Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index dac59b7d4437ee5fd406740cf7023277dfecd0f6..f043c23fbdd30725327fa787be568d640562ba68 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -3603,14 +3603,33 @@ Statement* Parser::DesugarLexicalBindingsInForStatement( |
} |
-Expression* Parser::DesugarDestructuringAssignment(Expression* expr) { |
- // TODO(caitp): implement the desugaring |
- DCHECK(expr->IsAssignment()); |
+Expression* Parser::DesugarDestructuringAssignmentInternal(Expression* expr, |
+ Variable** result) { |
Assignment* assign = expr->AsAssignment(); |
- while (assign->value()->IsAssignment()) { |
- assign = assign->value()->AsAssignment(); |
+ Expression* value = assign->value(); |
+ Expression* target = assign->target(); |
+ if (value->IsAssignment()) { |
+ value = DesugarDestructuringAssignmentInternal(value, result); |
+ } |
+ if (target->IsObjectLiteral() || target->IsArrayLiteral()) { |
+ Block* block = factory()->NewBlock(nullptr, 8, false, expr->position()); |
+ bool ok = true; |
+ *result = PatternRewriter::RewriteDestructuringAssignment( |
+ this, block, target, value, *result, &ok); |
+ DCHECK_EQ(ok, true); |
+ DCHECK_NOT_NULL(*result); |
+ return factory()->NewDoExpression(block, *result, expr->position()); |
} |
- return assign->value(); |
+ |
+ return expr; |
+} |
+ |
+ |
+Expression* Parser::DesugarDestructuringAssignment(Expression* expr) { |
+ DCHECK(expr->IsAssignment()); |
+ Variable* result = nullptr; |
+ |
+ return DesugarDestructuringAssignmentInternal(expr, &result); |
} |