| Index: src/scanner.cc
|
| diff --git a/src/scanner.cc b/src/scanner.cc
|
| index 96459f3c6699ec07f5b3a73db6defd5665dc791e..465fe92a27f19fe3f18f470243cc6d75e4f03f20 100644
|
| --- a/src/scanner.cc
|
| +++ b/src/scanner.cc
|
| @@ -697,13 +697,13 @@ void Scanner::SeekForward(int pos) {
|
| }
|
|
|
|
|
| -template <bool capture_raw>
|
| +template <bool capture_raw, bool in_template_literal>
|
| bool Scanner::ScanEscape() {
|
| uc32 c = c0_;
|
| Advance<capture_raw>();
|
|
|
| // Skip escaped newlines.
|
| - if (c0_ >= 0 && unicode_cache_->IsLineTerminator(c)) {
|
| + if (!in_template_literal && c0_ >= 0 && unicode_cache_->IsLineTerminator(c)) {
|
| // Allow CR+LF newlines in multiline string literals.
|
| if (IsCarriageReturn(c) && IsLineFeed(c0_)) Advance<capture_raw>();
|
| // Allow LF+CR newlines in multiline string literals.
|
| @@ -731,7 +731,15 @@ bool Scanner::ScanEscape() {
|
| if (c < 0) return false;
|
| break;
|
| }
|
| - case '0' : // fall through
|
| + case '0':
|
| + if (in_template_literal) {
|
| + // The TV of TemplateCharacter :: \ EscapeSequence is the CV of
|
| + // EscapeSequence.
|
| + // The CV of EscapeSequence :: 0 is the code unit value 0.
|
| + c = 0;
|
| + break;
|
| + }
|
| + // Fall through.
|
| case '1' : // fall through
|
| case '2' : // fall through
|
| case '3' : // fall through
|
| @@ -739,7 +747,9 @@ bool Scanner::ScanEscape() {
|
| case '5' : // fall through
|
| case '6' : // fall through
|
| case '7':
|
| - c = ScanOctalEscape<capture_raw>(c, 2);
|
| + if (!in_template_literal) {
|
| + c = ScanOctalEscape<capture_raw>(c, 2);
|
| + }
|
| break;
|
| }
|
|
|
| @@ -787,7 +797,7 @@ Token::Value Scanner::ScanString() {
|
| uc32 c = c0_;
|
| Advance();
|
| if (c == '\\') {
|
| - if (c0_ < 0 || !ScanEscape<false>()) return Token::ILLEGAL;
|
| + if (c0_ < 0 || !ScanEscape<false, false>()) return Token::ILLEGAL;
|
| } else {
|
| AddLiteralChar(c);
|
| }
|
| @@ -818,6 +828,7 @@ Token::Value Scanner::ScanTemplateSpan() {
|
| LiteralScope literal(this);
|
| StartRawLiteral();
|
| const bool capture_raw = true;
|
| + const bool in_template_literal = true;
|
|
|
| while (true) {
|
| uc32 c = c0_;
|
| @@ -844,11 +855,8 @@ Token::Value Scanner::ScanTemplateSpan() {
|
| AddRawLiteralChar('\n');
|
| }
|
| }
|
| - } else if (c0_ == '0') {
|
| - Advance<capture_raw>();
|
| - AddLiteralChar('0');
|
| } else {
|
| - ScanEscape<true>();
|
| + ScanEscape<capture_raw, in_template_literal>();
|
| }
|
| } else if (c < 0) {
|
| // Unterminated template literal
|
|
|