Index: src/scanner.cc |
=================================================================== |
--- src/scanner.cc (revision 7898) |
+++ src/scanner.cc (working copy) |
@@ -342,244 +342,4 @@ |
} |
-// ---------------------------------------------------------------------------- |
-// JsonScanner |
- |
-JsonScanner::JsonScanner(UnicodeCache* unicode_cache) |
- : Scanner(unicode_cache) { } |
- |
- |
-void JsonScanner::Initialize(UC16CharacterStream* source) { |
- source_ = source; |
- Init(); |
- // Skip initial whitespace. |
- SkipJsonWhiteSpace(); |
- // Preload first token as look-ahead. |
- ScanJson(); |
-} |
- |
- |
-Token::Value JsonScanner::Next() { |
- // BUG 1215673: Find a thread safe way to set a stack limit in |
- // pre-parse mode. Otherwise, we cannot safely pre-parse from other |
- // threads. |
- current_ = next_; |
- // Check for stack-overflow before returning any tokens. |
- ScanJson(); |
- return current_.token; |
-} |
- |
- |
-bool JsonScanner::SkipJsonWhiteSpace() { |
- int start_position = source_pos(); |
- // JSON WhiteSpace is tab, carrige-return, newline and space. |
- while (c0_ == ' ' || c0_ == '\n' || c0_ == '\r' || c0_ == '\t') { |
- Advance(); |
- } |
- return source_pos() != start_position; |
-} |
- |
- |
-void JsonScanner::ScanJson() { |
- next_.literal_chars = NULL; |
- Token::Value token; |
- do { |
- // Remember the position of the next token |
- next_.location.beg_pos = source_pos(); |
- switch (c0_) { |
- case '\t': |
- case '\r': |
- case '\n': |
- case ' ': |
- Advance(); |
- token = Token::WHITESPACE; |
- break; |
- case '{': |
- Advance(); |
- token = Token::LBRACE; |
- break; |
- case '}': |
- Advance(); |
- token = Token::RBRACE; |
- break; |
- case '[': |
- Advance(); |
- token = Token::LBRACK; |
- break; |
- case ']': |
- Advance(); |
- token = Token::RBRACK; |
- break; |
- case ':': |
- Advance(); |
- token = Token::COLON; |
- break; |
- case ',': |
- Advance(); |
- token = Token::COMMA; |
- break; |
- case '"': |
- token = ScanJsonString(); |
- break; |
- case '-': |
- case '0': |
- case '1': |
- case '2': |
- case '3': |
- case '4': |
- case '5': |
- case '6': |
- case '7': |
- case '8': |
- case '9': |
- token = ScanJsonNumber(); |
- break; |
- case 't': |
- token = ScanJsonIdentifier("true", Token::TRUE_LITERAL); |
- break; |
- case 'f': |
- token = ScanJsonIdentifier("false", Token::FALSE_LITERAL); |
- break; |
- case 'n': |
- token = ScanJsonIdentifier("null", Token::NULL_LITERAL); |
- break; |
- default: |
- if (c0_ < 0) { |
- Advance(); |
- token = Token::EOS; |
- } else { |
- Advance(); |
- token = Select(Token::ILLEGAL); |
- } |
- } |
- } while (token == Token::WHITESPACE); |
- |
- next_.location.end_pos = source_pos(); |
- next_.token = token; |
-} |
- |
- |
-Token::Value JsonScanner::ScanJsonString() { |
- ASSERT_EQ('"', c0_); |
- Advance(); |
- LiteralScope literal(this); |
- while (c0_ != '"') { |
- // Check for control character (0x00-0x1f) or unterminated string (<0). |
- if (c0_ < 0x20) return Token::ILLEGAL; |
- if (c0_ != '\\') { |
- AddLiteralCharAdvance(); |
- } else { |
- Advance(); |
- switch (c0_) { |
- case '"': |
- case '\\': |
- case '/': |
- AddLiteralChar(c0_); |
- break; |
- case 'b': |
- AddLiteralChar('\x08'); |
- break; |
- case 'f': |
- AddLiteralChar('\x0c'); |
- break; |
- case 'n': |
- AddLiteralChar('\x0a'); |
- break; |
- case 'r': |
- AddLiteralChar('\x0d'); |
- break; |
- case 't': |
- AddLiteralChar('\x09'); |
- break; |
- case 'u': { |
- uc32 value = 0; |
- for (int i = 0; i < 4; i++) { |
- Advance(); |
- int digit = HexValue(c0_); |
- if (digit < 0) { |
- return Token::ILLEGAL; |
- } |
- value = value * 16 + digit; |
- } |
- AddLiteralChar(value); |
- break; |
- } |
- default: |
- return Token::ILLEGAL; |
- } |
- Advance(); |
- } |
- } |
- literal.Complete(); |
- Advance(); |
- return Token::STRING; |
-} |
- |
- |
-Token::Value JsonScanner::ScanJsonNumber() { |
- LiteralScope literal(this); |
- 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(); |
- if (c0_ < '0' || c0_ > '9') return Token::ILLEGAL; |
- do { |
- AddLiteralCharAdvance(); |
- } while (c0_ >= '0' && c0_ <= '9'); |
- } |
- if (AsciiAlphaToLower(c0_) == 'e') { |
- AddLiteralCharAdvance(); |
- if (c0_ == '-' || c0_ == '+') AddLiteralCharAdvance(); |
- if (c0_ < '0' || c0_ > '9') return Token::ILLEGAL; |
- do { |
- AddLiteralCharAdvance(); |
- } while (c0_ >= '0' && c0_ <= '9'); |
- } |
- literal.Complete(); |
- ASSERT_NOT_NULL(next_.literal_chars); |
- number_ = StringToDouble(unicode_cache_, |
- next_.literal_chars->ascii_literal(), |
- NO_FLAGS, // Hex, octal or trailing junk. |
- OS::nan_value()); |
- return Token::NUMBER; |
-} |
- |
- |
-Token::Value JsonScanner::ScanJsonIdentifier(const char* text, |
- Token::Value token) { |
- LiteralScope literal(this); |
- while (*text != '\0') { |
- if (c0_ != *text) return Token::ILLEGAL; |
- Advance(); |
- text++; |
- } |
- if (unicode_cache_->IsIdentifierPart(c0_)) return Token::ILLEGAL; |
- literal.Complete(); |
- return token; |
-} |
- |
- |
} } // namespace v8::internal |