fix: ArraySetLength 收缩遇不可配置元素静默失败、ToPrimitive 异常透传与既有属性描述符缺省回填

- arr.length 收缩时若 [newLen, oldLen) 内存在不可配置元素,整个收缩失败且不做任何修改(sloppy 赋值静默 no-op),不再抛错或截断
- length 赋值 ToPrimitive(valueOf/toString)抛错时按主 dispatch 约定直接返回,避免二次抛 RangeError 覆盖原异常(S15.4.5.1_A1.3_T2)
- Object.defineProperty/defineProperties/create 对已有属性省略描述符字段时保持现有属性值(无显式 meta 按 DEFAULT_DATA 回填),修复 toReversed/toSorted/toSpliced/with length-decreased-while-iterating
This commit is contained in:
爱特每羊队
2026-08-12 13:07:32 +08:00
parent dc023b2637
commit cc78e6b28f
2 changed files with 26 additions and 2 deletions
+7 -2
View File
@@ -506,9 +506,14 @@ fn define_from_descriptor<H: VmHost>(
let obj = unsafe { &*obj_ptr };
vm.get_own_property_slot(obj, key_si)
};
let existing_meta = existing_pos.and_then(|pos| {
let existing_meta = existing_pos.map(|pos| {
let obj = unsafe { &*obj_ptr };
obj.prop_meta_at(pos)
// 已有属性无显式 meta(普通数据属性/数组元素)时按默认属性回填:
// 描述符缺省字段保持现有值(writable/enumerable/configurable 均 true),
// 而非按新属性处理为 false(Object.defineProperty 省略字段不改已有属性)。
obj.prop_meta_at(pos).unwrap_or_else(|| {
oxide_types::object::PropMetaEntry::data(PropAttributes::DEFAULT_DATA)
})
});
// 修改已有属性时缺省字段回填现有值,仅定义新属性时缺省才为 false。