Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index cb6e1118ebec8fa4d87d05466d869a3fe8a986ca..4a13688eda09ec3e35d0e6bb77285887f65341cb 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -759,21 +759,9 @@ class ParserBase : public Traits { |
Scanner::Location* first_spread_pos, ExpressionClassifier* classifier, |
bool* ok); |
- enum AssignmentExpressionFlags { |
- kIsNormalAssignment, |
- kIsPossiblePatternElement |
- }; |
- |
ExpressionT ParseAssignmentExpression(bool accept_IN, |
- AssignmentExpressionFlags flags, |
ExpressionClassifier* classifier, |
bool* ok); |
- ExpressionT ParseAssignmentExpression(bool accept_IN, |
- ExpressionClassifier* classifier, |
- bool* ok) { |
- return ParseAssignmentExpression(accept_IN, kIsNormalAssignment, classifier, |
- ok); |
- } |
ExpressionT ParseYieldExpression(ExpressionClassifier* classifier, bool* ok); |
ExpressionT ParseConditionalExpression(bool accept_IN, |
ExpressionClassifier* classifier, |
@@ -844,6 +832,15 @@ class ParserBase : public Traits { |
return true; |
} |
+ bool IsAssignmentExpression(ExpressionT expression) { |
+ return expression->IsAssignment() || |
+ expression->IsRewritableAssignmentExpression(); |
+ } |
+ |
+ bool IsValidPattern(ExpressionT expression) { |
+ return expression->IsObjectLiteral() || expression->IsArrayLiteral(); |
+ } |
+ |
// Keep track of eval() calls since they disable all local variable |
// optimizations. This checks if expression is an eval call, and if yes, |
// forwards the information to scope. |
@@ -1345,8 +1342,7 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier, |
classifier->RecordNonSimpleParameter(); |
ExpressionT expr = |
this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
- if (!this->IsIdentifier(expr) && !expr->IsObjectLiteral() && |
- !expr->IsArrayLiteral()) { |
+ if (!this->IsIdentifier(expr) && !IsValidPattern(expr)) { |
classifier->RecordArrowFormalParametersError( |
Scanner::Location(ellipsis_pos, scanner()->location().end_pos), |
MessageTemplate::kInvalidRestParameter); |
@@ -1466,8 +1462,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( |
ExpressionT right = this->ParseAssignmentExpression( |
accept_IN, &binding_classifier, CHECK_OK); |
if (is_rest) { |
- if (!this->IsIdentifier(right) && !right->IsObjectLiteral() && |
- !right->IsArrayLiteral()) { |
+ if (!this->IsIdentifier(right) && !IsValidPattern(right)) { |
classifier->RecordArrowFormalParametersError( |
Scanner::Location(pos, scanner()->location().end_pos), |
MessageTemplate::kInvalidRestParameter); |
@@ -1521,7 +1516,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
first_spread_index = values->length(); |
} |
- if (argument->IsAssignment()) { |
+ if (IsAssignmentExpression(argument)) { |
classifier->RecordPatternError( |
Scanner::Location(start_pos, scanner()->location().end_pos), |
MessageTemplate::kInvalidDestructuringTarget); |
@@ -1536,8 +1531,10 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
MessageTemplate::kElementAfterRest); |
} |
} else { |
- elem = this->ParseAssignmentExpression(true, kIsPossiblePatternElement, |
- classifier, CHECK_OK); |
+ int beg_pos = peek_position(); |
+ elem = this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
+ CheckDestructuringElement(elem, classifier, beg_pos, |
+ scanner()->location().end_pos); |
} |
values->Add(elem, zone_); |
if (peek() != Token::RBRACK) { |
@@ -1647,9 +1644,11 @@ ParserBase<Traits>::ParsePropertyDefinition( |
CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
} |
Consume(Token::COLON); |
+ int beg_pos = peek_position(); |
value = this->ParseAssignmentExpression( |
- true, kIsPossiblePatternElement, classifier, |
- CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
+ true, classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
+ CheckDestructuringElement(value, classifier, beg_pos, |
+ scanner()->location().end_pos); |
return factory()->NewObjectLiteralProperty(name_expression, value, false, |
*is_computed_name); |
@@ -1944,7 +1943,6 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments( |
template <class Traits> |
typename ParserBase<Traits>::ExpressionT |
ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
- AssignmentExpressionFlags flags, |
ExpressionClassifier* classifier, |
bool* ok) { |
// AssignmentExpression :: |
@@ -1952,7 +1950,6 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
// ArrowFunction |
// YieldExpression |
// LeftHandSideExpression AssignmentOperator AssignmentExpression |
- bool maybe_pattern_element = flags == kIsPossiblePatternElement; |
bool is_destructuring_assignment = false; |
int lhs_beg_pos = peek_position(); |
@@ -2018,15 +2015,8 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
ExpressionClassifier::FormalParametersProductions | |
ExpressionClassifier::CoverInitializedNameProduction); |
- bool maybe_pattern = |
- expression->IsObjectLiteral() || expression->IsArrayLiteral(); |
- |
if (!Token::IsAssignmentOp(peek())) { |
// Parsed conditional expression only (no assignment). |
- if (maybe_pattern_element) { |
- CheckDestructuringElement(expression, classifier, lhs_beg_pos, |
- scanner()->location().end_pos); |
- } |
return expression; |
} |
@@ -2035,7 +2025,7 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
BindingPatternUnexpectedToken(classifier); |
} |
- if (allow_harmony_destructuring_assignment() && maybe_pattern && |
+ if (allow_harmony_destructuring_assignment() && IsValidPattern(expression) && |
peek() == Token::ASSIGN) { |
classifier->ForgiveCoverInitializedNameError(); |
ValidateAssignmentPattern(classifier, CHECK_OK); |
@@ -2048,10 +2038,6 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
classifier, expression, lhs_beg_pos, scanner()->location().end_pos, |
MessageTemplate::kInvalidLhsInAssignment); |
} else { |
- if (maybe_pattern_element) { |
- CheckDestructuringElement(expression, classifier, lhs_beg_pos, |
- scanner()->location().end_pos); |
- } |
expression = this->CheckAndRewriteReferenceExpression( |
expression, lhs_beg_pos, scanner()->location().end_pos, |
MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); |
@@ -3296,18 +3282,11 @@ template <typename Traits> |
void ParserBase<Traits>::CheckDestructuringElement( |
ExpressionT expression, ExpressionClassifier* classifier, int begin, |
int end) { |
- static const MessageTemplate::Template message = |
- MessageTemplate::kInvalidDestructuringTarget; |
- const Scanner::Location location(begin, end); |
- if (expression->IsArrayLiteral() || expression->IsObjectLiteral() || |
- expression->IsAssignment()) { |
- return; |
- } |
- |
- if (expression->IsProperty()) { |
- classifier->RecordBindingPatternError(location, message); |
- } else if (!this->IsAssignableIdentifier(expression)) { |
- classifier->RecordPatternError(location, message); |
+ if (!IsValidPattern(expression) && !IsAssignmentExpression(expression) && |
+ !IsValidReferenceExpression(expression)) { |
+ classifier->RecordAssignmentPatternError( |
+ Scanner::Location(begin, end), |
+ MessageTemplate::kInvalidDestructuringTarget); |
} |
} |