From f88b11d224ae29bd4cdc52048a116cb45322271b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Wed, 10 Feb 2021 22:07:28 +0100 Subject: add break and continue --- src/vm.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/vm.rs') 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(()) -- cgit v1.2.1