diff options
Diffstat (limited to 'src/lj_meta.c')
-rw-r--r-- | src/lj_meta.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/lj_meta.c b/src/lj_meta.c index 07defa55..660dfec0 100644 --- a/src/lj_meta.c +++ b/src/lj_meta.c | |||
@@ -240,8 +240,8 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left) | |||
240 | int fromc = 0; | 240 | int fromc = 0; |
241 | if (left < 0) { left = -left; fromc = 1; } | 241 | if (left < 0) { left = -left; fromc = 1; } |
242 | do { | 242 | do { |
243 | if (!(tvisstr(top) || tvisnumber(top)) || | 243 | if (!(tvisstr(top) || tvisnumber(top) || tvisbuf(top)) || |
244 | !(tvisstr(top-1) || tvisnumber(top-1))) { | 244 | !(tvisstr(top-1) || tvisnumber(top-1) || tvisbuf(top-1))) { |
245 | cTValue *mo = lj_meta_lookup(L, top-1, MM_concat); | 245 | cTValue *mo = lj_meta_lookup(L, top-1, MM_concat); |
246 | if (tvisnil(mo)) { | 246 | if (tvisnil(mo)) { |
247 | mo = lj_meta_lookup(L, top, MM_concat); | 247 | mo = lj_meta_lookup(L, top, MM_concat); |
@@ -277,10 +277,12 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left) | |||
277 | ** next step: [...][CAT stack ............] | 277 | ** next step: [...][CAT stack ............] |
278 | */ | 278 | */ |
279 | TValue *e, *o = top; | 279 | TValue *e, *o = top; |
280 | uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM; | 280 | uint64_t tlen = tvisstr(o) ? strV(o)->len : |
281 | tvisbuf(o) ? sbufxlen(bufV(o)) : STRFMT_MAXBUF_NUM; | ||
281 | SBuf *sb; | 282 | SBuf *sb; |
282 | do { | 283 | do { |
283 | o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM; | 284 | o--; tlen += tvisstr(o) ? strV(o)->len : |
285 | tvisbuf(o) ? sbufxlen(bufV(o)) : STRFMT_MAXBUF_NUM; | ||
284 | } while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1))); | 286 | } while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1))); |
285 | if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV); | 287 | if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV); |
286 | sb = lj_buf_tmp_(L); | 288 | sb = lj_buf_tmp_(L); |
@@ -290,6 +292,9 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left) | |||
290 | GCstr *s = strV(o); | 292 | GCstr *s = strV(o); |
291 | MSize len = s->len; | 293 | MSize len = s->len; |
292 | lj_buf_putmem(sb, strdata(s), len); | 294 | lj_buf_putmem(sb, strdata(s), len); |
295 | } else if (tvisbuf(o)) { | ||
296 | SBufExt *sbx = bufV(o); | ||
297 | lj_buf_putmem(sb, sbx->r, sbufxlen(sbx)); | ||
293 | } else if (tvisint(o)) { | 298 | } else if (tvisint(o)) { |
294 | lj_strfmt_putint(sb, intV(o)); | 299 | lj_strfmt_putint(sb, intV(o)); |
295 | } else { | 300 | } else { |