aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-05-26 18:02:42 +0200
committerMike Pall <mike>2011-05-26 18:02:42 +0200
commit4057620bf5bcbb1ca96a6c0ffd83fa9e8a23efc8 (patch)
tree449f919215c325402a1c9cbecaf547b3b39e2c11 /src
parent625ef8626fcd400a65a270654ba056c48aae0e56 (diff)
downloadluajit-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.c10
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);