LJ_NOINLINE char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz) { lua_assert(sz > sbufsz(sb)); if (LJ_UNLIKELY(sz > LJ_MAX_MEM)) lj_err_mem(sbufL(sb)); buf_grow(sb, sz); return sbufB(sb); }
static void buf_grow(SBuf *sb, MSize sz) { MSize osz = sbufsz(sb), len = sbuflen(sb), nsz = osz; char *b; if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF; while (nsz < sz) nsz += nsz; b = (char *)lj_mem_realloc(sbufL(sb), sbufB(sb), osz, nsz); setmref(sb->b, b); setmref(sb->p, b + len); setmref(sb->e, b + nsz); }
char *kp_buf_need(SBuf *sb, int sz) { char *b; int old_len = sbuflen(sb); if (sz > sbufsz(sb)) { b = realloc(sbufB(sb), sz); sb->b = b; sb->p = b + old_len; sb->e = b + sz; } return sbufB(sb); }