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 { |
11 | 11 |
12 namespace internal { | 12 namespace internal { |
13 | 13 |
14 void Parser::PatternRewriter::DeclareAndInitializeVariables( | 14 void Parser::PatternRewriter::DeclareAndInitializeVariables( |
15 Block* block, const DeclarationDescriptor* declaration_descriptor, | 15 Block* block, const DeclarationDescriptor* declaration_descriptor, |
16 const DeclarationParsingResult::Declaration* declaration, | 16 const DeclarationParsingResult::Declaration* declaration, |
17 ZoneList<const AstRawString*>* names, bool* ok) { | 17 ZoneList<const AstRawString*>* names, bool* ok) { |
18 PatternRewriter rewriter; | 18 PatternRewriter rewriter; |
19 | 19 |
20 rewriter.scope_ = declaration_descriptor->scope; | 20 rewriter.scope_ = declaration_descriptor->scope; |
21 rewriter.parser_ = declaration_descriptor->parser; | 21 rewriter.parser_ = declaration_descriptor->parser; |
22 rewriter.context_ = BINDING; | 22 rewriter.context_ = BINDING; |
23 rewriter.pattern_ = declaration->pattern; | 23 rewriter.pattern_ = declaration->pattern; |
24 rewriter.initializer_position_ = declaration->initializer_position; | 24 rewriter.initializer_position_ = declaration->initializer_position; |
25 rewriter.block_ = block; | 25 rewriter.block_ = block; |
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 | 30 |
30 rewriter.RecurseIntoSubpattern(rewriter.pattern_, declaration->initializer); | 31 rewriter.RecurseIntoSubpattern(rewriter.pattern_, declaration->initializer); |
31 } | 32 } |
32 | 33 |
33 | 34 |
34 void Parser::PatternRewriter::RewriteDestructuringAssignment( | 35 void Parser::PatternRewriter::RewriteDestructuringAssignment( |
35 Parser* parser, RewritableAssignmentExpression* to_rewrite, Scope* scope) { | 36 Parser* parser, RewritableAssignmentExpression* to_rewrite, Scope* scope) { |
36 PatternRewriter rewriter; | 37 PatternRewriter rewriter; |
37 | 38 |
38 DCHECK(!to_rewrite->is_rewritten()); | 39 DCHECK(!to_rewrite->is_rewritten()); |
39 | 40 |
40 bool ok = true; | 41 bool ok = true; |
41 rewriter.scope_ = scope; | 42 rewriter.scope_ = scope; |
42 rewriter.parser_ = parser; | 43 rewriter.parser_ = parser; |
43 rewriter.context_ = ASSIGNMENT; | 44 rewriter.context_ = ASSIGNMENT; |
44 rewriter.pattern_ = to_rewrite; | 45 rewriter.pattern_ = to_rewrite; |
45 rewriter.block_ = nullptr; | 46 rewriter.block_ = nullptr; |
46 rewriter.descriptor_ = nullptr; | 47 rewriter.descriptor_ = nullptr; |
47 rewriter.names_ = nullptr; | 48 rewriter.names_ = nullptr; |
48 rewriter.ok_ = &ok; | 49 rewriter.ok_ = &ok; |
| 50 rewriter.recursion_level_ = 0; |
49 | 51 |
50 rewriter.RecurseIntoSubpattern(rewriter.pattern_, nullptr); | 52 rewriter.RecurseIntoSubpattern(rewriter.pattern_, nullptr); |
51 DCHECK(ok); | 53 DCHECK(ok); |
52 } | 54 } |
53 | 55 |
54 | 56 |
55 Expression* Parser::PatternRewriter::RewriteDestructuringAssignment( | 57 Expression* Parser::PatternRewriter::RewriteDestructuringAssignment( |
56 Parser* parser, Assignment* assignment, Scope* scope) { | 58 Parser* parser, Assignment* assignment, Scope* scope) { |
57 DCHECK_NOT_NULL(assignment); | 59 DCHECK_NOT_NULL(assignment); |
58 DCHECK_EQ(Token::ASSIGN, assignment->op()); | 60 DCHECK_EQ(Token::ASSIGN, assignment->op()); |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 // Constant initializations always assign to the declared constant which | 275 // Constant initializations always assign to the declared constant which |
274 // is always at the function scope level. This is only relevant for | 276 // is always at the function scope level. This is only relevant for |
275 // dynamically looked-up variables and constants (the | 277 // dynamically looked-up variables and constants (the |
276 // start context for constant lookups is always the function context, | 278 // start context for constant lookups is always the function context, |
277 // while it is the top context for var declared variables). Sigh... | 279 // while it is the top context for var declared variables). Sigh... |
278 // For 'let' and 'const' declared variables in harmony mode the | 280 // For 'let' and 'const' declared variables in harmony mode the |
279 // initialization also always assigns to the declared variable. | 281 // initialization also always assigns to the declared variable. |
280 DCHECK_NOT_NULL(proxy); | 282 DCHECK_NOT_NULL(proxy); |
281 DCHECK_NOT_NULL(proxy->var()); | 283 DCHECK_NOT_NULL(proxy->var()); |
282 DCHECK_NOT_NULL(value); | 284 DCHECK_NOT_NULL(value); |
283 Assignment* assignment = factory()->NewAssignment( | 285 // Add break location for destructured sub-pattern. |
284 Token::INIT, proxy, value, descriptor_->initialization_pos); | 286 int pos = IsSubPattern() ? pattern->position() : RelocInfo::kNoPosition; |
| 287 Assignment* assignment = |
| 288 factory()->NewAssignment(Token::INIT, proxy, value, pos); |
285 block_->statements()->Add( | 289 block_->statements()->Add( |
286 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), | 290 factory()->NewExpressionStatement(assignment, pos), zone()); |
287 zone()); | |
288 value = NULL; | 291 value = NULL; |
289 } | 292 } |
290 | 293 |
291 // Add an assignment node to the initialization statement block if we still | 294 // Add an assignment node to the initialization statement block if we still |
292 // have a pending initialization value. | 295 // have a pending initialization value. |
293 if (value != NULL) { | 296 if (value != NULL) { |
294 DCHECK(descriptor_->mode == VAR); | 297 DCHECK(descriptor_->mode == VAR); |
295 // 'var' initializations are simply assignments (with all the consequences | 298 // 'var' initializations are simply assignments (with all the consequences |
296 // if they are inside a 'with' statement - they may change a 'with' object | 299 // if they are inside a 'with' statement - they may change a 'with' object |
297 // property). | 300 // property). |
298 VariableProxy* proxy = initialization_scope->NewUnresolved(factory(), name); | 301 VariableProxy* proxy = initialization_scope->NewUnresolved(factory(), name); |
299 Assignment* assignment = factory()->NewAssignment( | 302 // Add break location for destructured sub-pattern. |
300 Token::INIT, proxy, value, descriptor_->initialization_pos); | 303 int pos = IsSubPattern() ? pattern->position() : RelocInfo::kNoPosition; |
| 304 Assignment* assignment = |
| 305 factory()->NewAssignment(Token::INIT, proxy, value, pos); |
301 block_->statements()->Add( | 306 block_->statements()->Add( |
302 factory()->NewExpressionStatement(assignment, RelocInfo::kNoPosition), | 307 factory()->NewExpressionStatement(assignment, pos), zone()); |
303 zone()); | |
304 } | 308 } |
305 } | 309 } |
306 | 310 |
307 | 311 |
308 Variable* Parser::PatternRewriter::CreateTempVar(Expression* value) { | 312 Variable* Parser::PatternRewriter::CreateTempVar(Expression* value) { |
309 auto temp = scope()->NewTemporary(ast_value_factory()->empty_string()); | 313 auto temp = scope()->NewTemporary(ast_value_factory()->empty_string()); |
310 if (value != nullptr) { | 314 if (value != nullptr) { |
311 auto assignment = factory()->NewAssignment( | 315 auto assignment = factory()->NewAssignment( |
312 Token::ASSIGN, factory()->NewVariableProxy(temp), value, | 316 Token::ASSIGN, factory()->NewVariableProxy(temp), value, |
313 RelocInfo::kNoPosition); | 317 RelocInfo::kNoPosition); |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 NOT_A_PATTERN(TryFinallyStatement) | 619 NOT_A_PATTERN(TryFinallyStatement) |
616 NOT_A_PATTERN(UnaryOperation) | 620 NOT_A_PATTERN(UnaryOperation) |
617 NOT_A_PATTERN(VariableDeclaration) | 621 NOT_A_PATTERN(VariableDeclaration) |
618 NOT_A_PATTERN(WhileStatement) | 622 NOT_A_PATTERN(WhileStatement) |
619 NOT_A_PATTERN(WithStatement) | 623 NOT_A_PATTERN(WithStatement) |
620 NOT_A_PATTERN(Yield) | 624 NOT_A_PATTERN(Yield) |
621 | 625 |
622 #undef NOT_A_PATTERN | 626 #undef NOT_A_PATTERN |
623 } // namespace internal | 627 } // namespace internal |
624 } // namespace v8 | 628 } // namespace v8 |
OLD | NEW |