diff options
author | Mike Pall <mike> | 2010-02-22 21:21:52 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-02-22 21:21:52 +0100 |
commit | f751cd1d6ff2ff1caab338cd2294f69cab34ae04 (patch) | |
tree | cacc214915aebde4fb0799c6a3e93981528e8ba5 /src | |
parent | 659ea9de7b1b272454e76a8b7fb1b5ba980dee3e (diff) | |
download | luajit-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.c | 8 |
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)); |