diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-01-09 14:07:45 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-09 14:07:45 -0800 |
commit | fab479dce41df1ebde617c060e9ee02eac92803d (patch) | |
tree | 5e8aa9b5a20ebb4d37ab4b0cd185e048a93a1b40 /libbindgen/src | |
parent | b30fe53aec602c3ac506e1c89b5311aa08b4a548 (diff) | |
parent | a20cf85dbb8b9f4ffcd656b3a541de24f4c37d95 (diff) |
Auto merge of #390 - emilio:str, r=Manishearth
ir: Evaluate constant strings too.
r? @Manishearth
Diffstat (limited to 'libbindgen/src')
-rw-r--r-- | libbindgen/src/clang.rs | 14 | ||||
-rw-r--r-- | libbindgen/src/ir/var.rs | 4 |
2 files changed, 17 insertions, 1 deletions
diff --git a/libbindgen/src/clang.rs b/libbindgen/src/clang.rs index fc5575b3..491aaa07 100644 --- a/libbindgen/src/clang.rs +++ b/libbindgen/src/clang.rs @@ -1348,6 +1348,20 @@ impl EvalResult { _ => None, } } + + /// Evaluates the expression as a literal string, that may or may not be + /// valid utf-8. + pub fn as_literal_string(&self) -> Option<Vec<u8>> { + match self.kind() { + CXEval_StrLiteral => { + let ret = unsafe { + CStr::from_ptr(clang_EvalResult_getAsStr(self.x)) + }; + Some(ret.to_bytes().to_vec()) + } + _ => None, + } + } } impl Drop for EvalResult { diff --git a/libbindgen/src/ir/var.rs b/libbindgen/src/ir/var.rs index d9160eca..e18af91b 100644 --- a/libbindgen/src/ir/var.rs +++ b/libbindgen/src/ir/var.rs @@ -236,7 +236,9 @@ impl ClangSubItemParser for Var { .and_then(|v| v.as_double()) .map(VarType::Float) } else { - None + cursor.evaluate() + .and_then(|v| v.as_literal_string()) + .map(VarType::String) }; let mangling = cursor_mangling(&cursor); |