Put vtable generation behind a flag for now.
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index 5ce42c3..3face26 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -1045,7 +1045,8 @@
// For now, we will only generate vtables for classes that:
// - do not inherit from others (compilers merge VTable from primary parent class).
// - do not contain a virtual destructor (requires ordering; platforms generate different vtables).
- if self.comp_info.base_members().is_empty() &&
+ if ctx.options().vtable_generation &&
+ self.comp_info.base_members().is_empty() &&
self.comp_info.destructor().is_none()
{
let class_ident = ctx.rust_ident(self.item_id.canonical_name(ctx));
@@ -1793,7 +1794,7 @@
if !is_opaque {
if item.has_vtable_ptr(ctx) {
- let vtable = Vtable::new(item.id(), &self);
+ let vtable = Vtable::new(item.id(), self);
vtable.codegen(ctx, result, item);
let vtable_type = vtable
diff --git a/src/lib.rs b/src/lib.rs
index ea5c61b..baea21b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -569,6 +569,10 @@
output_vector.push("--explicit-padding".into());
}
+ if self.options.vtable_generation {
+ output_vector.push("--vtable-generation".into());
+ }
+
// Add clang arguments
output_vector.push("--".into());
@@ -1450,6 +1454,14 @@
self
}
+ /// If true, enables experimental support to generate vtable functions.
+ ///
+ /// Should mostly work, though some edge cases are likely to be broken.
+ pub fn vtable_generation(mut self, doit: bool) -> Self {
+ self.options.vtable_generation = doit;
+ self
+ }
+
/// Generate the Rust bindings using the options built up thus far.
pub fn generate(mut self) -> Result<Bindings, BindgenError> {
// Add any extra arguments from the environment to the clang command line.
@@ -1981,6 +1993,9 @@
/// Always output explicit padding fields
force_explicit_padding: bool,
+
+ /// Emit vtable functions.
+ vtable_generation: bool,
}
/// TODO(emilio): This is sort of a lie (see the error message that results from
@@ -2128,6 +2143,7 @@
translate_enum_integer_types: false,
c_naming: false,
force_explicit_padding: false,
+ vtable_generation: false,
}
}
}
diff --git a/src/options.rs b/src/options.rs
index 04d42ed..081aad6 100644
--- a/src/options.rs
+++ b/src/options.rs
@@ -542,6 +542,9 @@
Arg::new("explicit-padding")
.long("explicit-padding")
.help("Always output explicit padding fields."),
+ Arg::new("vtable-generation")
+ .long("vtable-generation")
+ .help("Enables generation of vtable functions."),
]) // .args()
.get_matches_from(args);
@@ -1008,6 +1011,10 @@
builder = builder.explicit_padding(true);
}
+ if matches.is_present("vtable-generation") {
+ builder = builder.vtable_generation(true);
+ }
+
let verbose = matches.is_present("verbose");
Ok((builder, output, verbose))
diff --git a/tests/tests.rs b/tests/tests.rs
index 274c568..1f116c9 100644
--- a/tests/tests.rs
+++ b/tests/tests.rs
@@ -365,6 +365,7 @@
"--no-rustfmt-bindings",
"--with-derive-default",
"--disable-header-comment",
+ "--vtable-generation",
header_str,
"--raw-line",
"",