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

Unified Diff: src/runtime/runtime-debug.cc

Issue 2689493002: [debugger] implement per-function code coverage. (Closed)
Patch Set: address comments Created 3 years, 10 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 | « src/runtime/runtime.h ('k') | src/v8.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-debug.cc
diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc
index f409be18d6d84c1a83a550eb512ae06804fc0096..ab6fd30098ac2f58eadbe600b99629fe0a019efb 100644
--- a/src/runtime/runtime-debug.cc
+++ b/src/runtime/runtime-debug.cc
@@ -6,6 +6,7 @@
#include "src/arguments.h"
#include "src/compiler.h"
+#include "src/debug/debug-coverage.h"
#include "src/debug/debug-evaluate.h"
#include "src/debug/debug-frames.h"
#include "src/debug/debug-scopes.h"
@@ -1244,10 +1245,6 @@ RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) {
HandleScope scope(isolate);
DCHECK_EQ(0, args.length());
- // This runtime function is used by the debugger to determine whether the
- // debugger is active or not. Hence we fail gracefully here and don't crash.
- if (!isolate->debug()->is_active()) return isolate->ThrowIllegalOperation();
-
Handle<FixedArray> instances;
{
DebugScope debug_scope(isolate->debug());
@@ -1896,5 +1893,47 @@ RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) {
return NULL;
}
+RUNTIME_FUNCTION(Runtime_DebugCollectCoverage) {
+ HandleScope scope(isolate);
+ // Collect coverage data.
+ std::vector<Coverage::ScriptData> scripts = Coverage::Collect(isolate);
+ Factory* factory = isolate->factory();
+ // Turn the returned data structure into JavaScript.
+ // Create an array of scripts.
+ int num_scripts = static_cast<int>(scripts.size());
+ // Prepare property keys.
+ Handle<FixedArray> scripts_array = factory->NewFixedArray(num_scripts);
+ Handle<String> id_string = factory->NewStringFromStaticChars("script_id");
+ Handle<String> entries_string = factory->NewStringFromStaticChars("entries");
+ Handle<String> end_string = factory->NewStringFromStaticChars("end_position");
+ Handle<String> count_string = factory->NewStringFromStaticChars("count");
+ for (int i = 0; i < num_scripts; i++) {
+ // Create an object for each script, containing the script id and entries.
+ const auto& script = scripts[i];
+ HandleScope inner_scope(isolate);
+ int num_entries = static_cast<int>(script.entries.size());
+ Handle<FixedArray> entries_array = factory->NewFixedArray(num_entries);
+ for (int j = 0; j < num_entries; j++) {
+ // Create an object for each entry, containing the end position and count.
+ const auto& entry = script.entries[j];
+ Handle<JSObject> entry_obj = factory->NewJSObjectWithNullProto();
+ JSObject::AddProperty(entry_obj, end_string,
+ factory->NewNumberFromInt(entry.end_position),
+ NONE);
+ JSObject::AddProperty(entry_obj, count_string,
+ factory->NewNumberFromUint(entry.count), NONE);
+ entries_array->set(j, *entry_obj);
+ }
+ Handle<JSObject> script_obj = factory->NewJSObjectWithNullProto();
+ JSObject::AddProperty(script_obj, id_string,
+ factory->NewNumberFromInt(script.script_id), NONE);
+ JSObject::AddProperty(
+ script_obj, entries_string,
+ factory->NewJSArrayWithElements(entries_array, FAST_ELEMENTS), NONE);
+ scripts_array->set(i, *script_obj);
+ }
+ return *factory->NewJSArrayWithElements(scripts_array, FAST_ELEMENTS);
+}
+
} // namespace internal
} // namespace v8
« no previous file with comments | « src/runtime/runtime.h ('k') | src/v8.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698