diff options
author | Mike Pall <mike> | 2013-05-29 20:17:26 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-05-29 20:17:26 +0200 |
commit | c5ebfa0c6793562d7392ffc68b1318d250f47a02 (patch) | |
tree | 9c99888eb43a72eabc56818620ff6875de475bf4 | |
parent | b6882a57da86a19c4c95b675a36e44da367a9873 (diff) | |
download | luajit-c5ebfa0c6793562d7392ffc68b1318d250f47a02.tar.gz luajit-c5ebfa0c6793562d7392ffc68b1318d250f47a02.tar.bz2 luajit-c5ebfa0c6793562d7392ffc68b1318d250f47a02.zip |
Refactor string buffer growth helpers.
-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 | ||