diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index 6696675f..26da7736 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -964,14 +964,25 @@ impl Vm { } } Err(err_val) => { - return Err(format!("Native constructor error: {:?}", err_val)); + self.exception_value = Some(err_val); + self.pending_error_kind = Some("Error"); + match self.unwind() { + Ok(()) => continue, + Err(e) => return Err(e), + } } } } else { - // Bytecode constructor - wired in plan 12.1-03 - return Err( - "NEW_EXPRESSION: bytecode constructors not yet supported".into() + let error = crate::builtins::error::create_error( + self, + "NEW_EXPRESSION: bytecode constructors not yet supported", ); + self.exception_value = Some(error); + self.pending_error_kind = Some("Error"); + match self.unwind() { + Ok(()) => continue, + Err(e) => return Err(e), + } } } diff --git a/crates/oxide_vm/tests/regression_tests.rs b/crates/oxide_vm/tests/regression_tests.rs index 8375024f..38adee39 100644 --- a/crates/oxide_vm/tests/regression_tests.rs +++ b/crates/oxide_vm/tests/regression_tests.rs @@ -106,3 +106,21 @@ fn regression_vm_step_limit_is_configurable() { "expected configurable step limit error, got: {result}" ); } + +#[test] +fn regression_new_expression_native_constructor_error_is_catchable() { + assert_eq!( + eval("try { new RegExp('['); 0 } catch (e) { 1 }"), + "1", + "expected native constructor error to enter catch" + ); +} + +#[test] +fn regression_new_expression_bytecode_constructor_error_is_catchable() { + assert_eq!( + eval("try { function C() {} new C(); 0 } catch (e) { 1 }"), + "1", + "expected bytecode constructor capability error to enter catch" + ); +}