mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
fix: finally 体直落进入时置位 finally_active 防完成穿越计数错乱
catch 体正常结束后指令直落入 finally 体,此前 finally_active 未被置位, finally 内 break/continue/return/throw 触发未进入分支导致 finally 体重复 执行、完成计数错乱。新增无操作数标记指令 TRY_FINALLY_ENTER,在 finally 体入口统一置位栈顶 handler 的 finally_active,覆盖 JMP/直落/unwind/完成 穿越/挂起恢复全部进入路径,并删除 control_flow.rs 中对跳转目标匹配的 脆弱栈顶检测。
This commit is contained in:
@@ -80,6 +80,11 @@ impl Emitter {
|
||||
}
|
||||
if has_finally {
|
||||
ctx.labels.set_label_pos(finally_label, ctx.insts.len());
|
||||
// finally 体入口标记:运行时置位栈顶 handler 的 finally_active。所有进入
|
||||
// 路径(try/catch 体 JMP、catch 体直落、unwind、完成穿越、挂起恢复)都
|
||||
// 落到 finally_label 起始的这条标记,统一完成置位;catch 体直落路径此前
|
||||
// 无任何置位,finally 内 break/continue/return/throw 会重入 finally 体。
|
||||
ctx.inst(Inst::try_finally_enter());
|
||||
let mut last_finally_result: Option<u32> = None;
|
||||
// finally block 同为独立块作用域,lexical 声明互不泄漏。
|
||||
ctx.push_scope();
|
||||
|
||||
Reference in New Issue
Block a user