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

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

Issue 2777093006: Implement debugger support for async step-out (Closed)
Patch Set: rmacnak review Created 3 years, 8 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
« no previous file with comments | « runtime/vm/debugger.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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/debugger.h" 5 #include "vm/debugger.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 8
9 #include "platform/address_sanitizer.h" 9 #include "platform/address_sanitizer.h"
10 10
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 ASSERT(!stream_cls.IsNull()); 779 ASSERT(!stream_cls.IsNull());
780 const Class& stream_impl_cls = Class::Handle(stream_cls.SuperClass()); 780 const Class& stream_impl_cls = Class::Handle(stream_cls.SuperClass());
781 const Field& awaiter_field = Field::Handle( 781 const Field& awaiter_field = Field::Handle(
782 stream_impl_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter())); 782 stream_impl_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter()));
783 ASSERT(!awaiter_field.IsNull()); 783 ASSERT(!awaiter_field.IsNull());
784 return Instance::Cast(stream).GetField(awaiter_field); 784 return Instance::Cast(stream).GetField(awaiter_field);
785 } 785 }
786 786
787 787
788 RawObject* ActivationFrame::GetAsyncAwaiter() { 788 RawObject* ActivationFrame::GetAsyncAwaiter() {
789 const Object& completer = Object::Handle(GetAsyncCompleter());
790 if (!completer.IsNull()) {
791 return GetAsyncCompleterAwaiter(completer);
792 }
793 const Object& async_stream_controller_stream = 789 const Object& async_stream_controller_stream =
794 Object::Handle(GetAsyncStreamControllerStream()); 790 Object::Handle(GetAsyncStreamControllerStream());
795 if (!async_stream_controller_stream.IsNull()) { 791 if (!async_stream_controller_stream.IsNull()) {
796 return GetAsyncStreamControllerStreamAwaiter( 792 return GetAsyncStreamControllerStreamAwaiter(
797 async_stream_controller_stream); 793 async_stream_controller_stream);
798 } 794 }
795 const Object& completer = Object::Handle(GetAsyncCompleter());
796 if (!completer.IsNull()) {
797 return GetAsyncCompleterAwaiter(completer);
798 }
799 return Object::null(); 799 return Object::null();
800 } 800 }
801 801
802 802
803 RawObject* ActivationFrame::GetCausalStack() { 803 RawObject* ActivationFrame::GetCausalStack() {
804 return GetAsyncContextVariable(Symbols::AsyncStackTraceVar()); 804 return GetAsyncContextVariable(Symbols::AsyncStackTraceVar());
805 } 805 }
806 806
807 807
808 bool ActivationFrame::HandlesException(const Instance& exc_obj) { 808 bool ActivationFrame::HandlesException(const Instance& exc_obj) {
(...skipping 2413 matching lines...) Expand 10 before | Expand all | Expand 10 after
3222 } else if (resume_action_ == kStepOver) { 3222 } else if (resume_action_ == kStepOver) {
3223 DeoptimizeWorld(); 3223 DeoptimizeWorld();
3224 isolate_->set_single_step(true); 3224 isolate_->set_single_step(true);
3225 skip_next_step_ = skip_next_step; 3225 skip_next_step_ = skip_next_step;
3226 ASSERT(stack_trace->Length() > 0); 3226 ASSERT(stack_trace->Length() > 0);
3227 stepping_fp_ = stack_trace->FrameAt(0)->fp(); 3227 stepping_fp_ = stack_trace->FrameAt(0)->fp();
3228 if (FLAG_verbose_debug) { 3228 if (FLAG_verbose_debug) {
3229 OS::Print("HandleSteppingRequest- kStepOver %" Px "\n", stepping_fp_); 3229 OS::Print("HandleSteppingRequest- kStepOver %" Px "\n", stepping_fp_);
3230 } 3230 }
3231 } else if (resume_action_ == kStepOut) { 3231 } else if (resume_action_ == kStepOut) {
3232 if (FLAG_async_debugger_stepping) {
3233 if (stack_trace->FrameAt(0)->function().IsAsyncClosure() ||
3234 stack_trace->FrameAt(0)->function().IsAsyncGenClosure()) {
3235 // Request to step out of an async/async* closure.
3236 const Object& async_op =
3237 Object::Handle(stack_trace->FrameAt(0)->GetAsyncAwaiter());
3238 if (!async_op.IsNull()) {
3239 // Step out to the awaiter.
3240 ASSERT(async_op.IsClosure());
3241 AsyncStepInto(Closure::Cast(async_op));
3242 return;
3243 }
3244 }
3245 }
3246 // Fall through to synchronous stepping.
3232 DeoptimizeWorld(); 3247 DeoptimizeWorld();
3233 isolate_->set_single_step(true); 3248 isolate_->set_single_step(true);
3234 // Find topmost caller that is debuggable. 3249 // Find topmost caller that is debuggable.
3235 for (intptr_t i = 1; i < stack_trace->Length(); i++) { 3250 for (intptr_t i = 1; i < stack_trace->Length(); i++) {
3236 ActivationFrame* frame = stack_trace->FrameAt(i); 3251 ActivationFrame* frame = stack_trace->FrameAt(i);
3237 if (frame->IsDebuggable()) { 3252 if (frame->IsDebuggable()) {
3238 stepping_fp_ = frame->fp(); 3253 stepping_fp_ = frame->fp();
3239 break; 3254 break;
3240 } 3255 }
3241 } 3256 }
(...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after
4199 loc = loc->next(); 4214 loc = loc->next();
4200 } 4215 }
4201 return NULL; 4216 return NULL;
4202 } 4217 }
4203 4218
4204 4219
4205 void Debugger::MaybeAsyncStepInto(const Closure& async_op) { 4220 void Debugger::MaybeAsyncStepInto(const Closure& async_op) {
4206 if (FLAG_async_debugger_stepping && IsSingleStepping()) { 4221 if (FLAG_async_debugger_stepping && IsSingleStepping()) {
4207 // We are single stepping, set a breakpoint on the closure activation 4222 // We are single stepping, set a breakpoint on the closure activation
4208 // and resume execution so we can hit the breakpoint. 4223 // and resume execution so we can hit the breakpoint.
4209 SetBreakpointAtActivation(async_op, true); 4224 AsyncStepInto(async_op);
4210 Continue();
4211 } 4225 }
4212 } 4226 }
4213 4227
4214 4228
4229 void Debugger::AsyncStepInto(const Closure& async_op) {
4230 SetBreakpointAtActivation(async_op, true);
4231 Continue();
4232 }
4233
4234
4215 void Debugger::Continue() { 4235 void Debugger::Continue() {
4216 SetResumeAction(kContinue); 4236 SetResumeAction(kContinue);
4217 stepping_fp_ = 0; 4237 stepping_fp_ = 0;
4218 isolate_->set_single_step(false); 4238 isolate_->set_single_step(false);
4219 } 4239 }
4220 4240
4221 4241
4222 BreakpointLocation* Debugger::GetLatentBreakpoint(const String& url, 4242 BreakpointLocation* Debugger::GetLatentBreakpoint(const String& url,
4223 intptr_t line, 4243 intptr_t line,
4224 intptr_t column) { 4244 intptr_t column) {
(...skipping 24 matching lines...) Expand all
4249 4269
4250 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { 4270 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) {
4251 ASSERT(bpt->next() == NULL); 4271 ASSERT(bpt->next() == NULL);
4252 bpt->set_next(code_breakpoints_); 4272 bpt->set_next(code_breakpoints_);
4253 code_breakpoints_ = bpt; 4273 code_breakpoints_ = bpt;
4254 } 4274 }
4255 4275
4256 #endif // !PRODUCT 4276 #endif // !PRODUCT
4257 4277
4258 } // namespace dart 4278 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/debugger.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698