From c5ebfa0c6793562d7392ffc68b1318d250f47a02 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 29 May 2013 20:17:26 +0200 Subject: [PATCH] Refactor string buffer growth helpers. --- src/lj_buf.c | 36 ++++++++++++++++++++++++------------ src/lj_buf.h | 14 +++++++------- src/lj_str.c | 2 -- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/lj_buf.c b/src/lj_buf.c index 1786c10d..1f6e97bf 100644 --- a/src/lj_buf.c +++ b/src/lj_buf.c @@ -3,8 +3,6 @@ ** Copyright (C) 2005-2013 Mike Pall. See Copyright Notice in luajit.h */ -#include - #define lj_buf_c #define LUA_CORE @@ -18,23 +16,37 @@ /* -- Buffer management --------------------------------------------------- */ -LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en) +static void buf_grow(SBuf *sb, MSize sz) { - lua_State *L = sbufL(sb); - char *b = sbufB(sb); - MSize sz = (MSize)(en - b); - MSize osz = (MSize)(sbufE(sb) - b), nsz = osz; - MSize n = (MSize)(sbufP(sb) - b); - if (LJ_UNLIKELY(sz > LJ_MAX_MEM)) - lj_err_mem(L); + 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(L, b, osz, nsz); + b = (char *)lj_mem_realloc(sbufL(sb), sbufB(sb), osz, nsz); setmref(sb->b, b); - setmref(sb->p, b + n); + setmref(sb->p, b + len); setmref(sb->e, b + nsz); } +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); +} + +LJ_NOINLINE char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz) +{ + MSize len = sbuflen(sb); + lua_assert(sz > sbufleft(sb)); + if (LJ_UNLIKELY(sz > LJ_MAX_MEM || len + sz > LJ_MAX_MEM)) + lj_err_mem(sbufL(sb)); + buf_grow(sb, len + sz); + return sbufP(sb); +} + void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb) { char *b = sbufB(sb); diff --git a/src/lj_buf.h b/src/lj_buf.h index 5f78c4a9..7a123e83 100644 --- a/src/lj_buf.h +++ b/src/lj_buf.h @@ -17,11 +17,13 @@ #define sbufL(sb) (mref((sb)->L, lua_State)) #define sbufsz(sb) ((MSize)(sbufE((sb)) - sbufB((sb)))) #define sbuflen(sb) ((MSize)(sbufP((sb)) - sbufB((sb)))) +#define sbufleft(sb) ((MSize)(sbufE((sb)) - sbufP((sb)))) #define setsbufP(sb, q) (setmref((sb)->p, (q))) #define setsbufL(sb, l) (setmref((sb)->L, (l))) /* Buffer management */ -LJ_FUNC void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en); +LJ_FUNC char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz); +LJ_FUNC char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz); LJ_FUNC void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb); LJ_FUNC char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz); @@ -51,17 +53,15 @@ static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb) static LJ_AINLINE char *lj_buf_need(SBuf *sb, MSize sz) { - char *en = sbufB(sb) + sz; - if (LJ_UNLIKELY(en > sbufE(sb))) - lj_buf_grow(sb, en); + if (LJ_UNLIKELY(sz > sbufsz(sb))) + return lj_buf_need2(sb, sz); return sbufB(sb); } static LJ_AINLINE char *lj_buf_more(SBuf *sb, MSize sz) { - char *en = sbufP(sb) + sz; - if (LJ_UNLIKELY(en > sbufE(sb))) - lj_buf_grow(sb, en); + if (LJ_UNLIKELY(sz > sbufleft(sb))) + return lj_buf_more2(sb, sz); return sbufP(sb); } diff --git a/src/lj_str.c b/src/lj_str.c index 24d96067..5fdd1672 100644 --- a/src/lj_str.c +++ b/src/lj_str.c @@ -3,8 +3,6 @@ ** Copyright (C) 2005-2013 Mike Pall. See Copyright Notice in luajit.h */ -#include - #define lj_str_c #define LUA_CORE