From a0d782755482483c09e919a51c396322dd228bf2 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 24 Oct 2011 16:02:37 +0200 Subject: Generalize handling of stack checks indicated by highest exit + 1. --- src/lj_trace.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'src/lj_trace.c') diff --git a/src/lj_trace.c b/src/lj_trace.c index f907a77f..9645ecba 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c @@ -727,14 +727,8 @@ static TraceNo trace_exit_find(jit_State *J, MCode *pc) 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 (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; - } + if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) return traceno; - } } lua_assert(0); return 0; @@ -751,11 +745,20 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) int errcode; const BCIns *pc; void *cf; + GCtrace *T; #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); + T = traceref(J, J->parent); UNUSED(T); +#ifdef EXITSTATE_CHECKEXIT + if (J->exitno == T->nsnap) { /* Treat stack check like a parent exit. */ + lua_assert(T->root != 0); + J->exitno = T->ir[REF_BASE].op2; + J->parent = T->ir[REF_BASE].op1; + T = traceref(J, J->parent); + } +#endif + lua_assert(T != NULL && J->exitno < T->nsnap); exd.J = J; exd.exptr = exptr; errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); -- cgit v1.2.3-55-g6feb