diff --git a/src/lj_api.c b/src/lj_api.c index f33748ce..10f9f3cb 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -713,7 +713,7 @@ LUA_API void lua_concat(lua_State *L, int n) copyTV(L, L->top-1, L->top); } while (--n > 0); } else if (n == 0) { /* Push empty string. */ - setstrV(L, L->top, lj_str_new(L, "", 0)); + setstrV(L, L->top, &G(L)->strempty); incr_top(L); } /* else n == 1: nothing to do. */ diff --git a/src/lj_asm.c b/src/lj_asm.c index c349c990..17cbd848 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -4098,7 +4098,7 @@ static void asm_ir(ASMState *as, IRIns *ir) case IR_FSTORE: case IR_XSTORE: asm_fxstore(as, ir); break; /* Allocations. */ - case IR_SNEW: asm_snew(as, ir); break; + case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break; case IR_TNEW: asm_tnew(as, ir); break; case IR_TDUP: asm_tdup(as, ir); break; case IR_CNEW: case IR_CNEWI: asm_cnew(as, ir); break; diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 5e058a6f..d689b81b 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c @@ -970,7 +970,7 @@ void LJ_FASTCALL recff_ffi_string(jit_State *J, RecordFFData *rd) tr = crec_ct_tv(J, ctype_get(cts, CTID_P_CCHAR), 0, tr, &rd->argv[0]); trlen = lj_ir_call(J, IRCALL_strlen, tr); } - J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), tr, trlen); + J->base[0] = emitir(IRT(IR_XSNEW, IRT_STR), tr, trlen); } /* else: interpreter will throw. */ } diff --git a/src/lj_ir.h b/src/lj_ir.h index f9ca4627..4813f250 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h @@ -110,6 +110,7 @@ \ /* Allocations. */ \ _(SNEW, N , ref, ref) /* CSE is ok, not marked as A. */ \ + _(XSNEW, A , ref, ref) \ _(TNEW, AW, lit, lit) \ _(TDUP, AW, ref, ___) \ _(CNEW, AW, ref, ref) \ diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index e5ed7ade..e7a1ca54 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c @@ -153,7 +153,8 @@ typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J); */ #define gcstep_barrier(J, ref) \ ((ref) < J->chain[IR_LOOP] && \ - (J->chain[IR_SNEW] || J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ + (J->chain[IR_SNEW] || J->chain[IR_XSNEW] || \ + J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ J->chain[IR_CNEW] || J->chain[IR_CNEWI] || J->chain[IR_TOSTR])) /* -- Constant folding for FP numbers ------------------------------------- */ @@ -445,7 +446,7 @@ LJFOLD(SNEW any KINT) LJFOLDF(kfold_snew_empty) { if (fright->i == 0) - return lj_ir_kstr(J, lj_str_new(J->L, "", 0)); + return lj_ir_kstr(J, &J2G(J)->strempty); return NEXTFOLD; } @@ -1900,6 +1901,7 @@ LJFOLD(RETF any any) /* Modifies BASE. */ LJFOLD(TNEW any any) LJFOLD(TDUP any) LJFOLD(CNEW any any) +LJFOLD(XSNEW any any) LJFOLDX(lj_ir_emit) /* ------------------------------------------------------------------------ */