about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Holk <eholk@mozilla.com>2011-05-23 19:29:45 -0700
committerEric Holk <eholk@mozilla.com>2011-05-27 15:20:58 -0700
commitdad426419c1c93a90d458d8eee307df7ddb0fc05 (patch)
treed13d895aa04d101d73f7fa6cc3554861c45662d0
parentbb4c7a9c6818bef1851639f03bb3b5b5a90dd45f (diff)
downloadrust-dad426419c1c93a90d458d8eee307df7ddb0fc05.tar.gz
rust-dad426419c1c93a90d458d8eee307df7ddb0fc05.zip
Working on 2 argument spawn. The arguments seem to be copied correctly once, but then they get lost.
-rw-r--r--src/comp/middle/trans.rs4
-rw-r--r--src/rt/rust_task.cpp8
-rw-r--r--src/test/run-pass/spawn2.rs15
3 files changed, 22 insertions, 5 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 8f2f2f2db1b..1790ef553f3 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -5882,9 +5882,7 @@ fn trans_spawn(&@block_ctxt cx,
                                      e));
     }
 
-    // Make the tuple. We have to reverse the types first though.
-    //vec::reverse[ty::t](arg_tys);
-    //vec::reverse[ValueRef](arg_vals);
+    // Make the tuple.
     auto args_ty = ty::mk_imm_tup(cx.fcx.lcx.ccx.tcx, arg_tys);
     
     // Allocate and fill the tuple.
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index e937bd42ffc..e18259fba60 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -171,7 +171,12 @@ rust_task::start(uintptr_t spawnee_fn,
     src += 1;                  // spawn-call task slot
     src += 1;                  // spawn-call closure-or-obj slot
 
-    *spp-- = (uintptr_t) *src;       // vec
+    spp -= (args_size / sizeof(uintptr_t)) - 1;
+    memmove(spp, src, args_size);
+    spp--;
+
+    //*spp-- = (uintptr_t) *src;       // vec
+    
     *spp-- = (uintptr_t) 0x0;        // closure-or-obj
     *spp-- = (uintptr_t) this;       // task
     *spp-- = (uintptr_t) dummy_ret;  // output address
@@ -179,7 +184,6 @@ rust_task::start(uintptr_t spawnee_fn,
     I(dom, spp == align_down(spp));
     *spp-- = (uintptr_t) (uintptr_t) spawnee_fn;
 
-
     *spp-- = (uintptr_t) 0x0;        // retp
 
     *spp-- = (uintptr_t) rust_new_exit_task_glue;
diff --git a/src/test/run-pass/spawn2.rs b/src/test/run-pass/spawn2.rs
new file mode 100644
index 00000000000..eca1de89ae0
--- /dev/null
+++ b/src/test/run-pass/spawn2.rs
@@ -0,0 +1,15 @@
+// xfail-stage0
+// xfail-stage1
+// xfail-stage2
+// -*- rust -*-
+
+use std;
+
+fn main() {
+  spawn child(10, 20);
+}
+
+fn child(int i, int j) {
+  log_err i;
+  log_err j;
+}