summaryrefslogtreecommitdiff
path: root/libbindgen/src
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-01-19 08:59:01 -0800
committerGitHub <noreply@github.com>2017-01-19 08:59:01 -0800
commitbe53b94cae2618653f885290956edcf1e5545078 (patch)
tree07dc38336296fdf8aff96e6aa5fa9d95845a028a /libbindgen/src
parent36547ae216181fbcb1e3ec197e931ded17428e4c (diff)
parentd021caab5ea0180395cb790eb8ecafa8f66dc7b6 (diff)
Auto merge of #401 - emilio:function-checks, r=fitzgen
ir: Unify function checks so they apply to non-methods. Fixes #399 r? @fitzgen
Diffstat (limited to 'libbindgen/src')
-rw-r--r--libbindgen/src/ir/comp.rs29
-rw-r--r--libbindgen/src/ir/function.rs19
2 files changed, 23 insertions, 25 deletions
diff --git a/libbindgen/src/ir/comp.rs b/libbindgen/src/ir/comp.rs
index 6dfa1ece..0d1c653e 100644
--- a/libbindgen/src/ir/comp.rs
+++ b/libbindgen/src/ir/comp.rs
@@ -652,29 +652,6 @@ impl CompInfo {
ci.has_destructor |= cur.kind() == CXCursor_Destructor;
ci.has_vtable |= is_virtual;
- let linkage = cur.linkage();
- if linkage != CXLinkage_External {
- return CXChildVisit_Continue;
- }
-
- if cur.access_specifier() == CX_CXXPrivate {
- return CXChildVisit_Continue;
- }
-
- let visibility = cur.visibility();
- if visibility != CXVisibility_Default {
- return CXChildVisit_Continue;
- }
-
- if cur.is_inlined_function() {
- return CXChildVisit_Continue;
- }
-
- let spelling = cur.spelling();
- if spelling.starts_with("operator") {
- return CXChildVisit_Continue;
- }
-
// This used to not be here, but then I tried generating
// stylo bindings with this (without path filters), and
// cried a lot with a method in gfx/Point.h
@@ -691,8 +668,10 @@ impl CompInfo {
// NB: This gets us an owned `Function`, not a
// `FunctionSig`.
- let signature = Item::parse(cur, Some(potential_id), ctx)
- .expect("CXXMethod");
+ let signature = match Item::parse(cur, Some(potential_id), ctx) {
+ Ok(item) if ctx.resolve_item(item).kind().is_function() => item,
+ _ => return CXChildVisit_Continue,
+ };
match cur.kind() {
CXCursor_Constructor => {
diff --git a/libbindgen/src/ir/function.rs b/libbindgen/src/ir/function.rs
index 88ab861d..50c442db 100644
--- a/libbindgen/src/ir/function.rs
+++ b/libbindgen/src/ir/function.rs
@@ -150,6 +150,7 @@ impl FunctionSig {
} else {
ty.declaration()
};
+
let mut args: Vec<_> = match cursor.kind() {
CXCursor_FunctionDecl |
CXCursor_Constructor |
@@ -262,6 +263,24 @@ impl ClangSubItemParser for Function {
debug!("Function::parse({:?}, {:?})", cursor, cursor.cur_type());
+ let visibility = cursor.visibility();
+ if visibility != CXVisibility_Default {
+ return Err(ParseError::Continue);
+ }
+
+ if cursor.access_specifier() == CX_CXXPrivate {
+ return Err(ParseError::Continue);
+ }
+
+ if cursor.is_inlined_function() {
+ return Err(ParseError::Continue);
+ }
+
+ let linkage = cursor.linkage();
+ if linkage != CXLinkage_External && linkage != CXLinkage_UniqueExternal {
+ return Err(ParseError::Continue);
+ }
+
// Grab the signature using Item::from_ty.
let sig = try!(Item::from_ty(&cursor.cur_type(),
Some(cursor),