diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-12-05 17:11:33 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-12-05 17:11:35 -0800 |
| commit | 3b8bfaf5343dd13839df465cde6a4df50136ff03 (patch) | |
| tree | c63fe32d90310ae873f15ba05c813fdb8c447d9e /src/rt/rust_upcall.cpp | |
| parent | 98cd96ce96c8be7248e3d375053938354c82878a (diff) | |
| download | rust-3b8bfaf5343dd13839df465cde6a4df50136ff03.tar.gz rust-3b8bfaf5343dd13839df465cde6a4df50136ff03.zip | |
rt: Use an out pointer for rust_new_stack
upcall_call_shim_on_c_stack does not handle return values
Diffstat (limited to 'src/rt/rust_upcall.cpp')
| -rw-r--r-- | src/rt/rust_upcall.cpp | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp index e6e89c62cc0..670dbc3a24a 100644 --- a/src/rt/rust_upcall.cpp +++ b/src/rt/rust_upcall.cpp @@ -217,28 +217,40 @@ extern "C" void record_sp(void *limit); */ extern "C" CDECL void upcall_call_shim_on_c_stack(void *args, void *fn_ptr) { + rust_task *task = rust_scheduler::get_task(); + // FIXME (1226) - The shim functions generated by rustc contain the // morestack prologue, so we need to let them know they have enough // stack. - record_sp(0); - rust_task *task = rust_scheduler::get_task(); + //record_sp(0); + rust_scheduler *sched = task->sched; - sched->c_context.call_shim_on_c_stack(args, fn_ptr); - task->record_stack_limit(); + try { + sched->c_context.call_shim_on_c_stack(args, fn_ptr); + } catch (...) { + //task = rust_scheduler::get_task(); + //task->record_stack_limit(); + throw; + } + //task = rust_scheduler::get_task(); + //task->record_stack_limit(); } struct rust_new_stack2_args { - size_t stk_sz; - void *args_addr; - size_t args_sz; + void *new_stack; + size_t stk_sz; + void *args_addr; + size_t args_sz; }; // A new stack function suitable for calling through // upcall_call_shim_on_c_stack -extern "C" CDECL void * +extern "C" CDECL void upcall_new_stack(struct rust_new_stack2_args *args) { rust_task *task = rust_scheduler::get_task(); - return task->new_stack(args->stk_sz, args->args_addr, args->args_sz); + args->new_stack = task->new_stack(args->stk_sz, + args->args_addr, + args->args_sz); } extern "C" CDECL void |
