aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-02-11 18:42:04 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-02-11 18:42:04 +0100
commit4e6f4ff865a132df3e7a6f39f481f78c6fc1df47 (patch)
treea9f1ea95995b8b24758ee4d368313ec0e9809c3e /src/vm.rs
parent04b0c68a792cc9be4dea92bb8750d7990bd43cc8 (diff)
parentb09c97154886e1ca9e0a418f8969870a31f39077 (diff)
downloadsylt-4e6f4ff865a132df3e7a6f39f481f78c6fc1df47.tar.gz
Merge remote-tracking branch 'origin/main' into break-continue
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/vm.rs b/src/vm.rs
index 057fdba..c4d72a1 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -63,9 +63,10 @@ pub struct VM {
pub print_blocks: bool,
pub print_ops: bool,
+ runtime: bool,
- extern_functions: Vec<RustFunction>,
+ extern_functions: Vec<RustFunction>,
}
#[derive(Eq, PartialEq)]
@@ -92,6 +93,7 @@ impl VM {
print_blocks: false,
print_ops: false,
+ runtime: false,
extern_functions: Vec::new()
}
@@ -158,10 +160,25 @@ impl VM {
self.frame().block.borrow().ops[ip]
}
+ fn print_stacktrace(&self) {
+ if !self.runtime { return; }
+
+ println!("\n<{}>", "STACK".red());
+ for (i, frame) in self.frames.iter().enumerate() {
+ println!(" {:>3}. {}:{:<4} in {:10}",
+ i,
+ frame.block.borrow().file.display(),
+ frame.block.borrow().line(self.frame().ip),
+ frame.block.borrow().name.blue());
+ }
+ println!("")
+ }
+
/// Stop the program, violently
fn crash_and_burn(&self) -> ! {
self.print_stack();
println!("\n");
+ self.print_stacktrace();
self.frame().block.borrow().debug_print();
println!(" ip: {}, line: {}\n",
self.frame().ip.blue(),
@@ -171,6 +188,7 @@ impl VM {
fn error(&self, kind: ErrorKind, message: Option<String>) -> Error {
let frame = self.frames.last().unwrap();
+ self.print_stacktrace();
Error {
kind,
file: frame.block.borrow().file.clone(),
@@ -472,6 +490,7 @@ impl VM {
self.extern_functions = prog.functions.clone();
self.stack.clear();
self.frames.clear();
+ self.runtime = true;
self.push(Value::Function(Vec::new(), Rc::clone(&block)));
@@ -755,6 +774,7 @@ impl VM {
self.blobs = prog.blobs.clone();
self.constants = prog.constants.clone();
self.strings = prog.strings.clone();
+ self.runtime = false;
self.extern_functions = prog.functions.clone();
for block in prog.blocks.iter() {