diff options
author | Mike Pall <mike> | 2011-05-26 18:02:42 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-05-26 18:02:42 +0200 |
commit | 4057620bf5bcbb1ca96a6c0ffd83fa9e8a23efc8 (patch) | |
tree | 449f919215c325402a1c9cbecaf547b3b39e2c11 /src | |
parent | 625ef8626fcd400a65a270654ba056c48aae0e56 (diff) | |
download | luajit-4057620bf5bcbb1ca96a6c0ffd83fa9e8a23efc8.tar.gz luajit-4057620bf5bcbb1ca96a6c0ffd83fa9e8a23efc8.tar.bz2 luajit-4057620bf5bcbb1ca96a6c0ffd83fa9e8a23efc8.zip |
Treat extra exit from stack check like a parent exit.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_trace.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c index 7141de46..d83d36e6 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
@@ -714,8 +714,14 @@ static TraceNo trace_exit_find(jit_State *J, MCode *pc) | |||
714 | TraceNo traceno; | 714 | TraceNo traceno; |
715 | for (traceno = 1; traceno < J->sizetrace; traceno++) { | 715 | for (traceno = 1; traceno < J->sizetrace; traceno++) { |
716 | GCtrace *T = traceref(J, traceno); | 716 | GCtrace *T = traceref(J, traceno); |
717 | if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) | 717 | if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) { |
718 | if (J->exitno == T->nsnap) { /* Treat stack check like a parent exit. */ | ||
719 | lua_assert(T->root != 0); | ||
720 | traceno = T->ir[REF_BASE].op1; | ||
721 | J->exitno = T->ir[REF_BASE].op2; | ||
722 | } | ||
718 | return traceno; | 723 | return traceno; |
724 | } | ||
719 | } | 725 | } |
720 | lua_assert(0); | 726 | lua_assert(0); |
721 | return 0; | 727 | return 0; |
@@ -735,6 +741,8 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
735 | #ifdef EXITSTATE_PCREG | 741 | #ifdef EXITSTATE_PCREG |
736 | J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]); | 742 | J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]); |
737 | #endif | 743 | #endif |
744 | lua_assert(traceref(J, J->parent) != NULL && | ||
745 | J->exitno < traceref(J, J->parent)->nsnap); | ||
738 | exd.J = J; | 746 | exd.J = J; |
739 | exd.exptr = exptr; | 747 | exd.exptr = exptr; |
740 | errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); | 748 | errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); |