From f751cd1d6ff2ff1caab338cd2294f69cab34ae04 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 22 Feb 2010 21:21:52 +0100 Subject: [PATCH] Do not patch parent exit for a stack check. --- src/lj_asm.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lj_asm.c b/src/lj_asm.c index db71aebc..1e934d7c 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -3532,8 +3532,16 @@ void lj_asm_patchexit(jit_State *J, Trace *T, ExitNo exitno, MCode *target) MSize len = T->szmcode; MCode *px = exitstub_addr(J, exitno) - 6; MCode *pe = p+len-6; + uint32_t stateaddr = u32ptr(&J2G(J)->vmstate); if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px) *(int32_t *)(p+len-4) = (int32_t)(target - (p+len)); + /* Do not patch parent exit for a stack check. Skip beyond vmstate update. */ + for (; p < pe; p++) + if (*(uint32_t *)(p+(LJ_64 ? 3 : 2)) == stateaddr && p[0] == XI_MOVmi) { + p += LJ_64 ? 11 : 10; + break; + } + lua_assert(p < pe); for (; p < pe; p++) { if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px) { *(int32_t *)(p+2) = (int32_t)(target - (p+6));