Fix parsing of hex floats.

This commit is contained in:
Mike Pall 2010-11-01 17:53:04 +01:00
parent 7e5cb31e0b
commit 44372a4453

View File

@ -46,16 +46,22 @@ static int fillbuf(LexState *ls)
return char2int(*(ls->p++)); 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;
MSize newsize; if (ls->sb.sz >= LJ_MAX_STR/2)
if (ls->sb.sz >= LJ_MAX_STR/2) lj_lex_error(ls, 0, LJ_ERR_XELEM);
lj_lex_error(ls, 0, LJ_ERR_XELEM); newsize = ls->sb.sz * 2;
newsize = ls->sb.sz * 2; lj_str_resizebuf(ls->L, &ls->sb, newsize);
lj_str_resizebuf(ls->L, &ls->sb, newsize); ls->sb.buf[ls->sb.n++] = (char)c;
} }
ls->sb.buf[ls->sb.n++] = cast(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) static void inclinenumber(LexState *ls)
@ -73,18 +79,14 @@ static void inclinenumber(LexState *ls)
static void read_numeral(LexState *ls, TValue *tv) static void read_numeral(LexState *ls, TValue *tv)
{ {
int c;
lua_assert(lj_ctype_isdigit(ls->current)); lua_assert(lj_ctype_isdigit(ls->current));
do { do {
c = ls->current;
save_and_next(ls); save_and_next(ls);
} while (lj_ctype_isdigit(ls->current) || ls->current == '.'); } while (lj_ctype_isident(ls->current) || ls->current == '.' ||
if (ls->current == 'e' || ls->current == 'E' || ((ls->current == '-' || ls->current == '+') &&
ls->current == 'p' || ls->current == 'P') { ((c & ~0x20) == 'E' || (c & ~0x20) == 'P')));
save_and_next(ls);
if (ls->current == '+' || ls->current == '-')
save_and_next(ls);
}
while (lj_ctype_isident(ls->current))
save_and_next(ls);
save(ls, '\0'); save(ls, '\0');
if (!lj_str_numconv(ls->sb.buf, tv)) if (!lj_str_numconv(ls->sb.buf, tv))
lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER); lj_lex_error(ls, TK_number, LJ_ERR_XNUMBER);