diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-03-24 05:01:25 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-03-24 05:01:25 +0100 |
commit | f49ae05677ef711ebd1269145538039d7eb0ce0a (patch) | |
tree | afff2b87ffd1989d356f86837d87726b030049b8 | |
parent | 853608f9be79d2f35a825a47d862f4017a361df4 (diff) |
Make opaque types work for members too.
-rw-r--r-- | src/gen.rs | 21 | ||||
-rw-r--r-- | src/types.rs | 11 |
2 files changed, 28 insertions, 4 deletions
@@ -406,7 +406,17 @@ fn gen_mod(mut ctx: &mut GenCtx, } } -fn type_opaque(ctx: &GenCtx, global: &Global) -> bool { +fn type_opaque(ctx: &GenCtx, ty: &Type) -> bool { + let ty_name = ty.name(); + + match ty_name { + Some(ty_name) + => ctx.options.opaque_types.iter().any(|name| *name == ty_name), + None => false, + } +} + +fn global_opaque(ctx: &GenCtx, global: &Global) -> bool { let global_name = global.name(); // Can't make an opaque type without layout @@ -429,7 +439,7 @@ fn gen_global(mut ctx: &mut GenCtx, return; } - if type_opaque(ctx, &g) { + if global_opaque(ctx, &g) { let name = first(rust_id(ctx, &g.name())); let layout = g.layout().unwrap(); defs.push(mk_opaque_struct(ctx, &name, &layout)); @@ -1004,8 +1014,11 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: &str, ci: CompInfo) -> Vec<P<ast::Item> None => rust_type_id(ctx, &f.name) }; - if !cty_is_translatable(&f.ty) { - println!("{}::{} not translatable, void: {}", ci.name, f.name, f.ty == TVoid); + let is_translatable = cty_is_translatable(&f.ty); + if !is_translatable || type_opaque(ctx, &f.ty) { + if !is_translatable { + println!("{}::{} not translatable, void: {}", ci.name, f.name, f.ty == TVoid); + } let size = f.ty.size(); if size != 0 { diff --git a/src/types.rs b/src/types.rs index e31fe480..a5aa4188 100644 --- a/src/types.rs +++ b/src/types.rs @@ -165,6 +165,17 @@ pub enum Type { } impl Type { + pub fn name(&self) -> Option<String> { + match *self { + TNamed(ref info) => Some(info.borrow().name.clone()), + TComp(ref info) => Some(info.borrow().name.clone()), + TEnum(ref info) => Some(info.borrow().name.clone()), + TArray(ref t, _, _) => t.name(), + TPtr(ref t, _, _, _) => t.name(), + _ => None + } + } + pub fn size(&self) -> usize { match *self { TInt(_, l) => l.size, |