]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Fix maxslots when recording BC_VARG, part 3.
authorMike Pall <mike>
Sat, 12 Aug 2023 18:16:56 +0000 (20:16 +0200)
committerMike Pall <mike>
Sat, 12 Aug 2023 18:16:56 +0000 (20:16 +0200)
Thanks to Peter Cawley. #1046

src/lj_record.c

index 6361b42489ba687dc0051809efe8ad8a6357ac8c..751d9eb7f3ef5534f0ce32071fb4ab93d2b0e244 100644 (file)
@@ -1518,8 +1518,12 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
   if (J->framedepth > 0) {  /* Simple case: varargs defined on-trace. */
     ptrdiff_t i;
     if (nvararg < 0) nvararg = 0;
-    if (nresults == -1) nresults = nvararg;
-    J->maxslot = dst + (BCReg)nresults;
+    if (nresults != 1) {
+      if (nresults == -1) nresults = nvararg;
+      J->maxslot = dst + (BCReg)nresults;
+    } else if (dst >= J->maxslot) {
+      J->maxslot = dst + 1;
+    }
     if (J->baseslot + J->maxslot >= LJ_MAX_JSLOTS)
       lj_trace_err(J, LJ_TRERR_STACKOV);
     for (i = 0; i < nresults; i++)
@@ -1552,7 +1556,9 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
       }
       for (i = nvararg; i < nresults; i++)
        J->base[dst+i] = TREF_NIL;
-      J->maxslot = dst + (BCReg)nresults;
+      if (nresults != 1 || dst >= J->maxslot) {
+       J->maxslot = dst + (BCReg)nresults;
+      }
     } else if (select_detect(J)) {  /* y = select(x, ...) */
       TRef tridx = J->base[dst-1];
       TRef tr = TREF_NIL;