about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-02-18 18:52:16 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-02-18 18:52:31 -0800
commitb0c7439d777bbb967be7a67fa11096aaf540fe9f (patch)
tree29230c000965a7d9598f750b4c434367fb38d620 /src/comp
parent5508c28ff0e27d1027ddf372410cc5e1609662bd (diff)
downloadrust-b0c7439d777bbb967be7a67fa11096aaf540fe9f.tar.gz
rust-b0c7439d777bbb967be7a67fa11096aaf540fe9f.zip
Implement expr_put. Un-XFAIL foreach-simple.rs; iters w/o env access work.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 59d6ad7f764..efa3a41dc6a 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 {