Ensure forward progress on trace exit to BC_ITERN.
Also use a safer way to force a static dispatch for BC_RET*. Reported by Bartel Eerdekens. Analyzed by Peter Cawley. #1000 #1045
This commit is contained in:
@@ -2453,7 +2453,7 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
| mov r12, [RA]
|
||||
| mov rsp, RA // Reposition stack to C frame.
|
||||
|.endif
|
||||
| test RDd, RDd; js >9 // Check for error from exit.
|
||||
| cmp RDd, -LUA_ERRERR; jae >9 // Check for error from exit.
|
||||
| mov L:RB, SAVE_L
|
||||
| mov MULTRES, RDd
|
||||
| mov LFUNC:KBASE, [BASE-16]
|
||||
@@ -2469,6 +2469,8 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
| movzx OP, RCL
|
||||
| add PC, 4
|
||||
| shr RCd, 16
|
||||
| cmp MULTRES, -17 // Static dispatch?
|
||||
| je >5
|
||||
| cmp OP, BC_FUNCF // Function header?
|
||||
| jb >3
|
||||
| cmp OP, BC_FUNCC+2 // Fast function?
|
||||
@@ -2491,6 +2493,15 @@ static void build_subroutines(BuildCtx *ctx)
|
||||
| mov KBASE, [KBASE+PC2PROTO(k)]
|
||||
| jmp <2
|
||||
|
|
||||
|5: // Dispatch to static entry of original ins replaced by BC_JLOOP.
|
||||
| mov RA, [DISPATCH+DISPATCH_J(trace)]
|
||||
| mov TRACE:RA, [RA+RD*8]
|
||||
| mov RCd, TRACE:RA->startins
|
||||
| movzx RAd, RCH
|
||||
| movzx OP, RCL
|
||||
| shr RCd, 16
|
||||
| jmp aword [DISPATCH+OP*8+GG_DISP2STATIC]
|
||||
|
|
||||
|9: // Rethrow error from the right C frame.
|
||||
| mov CARG2d, RDd
|
||||
| mov CARG1, L:RB
|
||||
|
||||
Reference in New Issue
Block a user