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; +}