aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-02-10 22:07:28 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-02-10 22:07:28 +0100
commitf88b11d224ae29bd4cdc52048a116cb45322271b (patch)
treece931a0c173fc7e2d294c192cc064ba0afa2201b /src/vm.rs
parent0f25e98b903f6608d09ad8bfd9ca5d00fec4cec6 (diff)
downloadsylt-f88b11d224ae29bd4cdc52048a116cb45322271b.tar.gz
add break and continue
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/vm.rs b/src/vm.rs
index e5c7b2e..057fdba 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -318,6 +318,20 @@ impl VM {
}
}
+ Op::JmpNPop(line, to_pop) => {
+ let hi = self.stack.len();
+ let lo = hi - to_pop;
+ for slot in lo..hi {
+ if self.upvalues.contains_key(&slot) {
+ let value = self.stack[slot].clone();
+ self.drop_upvalue(slot, value);
+ }
+ }
+ self.stack.truncate(lo);
+ self.frame_mut().ip = line;
+ return Ok(OpResult::Continue);
+ }
+
Op::Assert => {
if matches!(self.pop(), Value::Bool(false)) {
error!(self, ErrorKind::AssertFailed);
@@ -678,6 +692,9 @@ impl VM {
a => { error!(self, ErrorKind::TypeError(op, vec![a.into()])) },
}
}
+
+ Op::JmpNPop(_, _) => {}
+
_ => {
self.eval_op(op)?;
return Ok(())