fix: 块级 let/const/class 预声明 + TDZ 读取运行时抛 ReferenceError

This commit is contained in:
爱特每羊队
2026-08-10 21:07:39 +08:00
parent 717e927057
commit 7055ef1fbb
9 changed files with 237 additions and 8 deletions
+9 -3
View File
@@ -64,9 +64,15 @@ impl Emitter {
var_reg
}
} else {
let var_reg = ctx.alloc_reg();
ctx.declare(name, var_reg, kind, is_const)?;
var_reg
// let/const:本块预声明(TDZ 占位)则复用预登记槽位,不重复 declare;
// 否则(for 头等未预声明路径)按原逻辑声明。
if let Some(reg) = ctx.scopes.symbols.consume_predeclared_slot(name) {
reg
} else {
let var_reg = ctx.alloc_reg();
ctx.declare(name, var_reg, kind, is_const)?;
var_reg
}
};
if let Some(&cell_idx) = ctx.captured_bindings.get(name) {
let op = if fresh_cell { OpCode::MAKE_CELL_FRESH } else { OpCode::MAKE_CELL };