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; |
