diff --git a/interpreter/src/error.rs b/interpreter/src/error.rs index bef079c..f17213f 100644 --- a/interpreter/src/error.rs +++ b/interpreter/src/error.rs @@ -48,6 +48,8 @@ pub enum RuntimeError { UndefinedAttribute { class: Rc, name: Box }, #[error("RuntimeError: {value} is not a valid superclass")] InvalidSuperclass { value: Value }, + #[error("RuntimeError: stack overflow")] + StackOverflow, } #[derive(Error, Debug)] diff --git a/interpreter/src/interpret.rs b/interpreter/src/interpret.rs index 264067b..d023f60 100644 --- a/interpreter/src/interpret.rs +++ b/interpreter/src/interpret.rs @@ -206,7 +206,7 @@ impl Eval for Expr { let mut methods: FxHashMap = FxHashMap::default(); // this is the scope "this" will get injected in - env.enter_scope(); + env.enter_scope()?; for method_expr in method_exprs.iter() { let method = method_expr.eval(env)?; @@ -280,7 +280,7 @@ impl Eval for Stmt { env.define(name.clone(), initializer); } Stmt::Block { statements } => { - env.enter_scope(); + env.enter_scope()?; for statement in statements { if let Err(err) = statement.eval(env) { env.exit_scope(); @@ -318,7 +318,7 @@ pub fn call_fun(fun: Rc, env: &mut Environment) -> EvalResult }, - #[error("Variable {name} not defined")] + #[error("ResolverError: Variable {name} not defined")] UnresolvableVariable { name: Box }, - #[error("Return outside of function definition")] + #[error("ResolverError: Return outside of function definition")] ReturnOutsideFunction, - #[error("this outside of method")] + #[error("ResolverError: this outside of method")] ThisOutsideMethod, - #[error("super outside of subclass method")] + #[error("ResolverError: super outside of subclass method")] SuperOutsideMethod, }