aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent7e5cb31e0bb66a9bed53f468d93913c5e6994434 (diff)
downloadluajit-44372a44530702b817a1059d8b086149e8554998.tar.gz
luajit-44372a44530702b817a1059d8b086149e8554998.tar.bz2
luajit-44372a44530702b817a1059d8b086149e8554998.zip
Fix parsing of hex floats.
Diffstat (limited to 'src')
-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)
46 return char2int(*(ls->p++)); 46 return char2int(*(ls->p++));
47} 47}
48 48
49static void save(LexState *ls, int c) 49static 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
59static 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
61static void inclinenumber(LexState *ls) 67static void inclinenumber(LexState *ls)
@@ -73,18 +79,14 @@ static void inclinenumber(LexState *ls)
73 79
74static void read_numeral(LexState *ls, TValue *tv) 80static 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);