| Index: src/scanner.cc
|
| diff --git a/src/scanner.cc b/src/scanner.cc
|
| index 1d41cb59312039b22954a562d9328eddff6b75e6..a141f8aa0208a9144a0732071a6db307c621a5cd 100644
|
| --- a/src/scanner.cc
|
| +++ b/src/scanner.cc
|
| @@ -983,15 +983,21 @@ Token::Value Scanner::ScanNumber(bool seen_period) {
|
| int value = 0;
|
| while (IsDecimalDigit(c0_)) {
|
| value = 10 * value + (c0_ - '0');
|
| - AddLiteralCharAdvance();
|
| +
|
| + uc32 first_char = c0_;
|
| + Advance<false, false>();
|
| + AddLiteralChar(first_char);
|
| }
|
|
|
| if (next_.literal_chars->one_byte_literal().length() < 10 &&
|
| c0_ != '.' && c0_ != 'e' && c0_ != 'E') {
|
| smi_value_ = value;
|
| literal.Complete();
|
| + HandleLeadSurrugate();
|
| +
|
| return Token::SMI;
|
| }
|
| + HandleLeadSurrugate();
|
| }
|
|
|
| ScanDecimalDigits(); // optional
|
| @@ -1193,8 +1199,53 @@ bool Scanner::IdentifierIsFutureStrictReserved(
|
| Token::Value Scanner::ScanIdentifierOrKeyword() {
|
| DCHECK(unicode_cache_->IsIdentifierStart(c0_));
|
| LiteralScope literal(this);
|
| - // Scan identifier start character.
|
| - if (c0_ == '\\') {
|
| + if (IsInRange(c0_, 'a', 'z')) {
|
| + do {
|
| + uc32 first_char = c0_;
|
| + Advance<false, false>();
|
| + AddLiteralChar(first_char);
|
| + } while (IsInRange(c0_, 'a', 'z'));
|
| +
|
| + if (IsDecimalDigit(c0_) || IsInRange(c0_, 'A', 'Z') || c0_ == '_' ||
|
| + c0_ == '$') {
|
| + // Identifier starting with lowercase.
|
| + uc32 first_char = c0_;
|
| + Advance<false, false>();
|
| + AddLiteralChar(first_char);
|
| + while (IsAsciiIdentifier(c0_)) {
|
| + uc32 first_char = c0_;
|
| + Advance<false, false>();
|
| + AddLiteralChar(first_char);
|
| + }
|
| + if (c0_ <= 127 && c0_ != '\\') {
|
| + literal.Complete();
|
| + return Token::IDENTIFIER;
|
| + }
|
| + } else if (c0_ <= 127 && c0_ != '\\') {
|
| + // Only a-z+: could be a keyword or identifier.
|
| + literal.Complete();
|
| + Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal();
|
| + return KeywordOrIdentifierToken(chars.start(), chars.length(),
|
| + harmony_scoping_, harmony_modules_,
|
| + harmony_classes_);
|
| + }
|
| +
|
| + HandleLeadSurrugate();
|
| + } else if (IsInRange(c0_, 'A', 'Z') || c0_ == '_' || c0_ == '$') {
|
| + do {
|
| + uc32 first_char = c0_;
|
| + Advance<false, false>();
|
| + AddLiteralChar(first_char);
|
| + } while (IsAsciiIdentifier(c0_));
|
| +
|
| + if (c0_ <= 127 && c0_ != '\\') {
|
| + literal.Complete();
|
| + return Token::IDENTIFIER;
|
| + }
|
| +
|
| + HandleLeadSurrugate();
|
| + } else if (c0_ == '\\') {
|
| + // Scan identifier start character.
|
| uc32 c = ScanIdentifierUnicodeEscape();
|
| // Only allow legal identifier start characters.
|
| if (c < 0 ||
|
| @@ -1204,12 +1255,12 @@ Token::Value Scanner::ScanIdentifierOrKeyword() {
|
| }
|
| AddLiteralChar(c);
|
| return ScanIdentifierSuffix(&literal);
|
| + } else {
|
| + uc32 first_char = c0_;
|
| + Advance();
|
| + AddLiteralChar(first_char);
|
| }
|
|
|
| - uc32 first_char = c0_;
|
| - Advance();
|
| - AddLiteralChar(first_char);
|
| -
|
| // Scan the rest of the identifier characters.
|
| while (c0_ >= 0 && unicode_cache_->IsIdentifierPart(c0_)) {
|
| if (c0_ != '\\') {
|
| @@ -1232,7 +1283,6 @@ Token::Value Scanner::ScanIdentifierOrKeyword() {
|
| harmony_modules_,
|
| harmony_classes_);
|
| }
|
| -
|
| return Token::IDENTIFIER;
|
| }
|
|
|
|
|