Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index 379d41879c3b9f364a6da460964ccd17a9b4f9ce..b08888834eb9ba4a42c557f8cd2d3dfa849c9520 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -691,8 +691,10 @@ class ParserBase : public Traits { |
ArrowFormalParametersProduction = 1 << 4, |
StandardProductions = (ExpressionProduction | BindingPatternProduction | |
AssignmentPatternProduction), |
+ PatternProductions = |
+ BindingPatternProduction | AssignmentPatternProduction, |
AllProductions = (StandardProductions | FormalParametersProduction | |
- ArrowFormalParametersProduction) |
+ ArrowFormalParametersProduction), |
}; |
void Accumulate(const ExpressionClassifier& inner, |
@@ -730,6 +732,18 @@ class ParserBase : public Traits { |
} |
} |
+ void AccumulateReclassifyingAsPattern(const ExpressionClassifier& inner) { |
+ Accumulate(inner, AllProductions & ~PatternProductions); |
+ if (!inner.is_valid_expression()) { |
+ if (is_valid_binding_pattern()) { |
+ binding_pattern_error_ = inner.expression_error(); |
+ } |
+ if (is_valid_assignment_pattern()) { |
+ assignment_pattern_error_ = inner.expression_error(); |
+ } |
+ } |
+ } |
+ |
private: |
Error expression_error_; |
Error binding_pattern_error_; |
@@ -803,6 +817,12 @@ class ParserBase : public Traits { |
} |
} |
+ void ExpressionUnexpectedToken(ExpressionClassifier* classifier) { |
+ classifier->RecordExpressionError(scanner()->peek_location(), |
+ MessageTemplate::kUnexpectedToken, |
+ Token::String(peek())); |
+ } |
+ |
void BindingPatternUnexpectedToken(ExpressionClassifier* classifier) { |
classifier->RecordBindingPatternError(scanner()->peek_location(), |
MessageTemplate::kUnexpectedToken, |
@@ -2677,8 +2697,21 @@ ParserBase<Traits>::ParsePropertyDefinition( |
this->is_generator())) { |
DCHECK(!*is_computed_name); |
DCHECK(!is_static); |
- value = this->ExpressionFromIdentifier(name, next_beg_pos, next_end_pos, |
- scope_, factory()); |
+ |
+ ExpressionT lhs = this->ExpressionFromIdentifier( |
+ name, next_beg_pos, next_end_pos, scope_, factory()); |
+ if (peek() == Token::ASSIGN) { |
+ this->ExpressionUnexpectedToken(classifier); |
+ Consume(Token::ASSIGN); |
+ ExpressionClassifier rhs_classifier; |
+ ExpressionT rhs = this->ParseAssignmentExpression( |
+ true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
+ classifier->AccumulateReclassifyingAsPattern(rhs_classifier); |
+ value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs, |
+ RelocInfo::kNoPosition); |
+ } else { |
+ value = lhs; |
+ } |
return factory()->NewObjectLiteralProperty( |
name_expression, value, ObjectLiteralProperty::COMPUTED, false, false); |
@@ -2900,9 +2933,17 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
expression = this->MarkExpressionAsAssigned(expression); |
Token::Value op = Next(); // Get assignment operator. |
+ if (op != Token::ASSIGN) { |
+ classifier->RecordBindingPatternError(scanner()->location(), |
+ MessageTemplate::kUnexpectedToken, |
+ Token::String(op)); |
+ } |
int pos = position(); |
+ |
+ ExpressionClassifier rhs_classifier; |
ExpressionT right = |
- this->ParseAssignmentExpression(accept_IN, classifier, CHECK_OK); |
+ this->ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK); |
+ classifier->AccumulateReclassifyingAsPattern(rhs_classifier); |
// TODO(1231235): We try to estimate the set of properties set by |
// constructors. We define a new property whenever there is an |