@@ -997,7 +997,7 @@ fn get_tydesc(&@block_ctxt cx, @ty.t t) -> result {
997
997
vec( p2i( bcx. fcx. ccx. crate_ptr) ,
998
998
sz. val,
999
999
align. val,
1000
- C_int ( n_params as int) ,
1000
+ C_int ( ( 1 u + n_params) as int) ,
1001
1001
bcx. build. PtrToInt ( tydescs, T_int ( ) ) ) ) ;
1002
1002
1003
1003
ret res( v. bcx, v. bcx. build. IntToPtr ( v. val, T_ptr ( T_tydesc ( ) ) ) ) ;
@@ -2193,6 +2193,34 @@ fn lval_val(@block_ctxt cx, ValueRef val) -> lval_result {
2193
2193
llobj=none[ ValueRef ] ) ;
2194
2194
}
2195
2195
2196
+ fn lval_generic_fn( @block_ctxt cx,
2197
+ ty. ty_params_and_ty tpt,
2198
+ ast. def_id fn_id,
2199
+ & ast. ann ann)
2200
+ -> lval_result {
2201
+
2202
+ check ( cx. fcx. ccx. fn_pairs. contains_key( fn_id) ) ;
2203
+ auto lv = lval_val( cx, cx. fcx. ccx. fn_pairs. get( fn_id) ) ;
2204
+ auto monoty = node_ann_type( cx. fcx. ccx, ann) ;
2205
+ auto tys = ty. resolve_ty_params( tpt, monoty) ;
2206
+
2207
+ if ( _vec. len[ @ty. t] ( tys) != 0 u) {
2208
+ auto bcx = cx;
2209
+ let vec[ ValueRef ] tydescs = vec( ) ;
2210
+ for ( @ty. t t in tys) {
2211
+ auto td = get_tydesc( bcx, t) ;
2212
+ bcx = td. bcx;
2213
+ append[ ValueRef ] ( tydescs, td. val) ;
2214
+ }
2215
+ auto gen = rec( item_type = tpt. _1,
2216
+ tydescs = tydescs ) ;
2217
+ lv = rec( res = res( bcx, lv. res. val) ,
2218
+ generic = some[ generic_info] ( gen)
2219
+ with lv) ;
2220
+ }
2221
+ ret lv;
2222
+ }
2223
+
2196
2224
fn trans_path( @block_ctxt cx, & ast. path p, & option. t[ ast. def] dopt,
2197
2225
& ast. ann ann) -> lval_result {
2198
2226
alt ( dopt) {
@@ -2215,39 +2243,33 @@ fn trans_path(@block_ctxt cx, &ast.path p, &option.t[ast.def] dopt,
2215
2243
ret lval_mem( cx, cx. fcx. llobjfields. get( did) ) ;
2216
2244
}
2217
2245
case ( ast. def_fn( ?did) ) {
2218
- check ( cx. fcx. ccx. fn_pairs. contains_key( did) ) ;
2219
- check ( cx. fcx. ccx. item_ids. contains_key( did) ) ;
2220
-
2246
+ check ( cx. fcx. ccx. items. contains_key( did) ) ;
2221
2247
auto fn_item = cx. fcx. ccx. items. get( did) ;
2222
- auto lv = lval_val( cx, cx. fcx. ccx. fn_pairs. get( did) ) ;
2223
- auto monoty = node_ann_type( cx. fcx. ccx, ann) ;
2224
- auto tys = ty. resolve_ty_params( fn_item, monoty) ;
2225
-
2226
- if ( _vec. len[ @ty. t] ( tys) != 0 u) {
2227
- auto bcx = cx;
2228
- let vec[ ValueRef ] tydescs = vec( ) ;
2229
- for ( @ty. t t in tys) {
2230
- auto td = get_tydesc( bcx, t) ;
2231
- bcx = td. bcx;
2232
- append[ ValueRef ] ( tydescs, td. val) ;
2233
- }
2234
- auto gen = rec( item_type = ty. item_ty( fn_item) . _1,
2235
- tydescs = tydescs ) ;
2236
- lv = rec( res = res( bcx, lv. res. val) ,
2237
- generic = some[ generic_info] ( gen)
2238
- with lv) ;
2239
- }
2240
-
2241
- ret lv;
2248
+ ret lval_generic_fn( cx, ty. item_ty( fn_item) , did, ann) ;
2242
2249
}
2243
2250
case ( ast. def_obj( ?did) ) {
2244
- check ( cx. fcx. ccx. fn_pairs. contains_key( did) ) ;
2245
- ret lval_val( cx, cx. fcx. ccx. fn_pairs. get( did) ) ;
2251
+ check ( cx. fcx. ccx. items. contains_key( did) ) ;
2252
+ auto fn_item = cx. fcx. ccx. items. get( did) ;
2253
+ ret lval_generic_fn( cx, ty. item_ty( fn_item) , did, ann) ;
2246
2254
}
2247
2255
case ( ast. def_variant( ?tid, ?vid) ) {
2248
2256
check ( cx. fcx. ccx. tags. contains_key( tid) ) ;
2249
2257
if ( cx. fcx. ccx. fn_pairs. contains_key( vid) ) {
2250
- ret lval_val( cx, cx. fcx. ccx. fn_pairs. get( vid) ) ;
2258
+ check ( cx. fcx. ccx. items. contains_key( tid) ) ;
2259
+ auto tag_item = cx. fcx. ccx. items. get( tid) ;
2260
+ auto params = ty. item_ty( tag_item) . _0;
2261
+ auto fty = ty. plain_ty( ty. ty_nil) ;
2262
+ alt ( tag_item. node) {
2263
+ case ( ast. item_tag( _, ?variants, _, _) ) {
2264
+ for ( ast. variant v in variants) {
2265
+ if ( v. id == vid) {
2266
+ fty = node_ann_type( cx. fcx. ccx,
2267
+ v. ann) ;
2268
+ }
2269
+ }
2270
+ }
2271
+ }
2272
+ ret lval_generic_fn( cx, tup( params, fty) , vid, ann) ;
2251
2273
} else {
2252
2274
// Nullary variants are just scalar constants.
2253
2275
check ( cx. fcx. ccx. item_ids. contains_key( vid) ) ;
@@ -3798,15 +3820,13 @@ fn collect_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
3798
3820
3799
3821
alt ( i. node) {
3800
3822
case ( ast. item_fn( ?name, ?f, _, ?fid, ?ann) ) {
3801
- // TODO: type-params
3802
3823
cx. items. insert( fid, i) ;
3803
3824
if ( ! cx. obj_methods. contains_key( fid) ) {
3804
3825
decl_fn_and_pair( cx, "fn ", name, ann, fid) ;
3805
3826
}
3806
3827
}
3807
3828
3808
3829
case ( ast. item_obj( ?name, ?ob, _, ?oid, ?ann) ) {
3809
- // TODO: type-params
3810
3830
cx. items. insert( oid, i) ;
3811
3831
decl_fn_and_pair( cx, "obj_ctor" , name, ann, oid) ;
3812
3832
for ( @ast. method m in ob. methods) {
0 commit comments