Chromium Code Reviews| Index: src/scanner.cc |
| diff --git a/src/scanner.cc b/src/scanner.cc |
| index 96459f3c6699ec07f5b3a73db6defd5665dc791e..1e259bdd310604c958e33726f022b3270b8e17b1 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)) { |
|
caitp (gmail)
2014/12/17 17:04:21
Is this check necessary? I think ScanTemplateSpan
arv (Not doing code reviews)
2014/12/17 17:56:20
It is not needed but it is dead code in case we ar
|
| // Allow CR+LF newlines in multiline string literals. |
| if (IsCarriageReturn(c) && IsLineFeed(c0_)) Advance<capture_raw>(); |
| // Allow LF+CR newlines in multiline string literals. |
| @@ -739,7 +739,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 +789,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 +820,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 +847,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>(); |
|
caitp (gmail)
2014/12/17 17:04:21
How are these ever not <true, true> here?
arv (Not doing code reviews)
2014/12/17 17:56:20
They are always true, true here. I added the const
|
| } |
| } else if (c < 0) { |
| // Unterminated template literal |