Index: runtime/vm/isolate.cc |
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc |
index 5b262075a150036f7d5fa015d820b21a9ff963ec..a4b987fc680af0ff7cfced5525b2f05a1ad0118b 100644 |
--- a/runtime/vm/isolate.cc |
+++ b/runtime/vm/isolate.cc |
@@ -27,6 +27,7 @@ |
#include "vm/profiler.h" |
#include "vm/reusable_handles.h" |
#include "vm/service.h" |
+#include "vm/service_event.h" |
#include "vm/service_isolate.h" |
#include "vm/simulator.h" |
#include "vm/stack_frame.h" |
@@ -114,6 +115,8 @@ class IsolateMessageHandler : public MessageHandler { |
const char* name() const; |
void MessageNotify(Message::Priority priority); |
bool HandleMessage(Message* message); |
+ void NotifyPauseOnStart(); |
+ void NotifyPauseOnExit(); |
#if defined(DEBUG) |
// Check that it is safe to access this handler. |
@@ -384,6 +387,24 @@ bool IsolateMessageHandler::HandleMessage(Message* message) { |
} |
+void IsolateMessageHandler::NotifyPauseOnStart() { |
+ StartIsolateScope start_isolate(isolate()); |
+ StackZone zone(I); |
+ HandleScope handle_scope(I); |
+ ServiceEvent pause_event(isolate(), ServiceEvent::kPauseStart); |
+ Service::HandleEvent(&pause_event); |
+} |
+ |
+ |
+void IsolateMessageHandler::NotifyPauseOnExit() { |
+ StartIsolateScope start_isolate(isolate()); |
+ StackZone zone(I); |
+ HandleScope handle_scope(I); |
+ ServiceEvent pause_event(isolate(), ServiceEvent::kPauseExit); |
+ Service::HandleEvent(&pause_event); |
+} |
+ |
+ |
#if defined(DEBUG) |
void IsolateMessageHandler::CheckAccess() { |
ASSERT(IsCurrentIsolate()); |
@@ -1318,32 +1339,29 @@ void Isolate::PrintJSON(JSONStream* stream, bool ref) { |
heap()->PrintToJSONObject(Heap::kOld, &jsheap); |
} |
- // TODO(turnidge): Don't compute a full stack trace every time we |
- // request an isolate's info. |
- DebuggerStackTrace* stack = debugger()->StackTrace(); |
- if (stack->Length() > 0) { |
- JSONObject jsframe(&jsobj, "topFrame"); |
- |
- ActivationFrame* frame = stack->FrameAt(0); |
- frame->PrintToJSONObject(&jsobj); |
- // TODO(turnidge): Implement depth differently -- differentiate |
- // inlined frames. |
- jsobj.AddProperty("depth", (intptr_t)0); |
- } |
jsobj.AddProperty("livePorts", message_handler()->live_ports()); |
jsobj.AddProperty("pauseOnExit", message_handler()->pause_on_exit()); |
- // TODO(turnidge): Make the debugger support paused_on_start/exit. |
if (message_handler()->paused_on_start()) { |
ASSERT(debugger()->PauseEvent() == NULL); |
- DebuggerEvent pauseEvent(this, DebuggerEvent::kIsolateCreated); |
- jsobj.AddProperty("pauseEvent", &pauseEvent); |
+ ServiceEvent pause_event(this, ServiceEvent::kPauseStart); |
+ jsobj.AddProperty("pauseEvent", &pause_event); |
} else if (message_handler()->paused_on_exit()) { |
ASSERT(debugger()->PauseEvent() == NULL); |
- DebuggerEvent pauseEvent(this, DebuggerEvent::kIsolateShutdown); |
- jsobj.AddProperty("pauseEvent", &pauseEvent); |
+ ServiceEvent pause_event(this, ServiceEvent::kPauseExit); |
+ jsobj.AddProperty("pauseEvent", &pause_event); |
} else if (debugger()->PauseEvent() != NULL) { |
- jsobj.AddProperty("pauseEvent", debugger()->PauseEvent()); |
+ ServiceEvent pause_event(debugger()->PauseEvent()); |
+ jsobj.AddProperty("pauseEvent", &pause_event); |
+ } else { |
+ ServiceEvent pause_event(this, ServiceEvent::kResume); |
+ |
+ // TODO(turnidge): Don't compute a full stack trace. |
+ DebuggerStackTrace* stack = debugger()->StackTrace(); |
+ if (stack->Length() > 0) { |
+ pause_event.set_top_frame(stack->FrameAt(0)); |
+ } |
+ jsobj.AddProperty("pauseEvent", &pause_event); |
} |
const Library& lib = |
@@ -1387,6 +1405,10 @@ void Isolate::PrintJSON(JSONStream* stream, bool ref) { |
} |
} |
{ |
+ JSONArray breakpoints(&jsobj, "breakpoints"); |
+ debugger()->PrintBreakpointsToJSONArray(&breakpoints); |
+ } |
+ { |
JSONArray features_array(&jsobj, "features"); |
if (is_io_enabled) { |
features_array.AddValue("io"); |