diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2013-01-29 15:06:05 -0800 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2013-02-04 15:18:53 -0800 |
| commit | e22aa029fb4d923dc03748b435abd6330933b473 (patch) | |
| tree | eb1dfcaaadd8ec5439fd0b51c0b755c8fd4009e1 | |
| parent | e08a805b306398b316a489f76960569ac19b25b2 (diff) | |
| download | rust-e22aa029fb4d923dc03748b435abd6330933b473.tar.gz rust-e22aa029fb4d923dc03748b435abd6330933b473.zip | |
core/syntax: Add transitional code for pipes
| -rw-r--r-- | src/libcore/pipes.rs | 25 | ||||
| -rw-r--r-- | src/libsyntax/ext/pipes/pipec.rs | 28 |
2 files changed, 44 insertions, 9 deletions
diff --git a/src/libcore/pipes.rs b/src/libcore/pipes.rs index 254e6010b1b..3e941da1247 100644 --- a/src/libcore/pipes.rs +++ b/src/libcore/pipes.rs @@ -143,14 +143,9 @@ pub fn BufferHeader() -> BufferHeader { // This is for protocols to associate extra data to thread around. #[doc(hidden)] #[cfg(stage0)] -type Buffer<T: Owned> = { - header: BufferHeader, - data: T, -}; -#[doc(hidden)] #[cfg(stage1)] +type Buffer<T> = { header: BufferHeader, data: T }; #[cfg(stage2)] -#[cfg(stage3)] pub struct Buffer<T> { header: BufferHeader, data: T, @@ -247,7 +242,6 @@ pub fn mk_packet<T: Owned>() -> Packet<T> { payload: None, } } - #[doc(hidden)] #[cfg(stage0)] fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> { @@ -264,10 +258,23 @@ fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> { } move b } -#[doc(hidden)] #[cfg(stage1)] +fn unibuffer<T>() -> ~Buffer<Packet<T>> { + let b = ~{ + header: BufferHeader(), + data: Packet { + header: PacketHeader(), + payload: None, + } + }; + + unsafe { + b.data.header.buffer = reinterpret_cast(&b); + } + move b +} +#[doc(hidden)] #[cfg(stage2)] -#[cfg(stage3)] fn unibuffer<T>() -> ~Buffer<Packet<T>> { let b = ~Buffer { header: BufferHeader(), diff --git a/src/libsyntax/ext/pipes/pipec.rs b/src/libsyntax/ext/pipes/pipec.rs index 8c73dcfc04f..4bf59d9c627 100644 --- a/src/libsyntax/ext/pipes/pipec.rs +++ b/src/libsyntax/ext/pipes/pipec.rs @@ -355,6 +355,34 @@ pub impl protocol: gen_init { })) } + #[cfg(stage0)] + fn gen_init_bounded(ext_cx: ext_ctxt) -> @ast::expr { + debug!("gen_init_bounded"); + let buffer_fields = self.gen_buffer_init(ext_cx); + let buffer = quote_expr!(~{ + header: ::pipes::BufferHeader(), + data: $buffer_fields, + }); + + let entangle_body = ext_cx.block_expr( + ext_cx.block( + self.states.map_to_vec( + |s| ext_cx.parse_stmt( + fmt!("data.%s.set_buffer_(buffer)", + s.name))), + ext_cx.parse_expr( + fmt!("::ptr::addr_of(&(data.%s))", + self.states[0].name)))); + + quote_expr!({ + let buffer = $buffer; + do ::pipes::entangle_buffer(move buffer) |buffer, data| { + $entangle_body + } + }) + } + #[cfg(stage1)] + #[cfg(stage2)] fn gen_init_bounded(ext_cx: ext_ctxt) -> @ast::expr { debug!("gen_init_bounded"); let buffer_fields = self.gen_buffer_init(ext_cx); |
