diff options
author | Mike Pall <mike> | 2013-04-23 12:25:18 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-04-23 12:40:07 +0200 |
commit | 39e53e8c4c4b6151c53e384d411ae48026e5567d (patch) | |
tree | 94c4ed448eaf38ccadea216c2c3257dc2320fd56 /src/lj_ffrecord.c | |
parent | 255326afb6fd428d62cf66e4e90a459b917a76a1 (diff) | |
download | luajit-39e53e8c4c4b6151c53e384d411ae48026e5567d.tar.gz luajit-39e53e8c4c4b6151c53e384d411ae48026e5567d.tar.bz2 luajit-39e53e8c4c4b6151c53e384d411ae48026e5567d.zip |
Compile string.char().
Diffstat (limited to 'src/lj_ffrecord.c')
-rw-r--r-- | src/lj_ffrecord.c | 25 |
1 files changed, 24 insertions, 1 deletions
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)); |