Index: src/scanner.cc |
=================================================================== |
--- src/scanner.cc (revision 6635) |
+++ src/scanner.cc (working copy) |
@@ -516,17 +516,30 @@ |
Token::Value JsonScanner::ScanJsonNumber() { |
LiteralScope literal(this); |
- if (c0_ == '-') AddLiteralCharAdvance(); |
+ bool negative = false; |
+ |
+ if (c0_ == '-') { |
+ AddLiteralCharAdvance(); |
+ negative = true; |
+ } |
if (c0_ == '0') { |
AddLiteralCharAdvance(); |
// Prefix zero is only allowed if it's the only digit before |
// a decimal point or exponent. |
if ('0' <= c0_ && c0_ <= '9') return Token::ILLEGAL; |
} else { |
+ int i = 0; |
+ int digits = 0; |
if (c0_ < '1' || c0_ > '9') return Token::ILLEGAL; |
do { |
+ i = i * 10 + c0_ - '0'; |
+ digits++; |
AddLiteralCharAdvance(); |
} while (c0_ >= '0' && c0_ <= '9'); |
+ if (c0_ != '.' && c0_ != 'e' && c0_ != 'E' && digits < 10) { |
+ number_ = (negative ? -i : i); |
+ return Token::NUMBER; |
+ } |
} |
if (c0_ == '.') { |
AddLiteralCharAdvance(); |
@@ -544,6 +557,10 @@ |
} while (c0_ >= '0' && c0_ <= '9'); |
} |
literal.Complete(); |
+ ASSERT_NOT_NULL(next_.literal_chars); |
+ number_ = StringToDouble(next_.literal_chars->ascii_literal(), |
+ NO_FLAGS, // Hex, octal or trailing junk. |
+ OS::nan_value()); |
return Token::NUMBER; |
} |