Chromium Code Reviews| Index: src/debug/debug-coverage.cc |
| diff --git a/src/debug/debug-coverage.cc b/src/debug/debug-coverage.cc |
| index 1489f4168b428f66986944634a08111b96f07a12..c60062ff3f2d8fec95485515f8d5b905b688a884 100644 |
| --- a/src/debug/debug-coverage.cc |
| +++ b/src/debug/debug-coverage.cc |
| @@ -119,7 +119,7 @@ Coverage* Coverage::Collect(Isolate* isolate, bool reset_count) { |
| // Create and add new script data. |
| Handle<Script> script_handle(script, isolate); |
| - result->emplace_back(isolate, script_handle); |
| + result->emplace_back(script_handle); |
| std::vector<CoverageFunction>* functions = &result->back().functions; |
| std::vector<SharedFunctionInfo*> sorted; |
| @@ -133,6 +133,9 @@ Coverage* Coverage::Collect(Isolate* isolate, bool reset_count) { |
| std::sort(sorted.begin(), sorted.end(), CompareSharedFunctionInfo); |
| } |
| + // Stack to track nested functions, referring function by index. |
| + std::vector<size_t> nesting; |
|
caseq
2017/03/23 00:09:56
nit: perhaps std::vector<const CoverageFunction*>
Yang
2017/03/23 07:43:16
I considered that. However, std::vector reallocate
|
| + |
| // Use sorted list to reconstruct function nesting. |
| for (SharedFunctionInfo* info : sorted) { |
| int start = StartPosition(info); |
| @@ -142,9 +145,22 @@ Coverage* Coverage::Collect(Isolate* isolate, bool reset_count) { |
| count = info->has_reported_binary_coverage() ? 0 : 1; |
| info->set_has_reported_binary_coverage(true); |
| } |
| - Handle<String> name(info->DebugName(), isolate); |
| - functions->emplace_back(start, end, count, name); |
| + // Find the correct outer function based on start position. |
| + while (!nesting.empty() && functions->at(nesting.back()).end <= start) { |
| + nesting.pop_back(); |
| + } |
| + if (count > 0 || |
| + (!nesting.empty() && functions->at(nesting.back()).count > 0)) { |
| + // Only include a function range if it has a non-0 count, or |
| + // if it is directly nested inside a function with non-0 count. |
| + Handle<String> name(info->DebugName(), isolate); |
| + nesting.push_back(functions->size()); |
| + functions->emplace_back(start, end, count, name); |
| + } |
| } |
| + |
| + // Remove entries for scripts that have no coverage. |
| + if (functions->empty()) result->pop_back(); |
| } |
| return result; |
| } |