fixed closures

This commit is contained in:
Moritz Gmeiner 2024-09-03 00:48:10 +02:00
commit 671f7d5306
6 changed files with 106 additions and 72 deletions

View file

@ -182,12 +182,19 @@ impl Eval for Expr {
param_names,
closure_vars,
body,
} => Ok(Value::function(LoxFunction::new(
name.clone(),
env.collect_closure(closure_vars),
param_names.clone(),
body.as_ref().clone(),
))),
} => {
let name = name.clone();
let closure = env.collect_closure(closure_vars);
let param_names = param_names.clone();
let body = body.as_ref().clone();
Ok(Value::function(LoxFunction::new(
name,
closure,
param_names,
body,
)))
}
Expr::Class {
superclass,
name,
@ -315,7 +322,7 @@ pub fn call_fun(fun: Rc<LoxFunction>, env: &mut Environment) -> EvalResult<Value
env.enter_scope()?;
env.define(fun.name(), Value::Function(fun.clone()));
env.define(fun.name(), Value::Function(Rc::clone(&fun)));
env.insert_closure(fun.closure().clone());