diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-08-29 14:04:10 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-08-29 14:04:22 -0700 |
| commit | 6e20ffeb8d6be059ee717993fc7ad2bcd86a0b13 (patch) | |
| tree | babb2ad0fa91434cdc0c160fc4f3108389f68d45 /src | |
| parent | ec9c68c1df2ab657e630993d34c859d8bcb3f18e (diff) | |
| download | rust-6e20ffeb8d6be059ee717993fc7ad2bcd86a0b13.tar.gz rust-6e20ffeb8d6be059ee717993fc7ad2bcd86a0b13.zip | |
Add sys::Closure type
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcore/sys.rs | 27 |
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: |
