From 1e889cc604f13acf6e2b3d346b8acfb8814ace58 Mon Sep 17 00:00:00 2001 From: numzero Date: Sat, 19 Apr 2025 14:01:15 +0300 Subject: [PATCH] eval! --- src/twopass.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/twopass.rs b/src/twopass.rs index 591805e..8d25ae4 100644 --- a/src/twopass.rs +++ b/src/twopass.rs @@ -359,11 +359,23 @@ impl Eval for Statement { } } +fn new_var(value: &types::Value) -> VariableRef { + Rc::new(Variable(RefCell::new(value.clone()))) +} + impl Function { - fn call(&self, upvalues: &[types::Value], args: &[types::Value]) -> types::Value { + fn call(&self, upvalues: &[VariableRef], args: &[types::Value]) -> types::Value { assert_eq!(upvalues.len(), self.upvalues.len()); assert_eq!(args.len(), self.args.len()); - todo!() + let ctx = RunContext { + args: args.iter().map(new_var).collect(), + locals: (0..self.locals.len()).map(|_| new_var(&None)).collect(), + upvalues: upvalues.to_vec(), + }; + for statement in &self.body { + statement.eval(&ctx); + } + self.ret.eval(&ctx) } } @@ -371,7 +383,7 @@ impl OpenFunction { pub fn call(&self, env: types::Value, args: &[types::Value]) -> types::Value { match self.0.upvalues.as_slice() { [] => self.0.call(&[], args), - [up] if up.0 == "_ENV" => self.0.call(&[env], args), + [up] if up.0 == "_ENV" => self.0.call(&[new_var(&env)], args), _ => unreachable!(), } }