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:
@@ -300,7 +300,7 @@ define_opcodes! {
|
||||
def = None, uses = [],
|
||||
pure = false, jump = false, term = false, ic = false,
|
||||
|
||||
// ── 异常 (0x2E-0x2F, 0x33-0x35) ──
|
||||
// ── 异常 (0x2E-0x2F, 0x33-0x35;TRY_FINALLY_ENTER 用 0x1B 空槽) ──
|
||||
THROW = 0x2E => "THROW",
|
||||
def = None, uses = [SlotSpec::Slot(Slot::Rd)],
|
||||
pure = false, jump = false, term = true, ic = false,
|
||||
@@ -313,6 +313,9 @@ define_opcodes! {
|
||||
TRY_FINALLY_BEGIN = 0x34 => "TRY_FINALLY_BEGIN",
|
||||
def = None, uses = [],
|
||||
pure = false, jump = true, term = false, ic = false,
|
||||
TRY_FINALLY_ENTER = 0x1B => "TRY_FINALLY_ENTER",
|
||||
def = None, uses = [],
|
||||
pure = false, jump = false, term = false, ic = false,
|
||||
TRY_FINALLY_END = 0x35 => "TRY_FINALLY_END",
|
||||
def = None, uses = [],
|
||||
pure = false, jump = false, term = false, ic = false,
|
||||
@@ -787,7 +790,7 @@ mod tests {
|
||||
assert_eq!(OpCode::UNSPILL.to_string(), "UNSPILL");
|
||||
assert_eq!(OpCode::SPREAD_OBJECT.to_string(), "SPREAD_OBJECT");
|
||||
|
||||
assert!(OpCode::try_from(0x1B).is_err());
|
||||
assert!(OpCode::try_from(0xFA).is_err());
|
||||
assert!(OpCode::try_from(0xFF).is_err());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user