diff options
| author | Graydon Hoare <[email protected]> | 2011-02-18 18:52:16 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-02-18 18:52:31 -0800 |
| commit | b0c7439d777bbb967be7a67fa11096aaf540fe9f (patch) | |
| tree | 29230c000965a7d9598f750b4c434367fb38d620 /src | |
| parent | Factor out the call typechecking logic so that bind can use it (diff) | |
| download | rust-b0c7439d777bbb967be7a67fa11096aaf540fe9f.tar.xz rust-b0c7439d777bbb967be7a67fa11096aaf540fe9f.zip | |
Implement expr_put. Un-XFAIL foreach-simple.rs; iters w/o env access work.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 1 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 31 |
2 files changed, 30 insertions, 2 deletions
diff --git a/src/Makefile b/src/Makefile index c468ded0..71c9807b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -475,6 +475,7 @@ TEST_XFAILS_RUSTC := $(filter-out \ else-if.rs \ fact.rs \ fn-lval.rs \ + foreach-simple.rs \ fun-call-variants.rs \ fun-indirect-call.rs \ generic-derived-type.rs \ diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 59d6ad7f..efa3a41d 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3454,8 +3454,35 @@ fn trans_fail(@block_ctxt cx, common.span sp, str fail_str) -> result { } fn trans_put(@block_ctxt cx, &option.t[@ast.expr] e) -> result { - cx.fcx.ccx.sess.unimpl("put expr"); - fail; + auto llcallee = C_nil(); + auto llenv = C_nil(); + + alt (cx.fcx.lliterbody) { + case (some[ValueRef](?lli)) { + auto slot = cx.build.Alloca(val_ty(lli)); + cx.build.Store(lli, slot); + + llcallee = cx.build.GEP(slot, vec(C_int(0), + C_int(abi.fn_field_code))); + llcallee = cx.build.Load(llcallee); + + llenv = cx.build.GEP(slot, vec(C_int(0), + C_int(abi.fn_field_box))); + llenv = cx.build.Load(llenv); + } + } + auto bcx = cx; + auto dummy_retslot = bcx.build.Alloca(T_nil()); + let vec[ValueRef] llargs = vec(dummy_retslot, cx.fcx.lltaskptr, llenv); + alt (e) { + case (none[@ast.expr]) { } + case (some[@ast.expr](?x)) { + auto r = trans_expr(bcx, x); + llargs += r.val; + bcx = r.bcx; + } + } + ret res(bcx, bcx.build.FastCall(llcallee, llargs)); } fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result { |