Skip to content

Commit fc6e188

Browse files
committed
---
yaml --- r: 11405 b: refs/heads/master c: 7599d2d h: refs/heads/master i: 11403: 3ac62a4 v: v3
1 parent 0cc660e commit fc6e188

File tree

2 files changed

+56
-23
lines changed

2 files changed

+56
-23
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 96e3031675aba427c1cff8967f2c1cbbcdb6b5ff
2+
refs/heads/master: 7599d2dd51eb76892c929404dd7b49265e9f7c8f
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/rustdoc/astsrv.rs

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import rustc::middle::resolve;
2121

2222
export ctxt;
2323
export ctxt_handler;
24-
export srv;
24+
export srv::{};
2525
export from_str;
2626
export from_file;
2727
export exec;
@@ -34,31 +34,71 @@ type ctxt = {
3434

3535
type srv_owner<T> = fn(srv: srv) -> T;
3636
type ctxt_handler<T> = fn~(ctxt: ctxt) -> T;
37+
type parser = fn~(session::session, str) -> @ast::crate;
3738

38-
type srv = {
39-
ctxt: ctxt
39+
enum msg {
40+
handle_request(fn~(ctxt)),
41+
exit
42+
}
43+
44+
enum srv = {
45+
ch: comm::chan<msg>
4046
};
4147

4248
fn from_str<T>(source: str, owner: srv_owner<T>) -> T {
43-
let (sess, ignore_errors) = build_session();
49+
run(owner, source, parse::from_str_sess)
50+
}
4451

45-
let srv = {
46-
ctxt: build_ctxt(sess, parse::from_str_sess(sess, source),
47-
ignore_errors)
48-
};
52+
fn from_file<T>(file: str, owner: srv_owner<T>) -> T {
53+
run(owner, file, parse::from_file_sess)
54+
}
55+
56+
fn run<T>(owner: srv_owner<T>, source: str, parse: parser) -> T {
57+
58+
let srv_ = srv({
59+
ch: task::spawn_listener {|po|
60+
act(po, source, parse);
61+
}
62+
});
4963

50-
owner(srv)
64+
let res = owner(srv_);
65+
comm::send(srv_.ch, exit);
66+
ret res;
5167
}
5268

53-
fn from_file<T>(file: str, owner: srv_owner<T>) -> T {
69+
fn act(po: comm::port<msg>, source: str, parse: parser) {
5470
let (sess, ignore_errors) = build_session();
5571

56-
let srv = {
57-
ctxt: build_ctxt(sess, parse::from_file_sess(sess, file),
58-
ignore_errors)
59-
};
72+
let ctxt = build_ctxt(
73+
sess,
74+
parse(sess, source),
75+
ignore_errors
76+
);
77+
78+
let keep_going = true;
79+
while keep_going {
80+
alt comm::recv(po) {
81+
handle_request(f) {
82+
f(ctxt);
83+
}
84+
exit {
85+
keep_going = false;
86+
}
87+
}
88+
}
89+
}
6090

61-
owner(srv)
91+
fn exec<T:send>(
92+
srv: srv,
93+
+f: fn~(ctxt: ctxt) -> T
94+
) -> T {
95+
let po = comm::port();
96+
let ch = comm::chan(po);
97+
let msg = handle_request(fn~[move f](ctxt: ctxt) {
98+
comm::send(ch, f(ctxt))
99+
});
100+
comm::send(srv.ch, msg);
101+
comm::recv(po)
62102
}
63103

64104
fn build_ctxt(sess: session::session, ast: @ast::crate,
@@ -242,13 +282,6 @@ fn should_ignore_external_import_paths_that_dont_exist() {
242282
from_str(source) {|_srv| }
243283
}
244284

245-
fn exec<T:send>(
246-
srv: srv,
247-
f: fn~(ctxt: ctxt) -> T
248-
) -> T {
249-
f(srv.ctxt)
250-
}
251-
252285
#[test]
253286
fn srv_should_return_request_result() {
254287
let source = "fn a() { }";

0 commit comments

Comments
 (0)