diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib_string.c | 2 | ||||
| -rw-r--r-- | src/lj_ffrecord.c | 25 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 8 |
3 files changed, 33 insertions, 2 deletions
diff --git a/src/lib_string.c b/src/lib_string.c index eb2ae226..27e0d594 100644 --- a/src/lib_string.c +++ b/src/lib_string.c | |||
| @@ -62,7 +62,7 @@ LJLIB_ASM(string_byte) LJLIB_REC(string_range 0) | |||
| 62 | return FFH_RES(n); | 62 | return FFH_RES(n); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | LJLIB_ASM(string_char) | 65 | LJLIB_ASM(string_char) LJLIB_REC(.) |
| 66 | { | 66 | { |
| 67 | int i, nargs = (int)(L->top - L->base); | 67 | int i, nargs = (int)(L->top - L->base); |
| 68 | char *buf = lj_buf_tmp(L, (size_t)nargs); | 68 | char *buf = lj_buf_tmp(L, (size_t)nargs); |
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 929dbb55..191974ea 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
| @@ -751,6 +751,26 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd) | |||
| 751 | } | 751 | } |
| 752 | } | 752 | } |
| 753 | 753 | ||
| 754 | static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd) | ||
| 755 | { | ||
| 756 | TRef k255 = lj_ir_kint(J, 255); | ||
| 757 | BCReg i; | ||
| 758 | for (i = 0; J->base[i] != 0; i++) { /* Convert char values to strings. */ | ||
| 759 | TRef tr = lj_opt_narrow_toint(J, J->base[i]); | ||
| 760 | emitir(IRTGI(IR_ULE), tr, k255); | ||
| 761 | J->base[i] = emitir(IRT(IR_TOSTR, IRT_STR), tr, IRTOSTR_CHAR); | ||
| 762 | } | ||
| 763 | if (i > 1) { /* Concatenate the strings, if there's more than one. */ | ||
| 764 | TRef hdr = emitir(IRT(IR_BUFHDR, IRT_P32), | ||
| 765 | lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET); | ||
| 766 | TRef tr = hdr; | ||
| 767 | for (i = 0; J->base[i] != 0; i++) | ||
| 768 | tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]); | ||
| 769 | J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), hdr, tr); | ||
| 770 | } | ||
| 771 | UNUSED(rd); | ||
| 772 | } | ||
| 773 | |||
| 754 | /* -- Table library fast functions ---------------------------------------- */ | 774 | /* -- Table library fast functions ---------------------------------------- */ |
| 755 | 775 | ||
| 756 | static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd) | 776 | static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd) |
| @@ -809,7 +829,10 @@ static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd) | |||
| 809 | TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero); | 829 | TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero); |
| 810 | TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN); | 830 | TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN); |
| 811 | if (tref_isk(len) && IR(tref_ref(len))->i == 1) { | 831 | if (tref_isk(len) && IR(tref_ref(len))->i == 1) { |
| 812 | TRef tr = emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY); | 832 | IRIns *irs = IR(tref_ref(str)); |
| 833 | TRef tr = (irs->o == IR_TOSTR && irs->op2 == IRTOSTR_CHAR) ? | ||
| 834 | irs->op1 : | ||
| 835 | emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY); | ||
| 813 | tr = lj_ir_call(J, IRCALL_fputc, tr, fp); | 836 | tr = lj_ir_call(J, IRCALL_fputc, tr, fp); |
| 814 | if (results_wanted(J) != 0) /* Check result only if not ignored. */ | 837 | if (results_wanted(J) != 0) /* Check result only if not ignored. */ |
| 815 | emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1)); | 838 | emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1)); |
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 06e0e783..75b8e174 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
| @@ -2074,6 +2074,14 @@ LJFOLDF(fload_str_len_snew) | |||
| 2074 | return NEXTFOLD; | 2074 | return NEXTFOLD; |
| 2075 | } | 2075 | } |
| 2076 | 2076 | ||
| 2077 | LJFOLD(FLOAD TOSTR IRFL_STR_LEN) | ||
| 2078 | LJFOLDF(fload_str_len_tostr) | ||
| 2079 | { | ||
| 2080 | if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fleft->op2 == IRTOSTR_CHAR) | ||
| 2081 | return INTFOLD(1); | ||
| 2082 | return NEXTFOLD; | ||
| 2083 | } | ||
| 2084 | |||
| 2077 | /* The C type ID of cdata objects is immutable. */ | 2085 | /* The C type ID of cdata objects is immutable. */ |
| 2078 | LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID) | 2086 | LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID) |
| 2079 | LJFOLDF(fload_cdata_typeid_kgc) | 2087 | LJFOLDF(fload_cdata_typeid_kgc) |
