about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2013-01-29 15:06:05 -0800
committerTim Chevalier <chevalier@alum.wellesley.edu>2013-02-04 15:18:53 -0800
commite22aa029fb4d923dc03748b435abd6330933b473 (patch)
treeeb1dfcaaadd8ec5439fd0b51c0b755c8fd4009e1
parente08a805b306398b316a489f76960569ac19b25b2 (diff)
downloadrust-e22aa029fb4d923dc03748b435abd6330933b473.tar.gz
rust-e22aa029fb4d923dc03748b435abd6330933b473.zip
core/syntax: Add transitional code for pipes
-rw-r--r--src/libcore/pipes.rs25
-rw-r--r--src/libsyntax/ext/pipes/pipec.rs28
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);