Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index 7d8c5a3f1b3abb0c1149de76c5522393bdbfefb0..79097a3243e4c09ba60f7b8eded9e2406e59e7e3 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -7252,6 +7252,18 @@ SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure_func, |
TokenPosition token_pos = TokenPosition::kNoSource; |
+ |
+ // Add to AST: |
+ // :async_op = <closure>; (containing the original body) |
+ LocalVariable* async_op_var = |
+ current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false); |
+ ClosureNode* closure_obj = new (Z) ClosureNode( |
+ TokenPosition::kNoSource, closure_func, NULL, closure_body->scope()); |
+ StoreLocalNode* store_async_op = new (Z) |
+ StoreLocalNode(TokenPosition::kNoSource, async_op_var, closure_obj); |
+ |
+ current_block_->statements->Add(store_async_op); |
+ |
if (FLAG_causal_async_stacks) { |
// Add to AST: |
// :async_stack_trace = _asyncStackTraceHelper(); |
@@ -7261,6 +7273,8 @@ SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure_func, |
ASSERT(!async_stack_trace_helper.IsNull()); |
ArgumentListNode* async_stack_trace_helper_args = |
new (Z) ArgumentListNode(TokenPosition::kNoSource); |
+ async_stack_trace_helper_args->Add( |
+ new (Z) LoadLocalNode(TokenPosition::kNoSource, async_op_var)); |
StaticCallNode* async_stack_trace_helper_call = new (Z) StaticCallNode( |
token_pos, async_stack_trace_helper, async_stack_trace_helper_args); |
LocalVariable* async_stack_trace_var = |
@@ -7271,18 +7285,6 @@ SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure_func, |
current_block_->statements->Add(store_async_stack_trace); |
} |
- |
- // Add to AST: |
- // :async_op = <closure>; (containing the original body) |
- LocalVariable* async_op_var = |
- current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false); |
- ClosureNode* closure_obj = new (Z) ClosureNode( |
- TokenPosition::kNoSource, closure_func, NULL, closure_body->scope()); |
- StoreLocalNode* store_async_op = new (Z) |
- StoreLocalNode(TokenPosition::kNoSource, async_op_var, closure_obj); |
- |
- current_block_->statements->Add(store_async_op); |
- |
// :async_then_callback = _asyncThenWrapperHelper(:async_op) |
const Function& async_then_wrapper_helper = Function::ZoneHandle( |
Z, |
@@ -7495,6 +7497,8 @@ SequenceNode* Parser::CloseAsyncFunction(const Function& closure, |
ASSERT(!async_stack_trace_helper.IsNull()); |
ArgumentListNode* async_stack_trace_helper_args = |
new (Z) ArgumentListNode(token_pos); |
+ async_stack_trace_helper_args->Add( |
+ new (Z) LoadLocalNode(token_pos, async_op_var)); |
StaticCallNode* async_stack_trace_helper_call = new (Z) StaticCallNode( |
token_pos, async_stack_trace_helper, async_stack_trace_helper_args); |
LocalVariable* async_stack_trace_var = |
@@ -9225,6 +9229,21 @@ AstNode* Parser::ParseAwaitForStatement(String* label_name) { |
stream_expr_pos, new (Z) LoadLocalNode(stream_expr_pos, iterator_var), |
Symbols::MoveNext(), no_args); |
OpenBlock(); |
+ if (FLAG_support_debugger) { |
+ // Call '_asyncStarMoveNextHelper' so that the debugger can intercept and |
+ // handle single stepping into a async* generator. |
+ const Function& async_star_move_next_helper = Function::ZoneHandle( |
+ Z, isolate()->object_store()->async_star_move_next_helper()); |
+ ASSERT(!async_star_move_next_helper.IsNull()); |
+ ArgumentListNode* async_star_move_next_helper_args = |
+ new (Z) ArgumentListNode(stream_expr_pos); |
+ async_star_move_next_helper_args->Add( |
+ new (Z) LoadLocalNode(stream_expr_pos, stream_var)); |
+ StaticCallNode* async_star_move_next_helper_call = |
+ new (Z) StaticCallNode(stream_expr_pos, async_star_move_next_helper, |
+ async_star_move_next_helper_args); |
+ current_block_->statements->Add(async_star_move_next_helper_call); |
+ } |
AstNode* await_moveNext = new (Z) AwaitNode( |
stream_expr_pos, iterator_moveNext, saved_try_ctx, async_saved_try_ctx, |
outer_saved_try_ctx, outer_async_saved_try_ctx, current_block_->scope); |