@@ -417,12 +417,6 @@ fn T_tydesc(type_names tn) -> TypeRef {
417
417
ret t;
418
418
}
419
419
420
- // A "fat tydesc" is a type descriptor plus an array of extra type descriptors
421
- // following it.
422
- fn T_fat_tydesc ( type_names tn, uint n_subdescs ) -> TypeRef {
423
- ret T_struct ( vec ( T_tydesc ( tn) , T_array ( T_tydesc ( tn) , n_subdescs) ) ) ;
424
- }
425
-
426
420
fn T_array ( TypeRef t, uint n) -> TypeRef {
427
421
ret llvm. LLVMArrayType ( t, n) ;
428
422
}
@@ -1589,6 +1583,27 @@ fn linearize_ty_params(@block_ctxt cx, ty.t t) ->
1589
1583
ret tup( x. defs, x. vals) ;
1590
1584
}
1591
1585
1586
+ fn trans_stack_local_derived_tydesc( @block_ctxt cx, ValueRef llsz,
1587
+ ValueRef llalign, ValueRef lltydescs) -> result {
1588
+ auto lltydesc = alloca( cx, T_tydesc ( cx. fcx. lcx. ccx. tn) ) ;
1589
+
1590
+ // By convention, desc 0 is the root descriptor.
1591
+ auto llroottydesc = cx. build. Load ( cx. build. GEP ( lltydescs,
1592
+ vec( C_int( 0 ) , C_int ( 0 ) ) ) ) ;
1593
+ llroottydesc = cx. build. Load ( llroottydesc) ;
1594
+ cx. build. Store ( llroottydesc, lltydesc) ;
1595
+
1596
+ // Store a pointer to the rest of the descriptors.
1597
+ auto llfirstparam = cx. build. GEP ( lltydescs, vec( C_int( 0 ) , C_int ( 1 ) ) ) ;
1598
+ cx. build. Store ( llfirstparam,
1599
+ cx. build. GEP ( lltydesc, vec( C_int( 0 ) , C_int ( 0 ) ) ) ) ;
1600
+
1601
+ cx. build. Store ( llsz, cx. build. GEP ( lltydesc, vec( C_int( 0 ) , C_int ( 1 ) ) ) ) ;
1602
+ cx. build. Store ( llalign, cx. build. GEP ( lltydesc, vec( C_int( 0 ) , C_int ( 2 ) ) ) ) ;
1603
+
1604
+ ret res( cx, lltydesc) ;
1605
+ }
1606
+
1592
1607
fn get_tydesc( & @block_ctxt cx, ty. t t, bool escapes) -> result {
1593
1608
// Is the supplied type a type param? If so, return the passed-in tydesc.
1594
1609
alt ( ty. type_param( cx. fcx. lcx. ccx. tcx, t) ) {
@@ -1627,12 +1642,18 @@ fn get_tydesc(&@block_ctxt cx, ty.t t, bool escapes) -> result {
1627
1642
auto align = align_of( bcx, t) ;
1628
1643
bcx = align. bcx;
1629
1644
1630
- auto v = trans_upcall( bcx, "upcall_get_type_desc" ,
1631
- vec( p2i( bcx. fcx. lcx. ccx. crate_ptr) ,
1632
- sz. val,
1633
- align. val,
1634
- C_int ( ( 1 u + n_params) as int) ,
1635
- vp2i( bcx, tydescs) ) , true ) ;
1645
+ auto v;
1646
+ if ( escapes) {
1647
+ v = trans_upcall( bcx, "upcall_get_type_desc" ,
1648
+ vec( p2i( bcx. fcx. lcx. ccx. crate_ptr) ,
1649
+ sz. val,
1650
+ align. val,
1651
+ C_int ( ( 1 u + n_params) as int) ,
1652
+ vp2i( bcx, tydescs) ) , true ) ;
1653
+ } else {
1654
+ v = trans_stack_local_derived_tydesc( bcx, sz. val, align. val,
1655
+ tydescs) ;
1656
+ }
1636
1657
1637
1658
ret res( v. bcx, vi2p( v. bcx, v. val,
1638
1659
T_ptr ( T_tydesc ( cx. fcx. lcx. ccx. tn) ) ) ) ;
0 commit comments