Compile string.char().

This commit is contained in:
Mike Pall 2013-04-23 12:25:18 +02:00
parent 255326afb6
commit 39e53e8c4c
3 changed files with 33 additions and 2 deletions

View File

@ -62,7 +62,7 @@ LJLIB_ASM(string_byte) LJLIB_REC(string_range 0)
return FFH_RES(n);
}
LJLIB_ASM(string_char)
LJLIB_ASM(string_char) LJLIB_REC(.)
{
int i, nargs = (int)(L->top - L->base);
char *buf = lj_buf_tmp(L, (size_t)nargs);

View File

@ -751,6 +751,26 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
}
}
static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)
{
TRef k255 = lj_ir_kint(J, 255);
BCReg i;
for (i = 0; J->base[i] != 0; i++) { /* Convert char values to strings. */
TRef tr = lj_opt_narrow_toint(J, J->base[i]);
emitir(IRTGI(IR_ULE), tr, k255);
J->base[i] = emitir(IRT(IR_TOSTR, IRT_STR), tr, IRTOSTR_CHAR);
}
if (i > 1) { /* Concatenate the strings, if there's more than one. */
TRef hdr = emitir(IRT(IR_BUFHDR, IRT_P32),
lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
TRef tr = hdr;
for (i = 0; J->base[i] != 0; i++)
tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);
J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), hdr, tr);
}
UNUSED(rd);
}
/* -- Table library fast functions ---------------------------------------- */
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)
TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);
TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);
if (tref_isk(len) && IR(tref_ref(len))->i == 1) {
TRef tr = emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY);
IRIns *irs = IR(tref_ref(str));
TRef tr = (irs->o == IR_TOSTR && irs->op2 == IRTOSTR_CHAR) ?
irs->op1 :
emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY);
tr = lj_ir_call(J, IRCALL_fputc, tr, fp);
if (results_wanted(J) != 0) /* Check result only if not ignored. */
emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1));

View File

@ -2074,6 +2074,14 @@ LJFOLDF(fload_str_len_snew)
return NEXTFOLD;
}
LJFOLD(FLOAD TOSTR IRFL_STR_LEN)
LJFOLDF(fload_str_len_tostr)
{
if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fleft->op2 == IRTOSTR_CHAR)
return INTFOLD(1);
return NEXTFOLD;
}
/* The C type ID of cdata objects is immutable. */
LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID)
LJFOLDF(fload_cdata_typeid_kgc)