| Index: src/scanner.cc
|
| diff --git a/src/scanner.cc b/src/scanner.cc
|
| index a141f8aa0208a9144a0732071a6db307c621a5cd..9e90868131cc7469b6d88d79e2d409e561915dce 100644
|
| --- a/src/scanner.cc
|
| +++ b/src/scanner.cc
|
| @@ -788,11 +788,31 @@ uc32 Scanner::ScanOctalEscape(uc32 c, int length) {
|
| }
|
|
|
|
|
| +const int kMaxAscii = 127;
|
| +
|
| +
|
| Token::Value Scanner::ScanString() {
|
| uc32 quote = c0_;
|
| - Advance(); // consume quote
|
| + Advance<false, false>(); // consume quote
|
|
|
| LiteralScope literal(this);
|
| + while (true) {
|
| + if (c0_ > kMaxAscii) {
|
| + HandleLeadSurrogate();
|
| + break;
|
| + }
|
| + if (c0_ < 0 || c0_ == '\n' || c0_ == '\r') return Token::ILLEGAL;
|
| + if (c0_ == quote) {
|
| + literal.Complete();
|
| + Advance<false, false>();
|
| + return Token::STRING;
|
| + }
|
| + uc32 c = c0_;
|
| + if (c == '\\') break;
|
| + Advance<false, false>();
|
| + AddLiteralChar(c);
|
| + }
|
| +
|
| while (c0_ != quote && c0_ >= 0
|
| && !unicode_cache_->IsLineTerminator(c0_)) {
|
| uc32 c = c0_;
|
| @@ -993,11 +1013,11 @@ Token::Value Scanner::ScanNumber(bool seen_period) {
|
| c0_ != '.' && c0_ != 'e' && c0_ != 'E') {
|
| smi_value_ = value;
|
| literal.Complete();
|
| - HandleLeadSurrugate();
|
| + HandleLeadSurrogate();
|
|
|
| return Token::SMI;
|
| }
|
| - HandleLeadSurrugate();
|
| + HandleLeadSurrogate();
|
| }
|
|
|
| ScanDecimalDigits(); // optional
|
| @@ -1217,11 +1237,11 @@ Token::Value Scanner::ScanIdentifierOrKeyword() {
|
| Advance<false, false>();
|
| AddLiteralChar(first_char);
|
| }
|
| - if (c0_ <= 127 && c0_ != '\\') {
|
| + if (c0_ <= kMaxAscii && c0_ != '\\') {
|
| literal.Complete();
|
| return Token::IDENTIFIER;
|
| }
|
| - } else if (c0_ <= 127 && c0_ != '\\') {
|
| + } else if (c0_ <= kMaxAscii && c0_ != '\\') {
|
| // Only a-z+: could be a keyword or identifier.
|
| literal.Complete();
|
| Vector<const uint8_t> chars = next_.literal_chars->one_byte_literal();
|
| @@ -1230,7 +1250,7 @@ Token::Value Scanner::ScanIdentifierOrKeyword() {
|
| harmony_classes_);
|
| }
|
|
|
| - HandleLeadSurrugate();
|
| + HandleLeadSurrogate();
|
| } else if (IsInRange(c0_, 'A', 'Z') || c0_ == '_' || c0_ == '$') {
|
| do {
|
| uc32 first_char = c0_;
|
| @@ -1238,12 +1258,12 @@ Token::Value Scanner::ScanIdentifierOrKeyword() {
|
| AddLiteralChar(first_char);
|
| } while (IsAsciiIdentifier(c0_));
|
|
|
| - if (c0_ <= 127 && c0_ != '\\') {
|
| + if (c0_ <= kMaxAscii && c0_ != '\\') {
|
| literal.Complete();
|
| return Token::IDENTIFIER;
|
| }
|
|
|
| - HandleLeadSurrugate();
|
| + HandleLeadSurrogate();
|
| } else if (c0_ == '\\') {
|
| // Scan identifier start character.
|
| uc32 c = ScanIdentifierUnicodeEscape();
|
|
|