aboutsummaryrefslogtreecommitdiff
path: root/src/lj_meta.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_meta.c')
-rw-r--r--src/lj_meta.c13
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 {