diff options
Diffstat (limited to 'src/lj_bcread.c')
-rw-r--r-- | src/lj_bcread.c | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/src/lj_bcread.c b/src/lj_bcread.c index 7a8c08f5..fabe76da 100644 --- a/src/lj_bcread.c +++ b/src/lj_bcread.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include "lj_obj.h" | 9 | #include "lj_obj.h" |
10 | #include "lj_gc.h" | 10 | #include "lj_gc.h" |
11 | #include "lj_err.h" | 11 | #include "lj_err.h" |
12 | #include "lj_buf.h" | ||
12 | #include "lj_str.h" | 13 | #include "lj_str.h" |
13 | #include "lj_tab.h" | 14 | #include "lj_tab.h" |
14 | #include "lj_bc.h" | 15 | #include "lj_bc.h" |
@@ -42,17 +43,6 @@ static LJ_NOINLINE void bcread_error(LexState *ls, ErrMsg em) | |||
42 | lj_err_throw(L, LUA_ERRSYNTAX); | 43 | lj_err_throw(L, LUA_ERRSYNTAX); |
43 | } | 44 | } |
44 | 45 | ||
45 | /* Resize input buffer. */ | ||
46 | static void bcread_resize(LexState *ls, MSize len) | ||
47 | { | ||
48 | if (ls->sb.sz < len) { | ||
49 | MSize sz = ls->sb.sz * 2; | ||
50 | while (len > sz) sz = sz * 2; | ||
51 | lj_str_resizebuf(ls->L, &ls->sb, sz); | ||
52 | /* Caveat: this may change ls->sb.buf which may affect ls->p. */ | ||
53 | } | ||
54 | } | ||
55 | |||
56 | /* Refill buffer if needed. */ | 46 | /* Refill buffer if needed. */ |
57 | static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need) | 47 | static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need) |
58 | { | 48 | { |
@@ -68,8 +58,7 @@ static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need) | |||
68 | if (ls->n != ls->sb.n) | 58 | if (ls->n != ls->sb.n) |
69 | memmove(ls->sb.buf, ls->p, ls->n); | 59 | memmove(ls->sb.buf, ls->p, ls->n); |
70 | } else { /* Copy from buffer provided by reader. */ | 60 | } else { /* Copy from buffer provided by reader. */ |
71 | bcread_resize(ls, len); | 61 | memcpy(lj_buf_need(ls->L, &ls->sb, len), ls->p, ls->n); |
72 | memcpy(ls->sb.buf, ls->p, ls->n); | ||
73 | } | 62 | } |
74 | ls->p = ls->sb.buf; | 63 | ls->p = ls->sb.buf; |
75 | } | 64 | } |
@@ -82,10 +71,10 @@ static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need) | |||
82 | } | 71 | } |
83 | if (ls->sb.n) { /* Append to buffer. */ | 72 | if (ls->sb.n) { /* Append to buffer. */ |
84 | MSize n = ls->sb.n + (MSize)size; | 73 | MSize n = ls->sb.n + (MSize)size; |
85 | bcread_resize(ls, n < len ? len : n); | 74 | char *p = lj_buf_need(ls->L, &ls->sb, n < len ? len : n); |
86 | memcpy(ls->sb.buf + ls->sb.n, buf, size); | 75 | memcpy(p + ls->sb.n, buf, size); |
87 | ls->n = ls->sb.n = n; | 76 | ls->n = ls->sb.n = n; |
88 | ls->p = ls->sb.buf; | 77 | ls->p = p; |
89 | } else { /* Return buffer provided by reader. */ | 78 | } else { /* Return buffer provided by reader. */ |
90 | ls->n = (MSize)size; | 79 | ls->n = (MSize)size; |
91 | ls->p = buf; | 80 | ls->p = buf; |
@@ -442,7 +431,7 @@ GCproto *lj_bcread(LexState *ls) | |||
442 | lua_State *L = ls->L; | 431 | lua_State *L = ls->L; |
443 | lua_assert(ls->current == BCDUMP_HEAD1); | 432 | lua_assert(ls->current == BCDUMP_HEAD1); |
444 | bcread_savetop(L, ls, L->top); | 433 | bcread_savetop(L, ls, L->top); |
445 | lj_str_resetbuf(&ls->sb); | 434 | lj_buf_reset(&ls->sb); |
446 | /* Check for a valid bytecode dump header. */ | 435 | /* Check for a valid bytecode dump header. */ |
447 | if (!bcread_header(ls)) | 436 | if (!bcread_header(ls)) |
448 | bcread_error(ls, LJ_ERR_BCFMT); | 437 | bcread_error(ls, LJ_ERR_BCFMT); |