about summary refs log tree commit diff
path: root/src/rt
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-01-06 12:06:35 -0800
committerNiko Matsakis <niko@alum.mit.edu>2012-01-06 22:40:31 -0800
commit8506241f3a0dce3f0d24764a3ce3d16f99bcb809 (patch)
tree70d453fea82f951f06184de75d45f2ada8536e4b /src/rt
parent8e89df69de47a4f944f5c3fc249a88c5934864b2 (diff)
downloadrust-8506241f3a0dce3f0d24764a3ce3d16f99bcb809.tar.gz
rust-8506241f3a0dce3f0d24764a3ce3d16f99bcb809.zip
fix how we walk functions to match new closure fmt
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/rust.cpp1
-rw-r--r--src/rt/rust_builtin.cpp6
-rw-r--r--src/rt/rust_internal.h27
-rw-r--r--src/rt/rust_kernel.cpp2
-rw-r--r--src/rt/rust_scheduler.cpp2
-rw-r--r--src/rt/rust_shape.cpp10
-rw-r--r--src/rt/rust_shape.h25
-rw-r--r--src/rt/rust_task.cpp15
-rw-r--r--src/rt/rust_task.h14
-rw-r--r--src/rt/rust_upcall.cpp1
-rw-r--r--src/rt/rust_util.h1
-rw-r--r--src/rt/test/rust_test_runtime.cpp2
12 files changed, 52 insertions, 54 deletions
diff --git a/src/rt/rust.cpp b/src/rt/rust.cpp
index 03acdaa91e0..6542c7237a7 100644
--- a/src/rt/rust.cpp
+++ b/src/rt/rust.cpp
@@ -1,4 +1,5 @@
 #include "rust_internal.h"
+#include "rust_util.h"
 #include <cstdio>
 
 struct
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 4f951a7faf0..264e6fdb325 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -3,6 +3,7 @@
 #include "rust_internal.h"
 #include "rust_scheduler.h"
 #include "rust_task.h"
+#include "rust_util.h"
 
 #if !defined(__WIN32__)
 #include <sys/time.h>
@@ -420,11 +421,6 @@ rust_get_task() {
     return rust_scheduler::get_task();
 }
 
-struct fn_env_pair {
-    spawn_fn f;
-    rust_boxed_closure *env;
-};
-
 extern "C" CDECL void
 start_task(rust_task_id id, fn_env_pair *f) {
     rust_task *task = rust_scheduler::get_task();
diff --git a/src/rt/rust_internal.h b/src/rt/rust_internal.h
index 889b5f62018..b83d74f6bfe 100644
--- a/src/rt/rust_internal.h
+++ b/src/rt/rust_internal.h
@@ -241,8 +241,6 @@ struct rust_timer {
     ~rust_timer();
 };
 
-#include "rust_util.h"
-
 typedef void CDECL (glue_fn)(void *, void *,
                              const type_desc **, void *);
 typedef void CDECL (cmp_glue_fn)(void *, void *,
@@ -254,6 +252,30 @@ struct rust_shape_tables {
     uint8_t *resources;
 };
 
+struct rust_opaque_closure;
+
+// The type of functions that we spawn, which fall into two categories:
+// - the main function: has a NULL environment, but uses the void* arg
+// - unique closures of type fn~(): have a non-NULL environment, but
+//   no arguments (and hence the final void*) is harmless
+typedef void (*CDECL spawn_fn)(void*, rust_opaque_closure*, void *);
+
+// corresponds to the layout of a fn(), fn@(), fn~() etc
+struct fn_env_pair {
+    spawn_fn f;
+    rust_opaque_closure *env;
+};
+
+// corresponds the closures generated in trans_closure.rs
+struct rust_opaque_closure {
+    intptr_t ref_count;
+    const type_desc *td;
+    // The size/types of these will vary per closure, so they
+    // cannot be statically expressed.  See trans_closure.rs:
+    const type_desc *captured_tds[0];
+    // struct bound_data;
+};
+
 struct type_desc {
     // First part of type_desc is known to compiler.
     // first_param = &descs[1] if dynamic, null if static.
@@ -297,7 +319,6 @@ extern "C" type_desc *rust_clone_type_desc(type_desc*);
 // indent-tabs-mode: nil
 // c-basic-offset: 4
 // buffer-file-coding-system: utf-8-unix
-// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
 // End:
 //
 
diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp
index f009541053d..3078f6b78c4 100644
--- a/src/rt/rust_kernel.cpp
+++ b/src/rt/rust_kernel.cpp
@@ -1,4 +1,5 @@
 #include "rust_internal.h"
+#include "rust_util.h"
 
 #define KLOG_(...)                              \
     KLOG(this, kern, __VA_ARGS__)
@@ -216,6 +217,5 @@ rust_kernel::win32_require(LPCTSTR fn, BOOL ok) {
 // indent-tabs-mode: nil
 // c-basic-offset: 4
 // buffer-file-coding-system: utf-8-unix
-// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
 // End:
 //
diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp
index bf40fea36ee..1df70306975 100644
--- a/src/rt/rust_scheduler.cpp
+++ b/src/rt/rust_scheduler.cpp
@@ -3,6 +3,7 @@
 #include <cassert>
 #include <pthread.h>
 #include "rust_internal.h"
+#include "rust_util.h"
 #include "globals.h"
 
 #ifndef _WIN32
@@ -414,6 +415,5 @@ rust_scheduler::get_task() {
 // indent-tabs-mode: nil
 // c-basic-offset: 4
 // buffer-file-coding-system: utf-8-unix
-// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
 // End:
 //
diff --git a/src/rt/rust_shape.cpp b/src/rt/rust_shape.cpp
index bd388ffff82..1743aaad9dd 100644
--- a/src/rt/rust_shape.cpp
+++ b/src/rt/rust_shape.cpp
@@ -47,13 +47,9 @@ type_param::make(const type_desc **tydescs, unsigned n_tydescs,
 // Constructs type parameters from a function shape. This is a bit messy,
 // because it requires that the function shape have a specific format.
 type_param *
-type_param::from_fn_shape(const uint8_t *sp, ptr dp, arena &arena) {
-    const type_desc *tydesc = bump_dp<const type_desc *>(dp);
-    const type_desc **tydescs = (const type_desc **)dp;
-    unsigned n_tydescs = tydesc->n_obj_params & 0x7fffffff;
-    for (unsigned i = 0; i < n_tydescs; i++)
-        bump_dp<const type_desc*>(dp);
-    return make(tydescs, n_tydescs, arena);
+type_param::from_fn_shape(rust_opaque_closure *env, arena &arena) {
+    unsigned n_tydescs = env->td->n_obj_params & 0x7fffffff;
+    return make(env->captured_tds, n_tydescs, arena);
 }
 
 // Constructs type parameters from an object shape. This is also a bit messy,
diff --git a/src/rt/rust_shape.h b/src/rt/rust_shape.h
index e6f3cfcd3d3..af21865f828 100644
--- a/src/rt/rust_shape.h
+++ b/src/rt/rust_shape.h
@@ -10,6 +10,7 @@
 
 #include <iostream>
 #include "rust_internal.h"
+#include "rust_util.h"
 
 // ISAAC pollutes our namespace.
 #undef align
@@ -300,7 +301,7 @@ public:
     const type_param *params;   // subparameters
 
     // Constructs type parameters from a function shape.
-    static type_param *from_fn_shape(const uint8_t *sp, ptr dp, arena &arena);
+    static type_param *from_fn_shape(rust_opaque_closure *env, arena &arena);
     // Creates type parameters from an object shape description.
     static type_param *from_obj_shape(const uint8_t *sp, ptr dp,
                                       arena &arena);
@@ -952,23 +953,17 @@ data<T,U>::walk_tag(tag_info &tinfo) {
 template<typename T,typename U>
 void
 data<T,U>::walk_fn_contents(ptr &dp) {
-    dp += sizeof(void *);   // Skip over the code pointer.
-
-    uint8_t *box_ptr = bump_dp<uint8_t *>(dp);
-    if (!box_ptr)
+    fn_env_pair pair = bump_dp<fn_env_pair>(dp);
+    if (!pair.env)
         return;
 
-    type_desc *subtydesc =
-        *reinterpret_cast<type_desc **>(box_ptr + sizeof(void *));
-    ptr closure_dp(box_ptr + sizeof(void *));
-
     arena arena;
-    type_param *params = type_param::from_fn_shape(subtydesc->shape,
-                                                   closure_dp, arena);
-
-    closure_dp += sizeof(void *);
-    T sub(*static_cast<T *>(this), subtydesc->shape, params,
-          subtydesc->shape_tables, closure_dp);
+    type_param *params =
+      type_param::from_fn_shape(pair.env, arena);
+    const type_desc *closure_td = pair.env->td;
+    ptr closure_dp((uintptr_t)pair.env);
+    T sub(*static_cast<T *>(this), closure_td->shape, params,
+          closure_td->shape_tables, closure_dp);
     sub.align = true;
     sub.walk();
 }
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index cade11e372d..79a6abdcf39 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -293,7 +293,7 @@ rust_task::~rust_task()
 struct spawn_args {
     rust_task *task;
     spawn_fn f;
-    rust_boxed_closure *envptr;
+    rust_opaque_closure *envptr;
     void *argptr;
 };
 
@@ -347,12 +347,13 @@ void task_start_wrapper(spawn_args *a)
         failed = true;
     }
 
-    rust_boxed_closure* boxed_env = (rust_boxed_closure*)a->envptr;
-    if(boxed_env) {
+    rust_opaque_closure* env = a->envptr;
+    if(env) {
         // free the environment.
-        const type_desc *td = boxed_env->closure.td;
-        td->drop_glue(NULL, NULL, td->first_param, &boxed_env->closure);
-        upcall_shared_free(boxed_env);
+        const type_desc *td = env->td;
+        LOG(task, task, "Freeing env %p with td %p", env, td);
+        td->drop_glue(NULL, NULL, td->first_param, env);
+        upcall_shared_free(env);
     }
 
     // The cleanup work needs lots of stack
@@ -364,7 +365,7 @@ void task_start_wrapper(spawn_args *a)
 
 void
 rust_task::start(spawn_fn spawnee_fn,
-                 rust_boxed_closure *envptr,
+                 rust_opaque_closure *envptr,
                  void *argptr)
 {
     LOG(this, task, "starting task from fn 0x%" PRIxPTR
diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h
index 6be28f41574..d0e3d0e2ad6 100644
--- a/src/rt/rust_task.h
+++ b/src/rt/rust_task.h
@@ -21,18 +21,6 @@ struct chan_handle {
     rust_port_id port;
 };
 
-struct rust_closure {
-    const type_desc *td;
-    // ... see trans_closure.rs for full description ...
-};
-
-struct rust_boxed_closure {
-    intptr_t ref_count;
-    rust_closure closure;
-};
-
-typedef void (*CDECL spawn_fn)(void*, rust_boxed_closure*, void *);
-
 struct rust_box;
 
 struct stk_seg {
@@ -145,7 +133,7 @@ rust_task : public kernel_owned<rust_task>, rust_cond
     ~rust_task();
 
     void start(spawn_fn spawnee_fn,
-               rust_boxed_closure *env,
+               rust_opaque_closure *env,
                void *args);
     void start();
     bool running();
diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp
index 6baac699e8f..a520770be3a 100644
--- a/src/rt/rust_upcall.cpp
+++ b/src/rt/rust_upcall.cpp
@@ -12,6 +12,7 @@
 #include "rust_scheduler.h"
 #include "rust_unwind.h"
 #include "rust_upcall.h"
+#include "rust_util.h"
 #include <stdint.h>
 
 
diff --git a/src/rt/rust_util.h b/src/rt/rust_util.h
index 50545b21310..37a1eb93e1d 100644
--- a/src/rt/rust_util.h
+++ b/src/rt/rust_util.h
@@ -210,7 +210,6 @@ make_str(rust_kernel* kernel, char* c, size_t strlen, const char* name) {
 // indent-tabs-mode: nil
 // c-basic-offset: 4
 // buffer-file-coding-system: utf-8-unix
-// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
 // End:
 //
 
diff --git a/src/rt/test/rust_test_runtime.cpp b/src/rt/test/rust_test_runtime.cpp
index 7bfa06fdc99..815d55acd86 100644
--- a/src/rt/test/rust_test_runtime.cpp
+++ b/src/rt/test/rust_test_runtime.cpp
@@ -39,7 +39,7 @@ rust_domain_test::run() {
     return true;
 }
 
-void task_entry(void *, rust_boxed_closure *, void *) {
+void task_entry(void *, rust_opaque_closure *, void *) {
     printf("task entry\n");
 }