Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index 23ca9317e3d68753a6981d935d120a7f088af64b..30105dcad83dfd6e00632682a265fdfad63108f7 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -7261,6 +7261,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(); |
@@ -7270,6 +7282,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 = |
@@ -7280,18 +7294,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, |
@@ -7504,6 +7506,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 = |
@@ -9234,6 +9238,19 @@ AstNode* Parser::ParseAwaitForStatement(String* label_name) { |
stream_expr_pos, new (Z) LoadLocalNode(stream_expr_pos, iterator_var), |
Symbols::MoveNext(), no_args); |
OpenBlock(); |
+ // Call '_asyncStarMoveNextHelper' so that the debugger can intercept and |
rmacnak
2017/03/23 20:20:18
if (FLAG_support_debugger) {
Cutch
2017/03/23 21:24:51
Done.
|
+ // 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); |