提交 71b6e945 编写于 作者: J Jed Davis

glue::trans_struct_drop -> adt

上级 5ca4fdfc
......@@ -19,6 +19,7 @@
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册