about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJed Davis <jld@panix.com>2013-02-24 22:46:33 -0800
committerJed Davis <jld@panix.com>2013-03-06 20:41:58 -0800
commit71b6e945c11a3a0f44e5e45bcad4e7bddf35ba8a (patch)
tree4017ccc738d00713d6e5902a8eb42aac8b41157d
parent5ca4fdfc981a9c0c7ecf3e23c4b26c05a6a7d2fe (diff)
downloadrust-71b6e945c11a3a0f44e5e45bcad4e7bddf35ba8a.tar.gz
rust-71b6e945c11a3a0f44e5e45bcad4e7bddf35ba8a.zip
glue::trans_struct_drop -> adt
-rw-r--r--src/librustc/middle/trans/glue.rs13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs
index 7bed3e86190..d38a04785b9 100644
--- a/src/librustc/middle/trans/glue.rs
+++ b/src/librustc/middle/trans/glue.rs
@@ -19,6 +19,7 @@ use back::link::*;
 use driver::session;
 use lib;
 use lib::llvm::{llvm, ValueRef, TypeRef, True};
+use middle::trans::adt;
 use middle::trans::base::*;
 use middle::trans::callee;
 use middle::trans::closure;
@@ -447,10 +448,10 @@ pub fn make_free_glue(bcx: block, v: ValueRef, t: ty::t) {
         match ty::ty_dtor(bcx.tcx(), did) {
             ty::NoDtor => bcx,
             ty::LegacyDtor(ref dt_id) => {
-                trans_struct_drop(bcx, v, *dt_id, did, substs, false)
+                trans_struct_drop(bcx, t, v, *dt_id, did, substs, false)
             }
             ty::TraitDtor(ref dt_id) => {
-                trans_struct_drop(bcx, v, *dt_id, did, substs, true)
+                trans_struct_drop(bcx, t, v, *dt_id, did, substs, true)
             }
         }
       }
@@ -460,6 +461,7 @@ pub fn make_free_glue(bcx: block, v: ValueRef, t: ty::t) {
 }
 
 pub fn trans_struct_drop(bcx: block,
+                         t: ty::t,
                          v0: ValueRef,
                          dtor_did: ast::def_id,
                          class_did: ast::def_id,
@@ -500,11 +502,12 @@ pub fn trans_struct_drop(bcx: block,
         Call(bcx, dtor_addr, args);
 
         // Drop the fields
+        let repr = adt::represent_type(bcx.ccx(), t);
         let field_tys =
             ty::struct_mutable_fields(bcx.tcx(), class_did,
                                               substs);
         for vec::eachi(field_tys) |i, fld| {
-            let llfld_a = GEPi(bcx, v0, struct_field(i));
+            let llfld_a = adt::trans_GEP(bcx, &repr, v0, 0, i);
             bcx = drop_ty(bcx, llfld_a, fld.mt.ty);
         }
 
@@ -534,10 +537,10 @@ pub fn make_drop_glue(bcx: block, v0: ValueRef, t: ty::t) {
         let tcx = bcx.tcx();
         match ty::ty_dtor(tcx, did) {
           ty::TraitDtor(dtor) => {
-            trans_struct_drop(bcx, v0, dtor, did, substs, true)
+            trans_struct_drop(bcx, t, v0, dtor, did, substs, true)
           }
           ty::LegacyDtor(dtor) => {
-            trans_struct_drop(bcx, v0, dtor, did, substs, false)
+            trans_struct_drop(bcx, t, v0, dtor, did, substs, false)
           }
           ty::NoDtor => {
             // No dtor? Just the default case