diff --git a/valuescript_vm/src/bytecode_decoder.rs b/valuescript_vm/src/bytecode_decoder.rs index 59bd17b..3dee123 100644 --- a/valuescript_vm/src/bytecode_decoder.rs +++ b/valuescript_vm/src/bytecode_decoder.rs @@ -132,7 +132,10 @@ impl BytecodeDecoder { } BytecodeType::Function => self.decode_function_header(), BytecodeType::Pointer => self.decode_pointer(), - BytecodeType::Register => registers[self.decode_register_index().unwrap()].clone(), + BytecodeType::Register => match registers[self.decode_register_index().unwrap()].clone() { + Val::Void => Val::Undefined, + val => val, + }, BytecodeType::Builtin => Val::Static(BUILTIN_VALS[self.decode_varsize_uint()]), BytecodeType::Class => Val::Class(Rc::new(VsClass { constructor: self.decode_val(registers), diff --git a/valuescript_vm/src/bytecode_stack_frame.rs b/valuescript_vm/src/bytecode_stack_frame.rs index cd546c1..e83e57a 100644 --- a/valuescript_vm/src/bytecode_stack_frame.rs +++ b/valuescript_vm/src/bytecode_stack_frame.rs @@ -403,8 +403,20 @@ impl StackFrameTrait for BytecodeStackFrame { } Throw => { - let error = self.decoder.decode_val(&self.registers); - return Err(error); + return match self.decoder.peek_type() { + BytecodeType::Register => { + self.decoder.decode_type(); + + // Avoid the void->undefined conversion here + let error = self.registers[self.decoder.decode_register_index().unwrap()].clone(); + + match error { + Val::Void => Ok(FrameStepOk::Continue), + _ => Err(error), + } + } + _ => Err(self.decoder.decode_val(&self.registers)), + }; } Import | ImportStar => { diff --git a/valuescript_vm/src/vs_function.rs b/valuescript_vm/src/vs_function.rs index d100d87..cc3c490 100644 --- a/valuescript_vm/src/vs_function.rs +++ b/valuescript_vm/src/vs_function.rs @@ -42,7 +42,7 @@ impl VsFunction { } while registers.len() < registers.capacity() { - registers.push(Val::Undefined); + registers.push(Val::Void); } return Box::new(BytecodeStackFrame {