summaryrefslogtreecommitdiff
path: root/src/lj_lex.c
diff options
context:
space:
mode:
authorMike Pall <mike>2010-11-01 17:53:04 +0100
committerMike Pall <mike>2010-11-01 17:53:04 +0100
commit44372a44530702b817a1059d8b086149e8554998 (patch)
tree75e4b87e5e21f7ec108c485ad6641ef615a0612f /src/lj_lex.c
parent7e5cb31e0bb66a9bed53f468d93913c5e6994434 (diff)
downloadluajit2-44372a44530702b817a1059d8b086149e8554998.tar.gz
Fix parsing of hex floats.
Diffstat (limited to 'src/lj_lex.c')
-rw-r--r--src/lj_lex.c38
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);