Index: src/d8.cc |
diff --git a/src/d8.cc b/src/d8.cc |
index 09cd9631b03b1feb16804001aeac04040ebecc90..1f35210f8a22ec45090de562e486b9a8a208db20 100644 |
--- a/src/d8.cc |
+++ b/src/d8.cc |
@@ -30,7 +30,7 @@ |
#include "src/base/platform/time.h" |
#include "src/base/sys-info.h" |
#include "src/basic-block-profiler.h" |
-#include "src/debug/debug-coverage.h" |
+#include "src/debug/debug-interface.h" |
#include "src/interpreter/interpreter.h" |
#include "src/list-inl.h" |
#include "src/msan.h" |
@@ -1658,38 +1658,38 @@ void Shell::WriteIgnitionDispatchCountersFile(v8::Isolate* isolate) { |
namespace { |
void ReadRange(std::ofstream* s, std::vector<uint32_t>* lines, |
- i::Handle<i::Script> script, const i::Coverage::Range* range) { |
- // Compute line and column numbers from source position. |
- i::Script::PositionInfo start; |
- i::Script::PositionInfo end; |
- i::Script::GetPositionInfo(script, range->start, &start, |
- i::Script::NO_OFFSET); |
- i::Script::GetPositionInfo(script, range->end, &end, i::Script::NO_OFFSET); |
+ 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(start.line) = std::max(lines->at(start.line), range->count); |
- lines->at(end.line) = std::max(lines->at(end.line), range->count); |
+ 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. |
- for (int i = start.line + 1; i < end.line; i++) lines->at(i) = range->count; |
+ 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. |
- if (!range->name.empty()) { |
- // Truncate UC16 characters down to Latin1. |
- std::unique_ptr<char[]> name(new char[range->name.size() + 1]); |
- for (size_t i = 0; i < range->name.size(); i++) { |
- name[i] = static_cast<char>(range->name.data()[i]); |
- } |
- name[range->name.size()] = 0; |
- *s << "FN:" << (start.line + 1) << "," << name.get() << std::endl; |
- *s << "FNDA:" << range->count << "," << name.get() << std::endl; |
+ // 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 { |
- // Anonymous function. Use line and column as name. |
- *s << "FN:" << (start.line + 1) << ","; |
- *s << "<" << (start.line + 1) << "-" << start.column << ">" << std::endl; |
- *s << "FNDA:" << range->count << ","; |
- *s << "<" << (start.line + 1) << "-" << start.column << ">" << std::endl; |
+ name_stream << "<" << line_plus_one << "-"; |
+ name_stream << range.Start().GetColumnNumber() << ">"; |
} |
- // Recurse over inner ranges. |
- for (const auto& inner : range->inner) ReadRange(s, lines, script, &inner); |
+ *s << "FN:" << line_plus_one << "," << name_stream.str() << std::endl; |
+ *s << "FNDA:" << range.Count() << "," << name_stream.str() << std::endl; |
} |
} // anonymous namespace |
@@ -1697,22 +1697,20 @@ void ReadRange(std::ofstream* s, std::vector<uint32_t>* lines, |
void Shell::WriteLcovData(v8::Isolate* isolate, const char* file) { |
if (!file) return; |
HandleScope handle_scope(isolate); |
- std::vector<i::Coverage::ScriptData> data = |
- i::Coverage::Collect(reinterpret_cast<i::Isolate*>(isolate)); |
+ debug::Coverage coverage = debug::Coverage::Collect(isolate); |
std::ofstream sink(file, std::ofstream::app); |
- for (const auto& script_data : data) { |
- i::Handle<i::Script> script = script_data.script; |
+ for (size_t i = 0; i < coverage.ScriptCount(); i++) { |
+ Local<debug::Script> script = coverage.GetScript(i); |
// Skip unnamed scripts. |
- if (!script->name()->IsString()) continue; |
- std::string file_name = ToSTLString(v8::Utils::ToLocal( |
- i::Handle<i::String>(i::String::cast(script->name())))); |
+ Local<String> name; |
+ if (!script->Name().ToLocal(&name)) continue; |
+ std::string file_name = ToSTLString(name); |
// Skip scripts not backed by a file. |
if (!std::ifstream(file_name).good()) continue; |
sink << "SF:"; |
sink << NormalizePath(file_name, GetWorkingDirectory()) << std::endl; |
std::vector<uint32_t> lines; |
- lines.resize(i::FixedArray::cast(script->line_ends())->length(), 0); |
- ReadRange(&sink, &lines, script, &script_data.toplevel); |
+ ReadRange(&sink, &lines, coverage.GetRange(i)); |
// 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; |
@@ -2513,9 +2511,7 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) { |
options.isolate_sources[i].StartExecuteInThread(); |
} |
{ |
- if (options.lcov_file) { |
- i::Coverage::EnablePrecise(reinterpret_cast<i::Isolate*>(isolate)); |
- } |
+ if (options.lcov_file) debug::Coverage::TogglePrecise(isolate, true); |
HandleScope scope(isolate); |
Local<Context> context = CreateEvaluationContext(isolate); |
if (last_run && options.use_interactive_shell()) { |