From 97ac17e917992b9668934caac48dfbaddfd4cdcb Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Thu, 1 Jun 2023 17:28:31 +1000 Subject: [PATCH] Partially implement yield* --- valuescript_vm/src/bytecode_stack_frame.rs | 5 ++++- valuescript_vm/src/generator.rs | 1 + valuescript_vm/src/stack_frame.rs | 1 + valuescript_vm/src/virtual_machine.rs | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/valuescript_vm/src/bytecode_stack_frame.rs b/valuescript_vm/src/bytecode_stack_frame.rs index 6c28007..f1104df 100644 --- a/valuescript_vm/src/bytecode_stack_frame.rs +++ b/valuescript_vm/src/bytecode_stack_frame.rs @@ -560,7 +560,10 @@ impl StackFrameTrait for BytecodeStackFrame { } YieldStar => { - panic!("TODO: yield*"); + let val = self.decoder.decode_val(&self.registers); + self.decoder.decode_register_index(); // TODO: Use this + + return Ok(FrameStepOk::YieldStar(val)); } }; diff --git a/valuescript_vm/src/generator.rs b/valuescript_vm/src/generator.rs index 7da2de5..d4193de 100644 --- a/valuescript_vm/src/generator.rs +++ b/valuescript_vm/src/generator.rs @@ -172,6 +172,7 @@ impl StackFrameTrait for GeneratorFrame { .to_dynamic_val(), this: take(&mut self.generator).to_dynamic_val(), })), + Ok(FrameStepOk::YieldStar(_)) => panic!("TODO: yield* (as instruction)"), } } diff --git a/valuescript_vm/src/stack_frame.rs b/valuescript_vm/src/stack_frame.rs index 80d66f9..0a29eab 100644 --- a/valuescript_vm/src/stack_frame.rs +++ b/valuescript_vm/src/stack_frame.rs @@ -13,6 +13,7 @@ pub enum FrameStepOk { Pop(CallResult), Push(StackFrame), Yield(Val), + YieldStar(Val), } pub type FrameStepResult = Result; diff --git a/valuescript_vm/src/virtual_machine.rs b/valuescript_vm/src/virtual_machine.rs index ac49a13..08db453 100644 --- a/valuescript_vm/src/virtual_machine.rs +++ b/valuescript_vm/src/virtual_machine.rs @@ -88,6 +88,7 @@ impl VirtualMachine { } // TODO: Internal errors FrameStepOk::Yield(_) => return self.handle_exception("Unexpected yield".to_error()), + FrameStepOk::YieldStar(_) => return self.handle_exception("Unexpected yield*".to_error()), } Ok(())