aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-02-22 21:21:52 +0100
committerMike Pall <mike>2010-02-22 21:21:52 +0100
commitf751cd1d6ff2ff1caab338cd2294f69cab34ae04 (patch)
treecacc214915aebde4fb0799c6a3e93981528e8ba5 /src
parent659ea9de7b1b272454e76a8b7fb1b5ba980dee3e (diff)
downloadluajit-f751cd1d6ff2ff1caab338cd2294f69cab34ae04.tar.gz
luajit-f751cd1d6ff2ff1caab338cd2294f69cab34ae04.tar.bz2
luajit-f751cd1d6ff2ff1caab338cd2294f69cab34ae04.zip
Do not patch parent exit for a stack check.
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm.c8
1 files changed, 8 insertions, 0 deletions
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)
3532 MSize len = T->szmcode; 3532 MSize len = T->szmcode;
3533 MCode *px = exitstub_addr(J, exitno) - 6; 3533 MCode *px = exitstub_addr(J, exitno) - 6;
3534 MCode *pe = p+len-6; 3534 MCode *pe = p+len-6;
3535 uint32_t stateaddr = u32ptr(&J2G(J)->vmstate);
3535 if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px) 3536 if (len > 5 && p[len-5] == XI_JMP && p+len-6 + *(int32_t *)(p+len-4) == px)
3536 *(int32_t *)(p+len-4) = (int32_t)(target - (p+len)); 3537 *(int32_t *)(p+len-4) = (int32_t)(target - (p+len));
3538 /* Do not patch parent exit for a stack check. Skip beyond vmstate update. */
3539 for (; p < pe; p++)
3540 if (*(uint32_t *)(p+(LJ_64 ? 3 : 2)) == stateaddr && p[0] == XI_MOVmi) {
3541 p += LJ_64 ? 11 : 10;
3542 break;
3543 }
3544 lua_assert(p < pe);
3537 for (; p < pe; p++) { 3545 for (; p < pe; p++) {
3538 if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px) { 3546 if ((*(uint16_t *)p & 0xf0ff) == 0x800f && p + *(int32_t *)(p+2) == px) {
3539 *(int32_t *)(p+2) = (int32_t)(target - (p+6)); 3547 *(int32_t *)(p+2) = (int32_t)(target - (p+6));