TraceNo traceno;
for (traceno = 1; traceno < J->sizetrace; traceno++) {
GCtrace *T = traceref(J, traceno);
- if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode))
+ if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) {
+ if (J->exitno == T->nsnap) { /* Treat stack check like a parent exit. */
+ lua_assert(T->root != 0);
+ traceno = T->ir[REF_BASE].op1;
+ J->exitno = T->ir[REF_BASE].op2;
+ }
return traceno;
+ }
}
lua_assert(0);
return 0;
#ifdef EXITSTATE_PCREG
J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]);
#endif
+ lua_assert(traceref(J, J->parent) != NULL &&
+ J->exitno < traceref(J, J->parent)->nsnap);
exd.J = J;
exd.exptr = exptr;
errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);