mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
fix: 顶层 count pass 镜像 emit 的函数提升顺序,消除跳转目标漂移导致的死循环
This commit is contained in:
@@ -866,8 +866,19 @@ impl Compiler {
|
||||
let mut ctx = CompileCtx::new();
|
||||
ctx.pre_register_builtins();
|
||||
|
||||
// The emit pass below hoists FunctionDeclarations to the front. The count pass
|
||||
// must walk in that same order: counting in source order would record jump-target
|
||||
// labels at source-order PCs while emit places code at hoisted-order PCs, drifting
|
||||
// every jump that sits after a hoisted function declaration (infinite loops at run).
|
||||
for stmt in &program.body {
|
||||
self.count_statement(stmt, &mut ctx);
|
||||
if matches!(stmt, Statement::FunctionDeclaration(_)) {
|
||||
self.count_statement(stmt, &mut ctx);
|
||||
}
|
||||
}
|
||||
for stmt in &program.body {
|
||||
if !matches!(stmt, Statement::FunctionDeclaration(_)) {
|
||||
self.count_statement(stmt, &mut ctx);
|
||||
}
|
||||
}
|
||||
crate::compiler_debug!("counter: {} instructions estimated", ctx.projected_pc);
|
||||
ctx.max_regs = ctx.max_regs.max(1);
|
||||
|
||||
Reference in New Issue
Block a user