diff options
author | Mike Pall <mike> | 2010-11-01 17:53:04 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-11-01 17:53:04 +0100 |
commit | 44372a44530702b817a1059d8b086149e8554998 (patch) | |
tree | 75e4b87e5e21f7ec108c485ad6641ef615a0612f /src | |
parent | 7e5cb31e0bb66a9bed53f468d93913c5e6994434 (diff) | |
download | luajit-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.c | 38 |
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 | ||
49 | static void save(LexState *ls, int c) | 49 | static 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 | |
59 | static 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 | ||
61 | static void inclinenumber(LexState *ls) | 67 | static void inclinenumber(LexState *ls) |
@@ -73,18 +79,14 @@ static void inclinenumber(LexState *ls) | |||
73 | 79 | ||
74 | static void read_numeral(LexState *ls, TValue *tv) | 80 | static 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); |