fix: 对象建键入口统一走 property_key_si 规范化,数字键不再分裂
Object.fromEntries/JSON.parse/new Map 对象 entry/rest 解构静态 excluded 四处直接 intern 动态字符串键绕过整数键区间映射,规范数字键分裂为 字符串键与整数键两个键。统一经 string_key_si 规范化:规范数字串映射 整数键,其余 intern 字符串键,与 property_key_si 字符串分支口径一致。 make_int_key 增加 debug 断言兜底索引越界。
This commit is contained in:
@@ -185,3 +185,33 @@ fn object_values_returns_array() {
|
||||
let obj = unsafe { &*result.as_js_object_ptr() };
|
||||
assert_eq!(obj.prop_count(), 2);
|
||||
}
|
||||
|
||||
// -- Object.fromEntries --
|
||||
|
||||
#[test]
|
||||
fn from_entries_numeric_key_normalized_to_int_key() {
|
||||
// 数字键 entry 走 ToPropertyKey 规范化:fromEntries 产出的 "5" 键与 o[5] 同一键。
|
||||
let (_vm, result) = eval("Object.fromEntries([[5,'a']])[5]").unwrap();
|
||||
assert!(result.is_string() && unsafe { &*result.as_string_ptr() }.as_str() == "a");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn from_entries_string_index_key_reads_via_numeric_access() {
|
||||
// 字符串 "5" 键是规范数组下标,读 o[5] 命中同一整数键。
|
||||
let (_vm, result) = eval("Object.fromEntries([['5','a']])[5]").unwrap();
|
||||
assert!(result.is_string() && unsafe { &*result.as_string_ptr() }.as_str() == "a");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn from_entries_numeric_key_write_keeps_single_key() {
|
||||
// 再写 o[5] 不产生第二个 "5" 键(键唯一)。
|
||||
let (_vm, result) =
|
||||
eval("var o = Object.fromEntries([[5,'a']]); o[5]='x'; Object.getOwnPropertyNames(o).join(',')").unwrap();
|
||||
assert!(result.is_string() && unsafe { &*result.as_string_ptr() }.as_str() == "5");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn from_entries_multiple_pairs_roundtrip() {
|
||||
let (_vm, result) = eval("var o = Object.fromEntries([[1,'a'],[2,'b']]); o[1] + o[2]").unwrap();
|
||||
assert!(result.is_string() && unsafe { &*result.as_string_ptr() }.as_str() == "ab");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user