summaryrefslogtreecommitdiff
path: root/src/lj_record.c
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-12 02:39:06 +0200
committerMike Pall <mike>2010-09-12 02:42:02 +0200
commit4da03965c0dfe30a386390f5f419739e5f06779b (patch)
tree33057bdffa08b24e8b77c15dbd2b86cfc2e95370 /src/lj_record.c
parentc2c08ba9b33ed89feb190aa3484bf2360db779a0 (diff)
downloadluajit-4da03965c0dfe30a386390f5f419739e5f06779b.tar.gz
luajit-4da03965c0dfe30a386390f5f419739e5f06779b.tar.bz2
luajit-4da03965c0dfe30a386390f5f419739e5f06779b.zip
Record vararg expressions with known fixed number of results.
Diffstat (limited to 'src/lj_record.c')
-rw-r--r--src/lj_record.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index 0dcc1ac7..2bb1c2c8 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -643,6 +643,29 @@ static void rec_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
643 lua_assert(J->baseslot >= 1); 643 lua_assert(J->baseslot >= 1);
644} 644}
645 645
646/* -- Vararg handling ----------------------------------------------------- */
647
648/* Record vararg instruction. */
649static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
650{
651 ptrdiff_t nvararg = frame_delta(J->L->base-1) - J->pt->numparams - 1;
652 lua_assert(frame_isvarg(J->L->base-1));
653 if (J->framedepth == 0) { /* NYI: unknown number of varargs. */
654 setintV(&J->errinfo, BC_VARG);
655 lj_trace_err_info(J, LJ_TRERR_NYIBC);
656 } else { /* Simple case: known fixed number of varargs defined on-trace. */
657 ptrdiff_t i;
658 if (nresults == -1) {
659 nresults = nvararg;
660 J->maxslot = dst + nvararg;
661 } else if (dst + nresults > J->maxslot) {
662 J->maxslot = dst + nresults + 1;
663 }
664 for (i = 0; i < nresults; i++)
665 J->base[dst+i] = i < nvararg ? J->base[i - nvararg - 1] : TREF_NIL;
666 }
667}
668
646/* -- Metamethod handling ------------------------------------------------- */ 669/* -- Metamethod handling ------------------------------------------------- */
647 670
648/* Prepare to record call to metamethod. */ 671/* Prepare to record call to metamethod. */
@@ -2223,6 +2246,10 @@ void lj_record_ins(jit_State *J)
2223 rec_tailcall(J, ra, (ptrdiff_t)rc-1); 2246 rec_tailcall(J, ra, (ptrdiff_t)rc-1);
2224 break; 2247 break;
2225 2248
2249 case BC_VARG:
2250 rec_varg(J, ra, (ptrdiff_t)rb-1);
2251 break;
2252
2226 /* -- Returns ----------------------------------------------------------- */ 2253 /* -- Returns ----------------------------------------------------------- */
2227 2254
2228 case BC_RETM: 2255 case BC_RETM:
@@ -2311,7 +2338,6 @@ void lj_record_ins(jit_State *J)
2311 case BC_UCLO: 2338 case BC_UCLO:
2312 case BC_FNEW: 2339 case BC_FNEW:
2313 case BC_TSETM: 2340 case BC_TSETM:
2314 case BC_VARG:
2315 setintV(&J->errinfo, (int32_t)op); 2341 setintV(&J->errinfo, (int32_t)op);
2316 lj_trace_err_info(J, LJ_TRERR_NYIBC); 2342 lj_trace_err_info(J, LJ_TRERR_NYIBC);
2317 break; 2343 break;