Chromium Code Reviews| 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); |
| } |