diff options
Diffstat (limited to 'src/lj_lex.c')
-rw-r--r-- | src/lj_lex.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/src/lj_lex.c b/src/lj_lex.c index 2c5128e7..5a8f1003 100644 --- a/src/lj_lex.c +++ b/src/lj_lex.c | |||
@@ -45,17 +45,17 @@ TKDEF(TKSTR1, TKSTR2) | |||
45 | static LJ_NOINLINE LexChar lex_more(LexState *ls) | 45 | static LJ_NOINLINE LexChar lex_more(LexState *ls) |
46 | { | 46 | { |
47 | size_t sz; | 47 | size_t sz; |
48 | const char *buf = ls->rfunc(ls->L, ls->rdata, &sz); | 48 | const char *p = ls->rfunc(ls->L, ls->rdata, &sz); |
49 | if (buf == NULL || sz == 0) return LEX_EOF; | 49 | if (p == NULL || sz == 0) return LEX_EOF; |
50 | ls->n = (MSize)sz - 1; | 50 | ls->pe = p + sz; |
51 | ls->p = buf; | 51 | ls->p = p + 1; |
52 | return (LexChar)(uint8_t)*ls->p++; | 52 | return (LexChar)(uint8_t)p[0]; |
53 | } | 53 | } |
54 | 54 | ||
55 | /* Get next character. */ | 55 | /* Get next character. */ |
56 | static LJ_AINLINE LexChar lex_next(LexState *ls) | 56 | static LJ_AINLINE LexChar lex_next(LexState *ls) |
57 | { | 57 | { |
58 | return (ls->c = ls->n ? (ls->n--,(LexChar)(uint8_t)*ls->p++) : lex_more(ls)); | 58 | return (ls->c = ls->p < ls->pe ? (LexChar)(uint8_t)*ls->p++ : lex_more(ls)); |
59 | } | 59 | } |
60 | 60 | ||
61 | /* Save character. */ | 61 | /* Save character. */ |
@@ -368,8 +368,7 @@ int lj_lex_setup(lua_State *L, LexState *ls) | |||
368 | int header = 0; | 368 | int header = 0; |
369 | ls->L = L; | 369 | ls->L = L; |
370 | ls->fs = NULL; | 370 | ls->fs = NULL; |
371 | ls->n = 0; | 371 | ls->pe = ls->p = NULL; |
372 | ls->p = NULL; | ||
373 | ls->vstack = NULL; | 372 | ls->vstack = NULL; |
374 | ls->sizevstack = 0; | 373 | ls->sizevstack = 0; |
375 | ls->vtop = 0; | 374 | ls->vtop = 0; |
@@ -379,9 +378,8 @@ int lj_lex_setup(lua_State *L, LexState *ls) | |||
379 | ls->linenumber = 1; | 378 | ls->linenumber = 1; |
380 | ls->lastline = 1; | 379 | ls->lastline = 1; |
381 | lex_next(ls); /* Read-ahead first char. */ | 380 | lex_next(ls); /* Read-ahead first char. */ |
382 | if (ls->c == 0xef && ls->n >= 2 && (uint8_t)ls->p[0] == 0xbb && | 381 | if (ls->c == 0xef && ls->p + 2 <= ls->pe && (uint8_t)ls->p[0] == 0xbb && |
383 | (uint8_t)ls->p[1] == 0xbf) { /* Skip UTF-8 BOM (if buffered). */ | 382 | (uint8_t)ls->p[1] == 0xbf) { /* Skip UTF-8 BOM (if buffered). */ |
384 | ls->n -= 2; | ||
385 | ls->p += 2; | 383 | ls->p += 2; |
386 | lex_next(ls); | 384 | lex_next(ls); |
387 | header = 1; | 385 | header = 1; |