about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorEric Holk <eholk@mozilla.com>2011-07-22 16:05:26 -0700
committerEric Holk <eholk@mozilla.com>2011-07-22 16:05:51 -0700
commit54be5b044f71ca9e191b26b2e65ff6541f377358 (patch)
tree5642938a86a2496eef5d6f8f79aec461b325fbea /src/comp
parent75ee817713f3352f2f80639c99ee2ec4477dfd66 (diff)
downloadrust-54be5b044f71ca9e191b26b2e65ff6541f377358.tar.gz
rust-54be5b044f71ca9e191b26b2e65ff6541f377358.zip
Fixing (or at least improving) translation of move semantics for send and receive. This let's us run all of the task-comm tests.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans_comm.rs13
1 files changed, 5 insertions, 8 deletions
diff --git a/src/comp/middle/trans_comm.rs b/src/comp/middle/trans_comm.rs
index 8882379135c..8fe7ea761e0 100644
--- a/src/comp/middle/trans_comm.rs
+++ b/src/comp/middle/trans_comm.rs
@@ -216,11 +216,14 @@ fn trans_send(&@block_ctxt cx, &@ast::expr lhs, &@ast::expr rhs,
     auto data_tmp = move_val_if_temp(bcx, INIT, data_alloc.val,
                                      data, unit_ty);
     bcx = data_tmp.bcx;
-    add_clean_temp(bcx, data_alloc.val, unit_ty);
     auto llchanval = bcx.build.PointerCast(chn.val, T_opaque_chan_ptr());
     auto lldataptr = bcx.build.PointerCast(data_alloc.val, T_ptr(T_i8()));
     bcx.build.Call(bcx.fcx.lcx.ccx.upcalls.send,
                    ~[bcx.fcx.lltaskptr, llchanval, lldataptr]);
+
+    // Deinit the stuff we sent.
+    bcx = zero_alloca(bcx, data_alloc.val, unit_ty).bcx;
+
     ret rslt(bcx, chn.val);
     auto unit_ty;
 }
@@ -231,7 +234,6 @@ fn trans_recv(&@block_ctxt cx, &@ast::expr lhs, &@ast::expr rhs,
     auto data = trans_lval(bcx, rhs);
     assert (data.is_mem);
     bcx = data.res.bcx;
-    auto unit_ty = node_id_type(bcx.fcx.lcx.ccx, id);
     // FIXME: calculate copy init-ness in typestate.
 
     auto prt = trans_expr(bcx, lhs);
@@ -241,13 +243,8 @@ fn trans_recv(&@block_ctxt cx, &@ast::expr lhs, &@ast::expr rhs,
     auto llportptr = bcx.build.PointerCast(prt.val, T_opaque_port_ptr());
     bcx.build.Call(bcx.fcx.lcx.ccx.upcalls.recv,
                    ~[bcx.fcx.lltaskptr, lldataptr, llportptr]);
-    auto data_load = load_if_immediate(bcx, data.res.val, unit_ty);
-    //auto cp = copy_val(bcx, DROP_EXISTING,
-    //                   data.res.val, data_load, unit_ty);
-    //bcx = cp.bcx;
 
-    add_clean_temp(cx, data_load, unit_ty);
-    ret rslt(bcx, data_load);
+    ret rslt(bcx, data.res.val);
 }
 
 // Does a deep copy of a value. This is needed for passing arguments to child