From edcc242a44eb0441d88b881b8d9ec6c4225c6c2e Mon Sep 17 00:00:00 2001 From: wingo Date: Wed, 24 Jun 2015 10:25:08 -0700 Subject: [PATCH] Fix unexpected token messages in expression classifier Some tokens need special messages because their token corresponds to many names. R=arv@chromium.org BUG=v8:4213 LOG=N Review URL: https://codereview.chromium.org/1207743004 Cr-Commit-Position: refs/heads/master@{#29262} --- src/preparser.h | 116 +++++++++++------- .../arrow-strict-eval-bare-parameter.js | 8 ++ .../arrow-strict-eval-bare-parameter.out | 4 + 3 files changed, 84 insertions(+), 44 deletions(-) create mode 100644 test/message/arrow-strict-eval-bare-parameter.js create mode 100644 test/message/arrow-strict-eval-bare-parameter.out diff --git a/src/preparser.h b/src/preparser.h index b66053b946..0653ded54a 100644 --- a/src/preparser.h +++ b/src/preparser.h @@ -503,6 +503,10 @@ class ParserBase : public Traits { error_type); } + void GetUnexpectedTokenMessage( + Token::Value token, MessageTemplate::Template* message, const char** arg, + MessageTemplate::Template default_ = MessageTemplate::kUnexpectedToken); + void ReportUnexpectedToken(Token::Value token); void ReportUnexpectedTokenAt( Scanner::Location location, Token::Value token, @@ -572,21 +576,26 @@ class ParserBase : public Traits { } void ExpressionUnexpectedToken(ExpressionClassifier* classifier) { - classifier->RecordExpressionError(scanner()->peek_location(), - MessageTemplate::kUnexpectedToken, - Token::String(peek())); + MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; + const char* arg; + GetUnexpectedTokenMessage(peek(), &message, &arg); + classifier->RecordExpressionError(scanner()->peek_location(), message, arg); } void BindingPatternUnexpectedToken(ExpressionClassifier* classifier) { - classifier->RecordBindingPatternError(scanner()->peek_location(), - MessageTemplate::kUnexpectedToken, - Token::String(peek())); + MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; + const char* arg; + GetUnexpectedTokenMessage(peek(), &message, &arg); + classifier->RecordBindingPatternError(scanner()->peek_location(), message, + arg); } void ArrowFormalParametersUnexpectedToken(ExpressionClassifier* classifier) { - classifier->RecordArrowFormalParametersError( - scanner()->peek_location(), MessageTemplate::kUnexpectedToken, - Token::String(peek())); + MessageTemplate::Template message = MessageTemplate::kUnexpectedToken; + const char* arg; + GetUnexpectedTokenMessage(peek(), &message, &arg); + classifier->RecordArrowFormalParametersError(scanner()->peek_location(), + message, arg); } // Recursive descent functions: @@ -1830,7 +1839,57 @@ ParserBase::FunctionState::~FunctionState() { } -template +template +void ParserBase::GetUnexpectedTokenMessage( + Token::Value token, MessageTemplate::Template* message, const char** arg, + MessageTemplate::Template default_) { + // Four of the tokens are treated specially + switch (token) { + case Token::EOS: + *message = MessageTemplate::kUnexpectedEOS; + *arg = nullptr; + break; + case Token::SMI: + case Token::NUMBER: + *message = MessageTemplate::kUnexpectedTokenNumber; + *arg = nullptr; + break; + case Token::STRING: + *message = MessageTemplate::kUnexpectedTokenString; + *arg = nullptr; + break; + case Token::IDENTIFIER: + *message = MessageTemplate::kUnexpectedTokenIdentifier; + *arg = nullptr; + break; + case Token::FUTURE_RESERVED_WORD: + *message = MessageTemplate::kUnexpectedReserved; + *arg = nullptr; + break; + case Token::LET: + case Token::STATIC: + case Token::YIELD: + case Token::FUTURE_STRICT_RESERVED_WORD: + *message = is_strict(language_mode()) + ? MessageTemplate::kUnexpectedStrictReserved + : MessageTemplate::kUnexpectedTokenIdentifier; + *arg = nullptr; + break; + case Token::TEMPLATE_SPAN: + case Token::TEMPLATE_TAIL: + *message = MessageTemplate::kUnexpectedTemplateString; + *arg = nullptr; + break; + default: + const char* name = Token::String(token); + DCHECK(name != NULL); + *arg = name; + break; + } +} + + +template void ParserBase::ReportUnexpectedToken(Token::Value token) { return ReportUnexpectedTokenAt(scanner_->location(), token); } @@ -1840,40 +1899,9 @@ template void ParserBase::ReportUnexpectedTokenAt( Scanner::Location source_location, Token::Value token, MessageTemplate::Template message) { - // Four of the tokens are treated specially - switch (token) { - case Token::EOS: - return ReportMessageAt(source_location, MessageTemplate::kUnexpectedEOS); - case Token::SMI: - case Token::NUMBER: - return ReportMessageAt(source_location, - MessageTemplate::kUnexpectedTokenNumber); - case Token::STRING: - return ReportMessageAt(source_location, - MessageTemplate::kUnexpectedTokenString); - case Token::IDENTIFIER: - return ReportMessageAt(source_location, - MessageTemplate::kUnexpectedTokenIdentifier); - case Token::FUTURE_RESERVED_WORD: - return ReportMessageAt(source_location, - MessageTemplate::kUnexpectedReserved); - case Token::LET: - case Token::STATIC: - case Token::YIELD: - case Token::FUTURE_STRICT_RESERVED_WORD: - return ReportMessageAt(source_location, - is_strict(language_mode()) - ? MessageTemplate::kUnexpectedStrictReserved - : MessageTemplate::kUnexpectedTokenIdentifier); - case Token::TEMPLATE_SPAN: - case Token::TEMPLATE_TAIL: - return Traits::ReportMessageAt( - source_location, MessageTemplate::kUnexpectedTemplateString); - default: - const char* name = Token::String(token); - DCHECK(name != NULL); - Traits::ReportMessageAt(source_location, message, name); - } + const char* arg; + GetUnexpectedTokenMessage(token, &message, &arg); + Traits::ReportMessageAt(source_location, message, arg); } diff --git a/test/message/arrow-strict-eval-bare-parameter.js b/test/message/arrow-strict-eval-bare-parameter.js new file mode 100644 index 0000000000..d5692517dd --- /dev/null +++ b/test/message/arrow-strict-eval-bare-parameter.js @@ -0,0 +1,8 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Flags: --harmony-arrow-functions + +"use strict"; +eval => 42 diff --git a/test/message/arrow-strict-eval-bare-parameter.out b/test/message/arrow-strict-eval-bare-parameter.out new file mode 100644 index 0000000000..9a1b9969fe --- /dev/null +++ b/test/message/arrow-strict-eval-bare-parameter.out @@ -0,0 +1,4 @@ +*%(basename)s:8: SyntaxError: Unexpected identifier +eval => 42 +^^^^ +SyntaxError: Unexpected identifier