Treat extra exit from stack check like a parent exit.

This commit is contained in:
Mike Pall 2011-05-26 18:02:42 +02:00
parent 625ef8626f
commit 4057620bf5

View File

@ -714,9 +714,15 @@ static TraceNo trace_exit_find(jit_State *J, MCode *pc)
TraceNo traceno; TraceNo traceno;
for (traceno = 1; traceno < J->sizetrace; traceno++) { for (traceno = 1; traceno < J->sizetrace; traceno++) {
GCtrace *T = traceref(J, 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; return traceno;
} }
}
lua_assert(0); lua_assert(0);
return 0; return 0;
} }
@ -735,6 +741,8 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
#ifdef EXITSTATE_PCREG #ifdef EXITSTATE_PCREG
J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]); J->parent = trace_exit_find(J, (MCode *)(intptr_t)ex->gpr[EXITSTATE_PCREG]);
#endif #endif
lua_assert(traceref(J, J->parent) != NULL &&
J->exitno < traceref(J, J->parent)->nsnap);
exd.J = J; exd.J = J;
exd.exptr = exptr; exd.exptr = exptr;
errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);