aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib_os.c2
-rw-r--r--src/lib_string.c8
-rw-r--r--src/lj_buf.c9
-rw-r--r--src/lj_buf.h9
-rw-r--r--src/lj_opt_fold.c13
5 files changed, 24 insertions, 17 deletions
diff --git a/src/lib_os.c b/src/lib_os.c
index 08f538bd..9bfc418b 100644
--- a/src/lib_os.c
+++ b/src/lib_os.c
@@ -205,7 +205,7 @@ LJLIB_CF(os_date)
205 const char *q; 205 const char *q;
206 for (q = s; *q; q++) 206 for (q = s; *q; q++)
207 sz += (*q == '%') ? 30 : 1; /* Overflow doesn't matter. */ 207 sz += (*q == '%') ? 30 : 1; /* Overflow doesn't matter. */
208 setmref(sb->L, L); 208 setsbufL(sb, L);
209 for (;;) { 209 for (;;) {
210 char *buf = lj_buf_need(sb, sz); 210 char *buf = lj_buf_need(sb, sz);
211 size_t len = strftime(buf, sbufsz(sb), s, stm); 211 size_t len = strftime(buf, sbufsz(sb), s, stm);
diff --git a/src/lib_string.c b/src/lib_string.c
index db2c275d..cd673478 100644
--- a/src/lib_string.c
+++ b/src/lib_string.c
@@ -155,9 +155,7 @@ LJLIB_CF(string_dump)
155{ 155{
156 GCfunc *fn = lj_lib_checkfunc(L, 1); 156 GCfunc *fn = lj_lib_checkfunc(L, 1);
157 int strip = L->base+1 < L->top && tvistruecond(L->base+1); 157 int strip = L->base+1 < L->top && tvistruecond(L->base+1);
158 SBuf *sb = &G(L)->tmpbuf; /* Assumes lj_bcwrite() doesn't use tmpbuf. */ 158 SBuf *sb = lj_buf_tmp_(L); /* Assumes lj_bcwrite() doesn't use tmpbuf. */
159 setmref(sb->L, L);
160 lj_buf_reset(sb);
161 L->top = L->base+1; 159 L->top = L->base+1;
162 if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip)) 160 if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip))
163 lj_err_caller(L, LJ_ERR_STRDUMP); 161 lj_err_caller(L, LJ_ERR_STRDUMP);
@@ -851,9 +849,7 @@ LJLIB_CF(string_format)
851 GCstr *sfmt = lj_lib_checkstr(L, arg); 849 GCstr *sfmt = lj_lib_checkstr(L, arg);
852 const char *fmt = strdata(sfmt); 850 const char *fmt = strdata(sfmt);
853 const char *efmt = fmt + sfmt->len; 851 const char *efmt = fmt + sfmt->len;
854 SBuf *sb = &G(L)->tmpbuf; 852 SBuf *sb = lj_buf_tmp_(L);
855 setmref(sb->L, L);
856 lj_buf_reset(sb);
857 while (fmt < efmt) { 853 while (fmt < efmt) {
858 if (*fmt != L_ESC || *++fmt == L_ESC) { 854 if (*fmt != L_ESC || *++fmt == L_ESC) {
859 lj_buf_putb(sb, *fmt++); 855 lj_buf_putb(sb, *fmt++);
diff --git a/src/lj_buf.c b/src/lj_buf.c
index 32ed52b9..3526a6e5 100644
--- a/src/lj_buf.c
+++ b/src/lj_buf.c
@@ -149,6 +149,15 @@ GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb)
149 return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb)); 149 return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb));
150} 150}
151 151
152GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2)
153{
154 MSize len1 = s1->len, len2 = s2->len;
155 char *buf = lj_buf_tmp(L, len1 + len2);
156 memcpy(buf, strdata(s1), len1);
157 memcpy(buf+len1, strdata(s2), len2);
158 return lj_str_new(L, buf, len1 + len2);
159}
160
152uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp) 161uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp)
153{ 162{
154 const uint8_t *p = (const uint8_t *)*pp; 163 const uint8_t *p = (const uint8_t *)*pp;
diff --git a/src/lj_buf.h b/src/lj_buf.h
index 98bcad20..92a6055a 100644
--- a/src/lj_buf.h
+++ b/src/lj_buf.h
@@ -36,6 +36,7 @@ LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s);
36LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s); 36LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s);
37LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s); 37LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s);
38LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb); 38LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb);
39LJ_FUNC GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2);
39LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp); 40LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp);
40LJ_FUNC char * LJ_FASTCALL lj_buf_wuleb128(char *p, uint32_t v); 41LJ_FUNC char * LJ_FASTCALL lj_buf_wuleb128(char *p, uint32_t v);
41 42
@@ -50,6 +51,14 @@ static LJ_AINLINE void lj_buf_reset(SBuf *sb)
50 setmrefr(sb->p, sb->b); 51 setmrefr(sb->p, sb->b);
51} 52}
52 53
54static LJ_AINLINE SBuf *lj_buf_tmp_(lua_State *L)
55{
56 SBuf *sb = &G(L)->tmpbuf;
57 setsbufL(sb, L);
58 lj_buf_reset(sb);
59 return sb;
60}
61
53static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb) 62static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb)
54{ 63{
55 lj_mem_free(g, sbufB(sb), sbufsz(sb)); 64 lj_mem_free(g, sbufB(sb), sbufsz(sb));
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index e9f873b7..fc625b84 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -559,20 +559,13 @@ LJFOLDF(bufput_kgc)
559{ 559{
560 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) { 560 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fright->o == IR_KGC) {
561 GCstr *s2 = ir_kstr(fright); 561 GCstr *s2 = ir_kstr(fright);
562 MSize len2 = s2->len; 562 if (s2->len == 0) { /* Empty string? */
563 if (len2 == 0) { /* Empty string? */
564 return LEFTFOLD; 563 return LEFTFOLD;
565 } else { 564 } else {
566 if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) && 565 if (fleft->o == IR_BUFPUT && irref_isk(fleft->op2) &&
567 !irt_isphi(fleft->t)) { 566 !irt_isphi(fleft->t)) { /* Join two constant string puts in a row. */
568 /* Join two constant string puts in a row. */
569 GCstr *s1 = ir_kstr(IR(fleft->op2)); 567 GCstr *s1 = ir_kstr(IR(fleft->op2));
570 MSize len1 = s1->len; 568 IRRef kref = lj_ir_kstr(J, lj_buf_cat2str(J->L, s1, s2));
571 char *buf = lj_buf_tmp(J->L, len1 + len2);
572 IRRef kref;
573 memcpy(buf, strdata(s1), len1);
574 memcpy(buf+len1, strdata(s2), len2);
575 kref = lj_ir_kstr(J, lj_str_new(J->L, buf, len1 + len2));
576 /* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */ 569 /* lj_ir_kstr() may realloc the IR and invalidates any IRIns *. */
577 IR(fins->op1)->op2 = kref; /* Modify previous BUFPUT. */ 570 IR(fins->op1)->op2 = kref; /* Modify previous BUFPUT. */
578 return fins->op1; 571 return fins->op1;