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:
@@ -130,3 +130,33 @@ fn standalone_nested_rest_assignment() {
|
||||
let result = eval(&mut vm, "var x; [...[x]]=[1,2,3]; x").unwrap();
|
||||
assert_num(result, 1.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_rest_excludes_numeric_bound_key_from_array_source() {
|
||||
// 数组元素区整数键:pattern 绑定 "0" 后 rest 不得再包含 "0"。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "const {0:x, ...r} = [1,2,3]; Object.keys(r).length").unwrap();
|
||||
assert_eq!(result.as_int(), 2);
|
||||
let result = eval(&mut vm, "const {0:x, ...r} = [1,2,3]; x === 1").unwrap();
|
||||
assert!(result.as_bool());
|
||||
// rest 从 1 开始:r[1] 是源元素 2,r[0] 已被排除为 undefined。
|
||||
let result = eval(&mut vm, "const {0:x, ...r} = [1,2,3]; r[1] + r[2]").unwrap();
|
||||
assert_eq!(result.as_int(), 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_rest_excludes_multiple_numeric_keys() {
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "const {0:x, 1:y, ...r} = [1,2,3,4]; Object.keys(r).join(',')").unwrap();
|
||||
let s = unsafe { &*result.as_string_ptr() }.as_str().to_string();
|
||||
assert_eq!(s, "2,3");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_rest_keeps_numeric_key_from_shape_source() {
|
||||
// 对象源数字键(shape 链整数键)同样排除。
|
||||
let mut vm = Vm::new();
|
||||
let result = eval(&mut vm, "const {0:x, ...r} = {0:'a',1:'b',2:'c'}; Object.keys(r).join(',')").unwrap();
|
||||
let s = unsafe { &*result.as_string_ptr() }.as_str().to_string();
|
||||
assert_eq!(s, "1,2");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user