Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Unified Diff: src/parser.cc

Issue 1411203002: [es6] implement destructuring assignment [clean diff] (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Completion-value reusing that may not necessarily accomplish anything Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}
« no previous file with comments | « src/parser.h ('k') | src/pattern-rewriter.cc » ('j') | src/pattern-rewriter.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698