fix: 数组长度定义异常原值抛出并保留错误类型

This commit is contained in:
2026-09-18 02:42:11 +00:00
parent a6411a495d
commit b45f979db7
9 changed files with 144 additions and 33 deletions
+11 -1
View File
@@ -848,6 +848,11 @@ pub fn object_define_property<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResul
let si = vm.property_key_si(vm.reg(args[2]));
if let Err(msg) = define_from_descriptor(vm, obj_ptr, si, vm.reg(args[3])) {
// 强转期用户代码(valueOf / Symbol.toPrimitive)抛出的异常值转存专用槽,
// 须原值重抛而非改写成引擎 TypeError。
if let Some(exc) = vm.take_pending_length_exception() {
return NativeResult::Err(exc);
}
return NativeResult::Err(crate::error::create_define_failure(vm, &msg));
}
NativeResult::Ok(obj_val)
@@ -1217,7 +1222,12 @@ pub fn object_define_properties<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeRes
Err(err) => return NativeResult::Err(err),
};
if let Err(msg) = define_all_from_properties(vm, target_ptr, vm.reg(args[2])) {
return NativeResult::Err(crate::error::create_type_error(vm, &msg));
// 与单属性入口一致:强转期用户异常原值重抛,非法 length 以 RangeError
// kind 穿透,其余 define 失败投影为 TypeError。
if let Some(exc) = vm.take_pending_length_exception() {
return NativeResult::Err(exc);
}
return NativeResult::Err(crate::error::create_define_failure(vm, &msg));
}
NativeResult::Ok(target_val)
}