diff options
| -rw-r--r-- | src/lj_buf.c | 36 | ||||
| -rw-r--r-- | src/lj_buf.h | 14 | ||||
| -rw-r--r-- | 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 @@ | |||
| 3 | ** Copyright (C) 2005-2013 Mike Pall. See Copyright Notice in luajit.h | 3 | ** Copyright (C) 2005-2013 Mike Pall. See Copyright Notice in luajit.h |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #include <stdio.h> | ||
| 7 | |||
| 8 | #define lj_buf_c | 6 | #define lj_buf_c |
| 9 | #define LUA_CORE | 7 | #define LUA_CORE |
| 10 | 8 | ||
| @@ -18,23 +16,37 @@ | |||
| 18 | 16 | ||
| 19 | /* -- Buffer management --------------------------------------------------- */ | 17 | /* -- Buffer management --------------------------------------------------- */ |
| 20 | 18 | ||
| 21 | LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en) | 19 | static void buf_grow(SBuf *sb, MSize sz) |
| 22 | { | 20 | { |
| 23 | lua_State *L = sbufL(sb); | 21 | MSize osz = sbufsz(sb), len = sbuflen(sb), nsz = osz; |
| 24 | char *b = sbufB(sb); | 22 | char *b; |
| 25 | MSize sz = (MSize)(en - b); | ||
| 26 | MSize osz = (MSize)(sbufE(sb) - b), nsz = osz; | ||
| 27 | MSize n = (MSize)(sbufP(sb) - b); | ||
| 28 | if (LJ_UNLIKELY(sz > LJ_MAX_MEM)) | ||
| 29 | lj_err_mem(L); | ||
| 30 | if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF; | 23 | if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF; |
| 31 | while (nsz < sz) nsz += nsz; | 24 | while (nsz < sz) nsz += nsz; |
| 32 | b = (char *)lj_mem_realloc(L, b, osz, nsz); | 25 | b = (char *)lj_mem_realloc(sbufL(sb), sbufB(sb), osz, nsz); |
| 33 | setmref(sb->b, b); | 26 | setmref(sb->b, b); |
| 34 | setmref(sb->p, b + n); | 27 | setmref(sb->p, b + len); |
| 35 | setmref(sb->e, b + nsz); | 28 | setmref(sb->e, b + nsz); |
| 36 | } | 29 | } |
| 37 | 30 | ||
| 31 | LJ_NOINLINE char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz) | ||
| 32 | { | ||
| 33 | lua_assert(sz > sbufsz(sb)); | ||
| 34 | if (LJ_UNLIKELY(sz > LJ_MAX_MEM)) | ||
| 35 | lj_err_mem(sbufL(sb)); | ||
| 36 | buf_grow(sb, sz); | ||
| 37 | return sbufB(sb); | ||
| 38 | } | ||
| 39 | |||
| 40 | LJ_NOINLINE char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz) | ||
| 41 | { | ||
| 42 | MSize len = sbuflen(sb); | ||
| 43 | lua_assert(sz > sbufleft(sb)); | ||
| 44 | if (LJ_UNLIKELY(sz > LJ_MAX_MEM || len + sz > LJ_MAX_MEM)) | ||
| 45 | lj_err_mem(sbufL(sb)); | ||
| 46 | buf_grow(sb, len + sz); | ||
| 47 | return sbufP(sb); | ||
| 48 | } | ||
| 49 | |||
| 38 | void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb) | 50 | void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb) |
| 39 | { | 51 | { |
| 40 | char *b = sbufB(sb); | 52 | 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 @@ | |||
| 17 | #define sbufL(sb) (mref((sb)->L, lua_State)) | 17 | #define sbufL(sb) (mref((sb)->L, lua_State)) |
| 18 | #define sbufsz(sb) ((MSize)(sbufE((sb)) - sbufB((sb)))) | 18 | #define sbufsz(sb) ((MSize)(sbufE((sb)) - sbufB((sb)))) |
| 19 | #define sbuflen(sb) ((MSize)(sbufP((sb)) - sbufB((sb)))) | 19 | #define sbuflen(sb) ((MSize)(sbufP((sb)) - sbufB((sb)))) |
| 20 | #define sbufleft(sb) ((MSize)(sbufE((sb)) - sbufP((sb)))) | ||
| 20 | #define setsbufP(sb, q) (setmref((sb)->p, (q))) | 21 | #define setsbufP(sb, q) (setmref((sb)->p, (q))) |
| 21 | #define setsbufL(sb, l) (setmref((sb)->L, (l))) | 22 | #define setsbufL(sb, l) (setmref((sb)->L, (l))) |
| 22 | 23 | ||
| 23 | /* Buffer management */ | 24 | /* Buffer management */ |
| 24 | LJ_FUNC void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en); | 25 | LJ_FUNC char *LJ_FASTCALL lj_buf_need2(SBuf *sb, MSize sz); |
| 26 | LJ_FUNC char *LJ_FASTCALL lj_buf_more2(SBuf *sb, MSize sz); | ||
| 25 | LJ_FUNC void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb); | 27 | LJ_FUNC void LJ_FASTCALL lj_buf_shrink(lua_State *L, SBuf *sb); |
| 26 | LJ_FUNC char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz); | 28 | LJ_FUNC char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz); |
| 27 | 29 | ||
| @@ -51,17 +53,15 @@ static LJ_AINLINE void lj_buf_free(global_State *g, SBuf *sb) | |||
| 51 | 53 | ||
| 52 | static LJ_AINLINE char *lj_buf_need(SBuf *sb, MSize sz) | 54 | static LJ_AINLINE char *lj_buf_need(SBuf *sb, MSize sz) |
| 53 | { | 55 | { |
| 54 | char *en = sbufB(sb) + sz; | 56 | if (LJ_UNLIKELY(sz > sbufsz(sb))) |
| 55 | if (LJ_UNLIKELY(en > sbufE(sb))) | 57 | return lj_buf_need2(sb, sz); |
| 56 | lj_buf_grow(sb, en); | ||
| 57 | return sbufB(sb); | 58 | return sbufB(sb); |
| 58 | } | 59 | } |
| 59 | 60 | ||
| 60 | static LJ_AINLINE char *lj_buf_more(SBuf *sb, MSize sz) | 61 | static LJ_AINLINE char *lj_buf_more(SBuf *sb, MSize sz) |
| 61 | { | 62 | { |
| 62 | char *en = sbufP(sb) + sz; | 63 | if (LJ_UNLIKELY(sz > sbufleft(sb))) |
| 63 | if (LJ_UNLIKELY(en > sbufE(sb))) | 64 | return lj_buf_more2(sb, sz); |
| 64 | lj_buf_grow(sb, en); | ||
| 65 | return sbufP(sb); | 65 | return sbufP(sb); |
| 66 | } | 66 | } |
| 67 | 67 | ||
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 @@ | |||
| 3 | ** Copyright (C) 2005-2013 Mike Pall. See Copyright Notice in luajit.h | 3 | ** Copyright (C) 2005-2013 Mike Pall. See Copyright Notice in luajit.h |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #include <stdio.h> | ||
| 7 | |||
| 8 | #define lj_str_c | 6 | #define lj_str_c |
| 9 | #define LUA_CORE | 7 | #define LUA_CORE |
| 10 | 8 | ||
