|
diff --git a/src/librustc/middle/trans/adt.rs b/src/librustc/middle/trans/adt.rs |
|
index 9cea6d0..2c0d2cc 100644 |
|
--- a/src/librustc/middle/trans/adt.rs |
|
+++ b/src/librustc/middle/trans/adt.rs |
|
@@ -147,7 +147,39 @@ pub fn represent_type(cx: &CrateContext, t: ty::t) -> Rc<Repr> { |
|
repr |
|
} |
|
|
|
+fn deep_padding(cx: &CrateContext, fields: &[ty::t]) -> uint { |
|
+ use std::iter::AdditiveIterator; |
|
+ fields.iter().map(|&ty| |
|
+ match ty::get(ty).sty { |
|
+ ty::ty_tup(ref elems) => { |
|
+ deep_padding(cx, elems.as_slice()) |
|
+ } |
|
+ ty::ty_struct(def_id, ref substs) => { |
|
+ let fields = ty::lookup_struct_fields(cx.tcx(), def_id); |
|
+ let mut ftys = fields.iter().map(|field| { |
|
+ ty::lookup_field_type(cx.tcx(), def_id, field.id, substs) |
|
+ }).collect::<Vec<_>>(); |
|
+ |
|
+ if ty::ty_dtor(cx.tcx(), def_id).has_drop_flag() { |
|
+ ftys.push(ty::mk_bool()); |
|
+ } |
|
+ |
|
+ let lltys = ftys.iter().map(|&ty| { |
|
+ type_of::sizing_type_of(cx, ty) |
|
+ }).collect::<Vec<_>>(); |
|
+ |
|
+ let llty_rec = Type::struct_(cx, lltys.as_slice(), ty::lookup_packed(cx.tcx(), def_id)); |
|
+ let field_sizes = lltys.iter().map(|&typ| machine::llsize_of_alloc(cx, typ)).collect::<Vec<u64>>(); |
|
+ let size = machine::llsize_of_alloc(cx, llty_rec) as uint; |
|
+ size - field_sizes.move_iter().sum() as uint + deep_padding(cx, ftys.as_slice()) |
|
+ } |
|
+ _ => 0 |
|
+ } |
|
+ ).sum() |
|
+} |
|
+ |
|
fn represent_type_uncached(cx: &CrateContext, t: ty::t) -> Repr { |
|
+ use std::iter::AdditiveIterator; |
|
match ty::get(t).sty { |
|
ty::ty_tup(ref elems) => { |
|
return Univariant(mk_struct(cx, elems.as_slice(), false), false) |
|
@@ -161,6 +193,17 @@ fn represent_type_uncached(cx: &CrateContext, t: ty::t) -> Repr { |
|
let dtor = ty::ty_dtor(cx.tcx(), def_id).has_drop_flag(); |
|
if dtor { ftys.push(ty::mk_bool()); } |
|
|
|
+ let lltys = ftys.iter().map(|&ty| type_of::sizing_type_of(cx, ty)).collect::<Vec<_>>(); |
|
+ let llty_rec = Type::struct_(cx, lltys.as_slice(), packed); |
|
+ let field_sizes = lltys.iter().map(|&typ| machine::llsize_of_alloc(cx, typ)).collect::<Vec<u64>>(); |
|
+ let size = machine::llsize_of_alloc(cx, llty_rec) as uint; |
|
+ println!("struct {} size {}-{}: {}", |
|
+ def_id, |
|
+ size, |
|
+ deep_padding(cx, ftys.as_slice()) + size - field_sizes.clone().move_iter().sum() as uint, |
|
+ field_sizes |
|
+ ); |
|
+ |
|
return Univariant(mk_struct(cx, ftys.as_slice(), packed), dtor) |
|
} |
|
ty::ty_enum(def_id, ref substs) => { |