aboutsummaryrefslogtreecommitdiff
path: root/src/lj_buf.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-02-27 21:17:27 +0100
committerMike Pall <mike>2013-02-27 21:28:28 +0100
commit116cdd7e9a578efffa5a9ca38167d059d12296d7 (patch)
treecc78e44c4b7a2175f2b16bc5f8898597a72bb228 /src/lj_buf.c
parent28cfcf77445e144335961a020e3e08d84cf0091f (diff)
downloadluajit-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.c64
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
16LJ_NOINLINE void lj_buf_grow(lua_State *L, SBuf *sb, MSize sz) 16LJ_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
27char *lj_buf_tmp(lua_State *L, MSize sz) 32char *lj_buf_tmp(lua_State *L, MSize sz)
@@ -31,10 +36,49 @@ char *lj_buf_tmp(lua_State *L, MSize sz)
31 36
32void lj_buf_shrink(lua_State *L, SBuf *sb) 37void 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
50char *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
57void 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
64uint32_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
77char *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