diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-02-11 18:43:47 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-11 18:43:47 +0100 |
| commit | 64a6bb6f9d5dec33815c88837c5cff98ddc18190 (patch) | |
| tree | a9f1ea95995b8b24758ee4d368313ec0e9809c3e /src/vm.rs | |
| parent | b09c97154886e1ca9e0a418f8969870a31f39077 (diff) | |
| parent | 4e6f4ff865a132df3e7a6f39f481f78c6fc1df47 (diff) | |
| download | sylt-64a6bb6f9d5dec33815c88837c5cff98ddc18190.tar.gz | |
Merge pull request #60 from FredTheDino/break-continue
break continue
Diffstat (limited to 'src/vm.rs')
| -rw-r--r-- | src/vm.rs | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -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(()) |
