Index: runtime/vm/debugger.cc |
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc |
index 7cce4af2d10ae90f839ab2cd35f4afc9d6d1e53f..ae1ca3ed1fa16d4cd811f3dcbccb5fa60f9318d8 100644 |
--- a/runtime/vm/debugger.cc |
+++ b/runtime/vm/debugger.cc |
@@ -1590,6 +1590,39 @@ void Debugger::Shutdown() { |
} |
+void Debugger::OnIsolateRunnable() { |
+ if (!FLAG_async_debugger_stepping) { |
+ // We don't have async debugger stepping enabled. |
+ return; |
+ } |
+ Thread::EnterIsolate(isolate_); |
+ Thread* thread = Thread::Current(); |
+ ASSERT(thread != NULL); |
+ { |
+ StackZone zone(thread); |
+ HandleScope handle_scope(thread); |
+ |
+ const Library& async_lib = Library::Handle(Library::AsyncLibrary()); |
+ // Grab the _AsyncStarStreamController class. |
+ const Class& controller_class = |
+ Class::Handle(async_lib.LookupClassAllowPrivate( |
+ Symbols::_AsyncStarStreamController())); |
+ const Array& functions = Array::Handle(controller_class.functions()); |
+ Function& function = Function::Handle(); |
siva
2017/03/23 22:37:01
could use the 'zone' parameter for these handles.
Cutch
2017/03/24 14:55:39
Done.
|
+ // Mark all functions as not debuggable or inlinable. |
+ for (intptr_t i = 0; i < functions.Length(); i++) { |
+ if (functions.At(i) == Function::null()) { |
+ break; |
+ } |
+ function ^= functions.At(i); |
+ function.set_is_debuggable(false); |
+ function.set_is_inlinable(false); |
siva
2017/03/23 22:37:01
maybe
for () {
function ^= functions.At(i);
i
Cutch
2017/03/24 14:55:39
Done.
|
+ } |
+ } |
+ Thread::ExitIsolate(); |
+} |
+ |
+ |
static RawFunction* ResolveLibraryFunction(const Library& library, |
const String& fname) { |
ASSERT(!library.IsNull()); |
@@ -4102,6 +4135,23 @@ Breakpoint* Debugger::GetBreakpointById(intptr_t id) { |
} |
+void Debugger::MaybeAsyncStepInto(const Closure& async_op) { |
+ if (FLAG_async_debugger_stepping && IsSingleStepping()) { |
+ // We are single stepping, set a breakpoint on the closure activation |
+ // and resume execution so we can hit the breakpoint. |
+ SetBreakpointAtActivation(async_op, true); |
+ Continue(); |
+ } |
+} |
+ |
+ |
+void Debugger::Continue() { |
+ SetResumeAction(kContinue); |
+ stepping_fp_ = 0; |
+ isolate_->set_single_step(false); |
+} |
+ |
+ |
BreakpointLocation* Debugger::GetLatentBreakpoint(const String& url, |
intptr_t line, |
intptr_t column) { |