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

Unified Diff: runtime/vm/parser.cc

Issue 2768103002: Debugger support for step-into async and async* functions. (Closed)
Patch Set: asiva review Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object_store.cc ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « runtime/vm/object_store.cc ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698