Index: runtime/vm/debugger.cc |
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc |
index adfea7a9510354b807b127ba5b3c1898d36617d8..aea2178a72487f41226d818193b273a4f3170f4b 100644 |
--- a/runtime/vm/debugger.cc |
+++ b/runtime/vm/debugger.cc |
@@ -258,13 +258,19 @@ void DebuggerEvent::UpdateTimestamp() { |
} |
-bool Debugger::HasEventHandler() { |
+bool Debugger::HasAnyEventHandler() { |
return ((event_handler_ != NULL) || |
Service::isolate_stream.enabled() || |
Service::debug_stream.enabled()); |
} |
+bool Debugger::HasDebugEventHandler() { |
+ return ((event_handler_ != NULL) || |
+ Service::debug_stream.enabled()); |
+} |
+ |
+ |
static bool ServiceNeedsDebuggerEvent(DebuggerEvent::EventType type) { |
switch (type) { |
case DebuggerEvent::kBreakpointResolved: |
@@ -289,8 +295,6 @@ static bool ServiceNeedsDebuggerEvent(DebuggerEvent::EventType type) { |
void Debugger::InvokeEventHandler(DebuggerEvent* event) { |
- ASSERT(HasEventHandler()); |
- |
// Give the event to the Service first, as the debugger event handler |
// may go into a message loop and the Service will not. |
// |
@@ -301,7 +305,8 @@ void Debugger::InvokeEventHandler(DebuggerEvent* event) { |
Service::HandleEvent(&service_event); |
} |
- if (FLAG_steal_breakpoints && event->IsPauseEvent()) { |
+ if ((FLAG_steal_breakpoints || (event_handler_ == NULL)) && |
+ event->IsPauseEvent()) { |
// We allow the embedder's default breakpoint handler to be overridden. |
isolate_->PauseEventHandler(); |
} else if (event_handler_ != NULL) { |
@@ -325,7 +330,7 @@ void Debugger::InvokeEventHandler(DebuggerEvent* event) { |
void Debugger::SignalIsolateEvent(DebuggerEvent::EventType type) { |
- if (HasEventHandler()) { |
+ if (HasAnyEventHandler()) { |
DebuggerEvent event(isolate_, type); |
ASSERT(event.isolate_id() != ILLEGAL_ISOLATE_ID); |
if (type == DebuggerEvent::kIsolateInterrupted) { |
@@ -347,21 +352,9 @@ void Debugger::SignalIsolateEvent(DebuggerEvent::EventType type) { |
RawError* Debugger::SignalIsolateInterrupted() { |
- if (HasEventHandler()) { |
+ if (HasDebugEventHandler()) { |
SignalIsolateEvent(DebuggerEvent::kIsolateInterrupted); |
} |
- Dart_IsolateInterruptCallback callback = isolate_->InterruptCallback(); |
- if (callback != NULL) { |
- if (!(*callback)()) { |
- if (FLAG_trace_isolates) { |
- OS::Print("[!] Embedder api: terminating isolate:\n" |
- "\tisolate: %s\n", isolate_->name()); |
- } |
- const String& msg = |
- String::Handle(String::New("isolate terminated by embedder")); |
- return UnwindError::New(msg); |
- } |
- } |
// If any error occurred while in the debug message loop, return it here. |
const Error& error = |
@@ -1411,7 +1404,7 @@ void Debugger::DeoptimizeWorld() { |
void Debugger::SignalBpResolved(Breakpoint* bpt) { |
- if (HasEventHandler() && !bpt->IsSingleShot()) { |
+ if (HasDebugEventHandler() && !bpt->IsSingleShot()) { |
DebuggerEvent event(isolate_, DebuggerEvent::kBreakpointResolved); |
event.set_breakpoint(bpt); |
InvokeEventHandler(&event); |
@@ -1632,7 +1625,7 @@ void Debugger::SignalExceptionThrown(const Instance& exc) { |
// interested in exception events. |
if (ignore_breakpoints_ || |
IsPaused() || |
- (!HasEventHandler()) || |
+ (!HasDebugEventHandler()) || |
(exc_pause_info_ == kNoPauseOnExceptions)) { |
return; |
} |
@@ -2616,9 +2609,6 @@ void Debugger::SignalPausedEvent(ActivationFrame* top_frame, |
RawError* Debugger::DebuggerStepCallback() { |
ASSERT(isolate_->single_step()); |
- // We can't get here unless the debugger event handler enabled |
- // single stepping. |
- ASSERT(HasEventHandler()); |
// Don't pause recursively. |
if (IsPaused()) { |
return Error::null(); |
@@ -2686,7 +2676,7 @@ RawError* Debugger::SignalBpReached() { |
// We ignore this breakpoint when the VM is executing code invoked |
// by the debugger to evaluate variables values, or when we see a nested |
// breakpoint or exception event. |
- if (ignore_breakpoints_ || IsPaused() || !HasEventHandler()) { |
+ if (ignore_breakpoints_ || IsPaused()) { |
return Error::null(); |
} |
DebuggerStackTrace* stack_trace = CollectStackTrace(); |
@@ -2775,10 +2765,14 @@ void Debugger::BreakHere(const String& msg) { |
// We ignore this breakpoint when the VM is executing code invoked |
// by the debugger to evaluate variables values, or when we see a nested |
// breakpoint or exception event. |
- if (ignore_breakpoints_ || IsPaused() || !HasEventHandler()) { |
+ if (ignore_breakpoints_ || IsPaused()) { |
return; |
} |
+ if (!HasDebugEventHandler()) { |
+ OS::Print("Hit debugger!"); |
+ } |
+ |
DebuggerStackTrace* stack_trace = CollectStackTrace(); |
ASSERT(stack_trace->Length() > 0); |
ASSERT(stack_trace_ == NULL); |