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(); |