From dad426419c1c93a90d458d8eee307df7ddb0fc05 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Mon, 23 May 2011 19:29:45 -0700 Subject: [PATCH] Working on 2 argument spawn. The arguments seem to be copied correctly once, but then they get lost. --- src/comp/middle/trans.rs | 4 +--- src/rt/rust_task.cpp | 8 ++++++-- src/test/run-pass/spawn2.rs | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 src/test/run-pass/spawn2.rs 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; +}