Skip to content

Commit d9ce3a7

Browse files
committed
---
yaml --- r: 1315 b: refs/heads/master c: caa5b92 h: refs/heads/master i: 1313: 97ff2c5 1311: cd11ec9 v: v3
1 parent 80b3d79 commit d9ce3a7

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: ea42911561842b4331c3fa5a5a30b97497cbf871
2+
refs/heads/master: caa5b92985e6df582a0d33d10cf41e2835ef11b1

trunk/src/comp/middle/trans.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -949,23 +949,30 @@ fn get_tydesc(&@block_ctxt cx, @ty.t t) -> ValueRef {
949949

950950
// Does it contain a type param? If so, generate a derived tydesc.
951951
let uint n_params = ty.count_ty_params(t);
952+
952953
if (ty.count_ty_params(t) > 0u) {
953954
auto tys = linearize_ty_params(cx, t);
955+
956+
if (!cx.fcx.ccx.tydescs.contains_key(t)) {
957+
make_tydesc(cx.fcx.ccx, t, tys._0);
958+
}
959+
954960
cx.fcx.ccx.sess.unimpl("derived type descriptors");
955961
}
956962

957963
// Otherwise, generate a tydesc if necessary, and return it.
958964
if (!cx.fcx.ccx.tydescs.contains_key(t)) {
959-
make_tydesc(cx.fcx.ccx, t);
965+
let vec[ast.def_id] defs = vec();
966+
make_tydesc(cx.fcx.ccx, t, defs);
960967
}
961968
ret cx.fcx.ccx.tydescs.get(t);
962969
}
963970

964-
fn make_tydesc(@crate_ctxt cx, @ty.t t) {
971+
fn make_tydesc(@crate_ctxt cx, @ty.t t, vec[ast.def_id] typaram_defs) {
965972
auto tg = make_take_glue;
966-
auto take_glue = make_generic_glue(cx, t, "take", tg);
973+
auto take_glue = make_generic_glue(cx, t, "take", tg, typaram_defs);
967974
auto dg = make_drop_glue;
968-
auto drop_glue = make_generic_glue(cx, t, "drop", dg);
975+
auto drop_glue = make_generic_glue(cx, t, "drop", dg, typaram_defs);
969976

970977
auto llty = type_of(cx, t);
971978
auto pvoid = T_ptr(T_i8());
@@ -993,7 +1000,8 @@ fn make_tydesc(@crate_ctxt cx, @ty.t t) {
9931000
}
9941001

9951002
fn make_generic_glue(@crate_ctxt cx, @ty.t t, str name,
996-
val_and_ty_fn helper) -> ValueRef {
1003+
val_and_ty_fn helper,
1004+
vec[ast.def_id] typaram_defs) -> ValueRef {
9971005
auto llfnty = T_fn(vec(T_taskptr(),
9981006
T_ptr(T_tydesc()),
9991007
T_ptr(T_i8())), T_void());
@@ -1014,6 +1022,15 @@ fn make_generic_glue(@crate_ctxt cx, @ty.t t, str name,
10141022
llty = type_of(cx, t);
10151023
}
10161024

1025+
auto lltyparams = llvm.LLVMGetParam(llfn, 1u);
1026+
auto p = 0;
1027+
for (ast.def_id d in typaram_defs) {
1028+
auto llparam = bcx.build.GEP(lltyparams, vec(C_int(p)));
1029+
llparam = bcx.build.Load(llparam);
1030+
bcx.fcx.lltydescs.insert(d, llparam);
1031+
p += 1;
1032+
}
1033+
10171034
auto llrawptr = llvm.LLVMGetParam(llfn, 2u);
10181035
auto llval = bcx.build.BitCast(llrawptr, llty);
10191036

0 commit comments

Comments
 (0)