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

Unified Diff: src/d8.cc

Issue 2700743002: [inspector] extend protocol for code coverage. (Closed)
Patch Set: fix 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/api.cc ('k') | src/debug/debug-coverage.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/d8.cc
diff --git a/src/d8.cc b/src/d8.cc
index a37eb9f9d1fbf6eddb4f9d85a7d82f379d3bacee..360330b4f19e790da64ee5a34ad85a196873bfc3 100644
--- a/src/d8.cc
+++ b/src/d8.cc
@@ -1657,51 +1657,15 @@ void Shell::WriteIgnitionDispatchCountersFile(v8::Isolate* isolate) {
JSON::Stringify(context, dispatch_counters).ToLocalChecked());
}
-namespace {
-void ReadRange(std::ofstream* s, std::vector<uint32_t>* lines,
- debug::Coverage::Range range) {
- // Ensure space in the array.
- lines->resize(std::max(static_cast<size_t>(range.End().GetLineNumber() + 1),
- lines->size()),
- 0);
- // Boundary lines could be shared between two functions with different
- // invocation counts. Take the maximum.
- lines->at(range.Start().GetLineNumber()) =
- std::max(lines->at(range.Start().GetLineNumber()), range.Count());
- lines->at(range.End().GetLineNumber()) =
- std::max(lines->at(range.End().GetLineNumber()), range.Count());
- // Invocation counts for non-boundary lines are overwritten.
- int line_plus_one = range.Start().GetLineNumber() + 1;
- for (int i = line_plus_one; i < range.End().GetLineNumber(); i++) {
- lines->at(i) = range.Count();
- }
- // Note that we use 0-based line numbers. But LCOV uses 1-based line numbers.
- // Recurse over inner ranges.
- for (size_t i = 0; i < range.NestedCount(); i++) {
- ReadRange(s, lines, range.GetNested(i));
- }
- // Write function stats.
- Local<String> name;
- std::stringstream name_stream;
- if (range.Name().ToLocal(&name)) {
- name_stream << ToSTLString(name);
- } else {
- name_stream << "<" << line_plus_one << "-";
- name_stream << range.Start().GetColumnNumber() << ">";
- }
- *s << "FN:" << line_plus_one << "," << name_stream.str() << std::endl;
- *s << "FNDA:" << range.Count() << "," << name_stream.str() << std::endl;
-}
-} // anonymous namespace
-
// Write coverage data in LCOV format. See man page for geninfo(1).
void Shell::WriteLcovData(v8::Isolate* isolate, const char* file) {
if (!file) return;
HandleScope handle_scope(isolate);
- debug::Coverage coverage = debug::Coverage::Collect(isolate);
+ debug::Coverage coverage = debug::Coverage::Collect(isolate, false);
std::ofstream sink(file, std::ofstream::app);
for (size_t i = 0; i < coverage.ScriptCount(); i++) {
- Local<debug::Script> script = coverage.GetScript(i);
+ debug::Coverage::ScriptData script_data = coverage.GetScriptData(i);
+ Local<debug::Script> script = script_data.GetScript();
// Skip unnamed scripts.
Local<String> name;
if (!script->Name().ToLocal(&name)) continue;
@@ -1711,7 +1675,33 @@ void Shell::WriteLcovData(v8::Isolate* isolate, const char* file) {
sink << "SF:";
sink << NormalizePath(file_name, GetWorkingDirectory()) << std::endl;
std::vector<uint32_t> lines;
- ReadRange(&sink, &lines, coverage.GetRange(i));
+ for (size_t j = 0; j < script_data.FunctionCount(); j++) {
+ debug::Coverage::FunctionData function_data =
+ script_data.GetFunctionData(j);
+ int start_line = function_data.Start().GetLineNumber();
+ int end_line = function_data.End().GetLineNumber();
+ uint32_t count = function_data.Count();
+ // Ensure space in the array.
+ lines.resize(std::max(static_cast<size_t>(end_line + 1), lines.size()),
+ 0);
+ // Boundary lines could be shared between two functions with different
+ // invocation counts. Take the maximum.
+ lines[start_line] = std::max(lines[start_line], count);
+ lines[end_line] = std::max(lines[end_line], count);
+ // Invocation counts for non-boundary lines are overwritten.
+ for (int k = start_line + 1; k < end_line; k++) lines[k] = count;
+ // Write function stats.
+ Local<String> name;
+ std::stringstream name_stream;
+ if (function_data.Name().ToLocal(&name)) {
+ name_stream << ToSTLString(name);
+ } else {
+ name_stream << "<" << start_line + 1 << "-";
+ name_stream << function_data.Start().GetColumnNumber() << ">";
+ }
+ sink << "FN:" << start_line + 1 << "," << name_stream.str() << std::endl;
+ sink << "FNDA:" << count << "," << name_stream.str() << std::endl;
+ }
// Write per-line coverage. LCOV uses 1-based line numbers.
for (size_t i = 0; i < lines.size(); i++) {
sink << "DA:" << (i + 1) << "," << lines[i] << std::endl;
« no previous file with comments | « src/api.cc ('k') | src/debug/debug-coverage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698