Skip to content

Commit 08a32d5

Browse files
committed
Add options to enable derive_debug, disabled by default.
Fixes rust-lang#282
1 parent 6d86d1e commit 08a32d5

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

src/bin/bindgen.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ fn parse_args(args: &[String]) -> ParseResult {
3434
let args_len = args.len();
3535

3636
let mut options: BindgenOptions = Default::default();
37+
options.derive_debug = false;
3738
let mut out = Box::new(io::BufWriter::new(io::stdout())) as Box<io::Write>;
3839

3940
if args_len == 0 {
@@ -101,6 +102,10 @@ fn parse_args(args: &[String]) -> ParseResult {
101102
options.rust_enums = false;
102103
ix += 1;
103104
}
105+
"-derive-debug" => {
106+
options.derive_debug = true;
107+
ix += 1;
108+
}
104109
"-allow-unknown-types" => {
105110
options.fail_on_unknown_type = false;
106111
ix += 1;

src/gen.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ pub fn gen_mod(
188188
defs.extend(ctypedef_to_rs(
189189
&mut ctx,
190190
options.rust_enums,
191+
options.derive_debug,
191192
t.name.clone(), &t.ty))
192193
},
193194
GCompDecl(ci) => {
@@ -205,6 +206,7 @@ pub fn gen_mod(
205206
}
206207
let c = ci.borrow().clone();
207208
defs.extend(comp_to_rs(&mut ctx, c.kind, comp_name(c.kind, &c.name),
209+
options.derive_debug,
208210
c.layout, c.members).into_iter())
209211
},
210212
GEnumDecl(ei) => {
@@ -452,6 +454,7 @@ fn tag_dup_decl(gs: Vec<Global>) -> Vec<Global> {
452454
fn ctypedef_to_rs(
453455
ctx: &mut GenCtx,
454456
rust_enums: bool,
457+
derive_debug: bool,
455458
name: String,
456459
ty: &Type)
457460
-> Vec<P<ast::Item>> {
@@ -483,7 +486,7 @@ fn ctypedef_to_rs(
483486
if is_empty {
484487
ci.borrow_mut().name = name.clone();
485488
let c = ci.borrow().clone();
486-
comp_to_rs(ctx, c.kind, name, c.layout, c.members)
489+
comp_to_rs(ctx, c.kind, name, derive_debug, c.layout, c.members)
487490
} else {
488491
vec!(mk_item(ctx, name, ty))
489492
}
@@ -503,14 +506,16 @@ fn ctypedef_to_rs(
503506
}
504507

505508
fn comp_to_rs(ctx: &mut GenCtx, kind: CompKind, name: String,
509+
derive_debug: bool,
506510
layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
507511
match kind {
508-
CompKind::Struct => cstruct_to_rs(ctx, name, layout, members),
509-
CompKind::Union => cunion_to_rs(ctx, name, layout, members),
512+
CompKind::Struct => cstruct_to_rs(ctx, name, derive_debug, layout, members),
513+
CompKind::Union => cunion_to_rs(ctx, name, derive_debug, layout, members),
510514
}
511515
}
512516

513517
fn cstruct_to_rs(ctx: &mut GenCtx, name: String,
518+
derive_debug: bool,
514519
layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
515520
let mut fields = vec!();
516521
let mut methods = vec!();
@@ -522,7 +527,7 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: String,
522527
let mut bitfields: u32 = 0;
523528

524529
// Debug is only defined on little arrays
525-
let mut can_derive_debug = true;
530+
let mut can_derive_debug = derive_debug;
526531

527532
for m in &members {
528533
let (opt_rc_c, opt_f) = match *m {
@@ -563,9 +568,10 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: String,
563568
unnamed += 1;
564569
let field_name = format!("_bindgen_data_{}_", unnamed);
565570
fields.push(mk_blob_field(ctx, &field_name[..], c.layout));
566-
methods.extend(gen_comp_methods(ctx, &field_name[..], 0, c.kind, &c.members, &mut extra).into_iter());
571+
methods.extend(gen_comp_methods(ctx, &field_name[..], 0, c.kind, &c.members, &mut extra, derive_debug).into_iter());
567572
} else {
568573
extra.extend(comp_to_rs(ctx, c.kind, comp_name(c.kind, &c.name),
574+
derive_debug,
569575
c.layout, c.members.clone()).into_iter());
570576
}
571577
}
@@ -634,7 +640,7 @@ fn opaque_to_rs(ctx: &mut GenCtx, name: String) -> P<ast::Item> {
634640
})
635641
}
636642

637-
fn cunion_to_rs(ctx: &mut GenCtx, name: String, layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
643+
fn cunion_to_rs(ctx: &mut GenCtx, name: String, derive_debug: bool, layout: Layout, members: Vec<CompMember>) -> Vec<P<ast::Item>> {
638644
fn mk_item(ctx: &mut GenCtx, name: String, item: ast::ItemKind, vis:
639645
ast::Visibility, attrs: Vec<ast::Attribute>) -> P<ast::Item> {
640646
P(ast::Item {
@@ -674,7 +680,7 @@ fn cunion_to_rs(ctx: &mut GenCtx, name: String, layout: Layout, members: Vec<Com
674680
empty_generics(),
675681
None,
676682
P(cty_to_rs(ctx, &union)),
677-
gen_comp_methods(ctx, data_field_name, 0, CompKind::Union, &members, &mut extra),
683+
gen_comp_methods(ctx, data_field_name, 0, CompKind::Union, &members, &mut extra, derive_debug),
678684
);
679685

680686
let mut items = vec!(
@@ -859,7 +865,8 @@ fn cenum_to_rs(
859865
/// These are emitted into `extra`.
860866
fn gen_comp_methods(ctx: &mut GenCtx, data_field: &str, data_offset: usize,
861867
kind: CompKind, members: &[CompMember],
862-
extra: &mut Vec<P<ast::Item>>) -> Vec<ast::ImplItem> {
868+
extra: &mut Vec<P<ast::Item>>,
869+
derive_debug: bool) -> Vec<ast::ImplItem> {
863870

864871
let mk_field_method = |ctx: &mut GenCtx, f: &FieldInfo, offset: usize| {
865872
// TODO: Implement bitfield accessors
@@ -904,14 +911,15 @@ fn gen_comp_methods(ctx: &mut GenCtx, data_field: &str, data_offset: usize,
904911
CompMember::Comp(ref rc_c) => {
905912
let c = &rc_c.borrow();
906913
methods.extend(gen_comp_methods(ctx, data_field, offset, c.kind,
907-
&c.members, extra).into_iter());
914+
&c.members, extra, derive_debug).into_iter());
908915
c.layout.size
909916
}
910917
CompMember::CompField(ref rc_c, ref f) => {
911918
methods.extend(mk_field_method(ctx, f, offset).into_iter());
912919

913920
let c = rc_c.borrow();
914921
extra.extend(comp_to_rs(ctx, c.kind, comp_name(c.kind, &c.name),
922+
derive_debug,
915923
c.layout, c.members.clone()).into_iter());
916924
f.ty.size()
917925
}

src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ pub struct BindgenOptions {
111111
pub fail_on_unknown_type: bool,
112112
pub override_enum_ty: String,
113113
pub clang_args: Vec<String>,
114+
pub derive_debug: bool,
114115
}
115116

116117
impl Default for BindgenOptions {
@@ -126,7 +127,8 @@ impl Default for BindgenOptions {
126127
clang_args: match get_include_dir() {
127128
Some(path) => vec!("-idirafter".to_owned(), path),
128129
None => Vec::new()
129-
}
130+
},
131+
derive_debug: true
130132
}
131133
}
132134
}

0 commit comments

Comments
 (0)