about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorEric Holk <eric.holk@gmail.com>2012-06-14 20:36:16 -0700
committerEric Holk <eric.holk@gmail.com>2012-06-14 20:36:16 -0700
commit8ab15c0266260faadd2804623c729efcb14e7315 (patch)
tree14d4ebaf9f6cfe2dd4a829b49bc03dfc9b9a1071 /src/rustc
parentd4b6898958c2a0a93268bbabce293f1b4353c1a0 (diff)
parentd953462d031db6c6fd632456a5533be818a0db1c (diff)
Merge branch 'incoming' into newsnap
Diffstat (limited to 'src/rustc')
-rw-r--r--src/rustc/front/intrinsic.rs30
-rw-r--r--src/rustc/middle/trans/reflect.rs37
2 files changed, 45 insertions, 22 deletions
diff --git a/src/rustc/front/intrinsic.rs b/src/rustc/front/intrinsic.rs
index 674436bcfaf..6496d8052d4 100644
--- a/src/rustc/front/intrinsic.rs
+++ b/src/rustc/front/intrinsic.rs
@@ -52,29 +52,38 @@ mod intrinsic {
         fn visit_leave_evec_uniq(mtbl: uint) -> bool;
         fn visit_enter_evec_slice(mtbl: uint) -> bool;
         fn visit_leave_evec_slice(mtbl: uint) -> bool;
-        fn visit_enter_evec_fixed(mtbl: uint, sz: uint) -> bool;
-        fn visit_leave_evec_fixed(mtbl: uint, sz: uint) -> bool;
+        fn visit_enter_evec_fixed(mtbl: uint, n: uint,
+                                  sz: uint, align: uint) -> bool;
+        fn visit_leave_evec_fixed(mtbl: uint, n: uint,
+                                  sz: uint, align: uint) -> bool;
 
-        fn visit_enter_rec(n_fields: uint) -> bool;
+        fn visit_enter_rec(n_fields: uint,
+                           sz: uint, align: uint) -> bool;
         fn visit_enter_rec_field(mtbl: uint, i: uint,
                                  name: str/&) -> bool;
         fn visit_leave_rec_field(mtbl: uint, i: uint,
                                  name: str/&) -> bool;
-        fn visit_leave_rec(n_fields: uint) -> bool;
+        fn visit_leave_rec(n_fields: uint,
+                           sz: uint, align: uint) -> bool;
 
-        fn visit_enter_class(n_fields: uint) -> bool;
+        fn visit_enter_class(n_fields: uint,
+                             sz: uint, align: uint) -> bool;
         fn visit_enter_class_field(mtbl: uint, i: uint,
                                    name: str/&) -> bool;
         fn visit_leave_class_field(mtbl: uint, i: uint,
                                    name: str/&) -> bool;
-        fn visit_leave_class(n_fields: uint) -> bool;
+        fn visit_leave_class(n_fields: uint,
+                             sz: uint, align: uint) -> bool;
 
-        fn visit_enter_tup(n_fields: uint) -> bool;
+        fn visit_enter_tup(n_fields: uint,
+                           sz: uint, align: uint) -> bool;
         fn visit_enter_tup_field(i: uint) -> bool;
         fn visit_leave_tup_field(i: uint) -> bool;
-        fn visit_leave_tup(n_fields: uint) -> bool;
+        fn visit_leave_tup(n_fields: uint,
+                           sz: uint, align: uint) -> bool;
 
-        fn visit_enter_enum(n_variants: uint) -> bool;
+        fn visit_enter_enum(n_variants: uint,
+                            sz: uint, align: uint) -> bool;
         fn visit_enter_enum_variant(variant: uint,
                                     disr_val: int,
                                     n_fields: uint,
@@ -85,7 +94,8 @@ mod intrinsic {
                                     disr_val: int,
                                     n_fields: uint,
                                     name: str/&) -> bool;
-        fn visit_leave_enum(n_variants: uint) -> bool;
+        fn visit_leave_enum(n_variants: uint,
+                            sz: uint, align: uint) -> bool;
 
         fn visit_enter_fn(purity: uint, proto: uint,
                           n_inputs: uint, retstyle: uint) -> bool;
diff --git a/src/rustc/middle/trans/reflect.rs b/src/rustc/middle/trans/reflect.rs
index c2f804d42cd..9731c34fa82 100644
--- a/src/rustc/middle/trans/reflect.rs
+++ b/src/rustc/middle/trans/reflect.rs
@@ -80,10 +80,14 @@ impl methods for reflector {
                          [self.c_uint(mt.mutbl as uint)] + extra);
     }
 
-    fn vstore_name_and_extra(vstore: ty::vstore,
+    fn vstore_name_and_extra(t: ty::t,
+                             vstore: ty::vstore,
                              f: fn(str,[ValueRef])) {
         alt vstore {
-          ty::vstore_fixed(n) { f("fixed", [self.c_uint(n)]) }
+          ty::vstore_fixed(n) {
+            let extra = [self.c_uint(n)] + self.c_size_and_align(t);
+            f("fixed", extra)
+          }
           ty::vstore_slice(_) { f("slice", []) }
           ty::vstore_uniq { f("uniq", []);}
           ty::vstore_box { f("box", []); }
@@ -123,12 +127,12 @@ impl methods for reflector {
 
           ty::ty_vec(mt) { self.bracketed_mt("vec", mt, []) }
           ty::ty_estr(vst) {
-            self.vstore_name_and_extra(vst) {|name, extra|
+            self.vstore_name_and_extra(t, vst) {|name, extra|
                 self.visit("estr_" + name, extra)
             }
           }
           ty::ty_evec(mt, vst) {
-            self.vstore_name_and_extra(vst) {|name, extra|
+            self.vstore_name_and_extra(t, vst) {|name, extra|
                 self.bracketed_mt("evec_" + name, mt, extra)
             }
           }
@@ -138,21 +142,25 @@ impl methods for reflector {
           ty::ty_rptr(_, mt) { self.bracketed_mt("rptr", mt, []) }
 
           ty::ty_rec(fields) {
-            self.visit("enter_rec", [self.c_uint(vec::len(fields))]);
+            let extra = ([self.c_uint(vec::len(fields))]
+                         + self.c_size_and_align(t));
+            self.visit("enter_rec", extra);
             for fields.eachi {|i, field|
                 self.bracketed_mt("rec_field", field.mt,
                                   [self.c_uint(i),
                                    self.c_slice(*field.ident)]);
             }
-            self.visit("leave_rec", [self.c_uint(vec::len(fields))]);
+            self.visit("leave_rec", extra);
           }
 
           ty::ty_tup(tys) {
-            self.visit("enter_tup", [self.c_uint(vec::len(tys))]);
+            let extra = ([self.c_uint(vec::len(tys))]
+                         + self.c_size_and_align(t));
+            self.visit("enter_tup", extra);
             for tys.eachi {|i, t|
                 self.bracketed_t("tup_field", t, [self.c_uint(i)]);
             }
-            self.visit("leave_tup", [self.c_uint(vec::len(tys))]);
+            self.visit("leave_tup", extra);
           }
 
           // FIXME: fetch constants out of intrinsic:: for the numbers.
@@ -206,13 +214,16 @@ impl methods for reflector {
             let bcx = self.bcx;
             let tcx = bcx.ccx().tcx;
             let fields = ty::class_items_as_fields(tcx, did, substs);
-            self.visit("enter_class", [self.c_uint(vec::len(fields))]);
+            let extra = ([self.c_uint(vec::len(fields))]
+                         + self.c_size_and_align(t));
+
+            self.visit("enter_class", extra);
             for fields.eachi {|i, field|
                 self.bracketed_mt("class_field", field.mt,
                                   [self.c_uint(i),
                                    self.c_slice(*field.ident)]);
             }
-            self.visit("leave_class", [self.c_uint(vec::len(fields))]);
+            self.visit("leave_class", extra);
           }
 
           // FIXME: visiting all the variants in turn is probably
@@ -223,8 +234,10 @@ impl methods for reflector {
             let bcx = self.bcx;
             let tcx = bcx.ccx().tcx;
             let variants = ty::substd_enum_variants(tcx, did, substs);
+            let extra = ([self.c_uint(vec::len(variants))]
+                         + self.c_size_and_align(t));
 
-            self.visit("enter_enum", [self.c_uint(vec::len(variants))]);
+            self.visit("enter_enum", extra);
             for variants.eachi {|i, v|
                 let extra = [self.c_uint(i),
                              self.c_int(v.disr_val),
@@ -237,7 +250,7 @@ impl methods for reflector {
                 }
                 self.visit("leave_enum_variant", extra);
             }
-            self.visit("leave_enum", [self.c_uint(vec::len(variants))]);
+            self.visit("leave_enum", extra);
           }
 
           // Miscallaneous extra types