Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index b18c4fda87d1d1f08306b059046bd05ce0faa5a7..57ebcc17659592d501120a83d037ef9fc588361d 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -7514,22 +7514,21 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure, |
Symbols::AsyncStackTraceVar(), false); |
ASSERT((existing_var != NULL) && existing_var->is_captured()); |
- // Create and return a new future that executes a closure with the current |
- // body. |
+ // Create and return a new _AsyncAwaitCompleter that executes a closure with |
+ // the current body. |
// No need to capture parameters or other variables, since they have already |
// been captured in the corresponding scope as the body has been parsed within |
// a nested block (contained in the async function's block). |
- const Class& future = Class::ZoneHandle(Z, I->object_store()->future_class()); |
- ASSERT(!future.IsNull()); |
- const Function& constructor = Function::ZoneHandle( |
- Z, future.LookupFunction(Symbols::FutureMicrotask())); |
- ASSERT(!constructor.IsNull()); |
- const Class& completer = |
- Class::ZoneHandle(Z, I->object_store()->completer_class()); |
- ASSERT(!completer.IsNull()); |
- const Function& completer_constructor = Function::ZoneHandle( |
- Z, completer.LookupFunction(Symbols::CompleterSyncConstructor())); |
+ |
+ const Library& async_lib = Library::Handle(Library::AsyncLibrary()); |
+ |
+ const Class& completer_class = Class::Handle( |
+ Z, async_lib.LookupClassAllowPrivate(Symbols::_AsyncAwaitCompleter())); |
+ ASSERT(!completer_class.IsNull()); |
+ const Function& completer_constructor = |
+ Function::ZoneHandle(Z, completer_class.LookupConstructorAllowPrivate( |
+ Symbols::_AsyncAwaitCompleterConstructor())); |
ASSERT(!completer_constructor.IsNull()); |
LocalVariable* async_completer = |
@@ -7564,8 +7563,6 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure, |
new (Z) StoreLocalNode(token_pos, async_op_var, cn); |
current_block_->statements->Add(store_async_op); |
- const Library& async_lib = Library::Handle(Library::AsyncLibrary()); |
- |
if (FLAG_causal_async_stacks) { |
// Add to AST: |
// :async_stack_trace = _asyncStackTraceHelper(); |
@@ -7627,12 +7624,13 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure, |
current_block_->statements->Add(store_async_catch_error_callback); |
// Add to AST: |
- // new Future.microtask(:async_op); |
+ // :async_completer.start(:async_op); |
ArgumentListNode* arguments = new (Z) ArgumentListNode(token_pos); |
arguments->Add(new (Z) LoadLocalNode(token_pos, async_op_var)); |
- ConstructorCallNode* future_node = new (Z) ConstructorCallNode( |
- token_pos, TypeArguments::ZoneHandle(Z), constructor, arguments); |
- current_block_->statements->Add(future_node); |
+ InstanceCallNode* start_call = new (Z) InstanceCallNode( |
+ token_pos, new (Z) LoadLocalNode(token_pos, async_completer), |
+ Symbols::_AsyncAwaitStart(), arguments); |
+ current_block_->statements->Add(start_call); |
// Add to AST: |
// return :async_completer.future; |