about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-08-29 14:04:10 -0700
committerBrian Anderson <banderson@mozilla.com>2012-08-29 14:04:22 -0700
commit6e20ffeb8d6be059ee717993fc7ad2bcd86a0b13 (patch)
treebabb2ad0fa91434cdc0c160fc4f3108389f68d45 /src
parentec9c68c1df2ab657e630993d34c859d8bcb3f18e (diff)
downloadrust-6e20ffeb8d6be059ee717993fc7ad2bcd86a0b13.tar.gz
rust-6e20ffeb8d6be059ee717993fc7ad2bcd86a0b13.zip
Add sys::Closure type
Diffstat (limited to 'src')
-rw-r--r--src/libcore/sys.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/libcore/sys.rs b/src/libcore/sys.rs
index ef8ddc9addc..99642c4a3ae 100644
--- a/src/libcore/sys.rs
+++ b/src/libcore/sys.rs
@@ -16,6 +16,12 @@ enum TypeDesc = {
     // Remaining fields not listed
 };
 
+/// The representation of a Rust closure
+struct Closure {
+    code: *();
+    env: *();
+}
+
 #[abi = "cdecl"]
 extern mod rustrt {
     pure fn shape_log_str(t: *sys::TypeDesc, data: *()) -> ~str;
@@ -138,6 +144,27 @@ mod tests {
         assert pref_align_of::<uint>() == 8u;
         assert pref_align_of::<*uint>() == 8u;
     }
+
+    #[test]
+    fn synthesize_closure() unsafe {
+        let x = 10;
+        let f: fn(int) -> int = |y| x + y;
+
+        assert f(20) == 30;
+
+        let original_closure: Closure = unsafe::transmute(f);
+
+        let actual_function_pointer = original_closure.code;
+        let environment = original_closure.env;
+
+        let new_closure = Closure {
+            code: actual_function_pointer,
+            env: environment
+        };
+
+        let new_f: fn(int) -> int = unsafe::transmute(new_closure);
+        assert new_f(20) == 30;
+    }
 }
 
 // Local Variables: