about summary refs log tree commit diff
path: root/src/rt/rust_task.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-11-30 17:54:11 -0800
committerBrian Anderson <banderson@mozilla.com>2011-11-30 20:31:33 -0800
commitf2de42c39ac5e2ff3bc916b4bbff1db91181d9fa (patch)
tree249765cf6b484ce6d3575fac9160b07d0632ba15 /src/rt/rust_task.cpp
parentdd48a1af58260eb68d87a08cc6dd1b0a589a0eae (diff)
downloadrust-f2de42c39ac5e2ff3bc916b4bbff1db91181d9fa.tar.gz
rust-f2de42c39ac5e2ff3bc916b4bbff1db91181d9fa.zip
rt: Reorganize stack growth code
Diffstat (limited to 'src/rt/rust_task.cpp')
-rw-r--r--src/rt/rust_task.cpp73
1 files changed, 25 insertions, 48 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index 7210fe3956c..d631a68f898 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -62,54 +62,6 @@ del_stk(rust_task *task, stk_seg *stk)
     task->free(stk);
 }
 
-extern "C" CDECL void
-record_sp(void *limit);
-
-// Entry points for `__morestack` (see arch/*/morestack.S).
-extern "C" void *
-rust_new_stack(size_t stk_sz, void *args_addr, size_t args_sz) {
-    rust_task *task = rust_scheduler::get_task();
-
-    stk_seg *stk_seg = new_stk(task->sched, task, stk_sz + args_sz);
-
-    uint8_t *new_sp = (uint8_t*)stk_seg->limit;
-    size_t sizeof_retaddr = sizeof(void*);
-    // Make enough room on the new stack to hold the old stack pointer
-    // in addition to the function arguments
-    new_sp = align_down(new_sp - (args_sz + sizeof_retaddr));
-    new_sp += sizeof_retaddr;
-    memcpy(new_sp, args_addr, args_sz);
-    record_sp(stk_seg->data + RED_ZONE_SIZE);
-    return new_sp;
-}
-
-struct rust_new_stack2_args {
-  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" void *
-rust_new_stack2(struct rust_new_stack2_args *args) {
-    return rust_new_stack(args->stk_sz, args->args_addr,
-                          args->args_sz);
-}
-
-extern "C" void
-rust_del_stack() {
-    rust_task *task = rust_scheduler::get_task();
-    del_stk(task, task->stk);
-    record_sp(task->stk->data + RED_ZONE_SIZE);
-}
-
-extern "C" rust_task *
-rust_get_task() {
-    return rust_scheduler::get_task();
-}
-
-
 // Tasks
 rust_task::rust_task(rust_scheduler *sched, rust_task_list *state,
                      rust_task *spawner, const char *name) :
@@ -609,6 +561,31 @@ rust_task::notify(bool success) {
     }
 }
 
+extern "C" CDECL void
+record_sp(void *limit);
+
+void *
+rust_task::new_stack(size_t stk_sz, void *args_addr, size_t args_sz) {
+
+    stk_seg *stk_seg = new_stk(sched, this, stk_sz + args_sz);
+
+    uint8_t *new_sp = (uint8_t*)stk_seg->limit;
+    size_t sizeof_retaddr = sizeof(void*);
+    // Make enough room on the new stack to hold the old stack pointer
+    // in addition to the function arguments
+    new_sp = align_down(new_sp - (args_sz + sizeof_retaddr));
+    new_sp += sizeof_retaddr;
+    memcpy(new_sp, args_addr, args_sz);
+    record_sp(stk_seg->data + RED_ZONE_SIZE);
+    return new_sp;
+}
+
+void
+rust_task::del_stack() {
+    del_stk(this, stk);
+    record_sp(stk->data + RED_ZONE_SIZE);
+}
+
 //
 // Local Variables:
 // mode: C++