aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);