Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1211)

Side by Side Diff: runtime/vm/service.cc

Issue 182703003: Cleanup native, collected, and stub code handling in profiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/stack_frame.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/stack_frame.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698