|
@@ -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;
|