| Index: src/parsing/scanner.cc
|
| diff --git a/src/parsing/scanner.cc b/src/parsing/scanner.cc
|
| index c1580bbeae7dd23d69d0e02c13b0090474cb1773..e92b97454adcda0dbe8163547fcdc80b58eba099 100644
|
| --- a/src/parsing/scanner.cc
|
| +++ b/src/parsing/scanner.cc
|
| @@ -19,10 +19,7 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -// Scoped helper for saving & restoring scanner error state.
|
| -// This is used for tagged template literals, in which normally forbidden
|
| -// escape sequences are allowed.
|
| -class ErrorState {
|
| +class Scanner::ErrorState {
|
| public:
|
| ErrorState(MessageTemplate::Template* message_stack,
|
| Scanner::Location* location_stack)
|
| @@ -31,7 +28,7 @@ class ErrorState {
|
| location_stack_(location_stack),
|
| old_location_(*location_stack) {
|
| *message_stack_ = MessageTemplate::kNone;
|
| - *location_stack_ = Scanner::Location::invalid();
|
| + *location_stack_ = Location::invalid();
|
| }
|
|
|
| ~ErrorState() {
|
| @@ -39,17 +36,16 @@ class ErrorState {
|
| *location_stack_ = old_location_;
|
| }
|
|
|
| - void MoveErrorTo(MessageTemplate::Template* message_dest,
|
| - Scanner::Location* location_dest) {
|
| + void MoveErrorTo(TokenDesc* dest) {
|
| if (*message_stack_ == MessageTemplate::kNone) {
|
| return;
|
| }
|
| - if (*message_dest == MessageTemplate::kNone) {
|
| - *message_dest = *message_stack_;
|
| - *location_dest = *location_stack_;
|
| + if (dest->invalid_template_escape_message == MessageTemplate::kNone) {
|
| + dest->invalid_template_escape_message = *message_stack_;
|
| + dest->invalid_template_escape_location = *location_stack_;
|
| }
|
| *message_stack_ = MessageTemplate::kNone;
|
| - *location_stack_ = Scanner::Location::invalid();
|
| + *location_stack_ = Location::invalid();
|
| }
|
|
|
| private:
|
| @@ -397,6 +393,7 @@ Token::Value Scanner::Next() {
|
| next_.location.end_pos = pos + 1;
|
| next_.literal_chars = nullptr;
|
| next_.raw_literal_chars = nullptr;
|
| + next_.invalid_template_escape_message = MessageTemplate::kNone;
|
| Advance();
|
| return current_.token;
|
| }
|
| @@ -609,6 +606,7 @@ Token::Value Scanner::ScanHtmlComment() {
|
| void Scanner::Scan() {
|
| next_.literal_chars = NULL;
|
| next_.raw_literal_chars = NULL;
|
| + next_.invalid_template_escape_message = MessageTemplate::kNone;
|
| Token::Value token;
|
| do {
|
| // Remember the position of the next token
|
| @@ -889,6 +887,8 @@ void Scanner::SanityCheckTokenDesc(const TokenDesc& token) const {
|
| // - TEMPLATE_*: need both literal + raw literal chars.
|
| // - IDENTIFIERS, STRINGS, etc.: need a literal, but no raw literal.
|
| // - all others: should have neither.
|
| + // Furthermore, only TEMPLATE_* tokens can have a
|
| + // invalid_template_escape_message.
|
|
|
| switch (token.token) {
|
| case Token::UNINITIALIZED:
|
| @@ -909,10 +909,12 @@ void Scanner::SanityCheckTokenDesc(const TokenDesc& token) const {
|
| case Token::STRING:
|
| DCHECK_NOT_NULL(token.literal_chars);
|
| DCHECK_NULL(token.raw_literal_chars);
|
| + DCHECK_EQ(token.invalid_template_escape_message, MessageTemplate::kNone);
|
| break;
|
| default:
|
| DCHECK_NULL(token.literal_chars);
|
| DCHECK_NULL(token.raw_literal_chars);
|
| + DCHECK_EQ(token.invalid_template_escape_message, MessageTemplate::kNone);
|
| break;
|
| }
|
| }
|
| @@ -1117,10 +1119,8 @@ Token::Value Scanner::ScanTemplateSpan() {
|
| DCHECK_EQ(!success, has_error());
|
| // For templates, invalid escape sequence checking is handled in the
|
| // parser.
|
| - scanner_error_state.MoveErrorTo(&invalid_template_escape_message_,
|
| - &invalid_template_escape_location_);
|
| - octal_error_state.MoveErrorTo(&invalid_template_escape_message_,
|
| - &invalid_template_escape_location_);
|
| + scanner_error_state.MoveErrorTo(&next_);
|
| + octal_error_state.MoveErrorTo(&next_);
|
| }
|
| } else if (c < 0) {
|
| // Unterminated template literal
|
| @@ -1736,7 +1736,9 @@ void Scanner::SeekNext(size_t position) {
|
| // 1, Reset the current_, next_ and next_next_ tokens
|
| // (next_ + next_next_ will be overwrittem by Next(),
|
| // current_ will remain unchanged, so overwrite it fully.)
|
| - current_ = {{0, 0}, nullptr, nullptr, 0, Token::UNINITIALIZED};
|
| + current_ = {
|
| + {0, 0}, nullptr, nullptr, 0, Token::UNINITIALIZED, MessageTemplate::kNone,
|
| + {0, 0}};
|
| next_.token = Token::UNINITIALIZED;
|
| next_next_.token = Token::UNINITIALIZED;
|
| // 2, reset the source to the desired position,
|
|
|