From 4057620bf5bcbb1ca96a6c0ffd83fa9e8a23efc8 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 26 May 2011 18:02:42 +0200 Subject: [PATCH] Treat extra exit from stack check like a parent exit. --- src/lj_trace.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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) 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; @@ -735,6 +741,8 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) #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);