Index: src/pattern-rewriter.cc |
diff --git a/src/pattern-rewriter.cc b/src/pattern-rewriter.cc |
index 09f9489e676211128c965a44f632843ea846ce0d..136dc5c1d919b945b61f102bb80528eedcb6d288 100644 |
--- a/src/pattern-rewriter.cc |
+++ b/src/pattern-rewriter.cc |
@@ -207,16 +207,22 @@ void Parser::PatternRewriter::VisitVariableProxy(VariableProxy* pattern) { |
} |
-void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern) { |
- auto temp = descriptor_->declaration_scope->NewTemporary( |
+Variable* Parser::PatternRewriter::CreateTemp(Expression* value) { |
arv (Not doing code reviews)
2015/05/18 14:36:20
CreateTempVar maybe?
Dmitry Lomov (no reviews)
2015/05/18 17:31:22
Done.
|
+ auto temp = TemporaryDeclarationScope()->NewTemporary( |
ast_value_factory()->empty_string()); |
auto assignment = |
factory()->NewAssignment(Token::ASSIGN, factory()->NewVariableProxy(temp), |
- current_value_, RelocInfo::kNoPosition); |
+ value, RelocInfo::kNoPosition); |
block_->AddStatement( |
factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), |
zone()); |
+ return temp; |
+} |
+ |
+ |
+void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern) { |
+ auto temp = CreateTemp(current_value_); |
block_->AddStatement(descriptor_->parser->BuildAssertIsCoercible(temp), |
zone()); |
@@ -236,7 +242,16 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node) { |
void Parser::PatternRewriter::VisitAssignment(Assignment* node) { |
- // TODO(dslomov): implement. |
+ DCHECK(node->op() == Token::ASSIGN); |
arv (Not doing code reviews)
2015/05/18 14:36:20
Maybe add a comment explaining the desugaring
l
Dmitry Lomov (no reviews)
2015/05/18 17:31:22
Done.
|
+ auto temp = CreateTemp(current_value_); |
+ Expression* is_undefined = factory()->NewCompareOperation( |
+ Token::EQ_STRICT, factory()->NewVariableProxy(temp), |
+ factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), |
+ RelocInfo::kNoPosition); |
+ Expression* value = factory()->NewConditional( |
+ is_undefined, node->value(), factory()->NewVariableProxy(temp), |
+ RelocInfo::kNoPosition); |
+ RecurseIntoSubpattern(node->target(), value); |
} |