Skip to content

Commit 7f5f1f9

Browse files
committed
Compiled a bounded version of pingpong.
There are some failures in the other pipe tests, but these seem to just be a matter of generalizing the library code. Updating pipes library so all tests pass again
1 parent b97fe98 commit 7f5f1f9

File tree

6 files changed

+265
-59
lines changed

6 files changed

+265
-59
lines changed

src/libcore/pipes.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import arc::methods;
88
// Things used by code generated by the pipe compiler.
99
export entangle, get_buffer, drop_buffer;
1010
export send_packet_buffered, recv_packet_buffered;
11-
export mk_packet, entangle_buffer, has_buffer;
11+
export packet, mk_packet, entangle_buffer, has_buffer;
1212

1313
// export these so we can find them in the buffer_resource
1414
// destructor. This is probably another metadata bug.
@@ -376,7 +376,7 @@ fn try_recv<T: send, Tbuffer: send>(-p: recv_packet_buffered<T, Tbuffer>)
376376
}
377377

378378
/// Returns true if messages are available.
379-
pure fn peek<T: send>(p: recv_packet<T>) -> bool {
379+
pure fn peek<T: send, Tb: send>(p: recv_packet_buffered<T, Tb>) -> bool {
380380
alt unsafe {(*p.header()).state} {
381381
empty { false }
382382
blocked { fail ~"peeking on blocked packet" }
@@ -480,10 +480,11 @@ fn wait_many(pkts: &[*packet_header]) -> uint {
480480
ready_packet
481481
}
482482

483-
fn select2<A: send, B: send>(
484-
+a: recv_packet<A>,
485-
+b: recv_packet<B>)
486-
-> either<(option<A>, recv_packet<B>), (recv_packet<A>, option<B>)>
483+
fn select2<A: send, Ab: send, B: send, Bb: send>(
484+
+a: recv_packet_buffered<A, Ab>,
485+
+b: recv_packet_buffered<B, Bb>)
486+
-> either<(option<A>, recv_packet_buffered<B, Bb>),
487+
(recv_packet_buffered<A, Ab>, option<B>)>
487488
{
488489
let i = wait_many([a.header(), b.header()]/_);
489490

@@ -514,8 +515,8 @@ fn select2i<A: selectable, B: selectable>(a: A, b: B) -> either<(), ()> {
514515

515516
#[doc = "Waits on a set of endpoints. Returns a message, its index,
516517
and a list of the remaining endpoints."]
517-
fn select<T: send>(+endpoints: ~[recv_packet<T>])
518-
-> (uint, option<T>, ~[recv_packet<T>])
518+
fn select<T: send, Tb: send>(+endpoints: ~[recv_packet_buffered<T, Tb>])
519+
-> (uint, option<T>, ~[recv_packet_buffered<T, Tb>])
519520
{
520521
let ready = wait_many(endpoints.map(|p| p.header()));
521522
let mut remaining = ~[];
@@ -657,10 +658,11 @@ fn entangle<T: send>() -> (send_packet<T>, recv_packet<T>) {
657658
(send_packet(p), recv_packet(p))
658659
}
659660

660-
fn spawn_service<T: send>(
661-
init: extern fn() -> (send_packet<T>, recv_packet<T>),
662-
+service: fn~(+recv_packet<T>))
663-
-> send_packet<T>
661+
fn spawn_service<T: send, Tb: send>(
662+
init: extern fn() -> (send_packet_buffered<T, Tb>,
663+
recv_packet_buffered<T, Tb>),
664+
+service: fn~(+recv_packet_buffered<T, Tb>))
665+
-> send_packet_buffered<T, Tb>
664666
{
665667
let (client, server) = init();
666668

@@ -676,10 +678,11 @@ fn spawn_service<T: send>(
676678
client
677679
}
678680

679-
fn spawn_service_recv<T: send>(
680-
init: extern fn() -> (recv_packet<T>, send_packet<T>),
681-
+service: fn~(+send_packet<T>))
682-
-> recv_packet<T>
681+
fn spawn_service_recv<T: send, Tb: send>(
682+
init: extern fn() -> (recv_packet_buffered<T, Tb>,
683+
send_packet_buffered<T, Tb>),
684+
+service: fn~(+send_packet_buffered<T, Tb>))
685+
-> recv_packet_buffered<T, Tb>
683686
{
684687
let (client, server) = init();
685688

src/libsyntax/ext/pipes/ast_builder.rs

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ import ast::{ident, node_id};
77
import codemap::span;
88
import ext::base::mk_ctxt;
99

10+
// Transitional reexports so qquote can find the paths it is looking for
11+
mod syntax {
12+
import ext;
13+
export ext;
14+
import parse;
15+
export parse;
16+
}
17+
1018
fn ident(s: ~str) -> ast::ident {
1119
@(copy s)
1220
}
@@ -93,9 +101,60 @@ trait ext_ctxt_ast_builder {
93101
fn ty_vars(+ty_params: ~[ast::ty_param]) -> ~[@ast::ty];
94102
fn ty_field_imm(name: ident, ty: @ast::ty) -> ast::ty_field;
95103
fn ty_rec(+~[ast::ty_field]) -> @ast::ty;
104+
fn field_imm(name: ident, e: @ast::expr) -> ast::field;
105+
fn rec(+~[ast::field]) -> @ast::expr;
106+
fn block(+stmts: ~[@ast::stmt], e: @ast::expr) -> ast::blk;
107+
fn stmt_let(ident: ident, e: @ast::expr) -> @ast::stmt;
108+
fn stmt_expr(e: @ast::expr) -> @ast::stmt;
109+
fn block_expr(b: ast::blk) -> @ast::expr;
96110
}
97111

98112
impl ast_builder of ext_ctxt_ast_builder for ext_ctxt {
113+
fn block_expr(b: ast::blk) -> @ast::expr {
114+
@{id: self.next_id(),
115+
callee_id: self.next_id(),
116+
node: ast::expr_block(b),
117+
span: empty_span()}
118+
}
119+
120+
fn stmt_expr(e: @ast::expr) -> @ast::stmt {
121+
@{node: ast::stmt_expr(e, self.next_id()),
122+
span: empty_span()}
123+
}
124+
125+
fn stmt_let(ident: ident, e: @ast::expr) -> @ast::stmt {
126+
// If the quasiquoter could interpolate idents, this is all
127+
// we'd need.
128+
//
129+
//let ext_cx = self;
130+
//#ast[stmt] { let $(ident) = $(e) }
131+
132+
@{node: ast::stmt_decl(@{node: ast::decl_local(~[
133+
@{node: {is_mutbl: false,
134+
ty: self.ty_infer(),
135+
pat: @{id: self.next_id(),
136+
node: ast::pat_ident(path(ident), none),
137+
span: empty_span()},
138+
init: some({op: ast::init_move,
139+
expr: e}),
140+
id: self.next_id()},
141+
span: empty_span()}]),
142+
span: empty_span()}, self.next_id()),
143+
span: empty_span()}
144+
}
145+
146+
fn field_imm(name: ident, e: @ast::expr) -> ast::field {
147+
{node: {mutbl: ast::m_imm, ident: name, expr: e},
148+
span: empty_span()}
149+
}
150+
151+
fn rec(+fields: ~[ast::field]) -> @ast::expr {
152+
@{id: self.next_id(),
153+
callee_id: self.next_id(),
154+
node: ast::expr_rec(fields, none),
155+
span: empty_span()}
156+
}
157+
99158
fn ty_field_imm(name: ident, ty: @ast::ty) -> ast::ty_field {
100159
{node: {ident: name, mt: { ty: ty, mutbl: ast::m_imm } },
101160
span: empty_span()}
@@ -107,6 +166,12 @@ impl ast_builder of ext_ctxt_ast_builder for ext_ctxt {
107166
span: empty_span()}
108167
}
109168

169+
fn ty_infer() -> @ast::ty {
170+
@{id: self.next_id(),
171+
node: ast::ty_infer,
172+
span: empty_span()}
173+
}
174+
110175
fn ty_param(id: ast::ident, +bounds: ~[ast::ty_param_bound])
111176
-> ast::ty_param
112177
{
@@ -128,9 +193,9 @@ impl ast_builder of ext_ctxt_ast_builder for ext_ctxt {
128193
id: self.next_id()}
129194
}
130195

131-
fn expr_block(e: @ast::expr) -> ast::blk {
196+
fn block(+stmts: ~[@ast::stmt], e: @ast::expr) -> ast::blk {
132197
let blk = {view_items: ~[],
133-
stmts: ~[],
198+
stmts: stmts,
134199
expr: some(e),
135200
id: self.next_id(),
136201
rules: ast::default_blk};
@@ -139,6 +204,10 @@ impl ast_builder of ext_ctxt_ast_builder for ext_ctxt {
139204
span: empty_span()}
140205
}
141206

207+
fn expr_block(e: @ast::expr) -> ast::blk {
208+
self.block(~[], e)
209+
}
210+
142211
fn fn_decl(+inputs: ~[ast::arg],
143212
output: @ast::ty) -> ast::fn_decl {
144213
{inputs: inputs,

0 commit comments

Comments
 (0)