Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index b5637aa5b2dbb8b3e06cc04b86d3504ca8fd8fbd..3d94f68ca2e128ef5ea6821f13b2169556b1836f 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -1565,7 +1565,7 @@ Statement* Parser::ParseExportDefault(bool* ok) { |
int pos = peek_position(); |
ExpressionClassifier classifier; |
Expression* expr = ParseAssignmentExpression(true, &classifier, CHECK_OK); |
- ValidateExpression(&classifier, CHECK_OK); |
+ expr = ParserTraits::RewriteNonPattern(expr, &classifier, CHECK_OK); |
ExpectSemicolon(CHECK_OK); |
result = factory()->NewExpressionStatement(expr, pos); |
@@ -2392,7 +2392,7 @@ void Parser::ParseVariableDeclarations(VariableDeclarationContext var_context, |
value = ParseAssignmentExpression(var_context != kForStatement, |
&classifier, ok); |
if (!*ok) return; |
- ValidateExpression(&classifier, ok); |
+ value = ParserTraits::RewriteNonPattern(value, &classifier, ok); |
if (!*ok) return; |
variable_loc.end_pos = scanner()->location().end_pos; |
@@ -2503,7 +2503,7 @@ Statement* Parser::ParseExpressionOrLabelledStatement( |
} else { |
expr = ParseStrongSuperCallExpression(&classifier, CHECK_OK); |
} |
- ValidateExpression(&classifier, CHECK_OK); |
+ expr = ParserTraits::RewriteNonPattern(expr, &classifier, CHECK_OK); |
switch (peek()) { |
case Token::SEMICOLON: |
Consume(Token::SEMICOLON); |
@@ -3724,7 +3724,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
if (is_destructuring) { |
ValidateAssignmentPattern(&classifier, CHECK_OK); |
} else { |
- ValidateExpression(&classifier, CHECK_OK); |
+ expression = |
+ ParserTraits::RewriteNonPattern(expression, &classifier, CHECK_OK); |
} |
if (is_for_each) { |
@@ -4748,7 +4749,7 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
block_scope->set_start_position(scanner()->location().end_pos); |
ExpressionClassifier classifier; |
extends = ParseLeftHandSideExpression(&classifier, CHECK_OK); |
- ValidateExpression(&classifier, CHECK_OK); |
+ extends = ParserTraits::RewriteNonPattern(extends, &classifier, CHECK_OK); |
} else { |
block_scope->set_start_position(scanner()->location().end_pos); |
} |
@@ -4774,7 +4775,8 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
ObjectLiteral::Property* property = ParsePropertyDefinition( |
&checker, in_class, has_extends, is_static, &is_computed_name, |
&has_seen_constructor, &classifier, &name, CHECK_OK); |
- ValidateExpression(&classifier, CHECK_OK); |
+ property = ParserTraits::RewriteNonPatternObjectLiteralProperty( |
+ property, &classifier, CHECK_OK); |
if (has_seen_constructor && constructor == NULL) { |
constructor = GetPropertyValue(property)->AsFunctionLiteral(); |
@@ -4825,7 +4827,7 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) { |
ExpressionClassifier classifier; |
ZoneList<Expression*>* args = |
ParseArguments(&spread_pos, &classifier, CHECK_OK); |
- ValidateExpression(&classifier, CHECK_OK); |
+ args = RewriteNonPatternArguments(args, &classifier, CHECK_OK); |
DCHECK(!spread_pos.IsValid()); |
@@ -5388,6 +5390,58 @@ void ParserTraits::RewriteDestructuringAssignments() { |
} |
+Expression* ParserTraits::RewriteNonPattern( |
+ Expression* expr, const ExpressionClassifier* classifier, bool* ok) { |
+ return parser_->RewriteNonPattern(expr, classifier, ok); |
+} |
+ |
+ |
+ZoneList<Expression*>* ParserTraits::RewriteNonPatternArguments( |
+ ZoneList<Expression*>* args, const ExpressionClassifier* classifier, |
+ bool* ok) { |
+ return parser_->RewriteNonPatternArguments(args, classifier, ok); |
+} |
+ |
+ |
+ObjectLiteralProperty* ParserTraits::RewriteNonPatternObjectLiteralProperty( |
+ ObjectLiteralProperty* property, const ExpressionClassifier* classifier, |
+ bool* ok) { |
+ return parser_->RewriteNonPatternObjectLiteralProperty(property, classifier, |
+ ok); |
+} |
+ |
+ |
+Expression* Parser::RewriteNonPattern(Expression* expr, |
+ const ExpressionClassifier* classifier, |
+ bool* ok) { |
+ // For the time being, this does no rewriting at all. |
+ ValidateExpression(classifier, ok); |
+ return expr; |
+} |
+ |
+ |
+ZoneList<Expression*>* Parser::RewriteNonPatternArguments( |
+ ZoneList<Expression*>* args, const ExpressionClassifier* classifier, |
+ bool* ok) { |
+ // For the time being, this does no rewriting at all. |
+ ValidateExpression(classifier, ok); |
+ return args; |
+} |
+ |
+ |
+ObjectLiteralProperty* Parser::RewriteNonPatternObjectLiteralProperty( |
+ ObjectLiteralProperty* property, const ExpressionClassifier* classifier, |
+ bool* ok) { |
+ if (property != nullptr) { |
+ Expression* key = RewriteNonPattern(property->key(), classifier, ok); |
+ property->set_key(key); |
+ Expression* value = RewriteNonPattern(property->value(), classifier, ok); |
+ property->set_value(value); |
+ } |
+ return property; |
+} |
+ |
+ |
void Parser::RewriteDestructuringAssignments() { |
FunctionState* func = function_state_; |
if (!allow_harmony_destructuring_assignment()) return; |