From 88e11748ff271a730bd6d20a7d6a6ab251d9fffe Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sat, 8 Aug 2026 00:19:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Error=20=E5=AE=B6=E6=97=8F=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=99=A8=E5=8F=AF=E6=9E=84=E9=80=A0=E6=A0=87=E5=BF=97?= =?UTF-8?q?=20+=20=E6=95=B0=E7=BB=84=E5=9B=9E=E8=B0=83=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E9=80=8F=E4=BC=A0=E5=8E=9F=E5=A7=8B=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/array.rs | 5 ++++- crates/oxide_vm/src/bindings/bind_error.rs | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/oxide_builtins/src/array.rs b/crates/oxide_builtins/src/array.rs index 6f0b67ad..5e45b3db 100644 --- a/crates/oxide_builtins/src/array.rs +++ b/crates/oxide_builtins/src/array.rs @@ -153,7 +153,10 @@ fn invoke_native_callback( } match vm.call_function_sync(callback_val, this_val, cb_args) { Ok(value) => NativeResult::Ok(value), - Err(err) => NativeResult::Err(callback_error_from_text(vm, &err)), + Err(err) => match vm.take_uncaught_value() { + Some(original) => NativeResult::Err(original), + None => NativeResult::Err(callback_error_from_text(vm, &err)), + }, } } diff --git a/crates/oxide_vm/src/bindings/bind_error.rs b/crates/oxide_vm/src/bindings/bind_error.rs index 3ac15520..2781a60a 100644 --- a/crates/oxide_vm/src/bindings/bind_error.rs +++ b/crates/oxide_vm/src/bindings/bind_error.rs @@ -16,6 +16,8 @@ fn bind_error_subtype_constructor( let mut ctor = Box::new(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::from_js_object(function_proto_ptr))); ctor.set_function(true); + // Error 子类型须标记可构造:new TypeError(...) 走 NEW_EXPRESSION 校验。 + ctor.type_tag = JsObject::OBJ_TYPE_CONSTRUCTOR; // SAFETY: ctor_fn 是调用方转成 *const () 的 NativeFn 函数项指针。 ctor.set_native_fn(Some(unsafe { NativeFnPtr::from_raw(ctor_fn) })); ctor.set_native_arg_count(1); @@ -121,6 +123,7 @@ pub fn bind_error(core: &Arc, session: &KernelSession, global: &mut { let err_ctor_ptr = session.builtin_world().error_constructor.as_ptr() as *mut JsObject; let err_ctor = unsafe { &mut *err_ctor_ptr }; + err_ctor.type_tag = JsObject::OBJ_TYPE_CONSTRUCTOR; // SAFETY: error_constructor 是 NativeFn 函数项。 err_ctor.set_native_fn(Some(unsafe { NativeFnPtr::from_raw(oxide_builtins::error::error_constructor:: as *const ())