String buffers, part 2d: basic string buffer methods.
Sponsored by fmad.io.
This commit is contained in:
@@ -240,8 +240,8 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
|
||||
int fromc = 0;
|
||||
if (left < 0) { left = -left; fromc = 1; }
|
||||
do {
|
||||
if (!(tvisstr(top) || tvisnumber(top)) ||
|
||||
!(tvisstr(top-1) || tvisnumber(top-1))) {
|
||||
if (!(tvisstr(top) || tvisnumber(top) || tvisbuf(top)) ||
|
||||
!(tvisstr(top-1) || tvisnumber(top-1) || tvisbuf(top-1))) {
|
||||
cTValue *mo = lj_meta_lookup(L, top-1, MM_concat);
|
||||
if (tvisnil(mo)) {
|
||||
mo = lj_meta_lookup(L, top, MM_concat);
|
||||
@@ -277,10 +277,12 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
|
||||
** next step: [...][CAT stack ............]
|
||||
*/
|
||||
TValue *e, *o = top;
|
||||
uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
|
||||
uint64_t tlen = tvisstr(o) ? strV(o)->len :
|
||||
tvisbuf(o) ? sbufxlen(bufV(o)) : STRFMT_MAXBUF_NUM;
|
||||
SBuf *sb;
|
||||
do {
|
||||
o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
|
||||
o--; tlen += tvisstr(o) ? strV(o)->len :
|
||||
tvisbuf(o) ? sbufxlen(bufV(o)) : STRFMT_MAXBUF_NUM;
|
||||
} while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1)));
|
||||
if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV);
|
||||
sb = lj_buf_tmp_(L);
|
||||
@@ -290,6 +292,9 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
|
||||
GCstr *s = strV(o);
|
||||
MSize len = s->len;
|
||||
lj_buf_putmem(sb, strdata(s), len);
|
||||
} else if (tvisbuf(o)) {
|
||||
SBufExt *sbx = bufV(o);
|
||||
lj_buf_putmem(sb, sbx->r, sbufxlen(sbx));
|
||||
} else if (tvisint(o)) {
|
||||
lj_strfmt_putint(sb, intV(o));
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user