Record vararg expressions with known fixed number of results.

This commit is contained in:
Mike Pall 2010-09-12 02:39:06 +02:00
parent c2c08ba9b3
commit 4da03965c0

View File

@ -643,6 +643,29 @@ static void rec_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
lua_assert(J->baseslot >= 1); lua_assert(J->baseslot >= 1);
} }
/* -- Vararg handling ----------------------------------------------------- */
/* Record vararg instruction. */
static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
{
ptrdiff_t nvararg = frame_delta(J->L->base-1) - J->pt->numparams - 1;
lua_assert(frame_isvarg(J->L->base-1));
if (J->framedepth == 0) { /* NYI: unknown number of varargs. */
setintV(&J->errinfo, BC_VARG);
lj_trace_err_info(J, LJ_TRERR_NYIBC);
} else { /* Simple case: known fixed number of varargs defined on-trace. */
ptrdiff_t i;
if (nresults == -1) {
nresults = nvararg;
J->maxslot = dst + nvararg;
} else if (dst + nresults > J->maxslot) {
J->maxslot = dst + nresults + 1;
}
for (i = 0; i < nresults; i++)
J->base[dst+i] = i < nvararg ? J->base[i - nvararg - 1] : TREF_NIL;
}
}
/* -- Metamethod handling ------------------------------------------------- */ /* -- Metamethod handling ------------------------------------------------- */
/* Prepare to record call to metamethod. */ /* Prepare to record call to metamethod. */
@ -2223,6 +2246,10 @@ void lj_record_ins(jit_State *J)
rec_tailcall(J, ra, (ptrdiff_t)rc-1); rec_tailcall(J, ra, (ptrdiff_t)rc-1);
break; break;
case BC_VARG:
rec_varg(J, ra, (ptrdiff_t)rb-1);
break;
/* -- Returns ----------------------------------------------------------- */ /* -- Returns ----------------------------------------------------------- */
case BC_RETM: case BC_RETM:
@ -2311,7 +2338,6 @@ void lj_record_ins(jit_State *J)
case BC_UCLO: case BC_UCLO:
case BC_FNEW: case BC_FNEW:
case BC_TSETM: case BC_TSETM:
case BC_VARG:
setintV(&J->errinfo, (int32_t)op); setintV(&J->errinfo, (int32_t)op);
lj_trace_err_info(J, LJ_TRERR_NYIBC); lj_trace_err_info(J, LJ_TRERR_NYIBC);
break; break;