File tree Expand file tree Collapse file tree 1 file changed +27
-0
lines changed
Expand file tree Collapse file tree 1 file changed +27
-0
lines changed Original file line number Diff line number Diff line change @@ -16,6 +16,12 @@ enum TypeDesc = {
1616 // Remaining fields not listed
1717} ;
1818
19+ /// The representation of a Rust closure
20+ struct Closure {
21+ code : * ( ) ;
22+ env : * ( ) ;
23+ }
24+
1925#[ abi = "cdecl" ]
2026extern mod rustrt {
2127 pure fn shape_log_str ( t : * sys:: TypeDesc , data : * ( ) ) -> ~str ;
@@ -138,6 +144,27 @@ mod tests {
138144 assert pref_align_of :: < uint > ( ) == 8 u;
139145 assert pref_align_of :: < * uint > ( ) == 8 u;
140146 }
147+
148+ #[ test]
149+ fn synthesize_closure ( ) unsafe {
150+ let x = 10 ;
151+ let f: fn ( int ) -> int = |y| x + y;
152+
153+ assert f( 20 ) == 30 ;
154+
155+ let original_closure: Closure = unsafe :: transmute ( f) ;
156+
157+ let actual_function_pointer = original_closure. code ;
158+ let environment = original_closure. env ;
159+
160+ let new_closure = Closure {
161+ code : actual_function_pointer,
162+ env : environment
163+ } ;
164+
165+ let new_f: fn ( int ) -> int = unsafe :: transmute ( new_closure) ;
166+ assert new_f( 20 ) == 30 ;
167+ }
141168}
142169
143170// Local Variables:
You can’t perform that action at this time.
0 commit comments