summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYamakaky <yamakaky@yamaworld.fr>2016-03-11 14:21:45 +0100
committerYamakaky <yamakaky@yamaworld.fr>2016-03-11 14:22:54 +0100
commit08a32d5276afa7c120af3ce83ba3e32d59503e68 (patch)
tree0acf4d3c5c0f919dea5d107479ac90f8eb038e16
parent6d86d1ec86ab678321e53e211a49183dcdc8de27 (diff)
Add options to enable derive_debug, disabled by default.
Fixes #282
-rw-r--r--src/bin/bindgen.rs5
-rw-r--r--src/gen.rs26
-rw-r--r--src/lib.rs4
3 files changed, 25 insertions, 10 deletions
diff --git a/src/bin/bindgen.rs b/src/bin/bindgen.rs
index fe17b2f6..c049f9a1 100644
--- a/src/bin/bindgen.rs
+++ b/src/bin/bindgen.rs
@@ -34,6 +34,7 @@ fn parse_args(args: &[String]) -> ParseResult {
let args_len = args.len();
let mut options: BindgenOptions = Default::default();
+ options.derive_debug = false;
let mut out = Box::new(io::BufWriter::new(io::stdout())) as Box<io::Write>;
if args_len == 0 {
@@ -101,6 +102,10 @@ fn parse_args(args: &[String]) -> ParseResult {
options.rust_enums = false;
ix += 1;
}
+ "-derive-debug" => {
+ options.derive_debug = true;
+ ix += 1;
+ }
"-allow-unknown-types" => {
options.fail_on_unknown_type = false;
ix += 1;
diff --git a/src/gen.rs b/src/gen.rs
index 6ea14a58..851f1830 100644
--- a/src/gen.rs
+++ b/src/gen.rs
@@ -188,6 +188,7 @@ pub fn gen_mod(
defs.extend(ctypedef_to_rs(
&mut ctx,
options.rust_enums,
+ options.derive_debug,
t.name.clone(), &t.ty))
},
GCompDecl(ci) => {
@@ -205,6 +206,7 @@ pub fn gen_mod(
}
let c = ci.borrow().clone();
defs.extend(comp_to_rs(&mut ctx, c.kind, comp_name(c.kind, &c.name),
+ options.derive_debug,
c.layout, c.members).into_iter())
},
GEnumDecl(ei) => {
@@ -452,6 +454,7 @@ fn tag_dup_decl(gs: Vec<Global>) -> Vec<Global> {
fn ctypedef_to_rs(
ctx: &mut GenCtx,
rust_enums: bool,
+ derive_debug: bool,
name: String,
ty: &Type)
-> Vec<P<ast::Item>> {
@@ -483,7 +486,7 @@ fn ctypedef_to_rs(
if is_empty {
ci.borrow_mut().name = name.clone();
let c = ci.borrow().clone();
- comp_to_rs(ctx, c.kind, name, c.layout, c.members)
+ comp_to_rs(ctx, c.kind, name, derive_debug, c.layout, c.members)
} else {
vec!(mk_item(ctx, name, ty))
}
@@ -503,14 +506,16 @@ fn ctypedef_to_rs(
}
fn comp_to_rs(ctx: &mut GenCtx, kind: CompKind, name: String,
+ derive_debug: bool,
layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
match kind {
- CompKind::Struct => cstruct_to_rs(ctx, name, layout, members),
- CompKind::Union => cunion_to_rs(ctx, name, layout, members),
+ CompKind::Struct => cstruct_to_rs(ctx, name, derive_debug, layout, members),
+ CompKind::Union => cunion_to_rs(ctx, name, derive_debug, layout, members),
}
}
fn cstruct_to_rs(ctx: &mut GenCtx, name: String,
+ derive_debug: bool,
layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
let mut fields = vec!();
let mut methods = vec!();
@@ -522,7 +527,7 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: String,
let mut bitfields: u32 = 0;
// Debug is only defined on little arrays
- let mut can_derive_debug = true;
+ let mut can_derive_debug = derive_debug;
for m in &members {
let (opt_rc_c, opt_f) = match *m {
@@ -563,9 +568,10 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: String,
unnamed += 1;
let field_name = format!("_bindgen_data_{}_", unnamed);
fields.push(mk_blob_field(ctx, &field_name[..], c.layout));
- methods.extend(gen_comp_methods(ctx, &field_name[..], 0, c.kind, &c.members, &mut extra).into_iter());
+ methods.extend(gen_comp_methods(ctx, &field_name[..], 0, c.kind, &c.members, &mut extra, derive_debug).into_iter());
} else {
extra.extend(comp_to_rs(ctx, c.kind, comp_name(c.kind, &c.name),
+ derive_debug,
c.layout, c.members.clone()).into_iter());
}
}
@@ -634,7 +640,7 @@ fn opaque_to_rs(ctx: &mut GenCtx, name: String) -> P<ast::Item> {
})
}
-fn cunion_to_rs(ctx: &mut GenCtx, name: String, layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
+fn cunion_to_rs(ctx: &mut GenCtx, name: String, derive_debug: bool, layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
fn mk_item(ctx: &mut GenCtx, name: String, item: ast::ItemKind, vis:
ast::Visibility, attrs: Vec<ast::Attribute>) -> P<ast::Item> {
P(ast::Item {
@@ -674,7 +680,7 @@ fn cunion_to_rs(ctx: &mut GenCtx, name: String, layout: Layout, members: Vec<Com
empty_generics(),
None,
P(cty_to_rs(ctx, &union)),
- gen_comp_methods(ctx, data_field_name, 0, CompKind::Union, &members, &mut extra),
+ gen_comp_methods(ctx, data_field_name, 0, CompKind::Union, &members, &mut extra, derive_debug),
);
let mut items = vec!(
@@ -859,7 +865,8 @@ fn cenum_to_rs(
/// These are emitted into `extra`.
fn gen_comp_methods(ctx: &mut GenCtx, data_field: &str, data_offset: usize,
kind: CompKind, members: &[CompMember],
- extra: &mut Vec<P<ast::Item>>) -> Vec<ast::ImplItem> {
+ extra: &mut Vec<P<ast::Item>>,
+ derive_debug: bool) -> Vec<ast::ImplItem> {
let mk_field_method = |ctx: &mut GenCtx, f: &FieldInfo, offset: usize| {
// TODO: Implement bitfield accessors
@@ -904,7 +911,7 @@ fn gen_comp_methods(ctx: &mut GenCtx, data_field: &str, data_offset: usize,
CompMember::Comp(ref rc_c) => {
let c = &rc_c.borrow();
methods.extend(gen_comp_methods(ctx, data_field, offset, c.kind,
- &c.members, extra).into_iter());
+ &c.members, extra, derive_debug).into_iter());
c.layout.size
}
CompMember::CompField(ref rc_c, ref f) => {
@@ -912,6 +919,7 @@ fn gen_comp_methods(ctx: &mut GenCtx, data_field: &str, data_offset: usize,
let c = rc_c.borrow();
extra.extend(comp_to_rs(ctx, c.kind, comp_name(c.kind, &c.name),
+ derive_debug,
c.layout, c.members.clone()).into_iter());
f.ty.size()
}
diff --git a/src/lib.rs b/src/lib.rs
index 4918ff3a..9154c9fa 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -111,6 +111,7 @@ pub struct BindgenOptions {
pub fail_on_unknown_type: bool,
pub override_enum_ty: String,
pub clang_args: Vec<String>,
+ pub derive_debug: bool,
}
impl Default for BindgenOptions {
@@ -126,7 +127,8 @@ impl Default for BindgenOptions {
clang_args: match get_include_dir() {
Some(path) => vec!("-idirafter".to_owned(), path),
None => Vec::new()
- }
+ },
+ derive_debug: true
}
}
}