From d8bbd362b80e07742eca5c8382ebfb19f505422c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Tue, 12 Jan 2021 22:30:11 +0100 Subject: Fix if-statements, also colors... BLEH --- src/vm.rs | 52 ++++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 24 deletions(-) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index bc3b1e8..4c09756 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -77,23 +77,45 @@ impl Block { } } - pub fn line(&mut self, token_position: usize) { + pub fn add_line(&mut self, token_position: usize) { if token_position != self.last_line_offset { self.line_offsets.insert(self.curr(), token_position); self.last_line_offset = token_position; } } + fn line(&self, ip: usize) -> usize { + for i in (0..=ip).rev() { + if let Some(line) = self.line_offsets.get(&i) { + return *line; + } + } + return 0; + } + + pub fn debug_print(&self) { + println!(" === {} ===", self.name.blue()); + for (i, s) in self.ops.iter().enumerate() { + if self.line_offsets.contains_key(&i) { + print!("{:5} ", self.line_offsets[&i].red()); + } else { + print!(" {} ", "|".red()); + } + println!("{:05} {:?}", i.blue(), s); + } + println!(""); + } + pub fn add(&mut self, op: Op, token_position: usize) -> usize { let len = self.curr(); - self.line(token_position); + self.add_line(token_position); self.ops.push(op); len } pub fn add_from(&mut self, ops: &[Op], token_position: usize) -> usize { let len = self.curr(); - self.line(token_position); + self.add_line(token_position); self.ops.extend_from_slice(ops); len } @@ -138,20 +160,11 @@ impl VM { self.stack.get(self.stack.len() - amount) } - fn line(&self) -> usize { - for i in (0..=self.ip).rev() { - if let Some(line) = self.block.line_offsets.get(&i) { - return *line; - } - } - return 0; - } - fn error(&self, kind: ErrorKind, message: Option) -> Error { Error { kind, file: self.block.file.clone(), - line: self.line(), + line: self.block.line(self.ip), message, } } @@ -161,16 +174,7 @@ impl VM { const PRINT_BLOCK: bool = true; if PRINT_BLOCK { - println!(" === {} ===", self.block.name.blue()); - for (i, s) in self.block.ops.iter().enumerate() { - if self.block.line_offsets.contains_key(&i) { - print!("{:5} ", self.block.line_offsets[&i].red()); - } else { - print!(" {} ", "|".red()); - } - println!("{:05} {:?}", i.blue(), s); - } - println!(""); + self.block.debug_print(); } loop { @@ -187,7 +191,7 @@ impl VM { } println!("]"); - println!("{:5} {:05} {:?}", self.line().red(), self.ip.blue(), self.block.ops[self.ip]); + println!("{:5} {:05} {:?}", self.block.line(self.ip).red(), self.ip.blue(), self.block.ops[self.ip]); } let op = self.block.ops[self.ip].clone(); -- cgit v1.2.1