fix: sloppy 未声明写隐式全局创建 + strict ReferenceError——DEFINE_GLOBAL_PROP_C 0x98

This commit is contained in:
2026-09-09 18:44:38 +08:00
parent c8bcff83f6
commit d9c2847730
14 changed files with 348 additions and 9 deletions
+11 -1
View File
@@ -64,7 +64,17 @@ impl Emitter {
ForStatementLeft::AssignmentTargetIdentifier(id_ref) => {
let name = id_ref.name.as_str();
let var_reg = ctx.lookup_or_global(name);
ctx.inst(Inst::new(OpCode::STORE_VAR, Operand::Reg(var_reg), Operand::Reg(key_reg), Operand::None));
let is_implicit = ctx.implicit_global_writes.contains(&var_reg);
// 未声明写仅在本迭代实际产生键后才发生(for-in NEXT 之后),空集合不抛。
if is_implicit && ctx.is_strict {
// 严格模式未声明写:抛 ReferenceError,跳过寄存器写(值无关)。
self.emit_strict_undeclared_write(name, ctx)?;
} else {
ctx.inst(Inst::new(OpCode::STORE_VAR, Operand::Reg(var_reg), Operand::Reg(key_reg), Operand::None));
if is_implicit {
self.emit_implicit_global_write(name, var_reg, ctx);
}
}
}
_ => return Err("unsupported for-in left-hand side".into()),
}
+11 -1
View File
@@ -108,7 +108,17 @@ impl Emitter {
ForStatementLeft::AssignmentTargetIdentifier(id_ref) => {
let name = id_ref.name.as_str();
let var_reg = ctx.lookup_or_global(name);
ctx.inst(Inst::new(OpCode::STORE_VAR, Operand::Reg(var_reg), Operand::Reg(val_reg), Operand::None));
let is_implicit = ctx.implicit_global_writes.contains(&var_reg);
// 未声明写仅在本迭代实际产生值后才发生(for-of NEXT 之后),空集合不抛。
if is_implicit && ctx.is_strict {
// 严格模式未声明写:抛 ReferenceError,跳过寄存器写(值无关)。
self.emit_strict_undeclared_write(name, ctx)?;
} else {
ctx.inst(Inst::new(OpCode::STORE_VAR, Operand::Reg(var_reg), Operand::Reg(val_reg), Operand::None));
if is_implicit {
self.emit_implicit_global_write(name, var_reg, ctx);
}
}
}
ForStatementLeft::ArrayAssignmentTarget(ap) => {
self.emit_array_assignment(ap, val_reg, ctx)?;