| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/ast/ast.h" | 5 #include "src/ast/ast.h" |
| 6 #include "src/messages.h" | 6 #include "src/messages.h" |
| 7 #include "src/parsing/parameter-initializer-rewriter.h" | 7 #include "src/parsing/parameter-initializer-rewriter.h" |
| 8 #include "src/parsing/parser.h" | 8 #include "src/parsing/parser.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 rewriter.descriptor_ = declaration_descriptor; | 26 rewriter.descriptor_ = declaration_descriptor; |
| 27 rewriter.names_ = names; | 27 rewriter.names_ = names; |
| 28 rewriter.ok_ = ok; | 28 rewriter.ok_ = ok; |
| 29 rewriter.recursion_level_ = 0; | 29 rewriter.recursion_level_ = 0; |
| 30 | 30 |
| 31 rewriter.RecurseIntoSubpattern(rewriter.pattern_, declaration->initializer); | 31 rewriter.RecurseIntoSubpattern(rewriter.pattern_, declaration->initializer); |
| 32 } | 32 } |
| 33 | 33 |
| 34 | 34 |
| 35 void Parser::PatternRewriter::RewriteDestructuringAssignment( | 35 void Parser::PatternRewriter::RewriteDestructuringAssignment( |
| 36 Parser* parser, RewritableExpression* to_rewrite, Scope* scope) { | 36 Parser* parser, RewritableAssignmentExpression* to_rewrite, Scope* scope) { |
| 37 PatternRewriter rewriter; | 37 PatternRewriter rewriter; |
| 38 | 38 |
| 39 DCHECK(!to_rewrite->is_rewritten()); | 39 DCHECK(!to_rewrite->is_rewritten()); |
| 40 | 40 |
| 41 bool ok = true; | 41 bool ok = true; |
| 42 rewriter.scope_ = scope; | 42 rewriter.scope_ = scope; |
| 43 rewriter.parser_ = parser; | 43 rewriter.parser_ = parser; |
| 44 rewriter.context_ = ASSIGNMENT; | 44 rewriter.context_ = ASSIGNMENT; |
| 45 rewriter.pattern_ = to_rewrite; | 45 rewriter.pattern_ = to_rewrite; |
| 46 rewriter.block_ = nullptr; | 46 rewriter.block_ = nullptr; |
| 47 rewriter.descriptor_ = nullptr; | 47 rewriter.descriptor_ = nullptr; |
| 48 rewriter.names_ = nullptr; | 48 rewriter.names_ = nullptr; |
| 49 rewriter.ok_ = &ok; | 49 rewriter.ok_ = &ok; |
| 50 rewriter.recursion_level_ = 0; | 50 rewriter.recursion_level_ = 0; |
| 51 | 51 |
| 52 rewriter.RecurseIntoSubpattern(rewriter.pattern_, nullptr); | 52 rewriter.RecurseIntoSubpattern(rewriter.pattern_, nullptr); |
| 53 DCHECK(ok); | 53 DCHECK(ok); |
| 54 } | 54 } |
| 55 | 55 |
| 56 | 56 |
| 57 Expression* Parser::PatternRewriter::RewriteDestructuringAssignment( | 57 Expression* Parser::PatternRewriter::RewriteDestructuringAssignment( |
| 58 Parser* parser, Assignment* assignment, Scope* scope) { | 58 Parser* parser, Assignment* assignment, Scope* scope) { |
| 59 DCHECK_NOT_NULL(assignment); | 59 DCHECK_NOT_NULL(assignment); |
| 60 DCHECK_EQ(Token::ASSIGN, assignment->op()); | 60 DCHECK_EQ(Token::ASSIGN, assignment->op()); |
| 61 auto to_rewrite = parser->factory()->NewRewritableExpression(assignment); | 61 auto to_rewrite = |
| 62 parser->factory()->NewRewritableAssignmentExpression(assignment); |
| 62 RewriteDestructuringAssignment(parser, to_rewrite, scope); | 63 RewriteDestructuringAssignment(parser, to_rewrite, scope); |
| 63 return to_rewrite->expression(); | 64 return to_rewrite->expression(); |
| 64 } | 65 } |
| 65 | 66 |
| 66 | 67 |
| 67 bool Parser::PatternRewriter::IsAssignmentContext(PatternContext c) const { | 68 bool Parser::PatternRewriter::IsAssignmentContext(PatternContext c) const { |
| 68 return c == ASSIGNMENT || c == ASSIGNMENT_INITIALIZER; | 69 return c == ASSIGNMENT || c == ASSIGNMENT_INITIALIZER; |
| 69 } | 70 } |
| 70 | 71 |
| 71 | 72 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 83 return old_context; | 84 return old_context; |
| 84 } | 85 } |
| 85 | 86 |
| 86 | 87 |
| 87 Parser::PatternRewriter::PatternContext | 88 Parser::PatternRewriter::PatternContext |
| 88 Parser::PatternRewriter::SetInitializerContextIfNeeded(Expression* node) { | 89 Parser::PatternRewriter::SetInitializerContextIfNeeded(Expression* node) { |
| 89 // Set appropriate initializer context for BindingElement and | 90 // Set appropriate initializer context for BindingElement and |
| 90 // AssignmentElement nodes | 91 // AssignmentElement nodes |
| 91 PatternContext old_context = context(); | 92 PatternContext old_context = context(); |
| 92 bool is_destructuring_assignment = | 93 bool is_destructuring_assignment = |
| 93 node->IsRewritableExpression() && | 94 node->IsRewritableAssignmentExpression() && |
| 94 !node->AsRewritableExpression()->is_rewritten(); | 95 !node->AsRewritableAssignmentExpression()->is_rewritten(); |
| 95 bool is_assignment = | 96 bool is_assignment = |
| 96 node->IsAssignment() && node->AsAssignment()->op() == Token::ASSIGN; | 97 node->IsAssignment() && node->AsAssignment()->op() == Token::ASSIGN; |
| 97 if (is_destructuring_assignment || is_assignment) { | 98 if (is_destructuring_assignment || is_assignment) { |
| 98 switch (old_context) { | 99 switch (old_context) { |
| 99 case BINDING: | 100 case BINDING: |
| 100 set_context(INITIALIZER); | 101 set_context(INITIALIZER); |
| 101 break; | 102 break; |
| 102 case ASSIGNMENT: | 103 case ASSIGNMENT: |
| 103 set_context(ASSIGNMENT_INITIALIZER); | 104 set_context(ASSIGNMENT_INITIALIZER); |
| 104 break; | 105 break; |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 RelocInfo::kNoPosition); | 317 RelocInfo::kNoPosition); |
| 317 | 318 |
| 318 block_->statements()->Add( | 319 block_->statements()->Add( |
| 319 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), | 320 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), |
| 320 zone()); | 321 zone()); |
| 321 } | 322 } |
| 322 return temp; | 323 return temp; |
| 323 } | 324 } |
| 324 | 325 |
| 325 | 326 |
| 326 void Parser::PatternRewriter::VisitRewritableExpression( | 327 void Parser::PatternRewriter::VisitRewritableAssignmentExpression( |
| 327 RewritableExpression* node) { | 328 RewritableAssignmentExpression* node) { |
| 328 // If this is not a destructuring assignment... | 329 if (!IsAssignmentContext()) { |
| 329 if (!IsAssignmentContext() || !node->expression()->IsAssignment()) { | 330 // Mark the assignment as rewritten to prevent redundant rewriting, and |
| 330 // Mark the node as rewritten to prevent redundant rewriting, and | |
| 331 // perform BindingPattern rewriting | 331 // perform BindingPattern rewriting |
| 332 DCHECK(!node->is_rewritten()); | 332 DCHECK(!node->is_rewritten()); |
| 333 node->Rewrite(node->expression()); | 333 node->Rewrite(node->expression()); |
| 334 return node->expression()->Accept(this); | 334 return node->expression()->Accept(this); |
| 335 } | 335 } |
| 336 | 336 |
| 337 if (node->is_rewritten()) return; | 337 if (node->is_rewritten()) return; |
| 338 DCHECK(IsAssignmentContext()); | 338 DCHECK(IsAssignmentContext()); |
| 339 Assignment* assign = node->expression()->AsAssignment(); | 339 Assignment* assign = node->expression()->AsAssignment(); |
| 340 DCHECK_NOT_NULL(assign); | 340 DCHECK_NOT_NULL(assign); |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 NOT_A_PATTERN(TryFinallyStatement) | 619 NOT_A_PATTERN(TryFinallyStatement) |
| 620 NOT_A_PATTERN(UnaryOperation) | 620 NOT_A_PATTERN(UnaryOperation) |
| 621 NOT_A_PATTERN(VariableDeclaration) | 621 NOT_A_PATTERN(VariableDeclaration) |
| 622 NOT_A_PATTERN(WhileStatement) | 622 NOT_A_PATTERN(WhileStatement) |
| 623 NOT_A_PATTERN(WithStatement) | 623 NOT_A_PATTERN(WithStatement) |
| 624 NOT_A_PATTERN(Yield) | 624 NOT_A_PATTERN(Yield) |
| 625 | 625 |
| 626 #undef NOT_A_PATTERN | 626 #undef NOT_A_PATTERN |
| 627 } // namespace internal | 627 } // namespace internal |
| 628 } // namespace v8 | 628 } // namespace v8 |
| OLD | NEW |