summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gen.rs14
-rw-r--r--src/types.rs41
2 files changed, 19 insertions, 36 deletions
diff --git a/src/gen.rs b/src/gen.rs
index 881fa91e..c3b4cc2f 100644
--- a/src/gen.rs
+++ b/src/gen.rs
@@ -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)]