From 7a8b388c69fd0b8113aeb134d86a9cc2ea736ffe Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Tue, 30 May 2023 16:47:17 +1000 Subject: [PATCH] Allow passing non-inline arrays as parameters --- valuescript_vm/src/bytecode_stack_frame.rs | 54 +++++++++++++++------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/valuescript_vm/src/bytecode_stack_frame.rs b/valuescript_vm/src/bytecode_stack_frame.rs index cf20414..27ee208 100644 --- a/valuescript_vm/src/bytecode_stack_frame.rs +++ b/valuescript_vm/src/bytecode_stack_frame.rs @@ -57,36 +57,56 @@ impl BytecodeStackFrame { } pub fn transfer_parameters(&mut self, new_frame: &mut StackFrame) { - let bytecode_type = self.decoder.decode_type(); + let bytecode_type = self.decoder.peek_type(); - if bytecode_type != BytecodeType::Array { - panic!("Not implemented: call instruction not using inline array"); + if bytecode_type == BytecodeType::Array { + self.decoder.decode_type(); + + while self.decoder.peek_type() != BytecodeType::End { + let p = self.decoder.decode_val(&self.registers); + new_frame.write_param(p); + } + + self.decoder.decode_type(); // End (TODO: assert) + + return; } - while self.decoder.peek_type() != BytecodeType::End { - let p = self.decoder.decode_val(&self.registers); - new_frame.write_param(p); - } + let params = self.decoder.decode_val(&self.registers); - self.decoder.decode_type(); // End (TODO: assert) + match params { + Val::Array(array_data) => { + for param in &array_data.elements { + new_frame.write_param(param.clone()) + } + } + _ => panic!("Unexpected non-array params"), + } } pub fn decode_parameters(&mut self) -> Vec { let mut res = Vec::::new(); - let bytecode_type = self.decoder.decode_type(); + let bytecode_type = self.decoder.peek_type(); - if bytecode_type != BytecodeType::Array { - panic!("Not implemented: call instruction not using inline array"); + if bytecode_type == BytecodeType::Array { + self.decoder.decode_type(); + + while self.decoder.peek_type() != BytecodeType::End { + res.push(self.decoder.decode_val(&self.registers)); + } + + self.decoder.decode_type(); // End (TODO: assert) + + return res; } - while self.decoder.peek_type() != BytecodeType::End { - res.push(self.decoder.decode_val(&self.registers)); + let params = self.decoder.decode_val(&self.registers); + + match params { + Val::Array(array_data) => array_data.elements.clone(), + _ => panic!("Unexpected non-array params"), } - - self.decoder.decode_type(); // End (TODO: assert) - - return res; } }