aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2011-02-18 18:52:16 -0800
committerGraydon Hoare <[email protected]>2011-02-18 18:52:31 -0800
commitb0c7439d777bbb967be7a67fa11096aaf540fe9f (patch)
tree29230c000965a7d9598f750b4c434367fb38d620 /src
parentFactor out the call typechecking logic so that bind can use it (diff)
downloadrust-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/Makefile1
-rw-r--r--src/comp/middle/trans.rs31
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 {