diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_lex.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/src/lj_lex.c b/src/lj_lex.c index 78c333b0..d02ae849 100644 --- a/src/lj_lex.c +++ b/src/lj_lex.c | |||
| @@ -46,16 +46,22 @@ static int fillbuf(LexState *ls) | |||
| 46 | return char2int(*(ls->p++)); | 46 | return char2int(*(ls->p++)); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | static void save(LexState *ls, int c) | 49 | static LJ_NOINLINE void save_grow(LexState *ls, int c) |
| 50 | { | 50 | { |
| 51 | if (ls->sb.n + 1 > ls->sb.sz) { | 51 | MSize newsize; |
| 52 | MSize newsize; | 52 | if (ls->sb.sz >= LJ_MAX_STR/2) |
| 53 | if (ls->sb.sz >= LJ_MAX_STR/2) | 53 | lj_lex_error(ls, 0, LJ_ERR_XELEM); |
| 54 | lj_lex_error(ls, 0, LJ_ERR_XELEM); | 54 | newsize = ls->sb.sz * 2; |
| 55 | newsize = ls->sb.sz * 2; | 55 | lj_str_resizebuf(ls->L, &ls->sb, newsize); |
| 56 | lj_str_resizebuf(ls->L, &ls->sb, newsize); | 56 | ls->sb.buf[ls->sb.n++] = (char)c; |
| 57 | } | 57 | } |
| 58 | ls->sb.buf[ls->sb.n++] = cast(char, c); | 58 | |
| 59 | static LJ_AINLINE void save(LexState *ls, int c) | ||
| 60 | { | ||
| 61 | if (LJ_UNLIKELY(ls->sb.n + 1 > ls->sb.sz)) | ||
| 62 | save_grow(ls, c); | ||
| 63 | else | ||
| 64 | ls->sb.buf[ls->sb.n++] = (char)c; | ||
| 59 | } | 65 | } |
| 60 | 66 | ||
| 61 | static void inclinenumber(LexState *ls) | 67 | static void inclinenumber(LexState *ls) |
| @@ -73,18 +79,14 @@ static void inclinenumber(LexState *ls) | |||
| 73 | 79 | ||
| 74 | static void read_numeral(LexState *ls, TValue *tv) | 80 | static void read_numeral(LexState *ls, TValue *tv) |
| 75 | { | 81 | { |
| 82 | int c; | ||
| 76 | lua_assert(lj_ctype_isdigit(ls->current)); | 83 | lua_assert(lj_ctype_isdigit(ls->current)); |
| 77 | do { | 84 | do { |
| 85 | c = ls->current; | ||
| 78 | save_and_next(ls); | 86 | save_and_next(ls); |
| 79 | } while (lj_ctype_isdigit(ls->current) || ls->current == '.'); | 87 | } while (lj_ctype_isident(ls->current) || ls->current == '.' || |
| 80 | if (ls->current == 'e' || ls->current == 'E' || | 88 | ((ls->current == '-' || ls->current == '+') && |
| 81 | ls->current == 'p' || ls->current == 'P') { | 89 | ((c & ~0x20) == 'E' || (c & ~0x20) == 'P'))); |
| 82 | save_and_next(ls); | ||
| 83 | if (ls->current == '+' || ls->current == '-') | ||
| 84 | save_and_next(ls); | ||
| 85 | } | ||
| 86 | while (lj_ctype_isident(ls->current)) | ||
| 87 | save_and_next(ls); | ||
| 88 | save(ls, '\0'); | 90 | save(ls, '\0'); |
| 89 | if (!lj_str_numconv(ls->sb.buf, tv)) | 91 | if (!lj_str_numconv(ls->sb.buf, tv)) |
| 90 | lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER); | 92 | lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER); |
