From 6e20ffeb8d6be059ee717993fc7ad2bcd86a0b13 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 29 Aug 2012 14:04:10 -0700 Subject: [PATCH] Add sys::Closure type --- src/libcore/sys.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) 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 @@ fn align_of_64() { assert pref_align_of::() == 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: -- GitLab