Skip to content

Commit 949151a

Browse files
committed
Stop patching in placeholder names for CompInfo and EnumInfo instances during code generator.
As best as I can tell, it's done this way (rather than my way) because bindgen tries to recognize struct and enums typedefs of the form: /* This is a common idiom in C, not so much in C++ */ typdef struct { ... } Foo; The intention, I think, is to avoid generating rust code for a struct with a placeholder name followed by a typedef, and just give the struct the right name initially. This seems like a reasonable goal, though not a particularly important one. However, in my testing this never actually happens, because we end up calling unnamed_name anyway during the GComp(ci) case of gen_mod before we get to evaluting the typedef. So let's just remove that stuff and simplify the code. This lets us remove all the borrow_mut calls during code generation, which seems necessary for soundness.
1 parent e0093ae commit 949151a

File tree

2 files changed

+19
-49
lines changed

2 files changed

+19
-49
lines changed

src/gen.rs

Lines changed: 6 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use types::*;
2424

2525
struct GenCtx<'r> {
2626
ext_cx: base::ExtCtxt<'r>,
27-
unnamed_ty: usize,
2827
span: Span
2928
}
3029

@@ -81,15 +80,6 @@ fn rust_type_id(ctx: &mut GenCtx, name: String) -> String {
8180
}
8281
}
8382

84-
fn unnamed_name(ctx: &mut GenCtx, name: String, filename: String) -> String {
85-
return if name.is_empty() {
86-
ctx.unnamed_ty += 1;
87-
format!("{}_unnamed_{}", filename, ctx.unnamed_ty)
88-
} else {
89-
name
90-
};
91-
}
92-
9383
fn comp_name(kind: CompKind, name: &String) -> String {
9484
match kind {
9585
CompKind::Struct => struct_name(name),
@@ -250,7 +240,6 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
250240
let mut feature_gated_cfgs = vec![];
251241
let mut ctx = GenCtx {
252242
ext_cx: base::ExtCtxt::new(sess, Vec::new(), cfg, &mut feature_gated_cfgs),
253-
unnamed_ty: 0,
254243
span: span
255244
};
256245
ctx.ext_cx.bt_push(ExpnInfo {
@@ -300,35 +289,19 @@ pub fn gen_mod(links: &[(String, LinkType)], globs: Vec<Global>, span: Span) ->
300289
defs.extend(ctypedef_to_rs(&mut ctx, t.name.clone(), t.comment.clone(), &t.ty).into_iter())
301290
},
302291
GCompDecl(ci) => {
303-
{
304-
let mut c = ci.borrow_mut();
305-
c.name = unnamed_name(&mut ctx, c.name.clone(), c.filename.clone());
306-
}
307292
let c = ci.borrow().clone();
308293
defs.push(opaque_to_rs(&mut ctx, comp_name(c.kind, &c.name)));
309294
},
310295
GComp(ci) => {
311-
{
312-
let mut c = ci.borrow_mut();
313-
c.name = unnamed_name(&mut ctx, c.name.clone(), c.filename.clone());
314-
}
315296
let c = ci.borrow().clone();
316297
defs.extend(comp_to_rs(&mut ctx, comp_name(c.kind, &c.name),
317298
c).into_iter())
318299
},
319300
GEnumDecl(ei) => {
320-
{
321-
let mut e = ei.borrow_mut();
322-
e.name = unnamed_name(&mut ctx, e.name.clone(), e.filename.clone());
323-
}
324301
let e = ei.borrow().clone();
325302
defs.push(opaque_to_rs(&mut ctx, enum_name(&e.name)));
326303
},
327304
GEnum(ei) => {
328-
{
329-
let mut e = ei.borrow_mut();
330-
e.name = unnamed_name(&mut ctx, e.name.clone(), e.filename.clone());
331-
}
332305
let e = ei.borrow().clone();
333306
defs.extend(cenum_to_rs(&mut ctx, enum_name(&e.name), e.comment, e.items, e.layout).into_iter())
334307
},
@@ -659,24 +632,12 @@ fn ctypedef_to_rs(ctx: &mut GenCtx, name: String, comment: String, ty: &Type) ->
659632

660633
return match *ty {
661634
TComp(ref ci) => {
662-
let is_empty = ci.borrow().name.is_empty();
663-
if is_empty {
664-
ci.borrow_mut().name = name.clone();
665-
let c = ci.borrow().clone();
666-
comp_to_rs(ctx, name, c)
667-
} else {
668-
vec!(mk_item(ctx, name, comment, ty))
669-
}
635+
assert!(!ci.borrow().name.is_empty());
636+
vec!(mk_item(ctx, name, comment, ty))
670637
},
671638
TEnum(ref ei) => {
672-
let is_empty = ei.borrow().name.is_empty();
673-
if is_empty {
674-
ei.borrow_mut().name = name.clone();
675-
let e = ei.borrow().clone();
676-
cenum_to_rs(ctx, name, e.comment, e.items, e.layout)
677-
} else {
678-
vec!(mk_item(ctx, name, comment, ty))
679-
}
639+
assert!(!ei.borrow().name.is_empty());
640+
vec!(mk_item(ctx, name, comment, ty))
680641
},
681642
_ => vec!(mk_item(ctx, name, comment, ty))
682643
}
@@ -1614,16 +1575,14 @@ fn cty_to_rs(ctx: &mut GenCtx, ty: &Type, allow_bool: bool) -> ast::Ty {
16141575
mk_ty(ctx, false, vec!(id))
16151576
},
16161577
&TComp(ref ci) => {
1617-
let mut c = ci.borrow_mut();
1618-
c.name = unnamed_name(ctx, c.name.clone(), c.filename.clone());
1578+
let mut c = ci.borrow();
16191579
let args = c.args.iter().map(|gt| {
16201580
P(cty_to_rs(ctx, gt, allow_bool))
16211581
}).collect();
16221582
mk_ty_args(ctx, false, vec!(comp_name(c.kind, &c.name)), args)
16231583
},
16241584
&TEnum(ref ei) => {
1625-
let mut e = ei.borrow_mut();
1626-
e.name = unnamed_name(ctx, e.name.clone(), e.filename.clone());
1585+
let mut e = ei.borrow();
16271586
mk_ty(ctx, false, vec!(enum_name(&e.name)))
16281587
}
16291588
};

src/types.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,22 @@ pub struct CompInfo {
194194
pub layout: Layout,
195195
}
196196

197+
static mut UNNAMED_COUNTER: u32 = 0;
198+
199+
fn unnamed_name(name: String, filename: &String) -> String {
200+
return if name.is_empty() {
201+
let n = unsafe { UNNAMED_COUNTER += 1; UNNAMED_COUNTER };
202+
format!("{}_unnamed_{}", filename, n)
203+
} else {
204+
name
205+
};
206+
}
207+
197208
impl CompInfo {
198209
pub fn new(name: String, filename: String, comment: String, kind: CompKind, members: Vec<CompMember>, layout: Layout) -> CompInfo {
199210
CompInfo {
200211
kind: kind,
201-
name: name,
212+
name: unnamed_name(name, &filename),
202213
filename: filename,
203214
comment: comment,
204215
members: members,
@@ -253,7 +264,7 @@ pub struct EnumInfo {
253264
impl EnumInfo {
254265
pub fn new(name: String, filename: String, kind: IKind, items: Vec<EnumItem>, layout: Layout) -> EnumInfo {
255266
EnumInfo {
256-
name: name,
267+
name: unnamed_name(name, &filename),
257268
comment: String::new(),
258269
filename: filename,
259270
items: items,

0 commit comments

Comments
 (0)