diff options
author | Mike Pall <mike> | 2013-02-27 21:17:27 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-02-27 21:28:28 +0100 |
commit | 116cdd7e9a578efffa5a9ca38167d059d12296d7 (patch) | |
tree | cc78e44c4b7a2175f2b16bc5f8898597a72bb228 /src/lj_buf.c | |
parent | 28cfcf77445e144335961a020e3e08d84cf0091f (diff) | |
download | luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.tar.gz luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.tar.bz2 luajit-116cdd7e9a578efffa5a9ca38167d059d12296d7.zip |
String buffer refactoring, part 2.
Switch to pointers for start/pos/end of buffer.
Abstract out some buffer writers.
Diffstat (limited to 'src/lj_buf.c')
-rw-r--r-- | src/lj_buf.c | 64 |
1 files changed, 54 insertions, 10 deletions
diff --git a/src/lj_buf.c b/src/lj_buf.c index 5d901d2a..a05dc22e 100644 --- a/src/lj_buf.c +++ b/src/lj_buf.c | |||
@@ -13,15 +13,20 @@ | |||
13 | #include "lj_err.h" | 13 | #include "lj_err.h" |
14 | #include "lj_buf.h" | 14 | #include "lj_buf.h" |
15 | 15 | ||
16 | LJ_NOINLINE void lj_buf_grow(lua_State *L, SBuf *sb, MSize sz) | 16 | LJ_NOINLINE void lj_buf_grow(lua_State *L, SBuf *sb, char *en) |
17 | { | 17 | { |
18 | MSize bsz = sb->sz * 2; | 18 | char *b = sbufB(sb); |
19 | MSize sz = (MSize)(en - b); | ||
20 | MSize osz = (MSize)(sbufE(sb) - b), nsz = osz; | ||
21 | MSize n = (MSize)(sbufP(sb) - b); | ||
19 | if (LJ_UNLIKELY(sz > LJ_MAX_MEM)) | 22 | if (LJ_UNLIKELY(sz > LJ_MAX_MEM)) |
20 | lj_err_mem(L); | 23 | lj_err_mem(L); |
21 | if (bsz < LJ_MIN_SBUF) bsz = LJ_MIN_SBUF; | 24 | if (nsz < LJ_MIN_SBUF) nsz = LJ_MIN_SBUF; |
22 | while (bsz < sz) bsz += bsz; | 25 | while (nsz < sz) nsz += nsz; |
23 | sb->buf = lj_mem_realloc(L, sb->buf, sb->sz, bsz); | 26 | b = (char *)lj_mem_realloc(L, b, osz, nsz); |
24 | sb->sz = bsz; | 27 | setmref(sb->b, b); |
28 | setmref(sb->p, b + n); | ||
29 | setmref(sb->e, b + nsz); | ||
25 | } | 30 | } |
26 | 31 | ||
27 | char *lj_buf_tmp(lua_State *L, MSize sz) | 32 | char *lj_buf_tmp(lua_State *L, MSize sz) |
@@ -31,10 +36,49 @@ char *lj_buf_tmp(lua_State *L, MSize sz) | |||
31 | 36 | ||
32 | void lj_buf_shrink(lua_State *L, SBuf *sb) | 37 | void lj_buf_shrink(lua_State *L, SBuf *sb) |
33 | { | 38 | { |
34 | MSize sz = sb->sz; | 39 | char *b = sbufB(sb); |
35 | if (sz > 2*LJ_MIN_SBUF) { | 40 | MSize osz = (MSize)(sbufE(sb) - b); |
36 | sb->buf = lj_mem_realloc(L, sb->buf, sz, (sz >> 1)); | 41 | if (osz > 2*LJ_MIN_SBUF) { |
37 | sb->sz = (sz >> 1); | 42 | MSize n = (MSize)(sbufP(sb) - b); |
43 | b = lj_mem_realloc(L, b, osz, (osz >> 1)); | ||
44 | setmref(sb->b, b); | ||
45 | setmref(sb->p, b + n); | ||
46 | setmref(sb->e, b + (osz >> 1)); | ||
38 | } | 47 | } |
39 | } | 48 | } |
40 | 49 | ||
50 | char *lj_buf_wmem(char *p, const void *q, MSize len) | ||
51 | { | ||
52 | const char *s = (const char *)q, *e = s + len; | ||
53 | while (s < e) *p++ = *s++; | ||
54 | return p; | ||
55 | } | ||
56 | |||
57 | void lj_buf_putmem(lua_State *L, SBuf *sb, const void *q, MSize len) | ||
58 | { | ||
59 | char *p = lj_buf_more(L, sb, len); | ||
60 | p = lj_buf_wmem(p, q, len); | ||
61 | setsbufP(sb, p); | ||
62 | } | ||
63 | |||
64 | uint32_t lj_buf_ruleb128(const char **pp) | ||
65 | { | ||
66 | const uint8_t *p = (const uint8_t *)*pp; | ||
67 | uint32_t v = *p++; | ||
68 | if (LJ_UNLIKELY(v >= 0x80)) { | ||
69 | int sh = 0; | ||
70 | v &= 0x7f; | ||
71 | do { v |= ((*p & 0x7f) << (sh += 7)); } while (*p++ >= 0x80); | ||
72 | } | ||
73 | *pp = (const char *)p; | ||
74 | return v; | ||
75 | } | ||
76 | |||
77 | char *lj_buf_wuleb128(char *p, uint32_t v) | ||
78 | { | ||
79 | for (; v >= 0x80; v >>= 7) | ||
80 | *p++ = (char)((v & 0x7f) | 0x80); | ||
81 | *p++ = (char)v; | ||
82 | return p; | ||
83 | } | ||
84 | |||