aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-02-11 18:43:47 +0100
committerGitHub <noreply@github.com>2021-02-11 18:43:47 +0100
commit64a6bb6f9d5dec33815c88837c5cff98ddc18190 (patch)
treea9f1ea95995b8b24758ee4d368313ec0e9809c3e /src/vm.rs
parentb09c97154886e1ca9e0a418f8969870a31f39077 (diff)
parent4e6f4ff865a132df3e7a6f39f481f78c6fc1df47 (diff)
downloadsylt-64a6bb6f9d5dec33815c88837c5cff98ddc18190.tar.gz
Merge pull request #60 from FredTheDino/break-continue
break 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 d238087..c4d72a1 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -336,6 +336,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);
@@ -697,6 +711,9 @@ impl VM {
a => { error!(self, ErrorKind::TypeError(op, vec![a.into()])) },
}
}
+
+ Op::JmpNPop(_, _) => {}
+
_ => {
self.eval_op(op)?;
return Ok(())