Index: runtime/vm/debugger.cc |
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc |
index 7cce4af2d10ae90f839ab2cd35f4afc9d6d1e53f..bf3acd3ad5e839e6c4fea426cbeaf52b29994c3b 100644 |
--- a/runtime/vm/debugger.cc |
+++ b/runtime/vm/debugger.cc |
@@ -1590,6 +1590,41 @@ 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(zone.GetZone(), Library::AsyncLibrary()); |
+ // Grab the _AsyncStarStreamController class. |
+ const Class& controller_class = Class::Handle( |
+ zone.GetZone(), async_lib.LookupClassAllowPrivate( |
+ Symbols::_AsyncStarStreamController())); |
+ const Array& functions = |
+ Array::Handle(zone.GetZone(), controller_class.functions()); |
+ Function& function = Function::Handle(zone.GetZone()); |
+ // Mark all functions as not debuggable or inlinable. |
+ for (intptr_t i = 0; i < functions.Length(); i++) { |
+ function ^= functions.At(i); |
+ if (function.IsNull()) { |
+ break; |
+ } |
+ function.set_is_debuggable(false); |
+ function.set_is_inlinable(false); |
+ } |
+ } |
+ Thread::ExitIsolate(); |
+} |
+ |
+ |
static RawFunction* ResolveLibraryFunction(const Library& library, |
const String& fname) { |
ASSERT(!library.IsNull()); |
@@ -4102,6 +4137,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) { |