@@ -949,23 +949,30 @@ fn get_tydesc(&@block_ctxt cx, @ty.t t) -> ValueRef {
949
949
950
950
// Does it contain a type param? If so, generate a derived tydesc.
951
951
let uint n_params = ty. count_ty_params ( t) ;
952
+
952
953
if ( ty. count_ty_params ( t) > 0 u) {
953
954
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
+
954
960
cx. fcx . ccx . sess . unimpl ( "derived type descriptors" ) ;
955
961
}
956
962
957
963
// Otherwise, generate a tydesc if necessary, and return it.
958
964
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) ;
960
967
}
961
968
ret cx. fcx . ccx . tydescs . get ( t) ;
962
969
}
963
970
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 ) {
965
972
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 ) ;
967
974
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 ) ;
969
976
970
977
auto llty = type_of ( cx, t) ;
971
978
auto pvoid = T_ptr ( T_i8 ( ) ) ;
@@ -993,7 +1000,8 @@ fn make_tydesc(@crate_ctxt cx, @ty.t t) {
993
1000
}
994
1001
995
1002
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 {
997
1005
auto llfnty = T_fn ( vec ( T_taskptr ( ) ,
998
1006
T_ptr ( T_tydesc ( ) ) ,
999
1007
T_ptr ( T_i8 ( ) ) ) , T_void ( ) ) ;
@@ -1014,6 +1022,15 @@ fn make_generic_glue(@crate_ctxt cx, @ty.t t, str name,
1014
1022
llty = type_of ( cx, t) ;
1015
1023
}
1016
1024
1025
+ auto lltyparams = llvm. LLVMGetParam ( llfn, 1 u) ;
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
+
1017
1034
auto llrawptr = llvm. LLVMGetParam ( llfn, 2 u) ;
1018
1035
auto llval = bcx. build. BitCast ( llrawptr, llty) ;
1019
1036
0 commit comments