Index: runtime/vm/service.cc |
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
index 34df390697a6607b28a5d22d8e2f2153e43aae3c..9a26f0297d1b14eb2e122b0e79581960f7e6e6e0 100644 |
--- a/runtime/vm/service.cc |
+++ b/runtime/vm/service.cc |
@@ -1204,6 +1204,14 @@ static bool HandleClassesInstances(Isolate* isolate, const Class& cls, |
} |
+static bool HandleClassesCoverage(Isolate* isolate, |
+ const Class& cls, |
+ JSONStream* stream) { |
+ CodeCoverage::PrintJSONForClass(cls, stream); |
+ return true; |
+} |
+ |
+ |
static bool HandleClasses(Isolate* isolate, JSONStream* js) { |
if (js->num_arguments() == 1) { |
ClassTable* table = isolate->class_table(); |
@@ -1246,6 +1254,8 @@ static bool HandleClasses(Isolate* isolate, JSONStream* js) { |
return HandleClassesRetained(isolate, cls, js); |
} else if (strcmp(second, "instances") == 0) { |
return HandleClassesInstances(isolate, cls, js); |
+ } else if (strcmp(second, "coverage") == 0) { |
+ return HandleClassesCoverage(isolate, cls, js); |
} else { |
PrintError(js, "Invalid sub collection %s", second); |
return true; |
@@ -1277,6 +1287,14 @@ static bool HandleLibrariesEval(Isolate* isolate, const Library& lib, |
} |
+static bool HandleLibrariesCoverage(Isolate* isolate, |
+ const Library& lib, |
+ JSONStream* js) { |
+ CodeCoverage::PrintJSONForLibrary(lib, Script::Handle(), js); |
Ivan Posva
2014/06/26 10:14:33
I find this an awkward API. If you want to factor
|
+ return true; |
+} |
+ |
+ |
static bool HandleLibraries(Isolate* isolate, JSONStream* js) { |
// TODO(johnmccutchan): Support fields and functions on libraries. |
REQUIRE_COLLECTION_ID("libraries"); |
@@ -1296,6 +1314,8 @@ static bool HandleLibraries(Isolate* isolate, JSONStream* js) { |
const char* second = js->GetArgument(2); |
if (strcmp(second, "eval") == 0) { |
return HandleLibrariesEval(isolate, lib, js); |
+ } else if (strcmp(second, "coverage") == 0) { |
+ return HandleLibrariesCoverage(isolate, lib, js); |
} else { |
PrintError(js, "Invalid sub collection %s", second); |
return true; |
@@ -1467,36 +1487,16 @@ static bool HandleScriptsEnumerate(Isolate* isolate, JSONStream* js) { |
} |
-static bool HandleScriptsFetch(Isolate* isolate, JSONStream* js) { |
- const GrowableObjectArray& libs = |
- GrowableObjectArray::Handle(isolate->object_store()->libraries()); |
- int num_libs = libs.Length(); |
- Library &lib = Library::Handle(); |
- Script& script = Script::Handle(); |
- String& url = String::Handle(); |
- const String& id = String::Handle(String::New(js->GetArgument(1))); |
- ASSERT(!id.IsNull()); |
- // The id is the url of the script % encoded, decode it. |
- String& requested_url = String::Handle(String::DecodeURI(id)); |
- for (intptr_t i = 0; i < num_libs; i++) { |
- lib ^= libs.At(i); |
- ASSERT(!lib.IsNull()); |
- ASSERT(Smi::IsValid(lib.index())); |
- const Array& loaded_scripts = Array::Handle(lib.LoadedScripts()); |
- ASSERT(!loaded_scripts.IsNull()); |
- intptr_t num_scripts = loaded_scripts.Length(); |
- for (intptr_t i = 0; i < num_scripts; i++) { |
- script ^= loaded_scripts.At(i); |
- ASSERT(!script.IsNull()); |
- url ^= script.url(); |
- if (url.Equals(requested_url)) { |
- script.PrintJSON(js, false); |
- return true; |
- } |
- } |
- } |
- PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s", |
- requested_url.ToCString()); |
+static bool HandleScriptsFetch( |
+ Isolate* isolate, const Script& script, JSONStream* js) { |
+ script.PrintJSON(js, false); |
+ return true; |
+} |
+ |
+ |
+static bool HandleScriptsCoverage( |
+ Isolate* isolate, const Script& script, JSONStream* js) { |
+ CodeCoverage::PrintJSONForScript(script, js); |
return true; |
} |
@@ -1505,9 +1505,29 @@ static bool HandleScripts(Isolate* isolate, JSONStream* js) { |
if (js->num_arguments() == 1) { |
// Enumerate all scripts. |
return HandleScriptsEnumerate(isolate, js); |
- } else if (js->num_arguments() == 2) { |
- // Fetch specific script. |
- return HandleScriptsFetch(isolate, js); |
+ } |
+ // Subcommands of scripts require a valid script id. |
+ const String& id = String::Handle(String::New(js->GetArgument(1))); |
+ ASSERT(!id.IsNull()); |
+ // The id is the url of the script % encoded, decode it. |
+ String& requested_url = String::Handle(String::DecodeURI(id)); |
+ Script& script = Script::Handle(); |
+ script = Script::FindByUrl(requested_url); |
+ if (script.IsNull()) { |
+ PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s", |
+ requested_url.ToCString()); |
+ return true; |
+ } |
+ if (js->num_arguments() == 2) { |
+ // If no subcommand is given, just fetch the script. |
+ return HandleScriptsFetch(isolate, script, js); |
+ } else if (js->num_arguments() == 3) { |
+ const char* arg = js->GetArgument(2); |
+ if (strcmp(arg, "coverage") == 0) { |
+ return HandleScriptsCoverage(isolate, script, js); |
+ } |
+ PrintError(js, "Unrecognized subcommand '%s'", arg); |
+ return true; |
} else { |
PrintError(js, "Command too long"); |
return true; |