| Index: src/scanner.cc
|
| ===================================================================
|
| --- src/scanner.cc (revision 3427)
|
| +++ src/scanner.cc (working copy)
|
| @@ -37,15 +37,8 @@
|
| // Character predicates
|
|
|
|
|
| -unibrow::Predicate<IdentifierStart, 128> Scanner::kIsIdentifierStart;
|
| -unibrow::Predicate<IdentifierPart, 128> Scanner::kIsIdentifierPart;
|
| -unibrow::Predicate<unibrow::LineTerminator, 128> Scanner::kIsLineTerminator;
|
| -unibrow::Predicate<unibrow::WhiteSpace, 128> Scanner::kIsWhiteSpace;
|
| +ScannerData::ScannerData() {}
|
|
|
| -
|
| -StaticResource<Scanner::Utf8Decoder> Scanner::utf8_decoder_;
|
| -
|
| -
|
| // ----------------------------------------------------------------------------
|
| // UTF8Buffer
|
|
|
| @@ -323,7 +316,9 @@
|
| // ----------------------------------------------------------------------------
|
| // Scanner
|
|
|
| -Scanner::Scanner(bool pre) : stack_overflow_(false), is_pre_parsing_(pre) { }
|
| +Scanner::Scanner(bool pre) : stack_overflow_(false), is_pre_parsing_(pre),
|
| + scanner_data_(v8_context()->scanner_data_) {
|
| +}
|
|
|
|
|
| void Scanner::Init(Handle<String> source, unibrow::CharacterStream* stream,
|
| @@ -417,6 +412,10 @@
|
|
|
|
|
| bool Scanner::SkipWhiteSpace() {
|
| + unibrow::Predicate<unibrow::WhiteSpace, 128>& kIsWhiteSpace =
|
| + scanner_data_.kIsWhiteSpace_;
|
| + unibrow::Predicate<unibrow::LineTerminator, 128>& kIsLineTerminator =
|
| + scanner_data_.kIsLineTerminator_;
|
| int start_position = source_pos();
|
|
|
| while (true) {
|
| @@ -459,6 +458,8 @@
|
| Token::Value Scanner::SkipSingleLineComment() {
|
| Advance();
|
|
|
| + unibrow::Predicate<unibrow::LineTerminator, 128>& kIsLineTerminator =
|
| + scanner_data_.kIsLineTerminator_;
|
| // The line terminator at the end of the line is not considered
|
| // to be part of the single-line comment; it is recognized
|
| // separately by the lexical grammar and becomes part of the
|
| @@ -513,6 +514,11 @@
|
|
|
|
|
| void Scanner::Scan() {
|
| + unibrow::Predicate<IdentifierPart, 128>& kIsIdentifierPart =
|
| + scanner_data_.kIsIdentifierPart_;
|
| + unibrow::Predicate<IdentifierStart, 128>& kIsIdentifierStart =
|
| + scanner_data_.kIsIdentifierStart_;
|
| +
|
| next_.literal_buffer = NULL;
|
| Token::Value token;
|
| has_line_terminator_before_next_ = false;
|
| @@ -809,7 +815,7 @@
|
| Advance();
|
|
|
| // Skip escaped newlines.
|
| - if (kIsLineTerminator.get(c)) {
|
| + if (scanner_data_.kIsLineTerminator_.get(c)) {
|
| // Allow CR+LF newlines in multiline string literals.
|
| if (IsCarriageReturn(c) && IsLineFeed(c0_)) Advance();
|
| // Allow LF+CR newlines in multiline string literals.
|
| @@ -851,6 +857,8 @@
|
| Advance(); // consume quote
|
|
|
| StartLiteral();
|
| + unibrow::Predicate<unibrow::LineTerminator, 128>& kIsLineTerminator =
|
| + scanner_data_.kIsLineTerminator_;
|
| while (c0_ != quote && c0_ >= 0 && !kIsLineTerminator.get(c0_)) {
|
| uc32 c = c0_;
|
| Advance();
|
| @@ -965,7 +973,8 @@
|
| // not be an identifier start or a decimal digit; see ECMA-262
|
| // section 7.8.3, page 17 (note that we read only one decimal digit
|
| // if the value is 0).
|
| - if (IsDecimalDigit(c0_) || kIsIdentifierStart.get(c0_))
|
| + if (IsDecimalDigit(c0_) ||
|
| + scanner_data_.kIsIdentifierStart_.get(c0_))
|
| return Token::ILLEGAL;
|
|
|
| return Token::NUMBER;
|
| @@ -985,8 +994,11 @@
|
|
|
|
|
| Token::Value Scanner::ScanIdentifier() {
|
| - ASSERT(kIsIdentifierStart.get(c0_));
|
| + unibrow::Predicate<IdentifierPart, 128>& kIsIdentifierPart =
|
| + scanner_data_.kIsIdentifierPart_;
|
|
|
| + ASSERT(scanner_data_.kIsIdentifierStart_.get(c0_));
|
| +
|
| StartLiteral();
|
| KeywordMatcher keyword_match;
|
|
|
| @@ -994,7 +1006,7 @@
|
| if (c0_ == '\\') {
|
| uc32 c = ScanIdentifierUnicodeEscape();
|
| // Only allow legal identifier start characters.
|
| - if (!kIsIdentifierStart.get(c)) return Token::ILLEGAL;
|
| + if (!scanner_data_.kIsIdentifierStart_.get(c)) return Token::ILLEGAL;
|
| AddChar(c);
|
| keyword_match.Fail();
|
| } else {
|
| @@ -1025,9 +1037,13 @@
|
|
|
|
|
| bool Scanner::IsIdentifier(unibrow::CharacterStream* buffer) {
|
| + ScannerData& scanner_data = v8_context()->scanner_data_;
|
| + unibrow::Predicate<IdentifierPart, 128>& kIsIdentifierPart =
|
| + scanner_data.kIsIdentifierPart_;
|
| +
|
| // Checks whether the buffer contains an identifier (no escape).
|
| if (!buffer->has_more()) return false;
|
| - if (!kIsIdentifierStart.get(buffer->GetNext())) return false;
|
| + if (!scanner_data.kIsIdentifierStart_.get(buffer->GetNext())) return false;
|
| while (buffer->has_more()) {
|
| if (!kIsIdentifierPart.get(buffer->GetNext())) return false;
|
| }
|
| @@ -1051,6 +1067,9 @@
|
| if (seen_equal)
|
| AddChar('=');
|
|
|
| + unibrow::Predicate<unibrow::LineTerminator, 128>& kIsLineTerminator =
|
| + scanner_data_.kIsLineTerminator_;
|
| +
|
| while (c0_ != '/' || in_character_class) {
|
| if (kIsLineTerminator.get(c0_) || c0_ < 0)
|
| return false;
|
| @@ -1077,6 +1096,9 @@
|
| bool Scanner::ScanRegExpFlags() {
|
| // Scan regular expression flags.
|
| StartLiteral();
|
| + unibrow::Predicate<IdentifierPart, 128>& kIsIdentifierPart =
|
| + scanner_data_.kIsIdentifierPart_;
|
| +
|
| while (kIsIdentifierPart.get(c0_)) {
|
| if (c0_ == '\\') {
|
| uc32 c = ScanIdentifierUnicodeEscape();
|
|
|