aboutsummaryrefslogtreecommitdiff
path: root/src/lj_bcread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_bcread.c')
-rw-r--r--src/lj_bcread.c23
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. */
46static 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. */
57static LJ_NOINLINE void bcread_fill(LexState *ls, MSize len, int need) 47static 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);