Skip to content

Commit 70bf4aa

Browse files
committed
---
yaml --- r: 2230 b: refs/heads/master c: e77f5b1 h: refs/heads/master v: v3
1 parent 7274c1e commit 70bf4aa

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
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: 592cd5fa309e1d6a3157c7417b67bf7503d0151f
2+
refs/heads/master: e77f5b1561092d9caa3a5423c569c1a2f8e44f99

trunk/src/comp/middle/trans.rs

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,20 +1564,16 @@ fn get_tydesc(&@block_ctxt cx, ty.t t) -> result {
15641564
}
15651565

15661566
// Does it contain a type param? If so, generate a derived tydesc.
1567-
let uint n_params = ty.count_ty_params(cx.fcx.lcx.ccx.tcx, t);
15681567

1569-
if (n_params > 0u) {
1568+
if (ty.type_contains_params(cx.fcx.lcx.ccx.tcx, t)) {
1569+
1570+
let uint n_params = ty.count_ty_params(cx.fcx.lcx.ccx.tcx, t);
15701571
auto tys = linearize_ty_params(cx, t);
15711572

15721573
check (n_params == _vec.len[uint](tys._0));
15731574
check (n_params == _vec.len[ValueRef](tys._1));
15741575

1575-
if (!cx.fcx.lcx.ccx.tydescs.contains_key(t)) {
1576-
declare_tydesc(cx.fcx.lcx, t);
1577-
define_tydesc(cx.fcx.lcx, t, tys._0);
1578-
}
1579-
1580-
auto root = cx.fcx.lcx.ccx.tydescs.get(t).tydesc;
1576+
auto root = get_static_tydesc(cx, t, tys._0).tydesc;
15811577

15821578
auto tydescs = alloca(cx, T_array(T_ptr(T_tydesc(cx.fcx.lcx.ccx.tn)),
15831579
1u /* for root*/ + n_params));
@@ -1610,18 +1606,35 @@ fn get_tydesc(&@block_ctxt cx, ty.t t) -> result {
16101606
}
16111607

16121608
// Otherwise, generate a tydesc if necessary, and return it.
1613-
if (!cx.fcx.lcx.ccx.tydescs.contains_key(t)) {
1614-
let vec[uint] tps = vec();
1615-
declare_tydesc(cx.fcx.lcx, t);
1616-
define_tydesc(cx.fcx.lcx, t, tps);
1609+
let vec[uint] tps = vec();
1610+
ret res(cx, get_static_tydesc(cx, t, tps).tydesc);
1611+
}
1612+
1613+
fn get_static_tydesc(&@block_ctxt cx,
1614+
ty.t t, vec[uint] ty_params) -> @tydesc_info {
1615+
alt (cx.fcx.lcx.ccx.tydescs.find(t)) {
1616+
case (some[@tydesc_info](?info)) {
1617+
ret info;
1618+
}
1619+
case (none[@tydesc_info]) {
1620+
fn simplifier(ty.t typ) -> ty.t {
1621+
ret @rec(cname=none[str] with *typ);
1622+
}
1623+
auto f = simplifier;
1624+
auto t_simplified = ty.fold_ty(cx.fcx.lcx.ccx.tcx, f, t);
1625+
auto info = declare_tydesc(cx.fcx.lcx, t_simplified);
1626+
cx.fcx.lcx.ccx.tydescs.insert(t, info);
1627+
cx.fcx.lcx.ccx.tydescs.insert(t_simplified, info);
1628+
define_tydesc(cx.fcx.lcx, t, ty_params);
1629+
ret info;
1630+
}
16171631
}
1618-
ret res(cx, cx.fcx.lcx.ccx.tydescs.get(t).tydesc);
16191632
}
16201633

16211634
// Generates the declaration for (but doesn't fill in) a type descriptor. This
16221635
// needs to be separate from make_tydesc() below, because sometimes type glue
16231636
// functions needs to refer to their own type descriptors.
1624-
fn declare_tydesc(@local_ctxt cx, ty.t t) {
1637+
fn declare_tydesc(@local_ctxt cx, ty.t t) -> @tydesc_info {
16251638
auto take_glue = declare_generic_glue(cx, t, T_glue_fn(cx.ccx.tn),
16261639
"take");
16271640
auto drop_glue = declare_generic_glue(cx, t, T_glue_fn(cx.ccx.tn),
@@ -1666,14 +1679,14 @@ fn declare_tydesc(@local_ctxt cx, ty.t t) {
16661679
llvm.LLVMSetLinkage(gvar, lib.llvm.LLVMInternalLinkage
16671680
as llvm.Linkage);
16681681

1669-
auto info = rec(
1682+
auto info = @rec(
16701683
tydesc=gvar,
16711684
take_glue=take_glue,
16721685
drop_glue=drop_glue,
16731686
cmp_glue=cmp_glue
16741687
);
16751688

1676-
ccx.tydescs.insert(t, @info);
1689+
ret info;
16771690
}
16781691

16791692
tag make_generic_glue_helper_fn {

0 commit comments

Comments
 (0)