aboutsummaryrefslogtreecommitdiff
path: root/src/lj_ffrecord.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_ffrecord.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 1560d3f5..d66aaa53 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -765,6 +765,34 @@ static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)
765 UNUSED(rd); 765 UNUSED(rd);
766} 766}
767 767
768static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd)
769{
770 TRef str = lj_ir_tostr(J, J->base[0]);
771 TRef rep = lj_opt_narrow_toint(J, J->base[1]);
772 TRef hdr, tr, str2 = 0;
773 if (J->base[2]) {
774 TRef sep = lj_ir_tostr(J, J->base[2]);
775 int32_t vrep = argv2int(J, &rd->argv[1]);
776 emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));
777 if (vrep > 1) {
778 TRef hdr2 = emitir(IRT(IR_BUFHDR, IRT_P32),
779 lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
780 TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), hdr2, sep);
781 tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), tr2, str);
782 str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);
783 }
784 }
785 tr = hdr = emitir(IRT(IR_BUFHDR, IRT_P32),
786 lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
787 if (str2) {
788 tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, str);
789 str = str2;
790 rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));
791 }
792 tr = lj_ir_call(J, IRCALL_lj_buf_putstr_rep, tr, str, rep);
793 J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
794}
795
768static void LJ_FASTCALL recff_string_op(jit_State *J, RecordFFData *rd) 796static void LJ_FASTCALL recff_string_op(jit_State *J, RecordFFData *rd)
769{ 797{
770 TRef str = lj_ir_tostr(J, J->base[0]); 798 TRef str = lj_ir_tostr(J, J->base[0]);