From 2f5b954b7c3964b9a06f0e5ffd5275d399ae5aca Mon Sep 17 00:00:00 2001 From: Erin Date: Sun, 29 Aug 2021 00:16:15 +0200 Subject: [PATCH] Eval errors are now correctly spanned --- ablescript/src/interpret.rs | 5 ++++- ablescript/src/variables.rs | 34 +++++++--------------------------- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/ablescript/src/interpret.rs b/ablescript/src/interpret.rs index 656583a9..cf85a10f 100644 --- a/ablescript/src/interpret.rs +++ b/ablescript/src/interpret.rs @@ -355,7 +355,10 @@ impl ExecEnv { } let stmts = crate::parser::Parser::new(&code).init()?; - self.eval_stmts(&stmts)?; + self.eval_stmts(&stmts).map_err(|x| Error { + span: span.clone(), + ..x + })?; } } Ok(()) diff --git a/ablescript/src/variables.rs b/ablescript/src/variables.rs index 3a5b186b..5d3eada3 100644 --- a/ablescript/src/variables.rs +++ b/ablescript/src/variables.rs @@ -93,11 +93,16 @@ impl Value { Value::Abool(a) => a as _, Value::Bool(b) => b as _, Value::Functio(func) => match func { + // Compares lengths of functions: + // BfFunctio - Sum of lengths of instructions and length of tape + // AbleFunctio - Sum of argument count and body length + // Eval - Length of input code + Functio::BfFunctio { instructions, tape_len, } => (instructions.len() + tape_len) as _, - Functio::AbleFunctio { params, body } => (params.len() + body.len()) as _, + Functio::AbleFunctio { params, body } => (params.len() + format!("{:?}", body).len()) as _, Functio::Eval(s) => s.len() as _, }, Value::Int(i) => i, @@ -361,32 +366,7 @@ impl PartialOrd for Value { Value::Int(i) => Some(i.cmp(&other.into_i32())), Value::Bool(b) => Some(b.cmp(&other.into_bool())), Value::Abool(a) => a.partial_cmp(&other.into_abool()), - Value::Functio(f) => { - // Compares lengths of functions: - // BfFunctio - Sum of lengths of instructions and length of tape - // AbleFunctio - Sum of argument count and body length - // Eval - Length of input code - - let selfl = match f { - Functio::BfFunctio { - instructions, - tape_len, - } => instructions.len() + tape_len, - Functio::AbleFunctio { params, body } => params.len() + body.len(), - Functio::Eval(s) => s.len(), - }; - - let otherl = match other.into_functio() { - Functio::BfFunctio { - instructions, - tape_len, - } => instructions.len() + tape_len, - Functio::AbleFunctio { params, body } => params.len() + body.len(), - Functio::Eval(s) => s.len(), - }; - - Some(selfl.cmp(&otherl)) - } + Value::Functio(_) => self.clone().into_i32().partial_cmp(&other.into_i32()), Value::Cart(c) => Some(c.len().cmp(&other.into_cart().len())), } }