diff --git a/interpreter/src/class.rs b/interpreter/src/class.rs index dcdba20..7057fa2 100644 --- a/interpreter/src/class.rs +++ b/interpreter/src/class.rs @@ -32,7 +32,8 @@ impl LoxClass { let name = init.name().clone(); let closure = init.closure().clone(); let param_names = init.param_names().to_vec(); - let mut body = init.body().clone(); + + let mut body = init.body().as_ref().clone(); if let Stmt::Block { ref mut statements } = body { statements.push(Stmt::return_stmt(Expr::local_variable("this", 1))); @@ -40,6 +41,8 @@ impl LoxClass { panic!("Body of init method of class {name} wasn't a block"); } + let body = Rc::new(body); + let new_init = Value::function(LoxFunction::new(name, closure, param_names, body)); methods.insert("init".into(), new_init); diff --git a/interpreter/src/function.rs b/interpreter/src/function.rs index 227d9c9..11f2404 100644 --- a/interpreter/src/function.rs +++ b/interpreter/src/function.rs @@ -14,7 +14,7 @@ pub struct LoxFunction { name: SmolStr, closure: ClosureScope, param_names: Vec, - body: Stmt, + body: Rc, } impl LoxFunction { @@ -22,7 +22,7 @@ impl LoxFunction { name: impl Into, closure: ClosureScope, param_names: Vec, - body: Stmt, + body: Rc, ) -> Rc { let name = name.into(); let fun = LoxFunction { @@ -46,7 +46,7 @@ impl LoxFunction { &self.param_names } - pub fn body(&self) -> &Stmt { + pub fn body(&self) -> &Rc { &self.body } diff --git a/interpreter/src/interpreter.rs b/interpreter/src/interpreter.rs index b8695f3..9d211e0 100644 --- a/interpreter/src/interpreter.rs +++ b/interpreter/src/interpreter.rs @@ -185,7 +185,7 @@ impl Eval for Expr { let name = name.clone(); let closure = env.collect_closure(closure_vars); let param_names = param_names.clone(); - let body = body.as_ref().clone(); + let body = Rc::new(body.as_ref().clone()); Ok(Value::function(LoxFunction::new( name,