OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/ast-expression-rewriter.h" | 9 #include "src/ast/ast-expression-rewriter.h" |
10 #include "src/ast/ast-expression-visitor.h" | 10 #include "src/ast/ast-expression-visitor.h" |
(...skipping 4637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4648 inner_scope->set_is_declaration_scope(); | 4648 inner_scope->set_is_declaration_scope(); |
4649 inner_scope->set_start_position(scanner()->location().beg_pos); | 4649 inner_scope->set_start_position(scanner()->location().beg_pos); |
4650 inner_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); | 4650 inner_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); |
4651 inner_block->set_scope(inner_scope); | 4651 inner_block->set_scope(inner_scope); |
4652 body = inner_block->statements(); | 4652 body = inner_block->statements(); |
4653 } | 4653 } |
4654 | 4654 |
4655 { | 4655 { |
4656 BlockState block_state(&scope_, inner_scope); | 4656 BlockState block_state(&scope_, inner_scope); |
4657 | 4657 |
4658 // For generators, allocate and yield an iterator on function entry. | |
4659 if (IsGeneratorFunction(kind)) { | 4658 if (IsGeneratorFunction(kind)) { |
4660 ZoneList<Expression*>* arguments = | 4659 // We produce: |
4661 new(zone()) ZoneList<Expression*>(0, zone()); | 4660 // |
4662 CallRuntime* allocation = factory()->NewCallRuntime( | 4661 // try { InitialYield; ...body...; FinalYield } |
4663 Runtime::kCreateJSGeneratorObject, arguments, pos); | 4662 // finally { %GeneratorClose(generator) } |
4664 VariableProxy* init_proxy = factory()->NewVariableProxy( | 4663 // |
4665 function_state_->generator_object_variable()); | 4664 // - InitialYield yields the actual generator object. |
4666 Assignment* assignment = factory()->NewAssignment( | 4665 // - FinalYield yields {value: foo, done: true} where foo is the |
4667 Token::INIT, init_proxy, allocation, RelocInfo::kNoPosition); | 4666 // completion value of body. (This is needed here in case the body |
4668 VariableProxy* get_proxy = factory()->NewVariableProxy( | 4667 // falls through without an explicit return.) |
4669 function_state_->generator_object_variable()); | 4668 // - Any return statement inside the body will be converted into a similar |
4670 Yield* yield = factory()->NewYield( | 4669 // FinalYield. |
4671 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition); | 4670 // - If the generator terminates for whatever reason, we must close it. |
4672 body->Add(factory()->NewExpressionStatement( | 4671 // Hence the finally clause. |
4673 yield, RelocInfo::kNoPosition), zone()); | |
4674 } | |
4675 | 4672 |
4676 ParseStatementList(body, Token::RBRACE, CHECK_OK); | 4673 Block* try_block = |
| 4674 factory()->NewBlock(nullptr, 3, false, RelocInfo::kNoPosition); |
4677 | 4675 |
4678 if (IsGeneratorFunction(kind)) { | 4676 { |
| 4677 ZoneList<Expression*>* arguments = |
| 4678 new (zone()) ZoneList<Expression*>(0, zone()); |
| 4679 CallRuntime* allocation = factory()->NewCallRuntime( |
| 4680 Runtime::kCreateJSGeneratorObject, arguments, pos); |
| 4681 VariableProxy* init_proxy = factory()->NewVariableProxy( |
| 4682 function_state_->generator_object_variable()); |
| 4683 Assignment* assignment = factory()->NewAssignment( |
| 4684 Token::INIT, init_proxy, allocation, RelocInfo::kNoPosition); |
| 4685 VariableProxy* get_proxy = factory()->NewVariableProxy( |
| 4686 function_state_->generator_object_variable()); |
| 4687 Yield* yield = factory()->NewYield( |
| 4688 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition); |
| 4689 try_block->statements()->Add( |
| 4690 factory()->NewExpressionStatement(yield, RelocInfo::kNoPosition), |
| 4691 zone()); |
| 4692 } |
| 4693 |
| 4694 ParseStatementList(try_block->statements(), Token::RBRACE, CHECK_OK); |
| 4695 |
4679 VariableProxy* get_proxy = factory()->NewVariableProxy( | 4696 VariableProxy* get_proxy = factory()->NewVariableProxy( |
4680 function_state_->generator_object_variable()); | 4697 function_state_->generator_object_variable()); |
4681 Expression* undefined = | 4698 Expression* undefined = |
4682 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition); | 4699 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition); |
4683 Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal, | 4700 Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal, |
4684 RelocInfo::kNoPosition); | 4701 RelocInfo::kNoPosition); |
4685 body->Add(factory()->NewExpressionStatement( | 4702 try_block->statements()->Add( |
4686 yield, RelocInfo::kNoPosition), zone()); | 4703 factory()->NewExpressionStatement(yield, RelocInfo::kNoPosition), |
| 4704 zone()); |
| 4705 |
| 4706 Block* finally_block = |
| 4707 factory()->NewBlock(nullptr, 1, false, RelocInfo::kNoPosition); |
| 4708 ZoneList<Expression*>* args = |
| 4709 new (zone()) ZoneList<Expression*>(1, zone()); |
| 4710 VariableProxy* call_proxy = factory()->NewVariableProxy( |
| 4711 function_state_->generator_object_variable()); |
| 4712 args->Add(call_proxy, zone()); |
| 4713 Expression* call = factory()->NewCallRuntime( |
| 4714 Runtime::kGeneratorClose, args, RelocInfo::kNoPosition); |
| 4715 finally_block->statements()->Add( |
| 4716 factory()->NewExpressionStatement(call, RelocInfo::kNoPosition), |
| 4717 zone()); |
| 4718 |
| 4719 body->Add(factory()->NewTryFinallyStatement(try_block, finally_block, |
| 4720 RelocInfo::kNoPosition), |
| 4721 zone()); |
| 4722 } else { |
| 4723 ParseStatementList(body, Token::RBRACE, CHECK_OK); |
4687 } | 4724 } |
4688 | 4725 |
4689 if (IsSubclassConstructor(kind)) { | 4726 if (IsSubclassConstructor(kind)) { |
4690 body->Add( | 4727 body->Add( |
4691 factory()->NewReturnStatement( | 4728 factory()->NewReturnStatement( |
4692 this->ThisExpression(scope_, factory(), RelocInfo::kNoPosition), | 4729 this->ThisExpression(scope_, factory(), RelocInfo::kNoPosition), |
4693 RelocInfo::kNoPosition), | 4730 RelocInfo::kNoPosition), |
4694 zone()); | 4731 zone()); |
4695 } | 4732 } |
4696 } | 4733 } |
(...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5733 auto class_literal = value->AsClassLiteral(); | 5770 auto class_literal = value->AsClassLiteral(); |
5734 if (class_literal->raw_name() == nullptr) { | 5771 if (class_literal->raw_name() == nullptr) { |
5735 class_literal->set_raw_name(name); | 5772 class_literal->set_raw_name(name); |
5736 } | 5773 } |
5737 } | 5774 } |
5738 } | 5775 } |
5739 | 5776 |
5740 | 5777 |
5741 } // namespace internal | 5778 } // namespace internal |
5742 } // namespace v8 | 5779 } // namespace v8 |
OLD | NEW |