aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2012-01-20 11:38:14 +0100
committerMike Pall <mike>2012-01-20 11:38:14 +0100
commita72134e28099dac14765cd84810844c742b34029 (patch)
tree8466a457a59cb80ab4f9d1c0f45da17c7a9cd833
parent2f396c6db7c1f0737ebd32c82265befa563b1586 (diff)
downloadluajit-a72134e28099dac14765cd84810844c742b34029.tar.gz
luajit-a72134e28099dac14765cd84810844c742b34029.tar.bz2
luajit-a72134e28099dac14765cd84810844c742b34029.zip
Fix parsing of hex literals with exponents.
-rw-r--r--src/lj_lex.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/lj_lex.c b/src/lj_lex.c
index 00daccd5..59d82259 100644
--- a/src/lj_lex.c
+++ b/src/lj_lex.c
@@ -137,14 +137,17 @@ static int lex_number64(LexState *ls, TValue *tv)
137/* Parse a number literal. */ 137/* Parse a number literal. */
138static void lex_number(LexState *ls, TValue *tv) 138static void lex_number(LexState *ls, TValue *tv)
139{ 139{
140 int c; 140 int c, xp = 'E';
141 lua_assert(lj_char_isdigit(ls->current)); 141 lua_assert(lj_char_isdigit(ls->current));
142 do { 142 if ((c = ls->current) == '0') {
143 save_and_next(ls);
144 if ((ls->current & ~0x20) == 'X') xp = 'P';
145 }
146 while (lj_char_isident(ls->current) || ls->current == '.' ||
147 ((ls->current == '-' || ls->current == '+') && (c & ~0x20) == xp)) {
143 c = ls->current; 148 c = ls->current;
144 save_and_next(ls); 149 save_and_next(ls);
145 } while (lj_char_isident(ls->current) || ls->current == '.' || 150 }
146 ((ls->current == '-' || ls->current == '+') &&
147 ((c & ~0x20) == 'E' || (c & ~0x20) == 'P')));
148#if LJ_HASFFI 151#if LJ_HASFFI
149 c &= ~0x20; 152 c &= ~0x20;
150 if ((c == 'I' || c == 'L' || c == 'U') && !ctype_ctsG(G(ls->L))) 153 if ((c == 'I' || c == 'L' || c == 'U') && !ctype_ctsG(G(ls->L)))