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 3970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3981 // return Promise.reject(e); | 3981 // return Promise.reject(e); |
3982 // } | 3982 // } |
3983 // } | 3983 // } |
3984 scope->ForceContextAllocation(); | 3984 scope->ForceContextAllocation(); |
3985 Variable* temp = | 3985 Variable* temp = |
3986 scope_->NewTemporary(ast_value_factory()->dot_generator_object_string()); | 3986 scope_->NewTemporary(ast_value_factory()->dot_generator_object_string()); |
3987 function_state_->set_generator_object_variable(temp); | 3987 function_state_->set_generator_object_variable(temp); |
3988 | 3988 |
3989 Expression* init_generator_variable = factory()->NewAssignment( | 3989 Expression* init_generator_variable = factory()->NewAssignment( |
3990 Token::INIT, factory()->NewVariableProxy(temp), | 3990 Token::INIT, factory()->NewVariableProxy(temp), |
3991 BuildCreateJSGeneratorObject(pos), RelocInfo::kNoPosition); | 3991 BuildCreateJSGeneratorObject(pos, kind), RelocInfo::kNoPosition); |
3992 body->Add(factory()->NewExpressionStatement(init_generator_variable, | 3992 body->Add(factory()->NewExpressionStatement(init_generator_variable, |
3993 RelocInfo::kNoPosition), | 3993 RelocInfo::kNoPosition), |
3994 zone()); | 3994 zone()); |
3995 | 3995 |
3996 Block* try_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); | 3996 Block* try_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); |
3997 | 3997 |
3998 ZoneList<Statement*>* inner_body = try_block->statements(); | 3998 ZoneList<Statement*>* inner_body = try_block->statements(); |
3999 | 3999 |
4000 Expression* return_value = nullptr; | 4000 Expression* return_value = nullptr; |
4001 if (body_type == FunctionBody::Normal) { | 4001 if (body_type == FunctionBody::Normal) { |
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4585 catch_block->statements()->Add(return_promise_reject, zone()); | 4585 catch_block->statements()->Add(return_promise_reject, zone()); |
4586 TryStatement* try_catch_statement = | 4586 TryStatement* try_catch_statement = |
4587 factory()->NewTryCatchStatement(try_block, catch_scope, catch_variable, | 4587 factory()->NewTryCatchStatement(try_block, catch_scope, catch_variable, |
4588 catch_block, RelocInfo::kNoPosition); | 4588 catch_block, RelocInfo::kNoPosition); |
4589 | 4589 |
4590 block = factory()->NewBlock(nullptr, 1, true, RelocInfo::kNoPosition); | 4590 block = factory()->NewBlock(nullptr, 1, true, RelocInfo::kNoPosition); |
4591 block->statements()->Add(try_catch_statement, zone()); | 4591 block->statements()->Add(try_catch_statement, zone()); |
4592 return block; | 4592 return block; |
4593 } | 4593 } |
4594 | 4594 |
4595 Expression* Parser::BuildCreateJSGeneratorObject(int pos) { | 4595 Expression* Parser::BuildCreateJSGeneratorObject(int pos, FunctionKind kind) { |
4596 DCHECK_NOT_NULL(function_state_->generator_object_variable()); | 4596 DCHECK_NOT_NULL(function_state_->generator_object_variable()); |
4597 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); | 4597 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
4598 args->Add(factory()->NewThisFunction(pos), zone()); | 4598 args->Add(factory()->NewThisFunction(pos), zone()); |
4599 args->Add(ThisExpression(scope_, factory(), RelocInfo::kNoPosition), zone()); | 4599 args->Add(IsArrowFunction(kind) |
| 4600 ? GetLiteralUndefined(pos) |
| 4601 : ThisExpression(scope_, factory(), RelocInfo::kNoPosition), |
| 4602 zone()); |
4600 return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, | 4603 return factory()->NewCallRuntime(Runtime::kCreateJSGeneratorObject, args, |
4601 pos); | 4604 pos); |
4602 } | 4605 } |
4603 | 4606 |
4604 Expression* Parser::BuildPromiseResolve(Expression* value, int pos) { | 4607 Expression* Parser::BuildPromiseResolve(Expression* value, int pos) { |
4605 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); | 4608 ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(1, zone()); |
4606 args->Add(value, zone()); | 4609 args->Add(value, zone()); |
4607 return factory()->NewCallRuntime(Context::PROMISE_CREATE_RESOLVED_INDEX, args, | 4610 return factory()->NewCallRuntime(Context::PROMISE_CREATE_RESOLVED_INDEX, args, |
4608 pos); | 4611 pos); |
4609 } | 4612 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4660 // - InitialYield yields the actual generator object. | 4663 // - InitialYield yields the actual generator object. |
4661 // - Any return statement inside the body will have its argument wrapped | 4664 // - Any return statement inside the body will have its argument wrapped |
4662 // in a "done" iterator result object. | 4665 // in a "done" iterator result object. |
4663 // - If the generator terminates for whatever reason, we must close it. | 4666 // - If the generator terminates for whatever reason, we must close it. |
4664 // Hence the finally clause. | 4667 // Hence the finally clause. |
4665 | 4668 |
4666 Block* try_block = | 4669 Block* try_block = |
4667 factory()->NewBlock(nullptr, 3, false, RelocInfo::kNoPosition); | 4670 factory()->NewBlock(nullptr, 3, false, RelocInfo::kNoPosition); |
4668 | 4671 |
4669 { | 4672 { |
4670 Expression* allocation = BuildCreateJSGeneratorObject(pos); | 4673 Expression* allocation = BuildCreateJSGeneratorObject(pos, kind); |
4671 VariableProxy* init_proxy = factory()->NewVariableProxy( | 4674 VariableProxy* init_proxy = factory()->NewVariableProxy( |
4672 function_state_->generator_object_variable()); | 4675 function_state_->generator_object_variable()); |
4673 Assignment* assignment = factory()->NewAssignment( | 4676 Assignment* assignment = factory()->NewAssignment( |
4674 Token::INIT, init_proxy, allocation, RelocInfo::kNoPosition); | 4677 Token::INIT, init_proxy, allocation, RelocInfo::kNoPosition); |
4675 VariableProxy* get_proxy = factory()->NewVariableProxy( | 4678 VariableProxy* get_proxy = factory()->NewVariableProxy( |
4676 function_state_->generator_object_variable()); | 4679 function_state_->generator_object_variable()); |
4677 Yield* yield = | 4680 Yield* yield = |
4678 factory()->NewYield(get_proxy, assignment, RelocInfo::kNoPosition); | 4681 factory()->NewYield(get_proxy, assignment, RelocInfo::kNoPosition); |
4679 try_block->statements()->Add( | 4682 try_block->statements()->Add( |
4680 factory()->NewExpressionStatement(yield, RelocInfo::kNoPosition), | 4683 factory()->NewExpressionStatement(yield, RelocInfo::kNoPosition), |
(...skipping 2363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7044 try_block, target); | 7047 try_block, target); |
7045 final_loop = target; | 7048 final_loop = target; |
7046 } | 7049 } |
7047 | 7050 |
7048 return final_loop; | 7051 return final_loop; |
7049 } | 7052 } |
7050 | 7053 |
7051 | 7054 |
7052 } // namespace internal | 7055 } // namespace internal |
7053 } // namespace v8 | 7056 } // namespace v8 |
OLD | NEW |