Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index 581015f5c9b88196869e988a16165481d66d3139..af6ee90eea4070a0c5c4ff3bced52e61fda32f6b 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -812,6 +812,9 @@ class ParserBase : public Traits { |
| ExpressionClassifier* classifier, ExpressionT expression, int beg_pos, |
| int end_pos, MessageTemplate::Template message, |
| ParseErrorType type = kSyntaxError); |
| + void ClassifyReferenceExpression(ExpressionClassifier* classifier, |
| + ExpressionT expression, int beg_pos, |
| + int end_pos); |
| ExpressionT CheckAndRewriteReferenceExpression( |
| ExpressionT expression, int beg_pos, int end_pos, |
| MessageTemplate::Template message, ParseErrorType type, bool* ok); |
| @@ -1517,6 +1520,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| Consume(Token::ELLIPSIS); |
| ExpressionT argument = |
| this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
| + ClassifyReferenceExpression(classifier, argument, start_pos, |
| + scanner()->location().end_pos); |
| elem = factory()->NewSpread(argument, start_pos); |
| if (first_spread_index < 0) { |
| @@ -1534,6 +1539,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| } else { |
| elem = this->ParseAssignmentExpression(true, kIsPatternElement, |
| classifier, CHECK_OK); |
| + ClassifyReferenceExpression(classifier, elem, pos, |
| + scanner()->location().end_pos); |
| if (!this->IsValidReferenceExpression(elem) && |
| !classifier->is_valid_assignment_pattern()) { |
| classifier->RecordPatternError( |
| @@ -1670,7 +1677,8 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| value = this->ParseAssignmentExpression( |
| true, kIsPatternElement, classifier, |
| CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
| - |
| + ClassifyReferenceExpression(classifier, value, pos, |
| + scanner()->location().end_pos); |
| if (!this->IsValidReferenceExpression(value) && |
| !classifier->is_valid_assignment_pattern()) { |
| classifier->RecordPatternError( |
| @@ -1711,6 +1719,8 @@ ParserBase<Traits>::ParsePropertyDefinition( |
| ExpressionT lhs = this->ExpressionFromIdentifier( |
| name, next_beg_pos, next_end_pos, scope_, factory()); |
| + ClassifyReferenceExpression(classifier, lhs, next_beg_pos, next_end_pos); |
| + |
| if (peek() == Token::ASSIGN) { |
| Consume(Token::ASSIGN); |
| ExpressionClassifier rhs_classifier; |
| @@ -2050,6 +2060,10 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags, |
| if (!Token::IsAssignmentOp(peek())) { |
| // Parsed conditional expression only (no assignment). |
| + if (is_pattern_element && !maybe_pattern) { |
| + ClassifyReferenceExpression(classifier, expression, lhs_beg_pos, |
| + scanner()->location().end_pos); |
| + } |
| if (is_pattern_element && !this->IsValidReferenceExpression(expression) && |
| !maybe_pattern) { |
| classifier->RecordPatternError( |
| @@ -3238,6 +3252,23 @@ ParserBase<Traits>::CheckAndRewriteReferenceExpression( |
| template <typename Traits> |
| +void ParserBase<Traits>::ClassifyReferenceExpression( |
|
adamk
2015/12/12 01:03:35
Indeed, this code is very close to the existing Ch
|
| + ExpressionClassifier* classifier, ExpressionT expression, int beg_pos, |
| + int end_pos) { |
| + if (!this->IsIdentifier(expression)) return; |
| + IdentifierT ref = this->AsIdentifier(expression); |
| + if (is_strict(language_mode()) && this->IsEvalOrArguments(ref)) { |
| + classifier->RecordAssignmentPatternError( |
| + Scanner::Location(beg_pos, end_pos), |
| + MessageTemplate::kStrictEvalArguments); |
| + } else if (is_strong(language_mode()) && this->IsUndefined(ref)) { |
| + classifier->RecordAssignmentPatternError( |
| + Scanner::Location(beg_pos, end_pos), MessageTemplate::kStrongUndefined); |
| + } |
| +} |
| + |
| + |
| +template <typename Traits> |
| typename ParserBase<Traits>::ExpressionT |
| ParserBase<Traits>::ClassifyAndRewriteReferenceExpression( |
| ExpressionClassifier* classifier, ExpressionT expression, int beg_pos, |
| @@ -3248,12 +3279,16 @@ ParserBase<Traits>::ClassifyAndRewriteReferenceExpression( |
| this->IsEvalOrArguments(this->AsIdentifier(expression))) { |
| classifier->RecordExpressionError( |
| location, MessageTemplate::kStrictEvalArguments, kSyntaxError); |
| + classifier->RecordAssignmentPatternError( |
| + location, MessageTemplate::kStrictEvalArguments); |
| return expression; |
| } |
| if (is_strong(language_mode()) && |
| this->IsUndefined(this->AsIdentifier(expression))) { |
| classifier->RecordExpressionError( |
| location, MessageTemplate::kStrongUndefined, kSyntaxError); |
| + classifier->RecordAssignmentPatternError( |
| + location, MessageTemplate::kStrongUndefined); |
| return expression; |
| } |
| } |