Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index ca5554ddeb8661eb302c32388b498b2ef2ee688f..d2919e1216e3a32ea3cfb90f5b726bba75854ddb 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -3322,10 +3322,9 @@ |
void Parser::InitializeForEachStatement(ForEachStatement* stmt, |
- Expression* each, Expression* subject, |
- Statement* body, |
- bool is_destructuring) { |
- DCHECK(!is_destructuring || allow_harmony_destructuring_assignment()); |
+ Expression* each, |
+ Expression* subject, |
+ Statement* body) { |
ForOfStatement* for_of = stmt->AsForOfStatement(); |
if (for_of != NULL) { |
@@ -3376,10 +3375,6 @@ |
result_proxy, value_literal, RelocInfo::kNoPosition); |
assign_each = factory()->NewAssignment(Token::ASSIGN, each, result_value, |
RelocInfo::kNoPosition); |
- if (is_destructuring) { |
- assign_each = PatternRewriter::RewriteDestructuringAssignment( |
- this, assign_each->AsAssignment(), scope_); |
- } |
} |
for_of->Initialize(each, subject, body, |
@@ -3388,23 +3383,6 @@ |
result_done, |
assign_each); |
} else { |
- if (is_destructuring) { |
- Variable* temp = |
- scope_->NewTemporary(ast_value_factory()->empty_string()); |
- VariableProxy* temp_proxy = factory()->NewVariableProxy(temp); |
- Expression* assign_each = PatternRewriter::RewriteDestructuringAssignment( |
- this, factory()->NewAssignment(Token::ASSIGN, each, temp_proxy, |
- RelocInfo::kNoPosition), |
- scope_); |
- auto block = |
- factory()->NewBlock(nullptr, 2, false, RelocInfo::kNoPosition); |
- block->statements()->Add(factory()->NewExpressionStatement( |
- assign_each, RelocInfo::kNoPosition), |
- zone()); |
- block->statements()->Add(body, zone()); |
- body = block; |
- each = factory()->NewVariableProxy(temp); |
- } |
stmt->Initialize(each, subject, body); |
} |
} |
@@ -3789,8 +3767,7 @@ |
body_block->statements()->Add(body, zone()); |
VariableProxy* temp_proxy = |
factory()->NewVariableProxy(temp, each_beg_pos, each_end_pos); |
- InitializeForEachStatement(loop, temp_proxy, enumerable, body_block, |
- false); |
+ InitializeForEachStatement(loop, temp_proxy, enumerable, body_block); |
scope_ = for_scope; |
body_scope->set_end_position(scanner()->location().end_pos); |
body_scope = body_scope->FinalizeBlockScope(); |
@@ -3841,8 +3818,7 @@ |
} |
} else { |
int lhs_beg_pos = peek_position(); |
- ExpressionClassifier classifier; |
- Expression* expression = ParseExpression(false, &classifier, CHECK_OK); |
+ Expression* expression = ParseExpression(false, CHECK_OK); |
int lhs_end_pos = scanner()->location().end_pos; |
ForEachStatement::VisitMode mode; |
is_let_identifier_expression = |
@@ -3852,17 +3828,9 @@ |
if (CheckInOrOf(&mode, ok)) { |
if (!*ok) return nullptr; |
- bool is_destructuring = |
- allow_harmony_destructuring_assignment() && |
- (expression->IsArrayLiteral() || expression->IsObjectLiteral()); |
- if (is_destructuring) { |
- ValidateAssignmentPattern(&classifier, CHECK_OK); |
- } else { |
- ValidateExpression(&classifier, CHECK_OK); |
- expression = this->CheckAndRewriteReferenceExpression( |
- expression, lhs_beg_pos, lhs_end_pos, |
- MessageTemplate::kInvalidLhsInFor, kSyntaxError, CHECK_OK); |
- } |
+ expression = this->CheckAndRewriteReferenceExpression( |
+ expression, lhs_beg_pos, lhs_end_pos, |
+ MessageTemplate::kInvalidLhsInFor, kSyntaxError, CHECK_OK); |
ForEachStatement* loop = |
factory()->NewForEachStatement(mode, labels, stmt_pos); |
@@ -3883,8 +3851,7 @@ |
factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition); |
Statement* body = ParseSubStatement(NULL, CHECK_OK); |
block->statements()->Add(body, zone()); |
- InitializeForEachStatement(loop, expression, enumerable, block, |
- is_destructuring); |
+ InitializeForEachStatement(loop, expression, enumerable, block); |
scope_ = saved_scope; |
body_scope->set_end_position(scanner()->location().end_pos); |
body_scope = body_scope->FinalizeBlockScope(); |
@@ -4584,8 +4551,10 @@ |
expr->AsRewritableAssignmentExpression(); |
if (to_rewrite == nullptr || to_rewrite->is_rewritten()) return; |
+ bool ok = true; |
Parser::PatternRewriter::RewriteDestructuringAssignment(parser_, to_rewrite, |
- scope_); |
+ scope_, &ok); |
+ DCHECK(ok); |
} |
private: |
@@ -6554,7 +6523,10 @@ |
Scope* scope = pair.scope; |
DCHECK_NOT_NULL(to_rewrite); |
if (!to_rewrite->is_rewritten()) { |
- PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite, scope); |
+ bool ok = true; |
+ PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite, scope, |
+ &ok); |
+ DCHECK(ok); |
} |
} |
} |