mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
Fix parsing of hex floats.
This commit is contained in:
parent
7e5cb31e0b
commit
44372a4453
38
src/lj_lex.c
38
src/lj_lex.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user