about summary refs log tree commit diff
path: root/src/rt/rust_upcall.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-12-05 17:11:33 -0800
committerBrian Anderson <banderson@mozilla.com>2011-12-05 17:11:35 -0800
commit3b8bfaf5343dd13839df465cde6a4df50136ff03 (patch)
treec63fe32d90310ae873f15ba05c813fdb8c447d9e /src/rt/rust_upcall.cpp
parent98cd96ce96c8be7248e3d375053938354c82878a (diff)
downloadrust-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.cpp30
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