about summary refs log tree commit diff
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
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.
-rw-r--r--src/comp/middle/trans_comm.rs13
-rw-r--r--src/test/run-pass/task-comm-10.rs3
-rw-r--r--src/test/run-pass/task-comm-11.rs2
3 files changed, 6 insertions, 12 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
diff --git a/src/test/run-pass/task-comm-10.rs b/src/test/run-pass/task-comm-10.rs
index 3b96caf7483..56585ad9ffb 100644
--- a/src/test/run-pass/task-comm-10.rs
+++ b/src/test/run-pass/task-comm-10.rs
@@ -23,11 +23,10 @@ fn main() {
 
     p = port();
     child = spawn start(chan(p));
+    auto c;
 
     p |> c;
     c <| "A";
     c <| "B";
     task::yield();
-
-    auto c;
 }
diff --git a/src/test/run-pass/task-comm-11.rs b/src/test/run-pass/task-comm-11.rs
index beb3d6d03d8..9a240dcf0e9 100644
--- a/src/test/run-pass/task-comm-11.rs
+++ b/src/test/run-pass/task-comm-11.rs
@@ -1,6 +1,4 @@
 // xfail-stage0
-// xfail-stage1
-// xfail-stage2
 // xfail-stage3
 
 fn start(chan[chan[str]] c) {