@@ -21,7 +21,7 @@ import rustc::middle::resolve;
21
21
22
22
export ctxt;
23
23
export ctxt_handler;
24
- export srv;
24
+ export srv:: { } ;
25
25
export from_str;
26
26
export from_file;
27
27
export exec;
@@ -34,31 +34,71 @@ type ctxt = {
34
34
35
35
type srv_owner < T > = fn ( srv : srv ) -> T ;
36
36
type ctxt_handler < T > = fn ~( ctxt : ctxt ) -> T ;
37
+ type parser = fn ~( session:: session , str ) -> @ast:: crate ;
37
38
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>
40
46
} ;
41
47
42
48
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
+ }
44
51
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
+ } ) ;
49
63
50
- owner ( srv)
64
+ let res = owner ( srv_) ;
65
+ comm:: send ( srv_. ch , exit) ;
66
+ ret res;
51
67
}
52
68
53
- fn from_file < T > ( file : str , owner : srv_owner < T > ) -> T {
69
+ fn act ( po : comm :: port < msg > , source : str , parse : parser ) {
54
70
let ( sess, ignore_errors) = build_session ( ) ;
55
71
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
+ }
60
90
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)
62
102
}
63
103
64
104
fn build_ctxt ( sess : session:: session , ast : @ast:: crate ,
@@ -242,13 +282,6 @@ fn should_ignore_external_import_paths_that_dont_exist() {
242
282
from_str ( source) { |_srv| }
243
283
}
244
284
245
- fn exec < T : send > (
246
- srv : srv ,
247
- f : fn ~( ctxt : ctxt ) -> T
248
- ) -> T {
249
- f ( srv. ctxt )
250
- }
251
-
252
285
#[ test]
253
286
fn srv_should_return_request_result ( ) {
254
287
let source = "fn a() { }" ;
0 commit comments