| 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 {
|
| + 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);
|
|
|