mirror of
https://github.com/voltrevo/ValueScript.git
synced 2026-04-18 03:00:27 -04:00
Avoid throwing when register is void
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -42,7 +42,7 @@ impl VsFunction {
|
||||
}
|
||||
|
||||
while registers.len() < registers.capacity() {
|
||||
registers.push(Val::Undefined);
|
||||
registers.push(Val::Void);
|
||||
}
|
||||
|
||||
return Box::new(BytecodeStackFrame {
|
||||
|
||||
Reference in New Issue
Block a user