diff options
-rw-r--r-- | src/gen.rs | 14 | ||||
-rw-r--r-- | src/types.rs | 41 |
2 files changed, 19 insertions, 36 deletions
@@ -1015,18 +1015,8 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: &str, ci: CompInfo) -> Vec<P<ast::Item> if !is_translatable { println!("{}::{} not translatable, void: {}", ci.name, f.name, f.ty == TVoid); } - let size = f.ty.size(); - - if size != 0 { - fields.push(respan(ctx.span, ast::StructField_ { - kind: ast::NamedField( - ctx.ext_cx.ident_of(&f_name), - ast::Visibility::Public, - ), - id: ast::DUMMY_NODE_ID, - ty: quote_ty!(&ctx.ext_cx, [u8; $size]), - attrs: mk_doc_attr(ctx, &f.comment) - })); + if let Some(layout) = f.ty.layout() { + fields.push(mk_blob_field(ctx, &f_name, layout)); } continue; } diff --git a/src/types.rs b/src/types.rs index 03a9ef3a..88e1b4a6 100644 --- a/src/types.rs +++ b/src/types.rs @@ -177,34 +177,27 @@ impl Type { } pub fn size(&self) -> usize { - match *self { - TInt(_, l) => l.size, - TFloat(_, l) => l.size, - TPtr(_, _, _, l) => l.size, - TArray(_, _, l) => l.size, - TNamed(ref ti) => ti.borrow().ty.size(), - TComp(ref ci) => ci.borrow().layout.size, - TEnum(ref ei) => ei.borrow().layout.size, - TVoid => 0, - TFuncProto(..) => 0, - TFuncPtr(..) => 0, - } + self.layout().map(|l| l.size).unwrap_or(0) } #[allow(dead_code)] pub fn align(&self) -> usize { - match *self { - TInt(_, l) => l.align, - TFloat(_, l) => l.align, - TPtr(_, _, _, l) => l.align, - TArray(_, _, l) => l.align, - TNamed(ref ti) => ti.borrow().ty.align(), - TComp(ref ci) => ci.borrow().layout.align, - TEnum(ref ei) => ei.borrow().layout.align, - TVoid - | TFuncProto(..) - | TFuncPtr(..) => 0, - } + self.layout().map(|l| l.align).unwrap_or(0) + } + + pub fn layout(&self) -> Option<Layout> { + Some(match *self { + TInt(_, l) => l.clone(), + TFloat(_, l) => l.clone(), + TPtr(_, _, _, l) => l.clone(), + TArray(_, _, l) => l.clone(), + TComp(ref ci) => ci.borrow().layout.clone(), + TEnum(ref ei) => ei.borrow().layout.clone(), + TNamed(ref ti) => return ti.borrow().ty.layout(), + TVoid | + TFuncProto(..) | + TFuncPtr(..) => return None, + }) } #[allow(dead_code)] |