|
2 | 2 | // Licensed under the MIT License.
|
3 | 3 |
|
4 | 4 | #![warn(clippy::mod_module_files, clippy::pedantic, clippy::unwrap_used)]
|
| 5 | +#![allow(unused)] |
5 | 6 |
|
6 | 7 | #[cfg(test)]
|
7 | 8 | mod tests;
|
8 | 9 |
|
9 | 10 | pub mod debug;
|
10 | 11 | mod intrinsic;
|
11 | 12 | pub mod output;
|
| 13 | +mod stackless; |
12 | 14 | pub mod val;
|
13 | 15 |
|
14 | 16 | use crate::val::{ConversionError, FunctorApp, Value};
|
@@ -217,50 +219,54 @@ impl<'a, F: Fn(GlobalId) -> Option<&'a CallableDecl>> GlobalLookup<'a> for F {
|
217 | 219 | /// # Errors
|
218 | 220 | /// Returns the first error encountered during execution.
|
219 | 221 | pub fn eval_stmt<'a>(
|
220 |
| - stmt: &Stmt, |
| 222 | + stmt: &'a Stmt, |
221 | 223 | globals: &'a impl GlobalLookup<'a>,
|
222 | 224 | package: PackageId,
|
223 |
| - env: &mut Env, |
| 225 | + env: &'a mut Env, |
224 | 226 | out: &'a mut dyn Receiver,
|
225 | 227 | ) -> 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 |
239 | 243 | }
|
240 | 244 |
|
241 | 245 | /// Evaluates the given expression with the given context.
|
242 | 246 | /// # Errors
|
243 | 247 | /// Returns the first error encountered during execution.
|
244 | 248 | pub fn eval_expr<'a>(
|
245 |
| - expr: &Expr, |
| 249 | + expr: &'a Expr, |
246 | 250 | globals: &'a impl GlobalLookup<'a>,
|
247 | 251 | package: PackageId,
|
248 |
| - env: &mut Env, |
| 252 | + env: &'a mut Env, |
249 | 253 | out: &'a mut dyn Receiver,
|
250 | 254 | ) -> 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 |
264 | 270 | }
|
265 | 271 |
|
266 | 272 | pub fn init() {
|
|
0 commit comments