]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Treat extra exit from stack check like a parent exit.
authorMike Pall <mike>
Thu, 26 May 2011 16:02:42 +0000 (18:02 +0200)
committerMike Pall <mike>
Thu, 26 May 2011 16:02:42 +0000 (18:02 +0200)
src/lj_trace.c

index 7141de46c8c6cecd3a790daac9bb8037a596f4c0..d83d36e6601e839529d40697bc001069e7f3727c 100644 (file)
@@ -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);