aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 22:05:56 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-01-09 22:05:56 +0100
commita894b3642114f63209fb4b787187ba249672ccee (patch)
tree449156f6a34d928788d60c7f8b18682d040216ea /src/vm.rs
parent3ede943556bebb85427415f21ec231973da9e080 (diff)
downloadsylt-a894b3642114f63209fb4b787187ba249672ccee.tar.gz
Add line numbers
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/vm.rs b/src/vm.rs
index d45e4d6..a53b5a9 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -117,6 +117,19 @@ impl VM {
self.stack.get(self.stack.len() - amount)
}
+ fn print_error(&self) {
+ let find_line = || {
+ for i in (0..=self.ip).rev() {
+ if let Some(line) = self.block.line_offsets.get(&i) {
+ return *line;
+ }
+ }
+ return 0;
+ };
+
+ println!("RUNTIME ERROR OR LINE: {}", find_line());
+ }
+
pub fn run(&mut self) -> Result<(), VMError>{
const PRINT_WHILE_RUNNING: bool = true;
const PRINT_BLOCK: bool = true;
@@ -229,6 +242,7 @@ impl VM {
Op::AssertEqual => {
let (a, b) = self.pop_twice();
if a != b {
+ self.print_error();
println!("Assert failed for '{:?}' and '{:?}'", a, b);
}
self.stack.push(Value::Bool(a == b));