diff options
author | Mike Pall <mike> | 2010-09-12 02:39:06 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-12 02:42:02 +0200 |
commit | 4da03965c0dfe30a386390f5f419739e5f06779b (patch) | |
tree | 33057bdffa08b24e8b77c15dbd2b86cfc2e95370 /src/lj_record.c | |
parent | c2c08ba9b33ed89feb190aa3484bf2360db779a0 (diff) | |
download | luajit-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.c | 28 |
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. */ | ||
649 | static 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; |