aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2024-03-10 17:26:36 +0100
committerMike Pall <mike>2024-03-10 17:26:36 +0100
commitbcc5125a9188179d23c223b8865ed94951fb91b3 (patch)
tree00f5a35037ded14e2cb6bd19fd9140e1eb3f522f
parent913df6a94517d31c7be1a6133b8f35a62e51ff7a (diff)
downloadluajit-bcc5125a9188179d23c223b8865ed94951fb91b3.tar.gz
luajit-bcc5125a9188179d23c223b8865ed94951fb91b3.tar.bz2
luajit-bcc5125a9188179d23c223b8865ed94951fb91b3.zip
Fix recording of __concat metamethod.
Thanks to Sergey Kaplun. #1164
-rw-r--r--src/lj_record.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index a9092d92..48bbbb20 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -903,6 +903,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
903{ 903{
904 TValue *frame = J->L->base - 1; 904 TValue *frame = J->L->base - 1;
905 ptrdiff_t i; 905 ptrdiff_t i;
906 BCReg baseadj = 0;
906 for (i = 0; i < gotresults; i++) 907 for (i = 0; i < gotresults; i++)
907 (void)getslot(J, rbase+i); /* Ensure all results have a reference. */ 908 (void)getslot(J, rbase+i); /* Ensure all results have a reference. */
908 while (frame_ispcall(frame)) { /* Immediately resolve pcall() returns. */ 909 while (frame_ispcall(frame)) { /* Immediately resolve pcall() returns. */
@@ -911,6 +912,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
911 lj_trace_err(J, LJ_TRERR_NYIRETL); 912 lj_trace_err(J, LJ_TRERR_NYIRETL);
912 lj_assertJ(J->baseslot > 1+LJ_FR2, "bad baseslot for return"); 913 lj_assertJ(J->baseslot > 1+LJ_FR2, "bad baseslot for return");
913 gotresults++; 914 gotresults++;
915 baseadj += cbase;
914 rbase += cbase; 916 rbase += cbase;
915 J->baseslot -= (BCReg)cbase; 917 J->baseslot -= (BCReg)cbase;
916 J->base -= cbase; 918 J->base -= cbase;
@@ -935,6 +937,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
935 if (--J->framedepth < 0) /* NYI: return of vararg func to lower frame. */ 937 if (--J->framedepth < 0) /* NYI: return of vararg func to lower frame. */
936 lj_trace_err(J, LJ_TRERR_NYIRETL); 938 lj_trace_err(J, LJ_TRERR_NYIRETL);
937 lj_assertJ(J->baseslot > 1+LJ_FR2, "bad baseslot for return"); 939 lj_assertJ(J->baseslot > 1+LJ_FR2, "bad baseslot for return");
940 baseadj += cbase;
938 rbase += cbase; 941 rbase += cbase;
939 J->baseslot -= (BCReg)cbase; 942 J->baseslot -= (BCReg)cbase;
940 J->base -= cbase; 943 J->base -= cbase;
@@ -1005,7 +1008,8 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
1005 BCReg bslot = bc_b(*(frame_contpc(frame)-1)); 1008 BCReg bslot = bc_b(*(frame_contpc(frame)-1));
1006 TRef tr = gotresults ? J->base[cbase+rbase] : TREF_NIL; 1009 TRef tr = gotresults ? J->base[cbase+rbase] : TREF_NIL;
1007 if (bslot != J->maxslot) { /* Concatenate the remainder. */ 1010 if (bslot != J->maxslot) { /* Concatenate the remainder. */
1008 TValue *b = J->L->base, save; /* Simulate lower frame and result. */ 1011 /* Simulate lower frame and result. */
1012 TValue *b = J->L->base - baseadj, save;
1009 /* Can't handle MM_concat + CALLT + fast func side-effects. */ 1013 /* Can't handle MM_concat + CALLT + fast func side-effects. */
1010 if (J->postproc != LJ_POST_NONE) 1014 if (J->postproc != LJ_POST_NONE)
1011 lj_trace_err(J, LJ_TRERR_NYIRETL); 1015 lj_trace_err(J, LJ_TRERR_NYIRETL);
@@ -1018,7 +1022,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
1018 J->L->base = b - cbase; 1022 J->L->base = b - cbase;
1019 tr = rec_cat(J, bslot, cbase-(2<<LJ_FR2)); 1023 tr = rec_cat(J, bslot, cbase-(2<<LJ_FR2));
1020 b = J->L->base + cbase; /* Undo. */ 1024 b = J->L->base + cbase; /* Undo. */
1021 J->L->base = b; 1025 J->L->base = b + baseadj;
1022 copyTV(J->L, b-(2<<LJ_FR2), &save); 1026 copyTV(J->L, b-(2<<LJ_FR2), &save);
1023 } 1027 }
1024 if (tr) { /* Store final result. */ 1028 if (tr) { /* Store final result. */