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

Unified Diff: runtime/vm/service.cc

Issue 392933003: vm/observatory: Clean up script access (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/report_test.cc ('k') | runtime/vm/service_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/service.cc
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 4acc49b499f38407e169135d0499a8243e3b71f5..91b7c7f7796d2a60ecd143fd0865cc51ac7c0b5d 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -155,7 +155,7 @@ class LibraryCoverageFilter : public CoverageFilter {
public:
explicit LibraryCoverageFilter(const Library& lib) : lib_(lib) {}
bool ShouldOutputCoverageFor(const Library& lib,
- const String& script_url,
+ const Script& script,
const Class& cls,
const Function& func) const {
return lib.raw() == lib_.raw();
@@ -167,16 +167,16 @@ class LibraryCoverageFilter : public CoverageFilter {
class ScriptCoverageFilter : public CoverageFilter {
public:
- explicit ScriptCoverageFilter(const String& script_url)
- : script_url_(script_url) {}
+ explicit ScriptCoverageFilter(const Script& script)
+ : script_(script) {}
bool ShouldOutputCoverageFor(const Library& lib,
- const String& script_url,
+ const Script& script,
const Class& cls,
const Function& func) const {
- return script_url_.Equals(script_url);
+ return script.raw() == script_.raw();
}
private:
- const String& script_url_;
+ const Script& script_;
};
@@ -184,7 +184,7 @@ class ClassCoverageFilter : public CoverageFilter {
public:
explicit ClassCoverageFilter(const Class& cls) : cls_(cls) {}
bool ShouldOutputCoverageFor(const Library& lib,
- const String& script_url,
+ const Script& script,
const Class& cls,
const Function& func) const {
return cls.raw() == cls_.raw();
@@ -198,7 +198,7 @@ class FunctionCoverageFilter : public CoverageFilter {
public:
explicit FunctionCoverageFilter(const Function& func) : func_(func) {}
bool ShouldOutputCoverageFor(const Library& lib,
- const String& script_url,
+ const Script& script,
const Class& cls,
const Function& func) const {
return func.raw() == func_.raw();
@@ -1408,6 +1408,62 @@ static bool HandleLibrariesEval(Isolate* isolate, const Library& lib,
}
+static bool HandleLibrariesScriptsCoverage(
+ Isolate* isolate, const Script& script, JSONStream* js) {
+ ScriptCoverageFilter sf(script);
+ CodeCoverage::PrintJSON(isolate, js, &sf);
+ return true;
+}
+
+
+static bool HandleLibrariesScripts(Isolate* isolate,
+ const Library& lib,
+ JSONStream* js) {
+ if (js->num_arguments() > 5) {
+ PrintError(js, "Command too long");
+ return true;
+ } else if (js->num_arguments() < 4) {
+ PrintError(js, "Must specify collection object id: scripts/id");
+ return true;
+ }
+ const String& id = String::Handle(String::New(js->GetArgument(3)));
+ ASSERT(!id.IsNull());
+ // The id is the url of the script % encoded, decode it.
+ const String& requested_url = String::Handle(String::DecodeURI(id));
+ Script& script = Script::Handle();
+ String& script_url = String::Handle();
+ const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
+ ASSERT(!loaded_scripts.IsNull());
+ intptr_t i;
+ for (i = 0; i < loaded_scripts.Length(); i++) {
+ script ^= loaded_scripts.At(i);
+ ASSERT(!script.IsNull());
+ script_url ^= script.url();
+ if (script_url.Equals(requested_url)) {
+ break;
+ }
+ }
+ if (i == loaded_scripts.Length()) {
+ PrintError(js, "Script %s not found", requested_url.ToCString());
+ return true;
+ }
+ if (js->num_arguments() == 4) {
+ script.PrintJSON(js, false);
+ return true;
+ } else {
+ const char* subcollection = js->GetArgument(4);
+ if (strcmp(subcollection, "coverage") == 0) {
+ return HandleLibrariesScriptsCoverage(isolate, script, js);
+ } else {
+ PrintError(js, "Invalid sub collection %s", subcollection);
+ return true;
+ }
+ }
+ UNREACHABLE();
+ return true;
+}
+
+
static bool HandleLibrariesCoverage(Isolate* isolate,
const Library& lib,
JSONStream* js) {
@@ -1436,6 +1492,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, "scripts") == 0) {
+ return HandleLibrariesScripts(isolate, lib, js);
} else if (strcmp(second, "coverage") == 0) {
return HandleLibrariesCoverage(isolate, lib, js);
} else {
@@ -1609,72 +1667,13 @@ static bool HandleScriptsEnumerate(Isolate* isolate, JSONStream* js) {
}
-static bool HandleScriptsFetch(
- Isolate* isolate, const Script& script, JSONStream* js) {
- script.PrintJSON(js, false);
- return true;
-}
-
-
-static bool HandleScriptsCoverage(
- Isolate* isolate, const String& script_url, JSONStream* js) {
- ScriptCoverageFilter sf(script_url);
- CodeCoverage::PrintJSON(isolate, js, &sf);
- return true;
-}
-
-
static bool HandleScripts(Isolate* isolate, JSONStream* js) {
if (js->num_arguments() == 1) {
// Enumerate all scripts.
return HandleScriptsEnumerate(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();
- // There may exist more than one script object for a given url. Since they all
- // have the same properties (source, tokens) we don't care which one we get.
- const GrowableObjectArray& libs = GrowableObjectArray::Handle(
- isolate, isolate->object_store()->libraries());
- Library& lib = Library::Handle();
- String& script_url = String::Handle();
- bool found = false;
- for (intptr_t i = 0; !found && (i < libs.Length()); i++) {
- lib ^= libs.At(i);
- ASSERT(!lib.IsNull());
- const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
- ASSERT(!loaded_scripts.IsNull());
- for (intptr_t j = 0; !found && (j < loaded_scripts.Length()); j++) {
- script ^= loaded_scripts.At(j);
- ASSERT(!script.IsNull());
- script_url ^= script.url();
- if (script_url.Equals(requested_url)) {
- found = true;
- }
- }
- }
- if (!found) {
- 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, requested_url, js);
- }
- PrintError(js, "Unrecognized subcommand '%s'", arg);
- return true;
- } else {
- PrintError(js, "Command too long");
- return true;
- }
+ PrintError(js, "Command too long");
+ return true;
}
« no previous file with comments | « runtime/vm/report_test.cc ('k') | runtime/vm/service_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698