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 | |
| 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')
| -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; |
