diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-08-10 14:06:22 -0700 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-08-13 23:51:02 -0700 |
commit | 53d73b7d5d45a1130ced3bffbc57d22fc96f4334 (patch) | |
tree | 54d34eabee6b8aed8122e22bc00cc47a33f8ec51 | |
parent | 6da575456f0c619aaeefedf15282e4d0bb58aed8 (diff) |
refactor: Take rid of CompMember::CompField, which was effectively dead since I introduced support for anonymous structs.
-rw-r--r-- | src/gen.rs | 223 | ||||
-rw-r--r-- | src/parser.rs | 4 | ||||
-rw-r--r-- | src/types.rs | 11 |
3 files changed, 95 insertions, 143 deletions
@@ -992,147 +992,112 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: &str, ci: CompInfo) -> Vec<P<ast::Item> let mut template_args_used = vec![false; template_args.len()]; for m in members.iter() { - if let CompMember::Enum(ref ei) = *m { - let empty_name = ei.borrow().name.is_empty(); - if empty_name { - ei.borrow_mut().name = format!("{}_enum{}", name, anon_enum_count); - anon_enum_count += 1; - } - - let e = ei.borrow().clone(); - extra.extend(cenum_to_rs(ctx, &e.name, e.kind, e.comment, &e.items, e.layout).into_iter()); - continue; - } + match *m { + CompMember::Enum(ref ei) => { + let empty_name = ei.borrow().name.is_empty(); + if empty_name { + ei.borrow_mut().name = format!("{}_enum{}", name, anon_enum_count); + anon_enum_count += 1; + } - fn comp_fields(m: &CompMember) - -> (Option<Rc<RefCell<CompInfo>>>, Option<FieldInfo>) { - match *m { - CompMember::Field(ref f) => { (None, Some(f.clone())) } - CompMember::Comp(ref rc_c) => { (Some(rc_c.clone()), None) } - CompMember::CompField(ref rc_c, ref f) => { (Some(rc_c.clone()), Some(f.clone())) } - _ => unreachable!() + let e = ei.borrow().clone(); + extra.extend(cenum_to_rs(ctx, &e.name, e.kind, e.comment, &e.items, e.layout).into_iter()); } - } - - let (opt_rc_c, opt_f) = comp_fields(m); + CompMember::Field(ref f) => { + let f_name = match f.bitfields { + Some(_) => { + bitfields += 1; + format!("_bitfield_{}", bitfields) + } + None => rust_type_id(ctx, &f.name) + }; - if let Some(f) = opt_f { - let f_name = match f.bitfields { - Some(_) => { - bitfields += 1; - format!("_bitfield_{}", bitfields) + let is_translatable = cty_is_translatable(&f.ty); + if !is_translatable || f.ty.is_opaque() { + if !is_translatable { + warn!("{}::{} not translatable, void: {}", ci.name, f.name, f.ty == TVoid); + } + if let Some(layout) = f.ty.layout() { + fields.push(mk_blob_field(ctx, &f_name, &layout)); + } + continue; } - None => rust_type_id(ctx, &f.name) - }; - - let f_ty = f.ty; - let is_translatable = cty_is_translatable(&f_ty); - if !is_translatable || f_ty.is_opaque() { - if !is_translatable { - warn!("{}::{} not translatable, void: {}", ci.name, f.name, f_ty == TVoid); - } - if let Some(layout) = f_ty.layout() { - fields.push(mk_blob_field(ctx, &f_name, &layout)); + if ctx.options.gen_bitfield_methods { + let mut offset: u32 = 0; + if let Some(ref bitfields) = f.bitfields { + for &(ref bf_name, bf_size) in bitfields.iter() { + setters.extend(gen_bitfield_methods(ctx, &f_name, bf_name, &f.ty, offset as usize, bf_size).into_iter()); + offset += bf_size; + } + setters.push(gen_fullbitfield_method(ctx, &f_name, &f.ty, bitfields)) + } } - continue; - } - if ctx.options.gen_bitfield_methods { - let mut offset: u32 = 0; - if let Some(ref bitfields) = f.bitfields { - for &(ref bf_name, bf_size) in bitfields.iter() { - setters.extend(gen_bitfield_methods(ctx, &f_name, bf_name, &f_ty, offset as usize, bf_size).into_iter()); - offset += bf_size; + // If the member is not a template argument, it needs the full path. + let mut needs_full_path = true; + for (index, arg) in template_args.iter().enumerate() { + let used = f.ty.signature_contains_type(arg); + + if used { + template_args_used[index] = true; + needs_full_path = *arg == f.ty || match f.ty { + TPtr(ref t, _, _, _) => **t != *arg, + TArray(ref t, _, _) => **t != *arg, + _ => true, + }; + break; } - setters.push(gen_fullbitfield_method(ctx, &f_name, &f_ty, bitfields)) } - } - let mut bypass = false; - let f_ty = if let Some(ref rc_c) = opt_rc_c { - if rc_c.borrow().members.len() == 1 { - if let CompMember::Field(ref inner_f) = rc_c.borrow().members[0] { - bypass = true; - inner_f.ty.clone() + let rust_ty = P(cty_to_rs(ctx, &f.ty, f.bitfields.is_none(), needs_full_path)); + + // Wrap mutable fields in a Cell/UnsafeCell + let rust_ty = if f.mutable { + if !f.ty.can_derive_copy() { + quote_ty!(&ctx.ext_cx, ::std::cell::UnsafeCell<$rust_ty>) + // We can only wrap in a cell for non-copiable types, since + // Cell<T>: Clone, but not Copy. + // + // It's fine though, since mutating copiable types is trivial + // and doesn't make a lot of sense marking fields as `mutable`. + } else if !ci.can_derive_copy() { + quote_ty!(&ctx.ext_cx, ::std::cell::Cell<$rust_ty>) } else { - f_ty + rust_ty } } else { - f_ty - } - } else { - f_ty - }; - - // If the member is not a template argument, it needs the full path. - let mut needs_full_path = true; - for (index, arg) in template_args.iter().enumerate() { - let used = f_ty.signature_contains_type(arg); - - if used { - template_args_used[index] = true; - needs_full_path = *arg == f_ty || match f_ty { - TPtr(ref t, _, _, _) => **t != *arg, - TArray(ref t, _, _) => **t != *arg, - _ => true, - }; - break; - } + rust_ty + }; + let vis = if f.private { + ast::Visibility::Inherited + } else { + ast::Visibility::Public + }; + gen_accessors(ctx, &f_name, &rust_ty, f.accessor, &mut methods); + let field = ast::StructField { + span: ctx.span, + ident: Some(ctx.ext_cx.ident_of(&f_name)), + vis: vis, + id: ast::DUMMY_NODE_ID, + ty: rust_ty, + attrs: mk_doc_attr(ctx, &f.comment) + }; + fields.push(field); } + CompMember::Comp(ref rc_c) => { + let name_is_empty = rc_c.borrow().name.is_empty(); - let rust_ty = P(cty_to_rs(ctx, &f_ty, f.bitfields.is_none(), needs_full_path)); - - // Wrap mutable fields in a Cell/UnsafeCell - let rust_ty = if f.mutable { - if !f_ty.can_derive_copy() { - quote_ty!(&ctx.ext_cx, ::std::cell::UnsafeCell<$rust_ty>) - // We can only wrap in a cell for non-copiable types, since - // Cell<T>: Clone, but not Copy. - // - // It's fine though, since mutating copiable types is trivial - // and doesn't make a lot of sense marking fields as `mutable`. - } else if !ci.can_derive_copy() { - quote_ty!(&ctx.ext_cx, ::std::cell::Cell<$rust_ty>) + if name_is_empty { + let c = rc_c.borrow(); + 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()); } else { - rust_ty + let name = comp_name(&ctx, rc_c.borrow().kind, &rc_c.borrow().name); + extra.extend(comp_to_rs(ctx, &name, rc_c.borrow().clone()).into_iter()); } - } else { - rust_ty - }; - let vis = if f.private { - ast::Visibility::Inherited - } else { - ast::Visibility::Public - }; - gen_accessors(ctx, &f_name, &rust_ty, f.accessor, &mut methods); - let field = ast::StructField { - span: ctx.span, - ident: Some(ctx.ext_cx.ident_of(&f_name)), - vis: vis, - id: ast::DUMMY_NODE_ID, - ty: rust_ty, - attrs: mk_doc_attr(ctx, &f.comment) - }; - fields.push(field); - - if bypass { - continue; - } - } - - if let Some(rc_c) = opt_rc_c { - let name_is_empty = rc_c.borrow().name.is_empty(); - - if name_is_empty { - let c = rc_c.borrow(); - 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()); - } else { - let name = comp_name(&ctx, rc_c.borrow().kind, &rc_c.borrow().name); - extra.extend(comp_to_rs(ctx, &name, rc_c.borrow().clone()).into_iter()); } } } @@ -1553,16 +1518,6 @@ fn gen_comp_methods(ctx: &mut GenCtx, data_field: &str, data_offset: usize, extra.extend(comp_to_rs(ctx, &name, c.clone()).into_iter()); c.layout.size } - CompMember::CompField(ref rc_c, ref f) => { - if ctx.options.gen_bitfield_methods { - methods.extend(mk_field_method(ctx, f, offset).into_iter()); - } - - let c = rc_c.borrow(); - let name = comp_name(&ctx, c.kind, &c.name); - extra.extend(comp_to_rs(ctx, &name, c.clone()).into_iter()); - f.ty.size() - } CompMember::Enum(_) => 0 }; match kind { diff --git a/src/parser.rs b/src/parser.rs index df6dbf55..96e46d9f 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -161,7 +161,9 @@ fn decl_name(ctx: &mut ClangParserCtx, cursor: &Cursor) -> Global { } }; - let mut ci = CompInfo::new(spelling, ctx.current_module_id, filename, comment, kind, vec![], layout, anno); + let mut ci = CompInfo::new(spelling, ctx.current_module_id, + filename, comment, kind, vec![], + layout, anno); ci.parser_cursor = Some(cursor); // If it's an instantiation of another template, diff --git a/src/types.rs b/src/types.rs index 09ce4cb2..dcb1ce7f 100644 --- a/src/types.rs +++ b/src/types.rs @@ -397,8 +397,6 @@ pub enum FKind { pub enum CompMember { Field(FieldInfo), Comp(Rc<RefCell<CompInfo>>), - #[allow(dead_code)] - CompField(Rc<RefCell<CompInfo>>, FieldInfo), Enum(Rc<RefCell<EnumInfo>>), } @@ -538,8 +536,7 @@ impl CompInfo { let can_derive_debug = self.args.iter().all(|ty| ty.can_derive_debug()) && self.members.iter() .all(|member| match *member { - CompMember::Field(ref f) | - CompMember::CompField(_, ref f) => f.ty.can_derive_debug(), + CompMember::Field(ref f) => f.ty.can_derive_debug(), _ => true, }); self.detect_derive_debug_cycle.set(false); @@ -577,8 +574,7 @@ impl CompInfo { self.ref_template.as_ref().map_or(false, |t| t.has_destructor()) || self.args.iter().any(|t| t.has_destructor()) || self.members.iter().enumerate().any(|(index, m)| match *m { - CompMember::Field(ref f) | - CompMember::CompField(_, ref f) => { + CompMember::Field(ref f) => { // Base members may not be resolved yet if index < self.base_members { f.ty.has_destructor() @@ -611,8 +607,7 @@ impl CompInfo { // since copyability depends on the types itself. self.ref_template.as_ref().map_or(true, |t| t.can_derive_copy()) && self.members.iter().all(|m| match *m { - CompMember::Field(ref f) | - CompMember::CompField(_, ref f) => f.ty.can_derive_copy(), + CompMember::Field(ref f) => f.ty.can_derive_copy(), _ => true, }) } |