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

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

Issue 2777093006: Implement debugger support for async step-out (Closed)
Patch Set: 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
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 695 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 } 706 }
707 } 707 }
708 } 708 }
709 ASSERT(context_level_ >= 0); 709 ASSERT(context_level_ >= 0);
710 } 710 }
711 return context_level_; 711 return context_level_;
712 } 712 }
713 713
714 714
715 RawObject* ActivationFrame::GetAsyncContextVariable(const String& name) { 715 RawObject* ActivationFrame::GetAsyncContextVariable(const String& name) {
716 if (!function_.IsAsyncClosure()) { 716 if (!function_.IsAsyncClosure() && !function_.IsAsyncGenClosure()) {
717 return Object::null(); 717 return Object::null();
718 } 718 }
719 GetVarDescriptors(); 719 GetVarDescriptors();
720 intptr_t var_desc_len = var_descriptors_.Length(); 720 intptr_t var_desc_len = var_descriptors_.Length();
721 for (intptr_t i = 0; i < var_desc_len; i++) { 721 for (intptr_t i = 0; i < var_desc_len; i++) {
722 RawLocalVarDescriptors::VarInfo var_info; 722 RawLocalVarDescriptors::VarInfo var_info;
723 var_descriptors_.GetInfo(i, &var_info); 723 var_descriptors_.GetInfo(i, &var_info);
724 if (var_descriptors_.GetName(i) == name.raw()) { 724 if (var_descriptors_.GetName(i) == name.raw()) {
725 const int8_t kind = var_info.kind(); 725 const int8_t kind = var_info.kind();
726 if (!live_frame_) { 726 if (!live_frame_) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 ASSERT(!stream_cls.IsNull()); 778 ASSERT(!stream_cls.IsNull());
779 const Class& stream_impl_cls = Class::Handle(stream_cls.SuperClass()); 779 const Class& stream_impl_cls = Class::Handle(stream_cls.SuperClass());
780 const Field& awaiter_field = Field::Handle( 780 const Field& awaiter_field = Field::Handle(
781 stream_impl_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter())); 781 stream_impl_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter()));
782 ASSERT(!awaiter_field.IsNull()); 782 ASSERT(!awaiter_field.IsNull());
783 return Instance::Cast(stream).GetField(awaiter_field); 783 return Instance::Cast(stream).GetField(awaiter_field);
784 } 784 }
785 785
786 786
787 RawObject* ActivationFrame::GetAsyncAwaiter() { 787 RawObject* ActivationFrame::GetAsyncAwaiter() {
788 const Object& completer = Object::Handle(GetAsyncCompleter());
789 if (!completer.IsNull()) {
790 return GetAsyncCompleterAwaiter(completer);
791 }
792 const Object& async_stream_controller_stream = 788 const Object& async_stream_controller_stream =
793 Object::Handle(GetAsyncStreamControllerStream()); 789 Object::Handle(GetAsyncStreamControllerStream());
794 if (!async_stream_controller_stream.IsNull()) { 790 if (!async_stream_controller_stream.IsNull()) {
795 return GetAsyncStreamControllerStreamAwaiter( 791 return GetAsyncStreamControllerStreamAwaiter(
796 async_stream_controller_stream); 792 async_stream_controller_stream);
797 } 793 }
794 const Object& completer = Object::Handle(GetAsyncCompleter());
795 if (!completer.IsNull()) {
796 return GetAsyncCompleterAwaiter(completer);
797 }
798 return Object::null(); 798 return Object::null();
799 } 799 }
800 800
801 801
802 bool ActivationFrame::HandlesException(const Instance& exc_obj) { 802 bool ActivationFrame::HandlesException(const Instance& exc_obj) {
803 intptr_t try_index = TryIndex(); 803 intptr_t try_index = TryIndex();
804 if (try_index < 0) { 804 if (try_index < 0) {
805 return false; 805 return false;
806 } 806 }
807 ExceptionHandlers& handlers = ExceptionHandlers::Handle(); 807 ExceptionHandlers& handlers = ExceptionHandlers::Handle();
(...skipping 2326 matching lines...) Expand 10 before | Expand all | Expand 10 after
3134 } else if (resume_action_ == kStepOver) { 3134 } else if (resume_action_ == kStepOver) {
3135 DeoptimizeWorld(); 3135 DeoptimizeWorld();
3136 isolate_->set_single_step(true); 3136 isolate_->set_single_step(true);
3137 skip_next_step_ = skip_next_step; 3137 skip_next_step_ = skip_next_step;
3138 ASSERT(stack_trace->Length() > 0); 3138 ASSERT(stack_trace->Length() > 0);
3139 stepping_fp_ = stack_trace->FrameAt(0)->fp(); 3139 stepping_fp_ = stack_trace->FrameAt(0)->fp();
3140 if (FLAG_verbose_debug) { 3140 if (FLAG_verbose_debug) {
3141 OS::Print("HandleSteppingRequest- kStepOver %" Px "\n", stepping_fp_); 3141 OS::Print("HandleSteppingRequest- kStepOver %" Px "\n", stepping_fp_);
3142 } 3142 }
3143 } else if (resume_action_ == kStepOut) { 3143 } else if (resume_action_ == kStepOut) {
3144 if (FLAG_async_debugger_stepping) {
3145 if (stack_trace->FrameAt(0)->function().IsAsyncClosure() ||
3146 stack_trace->FrameAt(0)->function().IsAsyncGenClosure()) {
3147 // Request to step out of an async/async* closure.
3148 const Object& async_op =
3149 Object::Handle(stack_trace->FrameAt(0)->GetAsyncAwaiter());
3150 if (!async_op.IsNull()) {
3151 // Step out to the awaiter.
3152 ASSERT(async_op.IsClosure());
3153 AsyncStepInto(Closure::Cast(async_op));
3154 return;
3155 }
3156 }
3157 }
3158 // Fall through to synchronous stepping.
3144 DeoptimizeWorld(); 3159 DeoptimizeWorld();
3145 isolate_->set_single_step(true); 3160 isolate_->set_single_step(true);
3146 // Find topmost caller that is debuggable. 3161 // Find topmost caller that is debuggable.
3147 for (intptr_t i = 1; i < stack_trace->Length(); i++) { 3162 for (intptr_t i = 1; i < stack_trace->Length(); i++) {
3148 ActivationFrame* frame = stack_trace->FrameAt(i); 3163 ActivationFrame* frame = stack_trace->FrameAt(i);
3149 if (frame->IsDebuggable()) { 3164 if (frame->IsDebuggable()) {
3150 stepping_fp_ = frame->fp(); 3165 stepping_fp_ = frame->fp();
3151 break; 3166 break;
3152 } 3167 }
3153 } 3168 }
(...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after
4103 loc = loc->next(); 4118 loc = loc->next();
4104 } 4119 }
4105 return NULL; 4120 return NULL;
4106 } 4121 }
4107 4122
4108 4123
4109 void Debugger::MaybeAsyncStepInto(const Closure& async_op) { 4124 void Debugger::MaybeAsyncStepInto(const Closure& async_op) {
4110 if (FLAG_async_debugger_stepping && IsSingleStepping()) { 4125 if (FLAG_async_debugger_stepping && IsSingleStepping()) {
4111 // We are single stepping, set a breakpoint on the closure activation 4126 // We are single stepping, set a breakpoint on the closure activation
4112 // and resume execution so we can hit the breakpoint. 4127 // and resume execution so we can hit the breakpoint.
4113 SetBreakpointAtActivation(async_op, true); 4128 AsyncStepInto(async_op);
4114 Continue();
4115 } 4129 }
4116 } 4130 }
4117 4131
4118 4132
4133 void Debugger::AsyncStepInto(const Closure& async_op) {
4134 SetBreakpointAtActivation(async_op, true);
4135 Continue();
4136 }
4137
4138
4119 void Debugger::Continue() { 4139 void Debugger::Continue() {
4120 SetResumeAction(kContinue); 4140 SetResumeAction(kContinue);
4121 stepping_fp_ = 0; 4141 stepping_fp_ = 0;
4122 isolate_->set_single_step(false); 4142 isolate_->set_single_step(false);
4123 } 4143 }
4124 4144
4125 4145
4126 BreakpointLocation* Debugger::GetLatentBreakpoint(const String& url, 4146 BreakpointLocation* Debugger::GetLatentBreakpoint(const String& url,
4127 intptr_t line, 4147 intptr_t line,
4128 intptr_t column) { 4148 intptr_t column) {
(...skipping 24 matching lines...) Expand all
4153 4173
4154 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { 4174 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) {
4155 ASSERT(bpt->next() == NULL); 4175 ASSERT(bpt->next() == NULL);
4156 bpt->set_next(code_breakpoints_); 4176 bpt->set_next(code_breakpoints_);
4157 code_breakpoints_ = bpt; 4177 code_breakpoints_ = bpt;
4158 } 4178 }
4159 4179
4160 #endif // !PRODUCT 4180 #endif // !PRODUCT
4161 4181
4162 } // namespace dart 4182 } // namespace dart
OLDNEW
« runtime/observatory/tests/service/async_star_step_out_test.dart ('K') | « runtime/vm/debugger.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698