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 |