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++)
}
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;