Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(703)

Side by Side Diff: runtime/vm/parser.cc

Issue 1236943003: Create only one closure for the body of an async* function. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "platform/utils.h" 8 #include "platform/utils.h"
9 #include "vm/ast_transformer.h" 9 #include "vm/ast_transformer.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 6718 matching lines...) Expand 10 before | Expand all | Expand 10 after
6729 // Generate the Ast nodes for the implicit code of the async* function. 6729 // Generate the Ast nodes for the implicit code of the async* function.
6730 // 6730 //
6731 // f(...) async* { 6731 // f(...) async* {
6732 // var :controller; 6732 // var :controller;
6733 // var :await_jump_var = -1; 6733 // var :await_jump_var = -1;
6734 // var :await_context_var; 6734 // var :await_context_var;
6735 // f_async_body() { 6735 // f_async_body() {
6736 // ... source code of f ... 6736 // ... source code of f ...
6737 // } 6737 // }
6738 // var :async_op = f_async_body; 6738 // var :async_op = f_async_body;
6739 // :controller = new _AsyncStarStreamController(f_async_body); 6739 // :controller = new _AsyncStarStreamController(:async_op);
6740 // return :controller.stream; 6740 // return :controller.stream;
6741 // } 6741 // }
6742 SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure, 6742 SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure_func,
6743 SequenceNode* closure_body) { 6743 SequenceNode* closure_body) {
6744 TRACE_PARSER("CloseAsyncGeneratorFunction"); 6744 TRACE_PARSER("CloseAsyncGeneratorFunction");
6745 ASSERT(!closure.IsNull()); 6745 ASSERT(!closure_func.IsNull());
6746 ASSERT(closure_body != NULL); 6746 ASSERT(closure_body != NULL);
6747 6747
6748 // The block for the async closure body has already been closed. Close the 6748 // The block for the async closure body has already been closed. Close the
6749 // corresponding function block. 6749 // corresponding function block.
6750 CloseBlock(); 6750 CloseBlock();
6751 6751
6752 // Make sure the implicit variables of the async generator function 6752 // Make sure the implicit variables of the async generator function
6753 // are captured. 6753 // are captured.
6754 closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); 6754 closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
6755 closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); 6755 closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
(...skipping 12 matching lines...) Expand all
6768 current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false); 6768 current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
6769 LiteralNode* init_value = 6769 LiteralNode* init_value =
6770 new(Z) LiteralNode(Scanner::kNoSourcePos, Smi::ZoneHandle(Smi::New(-1))); 6770 new(Z) LiteralNode(Scanner::kNoSourcePos, Smi::ZoneHandle(Smi::New(-1)));
6771 current_block_->statements->Add( 6771 current_block_->statements->Add(
6772 new(Z) StoreLocalNode(Scanner::kNoSourcePos, jump_var, init_value)); 6772 new(Z) StoreLocalNode(Scanner::kNoSourcePos, jump_var, init_value));
6773 6773
6774 // Add to AST: 6774 // Add to AST:
6775 // :async_op = <closure>; (containing the original body) 6775 // :async_op = <closure>; (containing the original body)
6776 LocalVariable* async_op_var = 6776 LocalVariable* async_op_var =
6777 current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false); 6777 current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false);
6778 ClosureNode* cn = new(Z) ClosureNode( 6778 ClosureNode* closure_obj = new(Z) ClosureNode(
6779 Scanner::kNoSourcePos, closure, NULL, closure_body->scope()); 6779 Scanner::kNoSourcePos, closure_func, NULL, closure_body->scope());
6780 StoreLocalNode* store_async_op = new (Z) StoreLocalNode( 6780 StoreLocalNode* store_async_op = new (Z) StoreLocalNode(
6781 Scanner::kNoSourcePos, 6781 Scanner::kNoSourcePos,
6782 async_op_var, 6782 async_op_var,
6783 cn); 6783 closure_obj);
6784 current_block_->statements->Add(store_async_op); 6784 current_block_->statements->Add(store_async_op);
6785 6785
6786 // :controller = new _AsyncStarStreamController(body_closure); 6786 // :controller = new _AsyncStarStreamController(body_closure);
6787 ArgumentListNode* arguments = new(Z) ArgumentListNode(Scanner::kNoSourcePos); 6787 ArgumentListNode* arguments = new(Z) ArgumentListNode(Scanner::kNoSourcePos);
6788 ClosureNode* closure_obj = new(Z) ClosureNode( 6788 arguments->Add(new (Z) LoadLocalNode(Scanner::kNoSourcePos, async_op_var));
6789 Scanner::kNoSourcePos, closure, NULL, closure_body->scope());
6790 arguments->Add(closure_obj);
6791 ConstructorCallNode* controller_constructor_call = 6789 ConstructorCallNode* controller_constructor_call =
6792 new(Z) ConstructorCallNode(Scanner::kNoSourcePos, 6790 new(Z) ConstructorCallNode(Scanner::kNoSourcePos,
6793 TypeArguments::ZoneHandle(Z), 6791 TypeArguments::ZoneHandle(Z),
6794 controller_constructor, 6792 controller_constructor,
6795 arguments); 6793 arguments);
6796 LocalVariable* controller_var = 6794 LocalVariable* controller_var =
6797 current_block_->scope->LookupVariable(Symbols::Controller(), false); 6795 current_block_->scope->LookupVariable(Symbols::Controller(), false);
6798 StoreLocalNode* store_controller = 6796 StoreLocalNode* store_controller =
6799 new(Z) StoreLocalNode(Scanner::kNoSourcePos, 6797 new(Z) StoreLocalNode(Scanner::kNoSourcePos,
6800 controller_var, 6798 controller_var,
(...skipping 6826 matching lines...) Expand 10 before | Expand all | Expand 10 after
13627 void Parser::SkipQualIdent() { 13625 void Parser::SkipQualIdent() {
13628 ASSERT(IsIdentifier()); 13626 ASSERT(IsIdentifier());
13629 ConsumeToken(); 13627 ConsumeToken();
13630 if (CurrentToken() == Token::kPERIOD) { 13628 if (CurrentToken() == Token::kPERIOD) {
13631 ConsumeToken(); // Consume the kPERIOD token. 13629 ConsumeToken(); // Consume the kPERIOD token.
13632 ExpectIdentifier("identifier expected after '.'"); 13630 ExpectIdentifier("identifier expected after '.'");
13633 } 13631 }
13634 } 13632 }
13635 13633
13636 } // namespace dart 13634 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698