Index: runtime/vm/service.cc |
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
index afc31be2c2550e26e05d32107b94cd64f826fb00..caed2335010161dbeb336303e65251e980cb3019 100644 |
--- a/runtime/vm/service.cc |
+++ b/runtime/vm/service.cc |
@@ -216,7 +216,7 @@ static Dart_NativeFunction VmServiceNativeResolver(Dart_Handle name, |
sizeof(_VmServiceNativeEntries) / sizeof(_VmServiceNativeEntries[0]); |
for (intptr_t i = 0; i < n; i++) { |
VmServiceNativeEntry entry = _VmServiceNativeEntries[i]; |
- if (!strcmp(function_name, entry.name) && |
+ if ((strcmp(function_name, entry.name) == 0) && |
(num_arguments == entry.num_arguments)) { |
return entry.function; |
} |
@@ -834,15 +834,15 @@ static bool HandleClasses(Isolate* isolate, JSONStream* js) { |
return true; |
} else if (js->num_arguments() >= 3) { |
const char* second = js->GetArgument(2); |
- if (!strcmp(second, "closures")) { |
+ if (strcmp(second, "closures") == 0) { |
return HandleClassesClosures(isolate, cls, js); |
- } else if (!strcmp(second, "fields")) { |
+ } else if (strcmp(second, "fields") == 0) { |
return HandleClassesFields(isolate, cls, js); |
- } else if (!strcmp(second, "functions")) { |
+ } else if (strcmp(second, "functions") == 0) { |
return HandleClassesFunctions(isolate, cls, js); |
- } else if (!strcmp(second, "implicit_closures")) { |
+ } else if (strcmp(second, "implicit_closures") == 0) { |
return HandleClassesImplicitClosures(isolate, cls, js); |
- } else if (!strcmp(second, "dispatchers")) { |
+ } else if (strcmp(second, "dispatchers") == 0) { |
return HandleClassesDispatchers(isolate, cls, js); |
} else { |
PrintError(js, "Invalid sub collection %s", second); |
@@ -1015,7 +1015,7 @@ static bool HandleDebug(Isolate* isolate, JSONStream* js) { |
return true; |
} |
const char* command = js->GetArgument(1); |
- if (!strcmp(command, "breakpoints")) { |
+ if (strcmp(command, "breakpoints") == 0) { |
if (js->num_arguments() == 2) { |
// Print breakpoint list. |
JSONObject jsobj(js); |
@@ -1057,19 +1057,50 @@ static bool HandleCpu(Isolate* isolate, JSONStream* js) { |
} |
+static bool HandleNullCode(uintptr_t pc, JSONStream* js) { |
+ Object::null_object().PrintToJSONStream(js, false); |
+ return true; |
+} |
+ |
+ |
static bool HandleCode(Isolate* isolate, JSONStream* js) { |
REQUIRE_COLLECTION_ID("code"); |
uintptr_t pc; |
+ if (js->num_arguments() > 3) { |
+ PrintError(js, "Command too long"); |
+ return true; |
+ } |
+ if (js->num_arguments() == 3) { |
+ const char* command = js->GetArgument(1); |
+ if ((strcmp("collected", command) == 0) || |
+ (strcmp("native", command) == 0)) { |
+ if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) { |
+ PrintError(js, "Must specify code address: code/%s/c0deadd0.", command); |
+ return true; |
+ } |
+ return HandleNullCode(pc, js); |
+ } else { |
+ PrintError(js, "Unrecognized subcommand '%s'", js->GetArgument(1)); |
+ return true; |
+ } |
+ } |
+ ASSERT(js->num_arguments() == 2); |
if (!GetUnsignedIntegerId(js->GetArgument(1), &pc, 16)) { |
PrintError(js, "Must specify code address: code/c0deadd0."); |
return true; |
} |
- Code& code = Code::Handle(Code::LookupCode(pc)); |
- if (code.IsNull()) { |
- PrintError(js, "Could not find code at %" Px "", pc); |
+ Code& code = Code::Handle(); |
+ code ^= Code::LookupCode(pc); |
+ if (!code.IsNull()) { |
+ code.PrintToJSONStream(js, false); |
+ return true; |
+ } |
+ code ^= Code::LookupCodeInVmIsolate(pc); |
+ if (!code.IsNull()) { |
+ code.PrintToJSONStream(js, false); |
return true; |
} |
- code.PrintToJSONStream(js, false); |
+ PrintError(js, "Could not find code at %" Px "", pc); |
return true; |
} |
@@ -1122,7 +1153,7 @@ static IsolateMessageHandler FindIsolateMessageHandler(const char* command) { |
sizeof(isolate_handlers[0]); |
for (intptr_t i = 0; i < num_message_handlers; i++) { |
const IsolateMessageHandlerEntry& entry = isolate_handlers[i]; |
- if (!strcmp(command, entry.command)) { |
+ if (strcmp(command, entry.command) == 0) { |
return entry.handler; |
} |
} |
@@ -1226,7 +1257,7 @@ static RootMessageHandler FindRootMessageHandler(const char* command) { |
sizeof(root_handlers[0]); |
for (intptr_t i = 0; i < num_message_handlers; i++) { |
const RootMessageHandlerEntry& entry = root_handlers[i]; |
- if (!strcmp(command, entry.command)) { |
+ if (strcmp(command, entry.command) == 0) { |
return entry.handler; |
} |
} |
@@ -1286,7 +1317,7 @@ EmbedderServiceHandler* Service::FindIsolateEmbedderHandler( |
const char* name) { |
EmbedderServiceHandler* current = isolate_service_handler_head_; |
while (current != NULL) { |
- if (!strcmp(name, current->name())) { |
+ if (strcmp(name, current->name()) == 0) { |
return current; |
} |
current = current->next(); |
@@ -1324,7 +1355,7 @@ EmbedderServiceHandler* Service::FindRootEmbedderHandler( |
const char* name) { |
EmbedderServiceHandler* current = root_service_handler_head_; |
while (current != NULL) { |
- if (!strcmp(name, current->name())) { |
+ if (strcmp(name, current->name()) == 0) { |
return current; |
} |
current = current->next(); |