Index: runtime/vm/debugger.cc |
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc |
index d5d82c729f445a695b2614ff4e91e58244f31bb7..939dafdd8fdfab7866e6af741d3633fe4051c6e6 100644 |
--- a/runtime/vm/debugger.cc |
+++ b/runtime/vm/debugger.cc |
@@ -235,7 +235,32 @@ ActivationFrame::ActivationFrame( |
bool Debugger::HasEventHandler() { |
- return (event_handler_ != NULL) || Service::NeedsEvents(); |
+ return ((event_handler_ != NULL) || |
+ Service::NeedsIsolateEvents() || |
+ Service::NeedsDebugEvents()); |
+} |
+ |
+ |
+static bool ServiceNeedsDebuggerEvent(DebuggerEvent::EventType type) { |
+ switch (type) { |
+ case DebuggerEvent::kBreakpointResolved: |
+ // kBreakpointResolved events are handled differently in the vm |
+ // service, so suppress them here. |
+ return false; |
+ |
+ case DebuggerEvent::kBreakpointReached: |
+ case DebuggerEvent::kExceptionThrown: |
+ case DebuggerEvent::kIsolateInterrupted: |
+ return Service::NeedsDebugEvents(); |
+ |
+ case DebuggerEvent::kIsolateCreated: |
+ case DebuggerEvent::kIsolateShutdown: |
+ return Service::NeedsIsolateEvents(); |
+ |
+ default: |
+ UNREACHABLE(); |
+ return false; |
+ } |
} |
@@ -247,8 +272,7 @@ void Debugger::InvokeEventHandler(DebuggerEvent* event) { |
// |
// kBreakpointResolved events are handled differently in the vm |
// service, so suppress them here. |
- if (Service::NeedsEvents() && |
- (event->type() != DebuggerEvent::kBreakpointResolved)) { |
+ if (ServiceNeedsDebuggerEvent(event->type())) { |
ServiceEvent service_event(event); |
Service::HandleEvent(&service_event); |
} |
@@ -260,7 +284,7 @@ void Debugger::InvokeEventHandler(DebuggerEvent* event) { |
(*event_handler_)(event); |
} |
- if (Service::NeedsEvents() && event->IsPauseEvent()) { |
+ if (ServiceNeedsDebuggerEvent(event->type()) && event->IsPauseEvent()) { |
// If we were paused, notify the service that we have resumed. |
ServiceEvent service_event(event->isolate(), ServiceEvent::kResume); |
service_event.set_top_frame(event->top_frame()); |
@@ -303,7 +327,7 @@ void Debugger::SignalIsolateInterrupted() { |
// than the regular debugger breakpoint notifications. |
static void SendServiceBreakpointEvent(ServiceEvent::EventType type, |
Breakpoint* bpt) { |
- if (Service::NeedsEvents()) { |
+ if (Service::NeedsDebugEvents()) { |
ServiceEvent service_event(Isolate::Current(), type); |
service_event.set_breakpoint(bpt); |
Service::HandleEvent(&service_event); |