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

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

Issue 2603383004: Sane asynchronous debugging and stack traces (Closed)
Patch Set: rebase Created 3 years, 11 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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/ast_transformer.h" 5 #include "vm/ast_transformer.h"
6 6
7 #include "vm/object_store.h" 7 #include "vm/object_store.h"
8 #include "vm/parser.h" 8 #include "vm/parser.h"
9 #include "vm/thread.h" 9 #include "vm/thread.h"
10 10
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 result_ = new (Z) TypeNode(node->token_pos(), node->type()); 122 result_ = new (Z) TypeNode(node->token_pos(), node->type());
123 } 123 }
124 124
125 125
126 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) { 126 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
127 // Await transformation: 127 // Await transformation:
128 // 128 //
129 // :await_temp_var_X = <expr>; 129 // :await_temp_var_X = <expr>;
130 // AwaitMarker(kNewContinuationState); 130 // AwaitMarker(kNewContinuationState);
131 // :result_param = _awaitHelper( 131 // :result_param = _awaitHelper(
132 // :await_temp_var_X, :async_then_callback, :async_catch_error_callback); 132 // :await_temp_var_X,
133 // :async_then_callback,
134 // :async_catch_error_callback,
135 // :async_op);
133 // return; // (return_type() == kContinuationTarget) 136 // return; // (return_type() == kContinuationTarget)
134 // 137 //
135 // :saved_try_ctx_var = :await_saved_try_ctx_var_y; 138 // :saved_try_ctx_var = :await_saved_try_ctx_var_y;
136 // :await_temp_var_(X+1) = :result_param; 139 // :await_temp_var_(X+1) = :result_param;
137 140
138 const TokenPosition token_pos = ST(node->token_pos()); 141 const TokenPosition token_pos = ST(node->token_pos());
139 LocalVariable* async_op = 142 LocalVariable* async_op =
140 GetVariableInScope(preamble_->scope(), Symbols::AsyncOperation()); 143 GetVariableInScope(preamble_->scope(), Symbols::AsyncOperation());
141 LocalVariable* async_then_callback = 144 LocalVariable* async_then_callback =
142 GetVariableInScope(preamble_->scope(), Symbols::AsyncThenCallback()); 145 GetVariableInScope(preamble_->scope(), Symbols::AsyncThenCallback());
143 LocalVariable* async_catch_error_callback = GetVariableInScope( 146 LocalVariable* async_catch_error_callback = GetVariableInScope(
144 preamble_->scope(), Symbols::AsyncCatchErrorCallback()); 147 preamble_->scope(), Symbols::AsyncCatchErrorCallback());
145 LocalVariable* result_param = 148 LocalVariable* result_param =
146 GetVariableInScope(preamble_->scope(), Symbols::AsyncOperationParam()); 149 GetVariableInScope(preamble_->scope(), Symbols::AsyncOperationParam());
147 LocalVariable* error_param = GetVariableInScope( 150 LocalVariable* error_param = GetVariableInScope(
148 preamble_->scope(), Symbols::AsyncOperationErrorParam()); 151 preamble_->scope(), Symbols::AsyncOperationErrorParam());
149 LocalVariable* stack_trace_param = GetVariableInScope( 152 LocalVariable* stack_trace_param = GetVariableInScope(
150 preamble_->scope(), Symbols::AsyncOperationStackTraceParam()); 153 preamble_->scope(), Symbols::AsyncOperationStackTraceParam());
151 154
152 AstNode* transformed_expr = Transform(node->expr()); 155 AstNode* transformed_expr = Transform(node->expr());
153 LocalVariable* await_temp = 156 LocalVariable* await_temp =
154 AddNewTempVarToPreamble(transformed_expr, ST(node->token_pos())); 157 AddNewTempVarToPreamble(transformed_expr, ST(node->token_pos()));
155 158
156 AwaitMarkerNode* await_marker = 159 AwaitMarkerNode* await_marker =
157 new (Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos); 160 new (Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos);
158 preamble_->Add(await_marker); 161 preamble_->Add(await_marker);
159 162
160 // :result_param = _awaitHelper( 163 // :result_param = _awaitHelper(
161 // :await_temp, :async_then_callback, :async_catch_error_callback) 164 // :await_temp,
165 // :async_then_callback,
166 // :async_catch_error_callback,
167 // :async_op)
162 const Library& async_lib = Library::Handle(Library::AsyncLibrary()); 168 const Library& async_lib = Library::Handle(Library::AsyncLibrary());
163 const Function& async_await_helper = Function::ZoneHandle( 169 const Function& async_await_helper = Function::ZoneHandle(
164 Z, async_lib.LookupFunctionAllowPrivate(Symbols::AsyncAwaitHelper())); 170 Z, async_lib.LookupFunctionAllowPrivate(Symbols::AsyncAwaitHelper()));
165 ASSERT(!async_await_helper.IsNull()); 171 ASSERT(!async_await_helper.IsNull());
166 ArgumentListNode* async_await_helper_args = 172 ArgumentListNode* async_await_helper_args =
167 new (Z) ArgumentListNode(token_pos); 173 new (Z) ArgumentListNode(token_pos);
168 async_await_helper_args->Add(new (Z) LoadLocalNode(token_pos, await_temp)); 174 async_await_helper_args->Add(new (Z) LoadLocalNode(token_pos, await_temp));
169 async_await_helper_args->Add( 175 async_await_helper_args->Add(
170 new (Z) LoadLocalNode(token_pos, async_then_callback)); 176 new (Z) LoadLocalNode(token_pos, async_then_callback));
171 async_await_helper_args->Add( 177 async_await_helper_args->Add(
172 new (Z) LoadLocalNode(token_pos, async_catch_error_callback)); 178 new (Z) LoadLocalNode(token_pos, async_catch_error_callback));
179 async_await_helper_args->Add(new (Z) LoadLocalNode(token_pos, async_op));
173 StaticCallNode* await_helper_call = new (Z) StaticCallNode( 180 StaticCallNode* await_helper_call = new (Z) StaticCallNode(
174 node->token_pos(), async_await_helper, async_await_helper_args); 181 node->token_pos(), async_await_helper, async_await_helper_args);
175 182
176 preamble_->Add( 183 preamble_->Add(
177 new (Z) StoreLocalNode(token_pos, result_param, await_helper_call)); 184 new (Z) StoreLocalNode(token_pos, result_param, await_helper_call));
178 185
179 ReturnNode* continuation_return = new (Z) ReturnNode(token_pos); 186 ReturnNode* continuation_return = new (Z) ReturnNode(token_pos);
180 continuation_return->set_return_type(ReturnNode::kContinuationTarget); 187 continuation_return->set_return_type(ReturnNode::kContinuationTarget);
181 preamble_->Add(continuation_return); 188 preamble_->Add(continuation_return);
182 189
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 } 514 }
508 515
509 516
510 void AwaitTransformer::VisitThrowNode(ThrowNode* node) { 517 void AwaitTransformer::VisitThrowNode(ThrowNode* node) {
511 AstNode* new_exception = Transform(node->exception()); 518 AstNode* new_exception = Transform(node->exception());
512 result_ = MakeName( 519 result_ = MakeName(
513 new (Z) ThrowNode(node->token_pos(), new_exception, node->stacktrace())); 520 new (Z) ThrowNode(node->token_pos(), new_exception, node->stacktrace()));
514 } 521 }
515 522
516 } // namespace dart 523 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/observatory/tests/observatory_ui/mocks/repositories/target.dart ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698