diff options
-rw-r--r-- | src/lib_os.c | 2 | ||||
-rw-r--r-- | src/lib_string.c | 8 | ||||
-rw-r--r-- | src/lj_buf.c | 9 | ||||
-rw-r--r-- | src/lj_buf.h | 9 | ||||
-rw-r--r-- | src/lj_opt_fold.c | 13 |
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 | ||
152 | GCstr *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 | |||
152 | uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp) | 161 | uint32_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); | |||
36 | LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s); | 36 | LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s); |
37 | LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s); | 37 | LJ_FUNCA SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s); |
38 | LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb); | 38 | LJ_FUNCA GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb); |
39 | LJ_FUNC GCstr *lj_buf_cat2str(lua_State *L, GCstr *s1, GCstr *s2); | ||
39 | LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp); | 40 | LJ_FUNC uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp); |
40 | LJ_FUNC char * LJ_FASTCALL lj_buf_wuleb128(char *p, uint32_t v); | 41 | LJ_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 | ||
54 | static 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 | |||
53 | static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb) | 62 | static 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; |