fix: for-in/for-of 左侧未声明写改读写登记集并集判定——读侧登记的全局槽漏全局对象属性写与 strict 漏抛

左侧标识符先读后写时全局槽由读侧登记,写侧单集判定不命中:sloppy 写穿透漏发(循环后读陈旧值)、strict 漏抛 ReferenceError。与其余 8 写点统一为 is_implicit_global_reg;补 3 枚判别性钉(sloppy for-in / for-of 穿透 + strict for-in 漏抛,回退单集判定必红)。
This commit is contained in:
2026-09-11 12:44:24 +00:00
parent cb0168faa1
commit ef3b95f6d3
3 changed files with 21 additions and 2 deletions
@@ -89,7 +89,7 @@ impl Emitter {
self.emit_throw_error("TypeError", "cannot assign to read-only property", ctx)?;
}
} else {
let is_implicit = ctx.implicit_global_writes.contains(&var_reg);
let is_implicit = ctx.is_implicit_global_reg(var_reg);
if is_implicit && ctx.is_strict {
// 严格模式未声明写:抛 ReferenceError,跳过寄存器写(值无关)。
self.emit_strict_undeclared_write(name, ctx)?;
@@ -116,7 +116,7 @@ impl Emitter {
self.emit_throw_error("TypeError", "cannot assign to read-only property", ctx)?;
}
} else {
let is_implicit = ctx.implicit_global_writes.contains(&var_reg);
let is_implicit = ctx.is_implicit_global_reg(var_reg);
if is_implicit && ctx.is_strict {
// 严格模式未声明写:抛 ReferenceError,跳过寄存器写(值无关)。
self.emit_strict_undeclared_write(name, ctx)?;