OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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.h" | 5 #include "vm/service.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 | 8 |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/coverage.h" | 10 #include "vm/coverage.h" |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 return NULL; | 209 return NULL; |
210 } | 210 } |
211 const char* function_name = obj.ToCString(); | 211 const char* function_name = obj.ToCString(); |
212 ASSERT(function_name != NULL); | 212 ASSERT(function_name != NULL); |
213 ASSERT(auto_setup_scope != NULL); | 213 ASSERT(auto_setup_scope != NULL); |
214 *auto_setup_scope = true; | 214 *auto_setup_scope = true; |
215 intptr_t n = | 215 intptr_t n = |
216 sizeof(_VmServiceNativeEntries) / sizeof(_VmServiceNativeEntries[0]); | 216 sizeof(_VmServiceNativeEntries) / sizeof(_VmServiceNativeEntries[0]); |
217 for (intptr_t i = 0; i < n; i++) { | 217 for (intptr_t i = 0; i < n; i++) { |
218 VmServiceNativeEntry entry = _VmServiceNativeEntries[i]; | 218 VmServiceNativeEntry entry = _VmServiceNativeEntries[i]; |
219 if (!strcmp(function_name, entry.name) && | 219 if ((strcmp(function_name, entry.name) == 0) && |
220 (num_arguments == entry.num_arguments)) { | 220 (num_arguments == entry.num_arguments)) { |
221 return entry.function; | 221 return entry.function; |
222 } | 222 } |
223 } | 223 } |
224 return NULL; | 224 return NULL; |
225 } | 225 } |
226 | 226 |
227 | 227 |
228 EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL; | 228 EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL; |
229 EmbedderServiceHandler* Service::root_service_handler_head_ = NULL; | 229 EmbedderServiceHandler* Service::root_service_handler_head_ = NULL; |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 if (!table->IsValidIndex(id)) { | 827 if (!table->IsValidIndex(id)) { |
828 PrintError(js, "%" Pd " is not a valid class id.", id);; | 828 PrintError(js, "%" Pd " is not a valid class id.", id);; |
829 return true; | 829 return true; |
830 } | 830 } |
831 Class& cls = Class::Handle(table->At(id)); | 831 Class& cls = Class::Handle(table->At(id)); |
832 if (js->num_arguments() == 2) { | 832 if (js->num_arguments() == 2) { |
833 cls.PrintToJSONStream(js, false); | 833 cls.PrintToJSONStream(js, false); |
834 return true; | 834 return true; |
835 } else if (js->num_arguments() >= 3) { | 835 } else if (js->num_arguments() >= 3) { |
836 const char* second = js->GetArgument(2); | 836 const char* second = js->GetArgument(2); |
837 if (!strcmp(second, "closures")) { | 837 if (strcmp(second, "closures") == 0) { |
838 return HandleClassesClosures(isolate, cls, js); | 838 return HandleClassesClosures(isolate, cls, js); |
839 } else if (!strcmp(second, "fields")) { | 839 } else if (strcmp(second, "fields") == 0) { |
840 return HandleClassesFields(isolate, cls, js); | 840 return HandleClassesFields(isolate, cls, js); |
841 } else if (!strcmp(second, "functions")) { | 841 } else if (strcmp(second, "functions") == 0) { |
842 return HandleClassesFunctions(isolate, cls, js); | 842 return HandleClassesFunctions(isolate, cls, js); |
843 } else if (!strcmp(second, "implicit_closures")) { | 843 } else if (strcmp(second, "implicit_closures") == 0) { |
844 return HandleClassesImplicitClosures(isolate, cls, js); | 844 return HandleClassesImplicitClosures(isolate, cls, js); |
845 } else if (!strcmp(second, "dispatchers")) { | 845 } else if (strcmp(second, "dispatchers") == 0) { |
846 return HandleClassesDispatchers(isolate, cls, js); | 846 return HandleClassesDispatchers(isolate, cls, js); |
847 } else { | 847 } else { |
848 PrintError(js, "Invalid sub collection %s", second); | 848 PrintError(js, "Invalid sub collection %s", second); |
849 return true; | 849 return true; |
850 } | 850 } |
851 } | 851 } |
852 UNREACHABLE(); | 852 UNREACHABLE(); |
853 return true; | 853 return true; |
854 } | 854 } |
855 | 855 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1008 } | 1008 } |
1009 } | 1009 } |
1010 | 1010 |
1011 | 1011 |
1012 static bool HandleDebug(Isolate* isolate, JSONStream* js) { | 1012 static bool HandleDebug(Isolate* isolate, JSONStream* js) { |
1013 if (js->num_arguments() == 1) { | 1013 if (js->num_arguments() == 1) { |
1014 PrintError(js, "Must specify a subcommand"); | 1014 PrintError(js, "Must specify a subcommand"); |
1015 return true; | 1015 return true; |
1016 } | 1016 } |
1017 const char* command = js->GetArgument(1); | 1017 const char* command = js->GetArgument(1); |
1018 if (!strcmp(command, "breakpoints")) { | 1018 if (strcmp(command, "breakpoints") == 0) { |
1019 if (js->num_arguments() == 2) { | 1019 if (js->num_arguments() == 2) { |
1020 // Print breakpoint list. | 1020 // Print breakpoint list. |
1021 JSONObject jsobj(js); | 1021 JSONObject jsobj(js); |
1022 jsobj.AddProperty("type", "BreakpointList"); | 1022 jsobj.AddProperty("type", "BreakpointList"); |
1023 JSONArray jsarr(&jsobj, "breakpoints"); | 1023 JSONArray jsarr(&jsobj, "breakpoints"); |
1024 isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr); | 1024 isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr); |
1025 return true; | 1025 return true; |
1026 } else if (js->num_arguments() == 3) { | 1026 } else if (js->num_arguments() == 3) { |
1027 // Print individual breakpoint. | 1027 // Print individual breakpoint. |
1028 intptr_t id = 0; | 1028 intptr_t id = 0; |
(...skipping 21 matching lines...) Expand all Loading... |
1050 | 1050 |
1051 static bool HandleCpu(Isolate* isolate, JSONStream* js) { | 1051 static bool HandleCpu(Isolate* isolate, JSONStream* js) { |
1052 JSONObject jsobj(js); | 1052 JSONObject jsobj(js); |
1053 jsobj.AddProperty("type", "CPU"); | 1053 jsobj.AddProperty("type", "CPU"); |
1054 jsobj.AddProperty("targetCPU", CPU::Id()); | 1054 jsobj.AddProperty("targetCPU", CPU::Id()); |
1055 jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware()); | 1055 jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware()); |
1056 return true; | 1056 return true; |
1057 } | 1057 } |
1058 | 1058 |
1059 | 1059 |
| 1060 static bool HandleNullCode(uintptr_t pc, JSONStream* js) { |
| 1061 Object::null_object().PrintToJSONStream(js, false); |
| 1062 return true; |
| 1063 } |
| 1064 |
| 1065 |
1060 static bool HandleCode(Isolate* isolate, JSONStream* js) { | 1066 static bool HandleCode(Isolate* isolate, JSONStream* js) { |
1061 REQUIRE_COLLECTION_ID("code"); | 1067 REQUIRE_COLLECTION_ID("code"); |
1062 uintptr_t pc; | 1068 uintptr_t pc; |
| 1069 if (js->num_arguments() > 3) { |
| 1070 PrintError(js, "Command too long"); |
| 1071 return true; |
| 1072 } |
| 1073 if (js->num_arguments() == 3) { |
| 1074 const char* command = js->GetArgument(1); |
| 1075 if ((strcmp("collected", command) == 0) || |
| 1076 (strcmp("native", command) == 0)) { |
| 1077 if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) { |
| 1078 PrintError(js, "Must specify code address: code/%s/c0deadd0.", command); |
| 1079 return true; |
| 1080 } |
| 1081 return HandleNullCode(pc, js); |
| 1082 } else { |
| 1083 PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1)); |
| 1084 return true; |
| 1085 } |
| 1086 } |
| 1087 ASSERT(js->num_arguments() == 2); |
1063 if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) { | 1088 if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) { |
1064 PrintError(js, "Must specify code address: code/c0deadd0."); | 1089 PrintError(js, "Must specify code address: code/c0deadd0."); |
1065 return true; | 1090 return true; |
1066 } | 1091 } |
1067 Code& code = Code::Handle(Code::LookupCode(pc)); | 1092 Code& code = Code::Handle(); |
1068 if (code.IsNull()) { | 1093 code ^= Code::LookupCode(pc); |
1069 PrintError(js, "Could not find code at %" Px "", pc); | 1094 if (!code.IsNull()) { |
| 1095 code.PrintToJSONStream(js, false); |
1070 return true; | 1096 return true; |
1071 } | 1097 } |
1072 code.PrintToJSONStream(js, false); | 1098 code ^= Code::LookupCodeInVmIsolate(pc); |
| 1099 if (!code.IsNull()) { |
| 1100 code.PrintToJSONStream(js, false); |
| 1101 return true; |
| 1102 } |
| 1103 PrintError(js, "Could not find code at %" Px "", pc); |
1073 return true; | 1104 return true; |
1074 } | 1105 } |
1075 | 1106 |
1076 | 1107 |
1077 static bool HandleProfile(Isolate* isolate, JSONStream* js) { | 1108 static bool HandleProfile(Isolate* isolate, JSONStream* js) { |
1078 Profiler::PrintToJSONStream(isolate, js, true); | 1109 Profiler::PrintToJSONStream(isolate, js, true); |
1079 return true; | 1110 return true; |
1080 } | 1111 } |
1081 | 1112 |
1082 static bool HandleCoverage(Isolate* isolate, JSONStream* js) { | 1113 static bool HandleCoverage(Isolate* isolate, JSONStream* js) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 { "scripts", HandleScripts }, | 1146 { "scripts", HandleScripts }, |
1116 { "stacktrace", HandleStackTrace }, | 1147 { "stacktrace", HandleStackTrace }, |
1117 }; | 1148 }; |
1118 | 1149 |
1119 | 1150 |
1120 static IsolateMessageHandler FindIsolateMessageHandler(const char* command) { | 1151 static IsolateMessageHandler FindIsolateMessageHandler(const char* command) { |
1121 intptr_t num_message_handlers = sizeof(isolate_handlers) / | 1152 intptr_t num_message_handlers = sizeof(isolate_handlers) / |
1122 sizeof(isolate_handlers[0]); | 1153 sizeof(isolate_handlers[0]); |
1123 for (intptr_t i = 0; i < num_message_handlers; i++) { | 1154 for (intptr_t i = 0; i < num_message_handlers; i++) { |
1124 const IsolateMessageHandlerEntry& entry = isolate_handlers[i]; | 1155 const IsolateMessageHandlerEntry& entry = isolate_handlers[i]; |
1125 if (!strcmp(command, entry.command)) { | 1156 if (strcmp(command, entry.command) == 0) { |
1126 return entry.handler; | 1157 return entry.handler; |
1127 } | 1158 } |
1128 } | 1159 } |
1129 if (FLAG_trace_service) { | 1160 if (FLAG_trace_service) { |
1130 OS::Print("Service has no isolate message handler for <%s>\n", command); | 1161 OS::Print("Service has no isolate message handler for <%s>\n", command); |
1131 } | 1162 } |
1132 return NULL; | 1163 return NULL; |
1133 } | 1164 } |
1134 | 1165 |
1135 | 1166 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 { "_echo", HandleRootEcho }, | 1250 { "_echo", HandleRootEcho }, |
1220 { "cpu", HandleCpu }, | 1251 { "cpu", HandleCpu }, |
1221 }; | 1252 }; |
1222 | 1253 |
1223 | 1254 |
1224 static RootMessageHandler FindRootMessageHandler(const char* command) { | 1255 static RootMessageHandler FindRootMessageHandler(const char* command) { |
1225 intptr_t num_message_handlers = sizeof(root_handlers) / | 1256 intptr_t num_message_handlers = sizeof(root_handlers) / |
1226 sizeof(root_handlers[0]); | 1257 sizeof(root_handlers[0]); |
1227 for (intptr_t i = 0; i < num_message_handlers; i++) { | 1258 for (intptr_t i = 0; i < num_message_handlers; i++) { |
1228 const RootMessageHandlerEntry& entry = root_handlers[i]; | 1259 const RootMessageHandlerEntry& entry = root_handlers[i]; |
1229 if (!strcmp(command, entry.command)) { | 1260 if (strcmp(command, entry.command) == 0) { |
1230 return entry.handler; | 1261 return entry.handler; |
1231 } | 1262 } |
1232 } | 1263 } |
1233 if (FLAG_trace_service) { | 1264 if (FLAG_trace_service) { |
1234 OS::Print("Service has no root message handler for <%s>\n", command); | 1265 OS::Print("Service has no root message handler for <%s>\n", command); |
1235 } | 1266 } |
1236 return NULL; | 1267 return NULL; |
1237 } | 1268 } |
1238 | 1269 |
1239 | 1270 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1279 // Insert into isolate_service_handler_head_ list. | 1310 // Insert into isolate_service_handler_head_ list. |
1280 handler->set_next(isolate_service_handler_head_); | 1311 handler->set_next(isolate_service_handler_head_); |
1281 isolate_service_handler_head_ = handler; | 1312 isolate_service_handler_head_ = handler; |
1282 } | 1313 } |
1283 | 1314 |
1284 | 1315 |
1285 EmbedderServiceHandler* Service::FindIsolateEmbedderHandler( | 1316 EmbedderServiceHandler* Service::FindIsolateEmbedderHandler( |
1286 const char* name) { | 1317 const char* name) { |
1287 EmbedderServiceHandler* current = isolate_service_handler_head_; | 1318 EmbedderServiceHandler* current = isolate_service_handler_head_; |
1288 while (current != NULL) { | 1319 while (current != NULL) { |
1289 if (!strcmp(name, current->name())) { | 1320 if (strcmp(name, current->name()) == 0) { |
1290 return current; | 1321 return current; |
1291 } | 1322 } |
1292 current = current->next(); | 1323 current = current->next(); |
1293 } | 1324 } |
1294 return NULL; | 1325 return NULL; |
1295 } | 1326 } |
1296 | 1327 |
1297 | 1328 |
1298 void Service::RegisterRootEmbedderCallback( | 1329 void Service::RegisterRootEmbedderCallback( |
1299 const char* name, | 1330 const char* name, |
(...skipping 17 matching lines...) Expand all Loading... |
1317 // Insert into root_service_handler_head_ list. | 1348 // Insert into root_service_handler_head_ list. |
1318 handler->set_next(root_service_handler_head_); | 1349 handler->set_next(root_service_handler_head_); |
1319 root_service_handler_head_ = handler; | 1350 root_service_handler_head_ = handler; |
1320 } | 1351 } |
1321 | 1352 |
1322 | 1353 |
1323 EmbedderServiceHandler* Service::FindRootEmbedderHandler( | 1354 EmbedderServiceHandler* Service::FindRootEmbedderHandler( |
1324 const char* name) { | 1355 const char* name) { |
1325 EmbedderServiceHandler* current = root_service_handler_head_; | 1356 EmbedderServiceHandler* current = root_service_handler_head_; |
1326 while (current != NULL) { | 1357 while (current != NULL) { |
1327 if (!strcmp(name, current->name())) { | 1358 if (strcmp(name, current->name()) == 0) { |
1328 return current; | 1359 return current; |
1329 } | 1360 } |
1330 current = current->next(); | 1361 current = current->next(); |
1331 } | 1362 } |
1332 return NULL; | 1363 return NULL; |
1333 } | 1364 } |
1334 | 1365 |
1335 } // namespace dart | 1366 } // namespace dart |
OLD | NEW |