Index: src/scanner.cc |
diff --git a/src/scanner.cc b/src/scanner.cc |
index 92f0b94053fd78dd8c199a18fb96ea29a9a88645..dea1e324c803497168cdd33ff4de79ce7de59d8b 100644 |
--- a/src/scanner.cc |
+++ b/src/scanner.cc |
@@ -24,6 +24,7 @@ namespace internal { |
Scanner::Scanner(UnicodeCache* unicode_cache) |
: unicode_cache_(unicode_cache), |
+ param_list_finder_(unicode_cache_), |
octal_pos_(Location::invalid()), |
harmony_scoping_(false), |
harmony_modules_(false), |
@@ -210,6 +211,7 @@ Token::Value Scanner::Next() { |
current_ = next_; |
has_line_terminator_before_next_ = false; |
has_multiline_comment_before_next_ = false; |
+ param_list_finder_.Update(this); |
if (static_cast<unsigned>(c0_) <= 0x7f) { |
Token::Value token = static_cast<Token::Value>(one_char_tokens[c0_]); |
if (token != Token::ILLEGAL) { |
@@ -395,10 +397,12 @@ void Scanner::Scan() { |
break; |
case '=': |
- // = == === |
+ // = == === => |
Advance(); |
if (c0_ == '=') { |
token = Select('=', Token::EQ_STRICT, Token::EQ); |
+ } else if (c0_ == '>') { |
+ token = Select(Token::ARROW); |
} else { |
token = Token::ASSIGN; |
} |
@@ -928,6 +932,29 @@ static Token::Value KeywordOrIdentifierToken(const uint8_t* input, |
} |
+bool Scanner::IdentifierIsFutureStrictReserved(const AstString* string) const { |
marja
2014/06/17 11:47:38
This sounds wrong, since we have a separate token
|
+ if (string->is_one_byte()) { |
+ return Token::FUTURE_STRICT_RESERVED_WORD == KeywordOrIdentifierToken( |
+ string->raw_data(), string->length(), |
+ harmony_scoping_, harmony_modules_); |
+ } |
+ |
+ // Language keywords are always ASCII-only, so we can just pick the |
+ // lower bytes to have a one-byte representation of the keyword. |
+ const unsigned len = string->length(); |
+ Vector<unsigned char> chars = Vector<unsigned char>::New(len); |
+ const uint16_t* uchars = reinterpret_cast<const uint16_t*>(string->raw_data()); |
+ |
+ for (unsigned i = 0; i < len; i++) |
+ (chars.start())[i] = 0xFF & uchars[i]; |
+ |
+ bool result = Token::FUTURE_STRICT_RESERVED_WORD == KeywordOrIdentifierToken( |
+ chars.start(), len, harmony_scoping_, harmony_modules_); |
+ chars.Dispose(); |
+ return result; |
+} |
+ |
+ |
Token::Value Scanner::ScanIdentifierOrKeyword() { |
ASSERT(unicode_cache_->IsIdentifierStart(c0_)); |
LiteralScope literal(this); |