diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_ffrecord.c | 28 |
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 | ||
768 | static 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 | |||
768 | static void LJ_FASTCALL recff_string_op(jit_State *J, RecordFFData *rd) | 796 | static 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]); |