@@ -17,12 +17,12 @@ fn main() {
17
17
#[ cfg( not( target_os = "emscripten" ) ) ]
18
18
mod not_web {
19
19
20
- use std:: env:: args;
21
20
use env_logger;
22
- use r5rs:: reader :: * ;
21
+ use r5rs:: compiler :: * ;
23
22
use r5rs:: lexer:: * ;
23
+ use r5rs:: reader:: * ;
24
24
use r5rs:: vm:: * ;
25
- use r5rs :: compiler :: * ;
25
+ use std :: env :: { args , var } ;
26
26
27
27
use rustyline;
28
28
use rustyline:: error:: ReadlineError ;
@@ -31,14 +31,15 @@ mod not_web {
31
31
env_logger:: init ( ) . expect ( "logger" ) ;
32
32
33
33
let file = args ( ) . nth ( 1 ) ;
34
+ let with_profiler = var ( "PROFILE" ) . map ( |s| !s. is_empty ( ) ) . unwrap_or ( false ) ;
34
35
35
36
match file {
36
- Some ( file) => run_file ( file) ,
37
+ Some ( file) => run_file ( file, with_profiler ) ,
37
38
None => run_repl ( ) ,
38
39
}
39
40
}
40
41
41
- fn run_file ( file_path : String ) {
42
+ fn run_file ( file_path : String , with_profiler : bool ) {
42
43
use std:: fs:: File ;
43
44
use std:: io:: Read ;
44
45
@@ -50,16 +51,33 @@ mod not_web {
50
51
} ;
51
52
let environment = default_env ( ) ;
52
53
let mut last_value = None ;
54
+ let mut time_profiler = None ;
55
+
56
+ {
57
+ let callback = |result : Result < _ , _ > | {
58
+ let should_continue = result. is_ok ( ) ;
59
+ last_value = Some ( result) ;
60
+ should_continue
61
+ } ;
53
62
54
- interpret ( & source[ ..] , & environment, |result| {
55
- let should_continue = result. is_ok ( ) ;
56
- last_value = Some ( result) ;
57
- should_continue
58
- } ) ;
63
+ if with_profiler {
64
+ let mut profiler = TimeProfiler :: new ( ) ;
65
+ interpret ( & source[ ..] , & environment, & mut profiler, callback) ;
66
+ time_profiler = Some ( profiler) ;
67
+ } else {
68
+ interpret ( & source[ ..] , & environment, & mut NoopProfiler , callback) ;
69
+ }
70
+ }
59
71
60
72
if let Some ( Err ( err) ) = last_value {
61
73
println ! ( "{:?}" , err) ;
62
74
}
75
+
76
+ let profile_report = time_profiler. map ( |p| p. report ( ) ) . unwrap_or ( None ) ;
77
+
78
+ if let Some ( report) = profile_report {
79
+ eprintln ! ( "{}" , report) ;
80
+ }
63
81
}
64
82
65
83
fn run_repl ( ) {
@@ -76,22 +94,32 @@ mod not_web {
76
94
77
95
rl. add_history_entry ( & line) ;
78
96
79
- interpret ( & line[ ..] , & environment, |result : Result < Value , _ > | {
80
- let need_more = result. is_ok ( ) ;
81
- match result {
82
- Ok ( v) => println ! ( "{}" , v. to_repl( ) ) ,
83
- Err ( e) => {
84
- println ! ( "Error: {:?}" , e) ;
97
+ interpret (
98
+ & line[ ..] ,
99
+ & environment,
100
+ & mut NoopProfiler ,
101
+ |result : Result < Value , _ > | {
102
+ let need_more = result. is_ok ( ) ;
103
+ match result {
104
+ Ok ( v) => println ! ( "{}" , v. to_repl( ) ) ,
105
+ Err ( e) => {
106
+ println ! ( "Error: {:?}" , e) ;
107
+ }
85
108
}
86
- }
87
- need_more
88
- } )
109
+ need_more
110
+ } ,
111
+ )
89
112
}
90
113
}
91
114
92
- fn interpret < F > ( source : & str , environment : & GcShared < Environment > , mut cb : F )
93
- where
115
+ fn interpret < F , P > (
116
+ source : & str ,
117
+ environment : & GcShared < Environment > ,
118
+ profiler : & mut P ,
119
+ mut cb : F ,
120
+ ) where
94
121
F : FnMut ( Result < Value , ExecutionError > ) -> bool ,
122
+ P : Profiler ,
95
123
{
96
124
let mut tokens = match Tokens :: new ( source. chars ( ) ) . collect ( ) {
97
125
Ok ( tokens) => tokens,
@@ -122,7 +150,7 @@ mod not_web {
122
150
} ;
123
151
124
152
debug ! ( "Code:\n {:?}" , bytecode) ;
125
- let should_continue = cb ( exec ( & bytecode, environment. clone ( ) ) ) ;
153
+ let should_continue = cb ( exec ( & bytecode, environment. clone ( ) , profiler ) ) ;
126
154
127
155
if !should_continue {
128
156
break ;
0 commit comments