fix: in 指令切 HasProperty 对齐整数索引与链上元素区

This commit is contained in:
2026-09-19 13:17:23 +00:00
parent e1691176c0
commit f870278795
2 changed files with 41 additions and 1 deletions
+3 -1
View File
@@ -381,7 +381,9 @@ impl Vm {
}
let obj = unsafe { &*obj_ptr };
let prop_name_si = self.property_key_si(key_val)?;
let found = self.resolve_property(obj, prop_name_si).is_some();
// `in` 即 HasProperty:原型链各层都要看数组元素区与 TypedArray 整数索引,
// 读值解析不覆盖这两处。
let found = self.has_property(obj, prop_name_si);
self.regs[rd] = JsValue::bool(found);
Ok(())
}
@@ -314,6 +314,44 @@ fn typed_array_bigint_sort_uses_bigint_compare() {
assert!(result.as_bool());
}
#[test]
fn typed_array_in_operator_uses_has_property_semantics() {
// `in` 按 HasProperty 判定:TypedArray 整数索引按视图长度判在界,
// 越界索引判不存在。
let mut vm = Vm::new();
let result = eval(
&mut vm,
"var ta = new Int8Array(2); \
(0 in ta) && (1 in ta) && !(2 in ta) && !(3 in ta) && \
('length' in ta) && !('foo' in ta)",
)
.unwrap();
assert!(result.as_bool());
}
#[test]
fn in_operator_finds_array_elements_on_proto_chain() {
// 原型链上的数组元素区索引判存在:Object.create([1,2]) 的 0/1 在界、2 越界。
let mut vm = Vm::new();
let result = eval(&mut vm, "var o = Object.create([1, 2]); (0 in o) && (1 in o) && !(2 in o)").unwrap();
assert!(result.as_bool());
}
#[test]
fn in_operator_ordinary_object_zero_drift() {
// 普通对象 `in` 既有行为零漂移:自有属性在、未定义键不在、原型链属性在、
// 无整型键的对象不判索引存在。
let mut vm = Vm::new();
let result = eval(
&mut vm,
"var base = { x: 1 }; var o = Object.create(base); \
('x' in o) && !('y' in o) && ('toString' in o) && \
!(0 in Object.create({}))",
)
.unwrap();
assert!(result.as_bool());
}
#[test]
fn typed_array_bigint_methods_receive_bigint_values() {
let mut vm = Vm::new();