diff options
author | Mike Pall <mike> | 2010-11-01 17:53:04 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-11-01 17:53:04 +0100 |
commit | 44372a44530702b817a1059d8b086149e8554998 (patch) | |
tree | 75e4b87e5e21f7ec108c485ad6641ef615a0612f /src/lj_lex.c | |
parent | 7e5cb31e0bb66a9bed53f468d93913c5e6994434 (diff) | |
download | luajit2-44372a44530702b817a1059d8b086149e8554998.tar.gz |
Fix parsing of hex floats.
Diffstat (limited to 'src/lj_lex.c')
-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) return char2int(*(ls->p++)); } -static void save(LexState *ls, int c) +static LJ_NOINLINE void save_grow(LexState *ls, int c) { - if (ls->sb.n + 1 > ls->sb.sz) { - MSize newsize; - if (ls->sb.sz >= LJ_MAX_STR/2) - lj_lex_error(ls, 0, LJ_ERR_XELEM); - newsize = ls->sb.sz * 2; - lj_str_resizebuf(ls->L, &ls->sb, newsize); - } - ls->sb.buf[ls->sb.n++] = cast(char, c); + MSize newsize; + if (ls->sb.sz >= LJ_MAX_STR/2) + lj_lex_error(ls, 0, LJ_ERR_XELEM); + newsize = ls->sb.sz * 2; + lj_str_resizebuf(ls->L, &ls->sb, newsize); + ls->sb.buf[ls->sb.n++] = (char)c; +} + +static LJ_AINLINE void save(LexState *ls, int c) +{ + if (LJ_UNLIKELY(ls->sb.n + 1 > ls->sb.sz)) + save_grow(ls, c); + else + ls->sb.buf[ls->sb.n++] = (char)c; } static void inclinenumber(LexState *ls) @@ -73,18 +79,14 @@ static void inclinenumber(LexState *ls) static void read_numeral(LexState *ls, TValue *tv) { + int c; lua_assert(lj_ctype_isdigit(ls->current)); do { + c = ls->current; save_and_next(ls); - } while (lj_ctype_isdigit(ls->current) || ls->current == '.'); - if (ls->current == 'e' || ls->current == 'E' || - ls->current == 'p' || ls->current == 'P') { - save_and_next(ls); - if (ls->current == '+' || ls->current == '-') - save_and_next(ls); - } - while (lj_ctype_isident(ls->current)) - save_and_next(ls); + } while (lj_ctype_isident(ls->current) || ls->current == '.' || + ((ls->current == '-' || ls->current == '+') && + ((c & ~0x20) == 'E' || (c & ~0x20) == 'P'))); save(ls, '\0'); if (!lj_str_numconv(ls->sb.buf, tv)) lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER); |