@@ -3454,8 +3454,35 @@ fn trans_fail(@block_ctxt cx, common.span sp, str fail_str) -> result {
3454
3454
}
3455
3455
3456
3456
fn trans_put( @block_ctxt cx, & option. t[ @ast. expr] e) -> result {
3457
- cx. fcx. ccx. sess. unimpl( "put expr" ) ;
3458
- fail;
3457
+ auto llcallee = C_nil ( ) ;
3458
+ auto llenv = C_nil ( ) ;
3459
+
3460
+ alt ( cx. fcx. lliterbody) {
3461
+ case ( some[ ValueRef ] ( ?lli) ) {
3462
+ auto slot = cx. build. Alloca ( val_ty( lli) ) ;
3463
+ cx. build. Store ( lli, slot) ;
3464
+
3465
+ llcallee = cx. build. GEP ( slot, vec( C_int ( 0 ) ,
3466
+ C_int ( abi. fn_field_code) ) ) ;
3467
+ llcallee = cx. build. Load ( llcallee) ;
3468
+
3469
+ llenv = cx. build. GEP ( slot, vec( C_int ( 0 ) ,
3470
+ C_int ( abi. fn_field_box) ) ) ;
3471
+ llenv = cx. build. Load ( llenv) ;
3472
+ }
3473
+ }
3474
+ auto bcx = cx;
3475
+ auto dummy_retslot = bcx. build. Alloca ( T_nil ( ) ) ;
3476
+ let vec[ ValueRef ] llargs = vec( dummy_retslot, cx. fcx. lltaskptr, llenv) ;
3477
+ alt ( e) {
3478
+ case ( none[ @ast. expr] ) { }
3479
+ case ( some[ @ast. expr] ( ?x) ) {
3480
+ auto r = trans_expr( bcx, x) ;
3481
+ llargs += r. val;
3482
+ bcx = r. bcx;
3483
+ }
3484
+ }
3485
+ ret res( bcx, bcx. build. FastCall ( llcallee, llargs) ) ;
3459
3486
}
3460
3487
3461
3488
fn trans_ret( @block_ctxt cx, & option. t[ @ast. expr] e) -> result {
0 commit comments