@@ -1564,20 +1564,16 @@ fn get_tydesc(&@block_ctxt cx, ty.t t) -> result {
1564
1564
}
1565
1565
1566
1566
// 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) ;
1568
1567
1569
- if ( n_params > 0 u) {
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) ;
1570
1571
auto tys = linearize_ty_params( cx, t) ;
1571
1572
1572
1573
check ( n_params == _vec. len[ uint] ( tys. _0) ) ;
1573
1574
check ( n_params == _vec. len[ ValueRef ] ( tys. _1) ) ;
1574
1575
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;
1581
1577
1582
1578
auto tydescs = alloca( cx, T_array ( T_ptr ( T_tydesc ( cx. fcx. lcx. ccx. tn) ) ,
1583
1579
1 u /* for root*/ + n_params) ) ;
@@ -1610,18 +1606,35 @@ fn get_tydesc(&@block_ctxt cx, ty.t t) -> result {
1610
1606
}
1611
1607
1612
1608
// 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
+ }
1617
1631
}
1618
- ret res( cx, cx. fcx. lcx. ccx. tydescs. get( t) . tydesc) ;
1619
1632
}
1620
1633
1621
1634
// Generates the declaration for (but doesn't fill in) a type descriptor. This
1622
1635
// needs to be separate from make_tydesc() below, because sometimes type glue
1623
1636
// 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 {
1625
1638
auto take_glue = declare_generic_glue( cx, t, T_glue_fn( cx. ccx. tn) ,
1626
1639
"take" ) ;
1627
1640
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) {
1666
1679
llvm. LLVMSetLinkage ( gvar, lib. llvm. LLVMInternalLinkage
1667
1680
as llvm. Linkage ) ;
1668
1681
1669
- auto info = rec(
1682
+ auto info = @ rec(
1670
1683
tydesc=gvar,
1671
1684
take_glue=take_glue,
1672
1685
drop_glue=drop_glue,
1673
1686
cmp_glue=cmp_glue
1674
1687
) ;
1675
1688
1676
- ccx . tydescs . insert ( t , @ info) ;
1689
+ ret info;
1677
1690
}
1678
1691
1679
1692
tag make_generic_glue_helper_fn {
0 commit comments