Skip to content

Commit d268b4e

Browse files
committed
Refactor evaluator for stackless execution
1 parent 30b69c9 commit d268b4e

File tree

9 files changed

+1586
-118
lines changed

9 files changed

+1586
-118
lines changed

compiler/qsc_eval/src/lib.rs

+36-30
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
// Licensed under the MIT License.
33

44
#![warn(clippy::mod_module_files, clippy::pedantic, clippy::unwrap_used)]
5+
#![allow(unused)]
56

67
#[cfg(test)]
78
mod tests;
89

910
pub mod debug;
1011
mod intrinsic;
1112
pub mod output;
13+
mod stackless;
1214
pub mod val;
1315

1416
use crate::val::{ConversionError, FunctorApp, Value};
@@ -217,50 +219,54 @@ impl<'a, F: Fn(GlobalId) -> Option<&'a CallableDecl>> GlobalLookup<'a> for F {
217219
/// # Errors
218220
/// Returns the first error encountered during execution.
219221
pub fn eval_stmt<'a>(
220-
stmt: &Stmt,
222+
stmt: &'a Stmt,
221223
globals: &'a impl GlobalLookup<'a>,
222224
package: PackageId,
223-
env: &mut Env,
225+
env: &'a mut Env,
224226
out: &'a mut dyn Receiver,
225227
) -> Result<Value, (Error, CallStack)> {
226-
let mut eval = Evaluator {
227-
globals,
228-
package,
229-
env: take(env),
230-
call_stack: CallStack::default(),
231-
out: Some(out),
232-
};
233-
let res = match eval.eval_stmt(stmt) {
234-
Continue(res) | Break(Reason::Return(res)) => Ok(res),
235-
Break(Reason::Error(error)) => Err((error, eval.call_stack.clone())),
236-
};
237-
*env = take(&mut eval.env);
238-
res
228+
stackless::eval_stmt(stmt, globals, package, env, out)
229+
230+
// let mut eval = Evaluator {
231+
// globals,
232+
// package,
233+
// env: take(env),
234+
// call_stack: CallStack::default(),
235+
// out: Some(out),
236+
// };
237+
// let res = match eval.eval_stmt(stmt) {
238+
// Continue(res) | Break(Reason::Return(res)) => Ok(res),
239+
// Break(Reason::Error(error)) => Err((error, eval.call_stack.clone())),
240+
// };
241+
// *env = take(&mut eval.env);
242+
// res
239243
}
240244

241245
/// Evaluates the given expression with the given context.
242246
/// # Errors
243247
/// Returns the first error encountered during execution.
244248
pub fn eval_expr<'a>(
245-
expr: &Expr,
249+
expr: &'a Expr,
246250
globals: &'a impl GlobalLookup<'a>,
247251
package: PackageId,
248-
env: &mut Env,
252+
env: &'a mut Env,
249253
out: &'a mut dyn Receiver,
250254
) -> Result<Value, (Error, CallStack)> {
251-
let mut eval = Evaluator {
252-
globals,
253-
package,
254-
env: take(env),
255-
call_stack: CallStack::default(),
256-
out: Some(out),
257-
};
258-
let res = match eval.eval_expr(expr) {
259-
Continue(res) | Break(Reason::Return(res)) => Ok(res),
260-
Break(Reason::Error(error)) => Err((error, eval.call_stack.clone())),
261-
};
262-
*env = take(&mut eval.env);
263-
res
255+
stackless::eval_expr(expr, globals, package, env, out)
256+
257+
// let mut eval = Evaluator {
258+
// globals,
259+
// package,
260+
// env: take(env),
261+
// call_stack: CallStack::default(),
262+
// out: Some(out),
263+
// };
264+
// let res = match eval.eval_expr(expr) {
265+
// Continue(res) | Break(Reason::Return(res)) => Ok(res),
266+
// Break(Reason::Error(error)) => Err((error, eval.call_stack.clone())),
267+
// };
268+
// *env = take(&mut eval.env);
269+
// res
264270
}
265271

266272
pub fn init() {

0 commit comments

Comments
 (0)