| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/service_event.h" | 5 #include "vm/service_event.h" |
| 6 | 6 |
| 7 namespace dart { | 7 namespace dart { |
| 8 | 8 |
| 9 // Translate from the legacy DebugEvent to a ServiceEvent. | 9 // Translate from the legacy DebugEvent to a ServiceEvent. |
| 10 static ServiceEvent::EventType TranslateEventType( | 10 static ServiceEvent::EventKind TranslateEventKind( |
| 11 DebuggerEvent::EventType type) { | 11 DebuggerEvent::EventType kind) { |
| 12 switch (type) { | 12 switch (kind) { |
| 13 case DebuggerEvent::kIsolateCreated: | 13 case DebuggerEvent::kIsolateCreated: |
| 14 return ServiceEvent::kIsolateStart; | 14 return ServiceEvent::kIsolateStart; |
| 15 | 15 |
| 16 case DebuggerEvent::kIsolateShutdown: | 16 case DebuggerEvent::kIsolateShutdown: |
| 17 return ServiceEvent::kIsolateExit; | 17 return ServiceEvent::kIsolateExit; |
| 18 | 18 |
| 19 case DebuggerEvent::kBreakpointReached: | 19 case DebuggerEvent::kBreakpointReached: |
| 20 return ServiceEvent::kPauseBreakpoint; | 20 return ServiceEvent::kPauseBreakpoint; |
| 21 | 21 |
| 22 case DebuggerEvent::kIsolateInterrupted: | 22 case DebuggerEvent::kIsolateInterrupted: |
| 23 return ServiceEvent::kPauseInterrupted; | 23 return ServiceEvent::kPauseInterrupted; |
| 24 | 24 |
| 25 case DebuggerEvent::kExceptionThrown: | 25 case DebuggerEvent::kExceptionThrown: |
| 26 return ServiceEvent::kPauseException; | 26 return ServiceEvent::kPauseException; |
| 27 | |
| 28 default: | 27 default: |
| 29 UNREACHABLE(); | 28 UNREACHABLE(); |
| 30 return ServiceEvent::kIllegal; | 29 return ServiceEvent::kIllegal; |
| 31 } | 30 } |
| 32 } | 31 } |
| 33 | 32 |
| 34 ServiceEvent::ServiceEvent(const DebuggerEvent* debugger_event) | 33 ServiceEvent::ServiceEvent(const DebuggerEvent* debugger_event) |
| 35 : isolate_(debugger_event->isolate()), | 34 : isolate_(debugger_event->isolate()), |
| 36 type_(TranslateEventType(debugger_event->type())), | 35 kind_(TranslateEventKind(debugger_event->type())), |
| 37 breakpoint_(NULL), | 36 breakpoint_(NULL), |
| 38 top_frame_(NULL), | 37 top_frame_(NULL), |
| 39 exception_(NULL), | 38 exception_(NULL), |
| 40 inspectee_(NULL), | 39 inspectee_(NULL), |
| 41 gc_stats_(NULL) { | 40 gc_stats_(NULL), |
| 41 bytes_(NULL), |
| 42 bytes_length_(0) { |
| 42 DebuggerEvent::EventType type = debugger_event->type(); | 43 DebuggerEvent::EventType type = debugger_event->type(); |
| 43 if (type == DebuggerEvent::kBreakpointReached) { | 44 if (type == DebuggerEvent::kBreakpointReached) { |
| 44 set_breakpoint(debugger_event->breakpoint()); | 45 set_breakpoint(debugger_event->breakpoint()); |
| 45 } | 46 } |
| 46 if (type == DebuggerEvent::kExceptionThrown) { | 47 if (type == DebuggerEvent::kExceptionThrown) { |
| 47 set_exception(debugger_event->exception()); | 48 set_exception(debugger_event->exception()); |
| 48 } | 49 } |
| 49 if (type == DebuggerEvent::kBreakpointReached || | 50 if (type == DebuggerEvent::kBreakpointReached || |
| 50 type == DebuggerEvent::kIsolateInterrupted || | 51 type == DebuggerEvent::kIsolateInterrupted || |
| 51 type == DebuggerEvent::kExceptionThrown) { | 52 type == DebuggerEvent::kExceptionThrown) { |
| 52 set_top_frame(debugger_event->top_frame()); | 53 set_top_frame(debugger_event->top_frame()); |
| 53 } | 54 } |
| 54 } | 55 } |
| 55 | 56 |
| 56 | 57 |
| 57 const char* ServiceEvent::EventTypeToCString(EventType type) { | 58 const char* ServiceEvent::KindAsCString() const { |
| 58 switch (type) { | 59 switch (kind()) { |
| 59 case kIsolateStart: | 60 case kIsolateStart: |
| 60 return "IsolateStart"; | 61 return "IsolateStart"; |
| 61 case kIsolateExit: | 62 case kIsolateExit: |
| 62 return "IsolateExit"; | 63 return "IsolateExit"; |
| 63 case kIsolateUpdate: | 64 case kIsolateUpdate: |
| 64 return "IsolateUpdate"; | 65 return "IsolateUpdate"; |
| 65 case kPauseStart: | 66 case kPauseStart: |
| 66 return "PauseStart"; | 67 return "PauseStart"; |
| 67 case kPauseExit: | 68 case kPauseExit: |
| 68 return "PauseExit"; | 69 return "PauseExit"; |
| 69 case kPauseBreakpoint: | 70 case kPauseBreakpoint: |
| 70 return "PauseBreakpoint"; | 71 return "PauseBreakpoint"; |
| 71 case kPauseInterrupted: | 72 case kPauseInterrupted: |
| 72 return "PauseInterrupted"; | 73 return "PauseInterrupted"; |
| 73 case kPauseException: | 74 case kPauseException: |
| 74 return "PauseException"; | 75 return "PauseException"; |
| 75 case kResume: | 76 case kResume: |
| 76 return "Resume"; | 77 return "Resume"; |
| 77 case kBreakpointAdded: | 78 case kBreakpointAdded: |
| 78 return "BreakpointAdded"; | 79 return "BreakpointAdded"; |
| 79 case kBreakpointResolved: | 80 case kBreakpointResolved: |
| 80 return "BreakpointResolved"; | 81 return "BreakpointResolved"; |
| 81 case kBreakpointRemoved: | 82 case kBreakpointRemoved: |
| 82 return "BreakpointRemoved"; | 83 return "BreakpointRemoved"; |
| 83 case kGC: | 84 case kGC: |
| 84 return "GC"; // TODO(koda): Change to GarbageCollected. | 85 return "GC"; // TODO(koda): Change to GarbageCollected. |
| 85 case kInspect: | 86 case kInspect: |
| 86 return "Inspect"; | 87 return "Inspect"; |
| 88 case kEmbedder: |
| 89 return embedder_kind(); |
| 87 case kDebuggerSettingsUpdate: | 90 case kDebuggerSettingsUpdate: |
| 88 return "_DebuggerSettingsUpdate"; | 91 return "_DebuggerSettingsUpdate"; |
| 89 case kIllegal: | 92 case kIllegal: |
| 90 return "Illegal"; | 93 return "Illegal"; |
| 91 default: | 94 default: |
| 92 UNREACHABLE(); | 95 UNREACHABLE(); |
| 93 return "Unknown"; | 96 return "Unknown"; |
| 94 } | 97 } |
| 95 } | 98 } |
| 96 | 99 |
| 97 | 100 |
| 98 const char* ServiceEvent::stream_id() const { | 101 const char* ServiceEvent::stream_id() const { |
| 99 switch (type()) { | 102 switch (kind()) { |
| 100 case kIsolateStart: | 103 case kIsolateStart: |
| 101 case kIsolateExit: | 104 case kIsolateExit: |
| 102 case kIsolateUpdate: | 105 case kIsolateUpdate: |
| 103 return "Isolate"; | 106 return Service::isolate_stream.id(); |
| 104 | 107 |
| 105 case kPauseStart: | 108 case kPauseStart: |
| 106 case kPauseExit: | 109 case kPauseExit: |
| 107 case kPauseBreakpoint: | 110 case kPauseBreakpoint: |
| 108 case kPauseInterrupted: | 111 case kPauseInterrupted: |
| 109 case kPauseException: | 112 case kPauseException: |
| 110 case kResume: | 113 case kResume: |
| 111 case kBreakpointAdded: | 114 case kBreakpointAdded: |
| 112 case kBreakpointResolved: | 115 case kBreakpointResolved: |
| 113 case kBreakpointRemoved: | 116 case kBreakpointRemoved: |
| 114 case kInspect: | 117 case kInspect: |
| 115 case kDebuggerSettingsUpdate: | 118 case kDebuggerSettingsUpdate: |
| 116 return "Debug"; | 119 return Service::debug_stream.id(); |
| 117 | 120 |
| 118 case kGC: | 121 case kGC: |
| 119 return "GC"; | 122 return Service::gc_stream.id(); |
| 123 |
| 124 case kEmbedder: |
| 125 return embedder_stream_id_; |
| 120 | 126 |
| 121 default: | 127 default: |
| 122 UNREACHABLE(); | 128 UNREACHABLE(); |
| 123 return NULL; | 129 return NULL; |
| 124 } | 130 } |
| 125 } | 131 } |
| 126 | 132 |
| 127 | 133 |
| 128 void ServiceEvent::PrintJSON(JSONStream* js) const { | 134 void ServiceEvent::PrintJSON(JSONStream* js) const { |
| 129 JSONObject jsobj(js); | 135 JSONObject jsobj(js); |
| 130 jsobj.AddProperty("type", "Event"); | 136 jsobj.AddProperty("type", "Event"); |
| 131 jsobj.AddProperty("kind", EventTypeToCString(type())); | 137 jsobj.AddProperty("kind", KindAsCString()); |
| 132 jsobj.AddProperty("isolate", isolate()); | 138 jsobj.AddProperty("isolate", isolate()); |
| 133 if (type() == kPauseBreakpoint) { | 139 if (kind() == kPauseBreakpoint) { |
| 134 JSONArray jsarr(&jsobj, "pauseBreakpoints"); | 140 JSONArray jsarr(&jsobj, "pauseBreakpoints"); |
| 135 // TODO(rmacnak): If we are paused at more than one breakpoint, | 141 // TODO(rmacnak): If we are paused at more than one breakpoint, |
| 136 // provide it here. | 142 // provide it here. |
| 137 if (breakpoint() != NULL) { | 143 if (breakpoint() != NULL) { |
| 138 jsarr.AddValue(breakpoint()); | 144 jsarr.AddValue(breakpoint()); |
| 139 } | 145 } |
| 140 } else { | 146 } else { |
| 141 if (breakpoint() != NULL) { | 147 if (breakpoint() != NULL) { |
| 142 jsobj.AddProperty("breakpoint", breakpoint()); | 148 jsobj.AddProperty("breakpoint", breakpoint()); |
| 143 } | 149 } |
| 144 } | 150 } |
| 145 if (type() == kDebuggerSettingsUpdate) { | 151 if (kind() == kDebuggerSettingsUpdate) { |
| 146 JSONObject jssettings(&jsobj, "_debuggerSettings"); | 152 JSONObject jssettings(&jsobj, "_debuggerSettings"); |
| 147 isolate()->debugger()->PrintSettingsToJSONObject(&jssettings); | 153 isolate()->debugger()->PrintSettingsToJSONObject(&jssettings); |
| 148 } | 154 } |
| 149 if (top_frame() != NULL) { | 155 if (top_frame() != NULL) { |
| 150 JSONObject jsFrame(&jsobj, "topFrame"); | 156 JSONObject jsFrame(&jsobj, "topFrame"); |
| 151 top_frame()->PrintToJSONObject(&jsFrame); | 157 top_frame()->PrintToJSONObject(&jsFrame); |
| 152 intptr_t index = 0; // Avoid ambiguity in call to AddProperty. | 158 intptr_t index = 0; // Avoid ambiguity in call to AddProperty. |
| 153 jsFrame.AddProperty("index", index); | 159 jsFrame.AddProperty("index", index); |
| 154 } | 160 } |
| 155 if (exception() != NULL) { | 161 if (exception() != NULL) { |
| 156 jsobj.AddProperty("exception", *(exception())); | 162 jsobj.AddProperty("exception", *(exception())); |
| 157 } | 163 } |
| 158 if (inspectee() != NULL) { | 164 if (inspectee() != NULL) { |
| 159 jsobj.AddProperty("inspectee", *(inspectee())); | 165 jsobj.AddProperty("inspectee", *(inspectee())); |
| 160 } | 166 } |
| 161 if (gc_stats() != NULL) { | 167 if (gc_stats() != NULL) { |
| 162 jsobj.AddProperty("reason", Heap::GCReasonToString(gc_stats()->reason_)); | 168 jsobj.AddProperty("reason", Heap::GCReasonToString(gc_stats()->reason_)); |
| 163 isolate()->heap()->PrintToJSONObject(Heap::kNew, &jsobj); | 169 isolate()->heap()->PrintToJSONObject(Heap::kNew, &jsobj); |
| 164 isolate()->heap()->PrintToJSONObject(Heap::kOld, &jsobj); | 170 isolate()->heap()->PrintToJSONObject(Heap::kOld, &jsobj); |
| 165 } | 171 } |
| 172 if (bytes() != NULL) { |
| 173 jsobj.AddPropertyBase64("bytes", bytes(), bytes_length()); |
| 174 } |
| 166 } | 175 } |
| 167 | 176 |
| 168 } // namespace dart | 177 } // namespace dart |
| OLD | NEW |