From d2fd074370d829d3d1dfbc6279f1fcbde769eeb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Sat, 30 Jan 2021 23:17:49 +0100 Subject: Add in the yield keyword --- src/vm.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index e2b9e57..60f723b 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -42,7 +42,9 @@ pub struct VM { } -enum OpResult { +#[derive(Eq, PartialEq)] +pub enum OpResult { + Yield, Continue, Done, } @@ -139,6 +141,11 @@ impl VM { self.stack.pop().unwrap(); } + Op::Yield => { + self.frame_mut().ip += 1; + return Ok(OpResult::Yield); + } + Op::PopUpvalue => { let value = self.stack.pop().unwrap(); let slot = self.stack.len(); @@ -427,7 +434,7 @@ impl VM { self.frame().block.borrow().ops[self.frame().ip]); } - pub fn run(&mut self, prog: &Prog) -> Result<(), Error>{ + pub fn init(&mut self, prog: &Prog) { let block = Rc::clone(&prog.blocks[0]); self.blobs = prog.blobs.clone(); self.extern_functions = prog.functions.clone(); @@ -441,6 +448,9 @@ impl VM { block, ip: 0 }); + } + + pub fn run(&mut self) -> Result { if self.print_blocks { println!("\n [[{}]]\n", "RUNNING".red()); @@ -452,8 +462,9 @@ impl VM { self.print_stack() } - if matches!(self.eval_op(self.op())?, OpResult::Done) { - return Ok(()); + let op = self.eval_op(self.op())?; + if matches!(op, OpResult::Done | OpResult::Yield) { + return Ok(op); } } } @@ -464,6 +475,8 @@ impl VM { Op::Jmp(_line) => {} + Op::Yield => {} + Op::Constant(ref value) => { match value.clone() { Value::Function(_, block) => { -- cgit v1.2.1