aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lj_ffrecord.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 13f91333..a19f6fdc 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -1223,6 +1223,12 @@ static void LJ_FASTCALL recff_buffer_method_put(jit_State *J, RecordFFData *rd)
1223 ptrdiff_t arg; 1223 ptrdiff_t arg;
1224 if (!J->base[1]) return; 1224 if (!J->base[1]) return;
1225 for (arg = 1; (tr = J->base[arg]); arg++) { 1225 for (arg = 1; (tr = J->base[arg]); arg++) {
1226 if (tref_isudata(tr)) {
1227 TRef ud2 = recff_sbufx_check(J, rd, arg);
1228 emitir(IRTG(IR_NE, IRT_PGC), ud, ud2);
1229 }
1230 }
1231 for (arg = 1; (tr = J->base[arg]); arg++) {
1226 if (tref_isstr(tr)) { 1232 if (tref_isstr(tr)) {
1227 trbuf = emitir(IRTG(IR_BUFPUT, IRT_PGC), trbuf, tr); 1233 trbuf = emitir(IRTG(IR_BUFPUT, IRT_PGC), trbuf, tr);
1228 } else if (tref_isnumber(tr)) { 1234 } else if (tref_isnumber(tr)) {
@@ -1230,11 +1236,9 @@ static void LJ_FASTCALL recff_buffer_method_put(jit_State *J, RecordFFData *rd)
1230 emitir(IRT(IR_TOSTR, IRT_STR), tr, 1236 emitir(IRT(IR_TOSTR, IRT_STR), tr,
1231 tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT)); 1237 tref_isnum(tr) ? IRTOSTR_NUM : IRTOSTR_INT));
1232 } else if (tref_isudata(tr)) { 1238 } else if (tref_isudata(tr)) {
1233 TRef ud2 = recff_sbufx_check(J, rd, arg); 1239 TRef trr = recff_sbufx_get_ptr(J, tr, IRFL_SBUF_R);
1234 TRef trr = recff_sbufx_get_ptr(J, ud2, IRFL_SBUF_R); 1240 TRef trw = recff_sbufx_get_ptr(J, tr, IRFL_SBUF_W);
1235 TRef trw = recff_sbufx_get_ptr(J, ud2, IRFL_SBUF_W);
1236 TRef len = recff_sbufx_len(J, trr, trw); 1241 TRef len = recff_sbufx_len(J, trr, trw);
1237 emitir(IRTG(IR_NE, IRT_PGC), ud, ud2);
1238 trbuf = lj_ir_call(J, IRCALL_lj_buf_putmem, trbuf, trr, len); 1242 trbuf = lj_ir_call(J, IRCALL_lj_buf_putmem, trbuf, trr, len);
1239 } else { 1243 } else {
1240 recff_nyiu(J, rd); 1244 recff_nyiu(J, rd);
@@ -1259,14 +1263,18 @@ static void LJ_FASTCALL recff_buffer_method_get(jit_State *J, RecordFFData *rd)
1259 ptrdiff_t arg; 1263 ptrdiff_t arg;
1260 if (!J->base[1]) { J->base[1] = TREF_NIL; J->base[2] = 0; } 1264 if (!J->base[1]) { J->base[1] = TREF_NIL; J->base[2] = 0; }
1261 for (arg = 0; (tr = J->base[arg+1]); arg++) { 1265 for (arg = 0; (tr = J->base[arg+1]); arg++) {
1266 if (!tref_isnil(tr)) {
1267 J->base[arg+1] = recff_sbufx_checkint(J, rd, arg+1);
1268 }
1269 }
1270 for (arg = 0; (tr = J->base[arg+1]); arg++) {
1262 TRef len = recff_sbufx_len(J, trr, trw); 1271 TRef len = recff_sbufx_len(J, trr, trw);
1263 if (tref_isnil(tr)) { 1272 if (tref_isnil(tr)) {
1264 J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len); 1273 J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len);
1265 trr = trw; 1274 trr = trw;
1266 } else { 1275 } else {
1267 TRef trn = recff_sbufx_checkint(J, rd, arg+1);
1268 TRef tru; 1276 TRef tru;
1269 len = emitir(IRTI(IR_MIN), len, trn); 1277 len = emitir(IRTI(IR_MIN), len, tr);
1270 tru = emitir(IRT(IR_ADD, IRT_PTR), trr, len); 1278 tru = emitir(IRT(IR_ADD, IRT_PTR), trr, len);
1271 J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len); 1279 J->base[arg] = emitir(IRT(IR_XSNEW, IRT_STR), trr, len);
1272 trr = tru; /* Doing the ADD before the SNEW generates better code. */ 1280 trr = tru; /* Doing the ADD before the SNEW generates better code. */