| 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);
|
| }
|
|
|
|
|
|
|