about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/middle/trans/base.rs2
-rw-r--r--src/librustc/middle/trans/glue.rs16
-rw-r--r--src/librustc/middle/trans/meth.rs4
-rw-r--r--src/librustc/middle/trans/type_.rs6
4 files changed, 10 insertions, 18 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index 3bc46a0b14b..d39369c7a5f 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -376,7 +376,7 @@ pub fn malloc_raw_dyn<'a>(
 
         // Get the tydesc for the body:
         let static_ti = get_tydesc(ccx, t);
-        glue::lazily_emit_all_tydesc_glue(ccx, static_ti);
+        glue::lazily_emit_tydesc_glue(ccx, abi::tydesc_field_drop_glue, static_ti);
 
         // Allocate space:
         let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p());
diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs
index ea5e6e8d386..ab77d105e5f 100644
--- a/src/librustc/middle/trans/glue.rs
+++ b/src/librustc/middle/trans/glue.rs
@@ -131,7 +131,7 @@ fn simplified_glue_type(tcx: ty::ctxt, field: uint, t: ty::t) -> ty::t {
     t
 }
 
-fn lazily_emit_tydesc_glue(ccx: @CrateContext, field: uint, ti: @tydesc_info) {
+pub fn lazily_emit_tydesc_glue(ccx: @CrateContext, field: uint, ti: @tydesc_info) {
     let _icx = push_ctxt("lazily_emit_tydesc_glue");
 
     let simpl = simplified_glue_type(ccx.tcx, field, ti.ty);
@@ -367,17 +367,9 @@ fn make_drop_glue<'a>(bcx: &'a Block<'a>, v0: ValueRef, t: ty::t) -> &'a Block<'
             let lluniquevalue = GEPi(bcx, v0, [0, abi::trt_field_box]);
             // Only drop the value when it is non-null
             with_cond(bcx, IsNotNull(bcx, Load(bcx, lluniquevalue)), |bcx| {
-                let llvtable = Load(bcx, GEPi(bcx, v0, [0, abi::trt_field_vtable]));
-
-                // Cast the vtable to a pointer to a pointer to a tydesc.
-                let llvtable = PointerCast(bcx, llvtable,
-                                           ccx.tydesc_type.ptr_to().ptr_to());
-                let lltydesc = Load(bcx, llvtable);
-                call_tydesc_glue_full(bcx,
-                                      lluniquevalue,
-                                      lltydesc,
-                                      abi::tydesc_field_drop_glue,
-                                      None);
+                let lldtor_ptr = Load(bcx, GEPi(bcx, v0, [0, abi::trt_field_vtable]));
+                let lldtor = Load(bcx, lldtor_ptr);
+                Call(bcx, lldtor, [PointerCast(bcx, lluniquevalue, Type::i8p())], []);
                 bcx
             })
         }
diff --git a/src/librustc/middle/trans/meth.rs b/src/librustc/middle/trans/meth.rs
index 0301bbf5979..09bfa36ddc1 100644
--- a/src/librustc/middle/trans/meth.rs
+++ b/src/librustc/middle/trans/meth.rs
@@ -481,7 +481,7 @@ pub fn get_vtable(bcx: &Block,
 
     // Generate a type descriptor for the vtable.
     let tydesc = get_tydesc(ccx, self_ty);
-    glue::lazily_emit_all_tydesc_glue(ccx, tydesc);
+    glue::lazily_emit_tydesc_glue(ccx, abi::tydesc_field_drop_glue, tydesc);
 
     let vtable = make_vtable(ccx, tydesc, methods);
 
@@ -498,7 +498,7 @@ pub fn make_vtable(ccx: &CrateContext,
     unsafe {
         let _icx = push_ctxt("meth::make_vtable");
 
-        let mut components = ~[ tydesc.tydesc ];
+        let mut components = ~[tydesc.drop_glue.get().unwrap()];
         for &ptr in ptrs.iter() {
             components.push(ptr)
         }
diff --git a/src/librustc/middle/trans/type_.rs b/src/librustc/middle/trans/type_.rs
index e685849cbd8..39a99ef9950 100644
--- a/src/librustc/middle/trans/type_.rs
+++ b/src/librustc/middle/trans/type_.rs
@@ -180,7 +180,7 @@ impl Type {
     }
 
     pub fn vtable() -> Type {
-        Type::array(&Type::i8().ptr_to(), 1)
+        Type::array(&Type::i8p().ptr_to(), 1)
     }
 
     pub fn generic_glue_fn(cx: &CrateContext) -> Type {
@@ -246,13 +246,13 @@ impl Type {
     }
 
     pub fn opaque_trait(ctx: &CrateContext, store: ty::TraitStore) -> Type {
-        let tydesc_ptr = ctx.tydesc_type.ptr_to();
+        let vtable = Type::glue_fn(Type::i8p()).ptr_to().ptr_to();
         let box_ty = match store {
             ty::BoxTraitStore => Type::at_box(ctx, Type::i8()),
             ty::UniqTraitStore => Type::i8(),
             ty::RegionTraitStore(..) => Type::i8()
         };
-        Type::struct_([tydesc_ptr, box_ty.ptr_to()], false)
+        Type::struct_([vtable, box_ty.ptr_to()], false)
     }
 
     pub fn kind(&self) -> TypeKind {