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

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

Issue 2696163002: [debugger] implement inspector-facing API for code coverage. (Closed)
Patch Set: one more shared export 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/debug/debug-coverage.h ('k') | src/debug/debug-interface.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/debug/debug-coverage.cc
diff --git a/src/debug/debug-coverage.cc b/src/debug/debug-coverage.cc
index 47f51661a137c103e451fc8b5aa4acc500dad1bb..76a88b095271869710c78341055f9520de283e0a 100644
--- a/src/debug/debug-coverage.cc
+++ b/src/debug/debug-coverage.cc
@@ -58,7 +58,12 @@ bool CompareSharedFunctionInfo(SharedFunctionInfo* a, SharedFunctionInfo* b) {
}
} // anonymous namespace
-std::vector<Coverage::ScriptData> Coverage::Collect(Isolate* isolate) {
+CoverageScript::CoverageScript(Isolate* isolate, Handle<Script> s,
+ int source_length)
+ : script(s),
+ toplevel(0, source_length, 1, isolate->factory()->empty_string()) {}
+
+Coverage* Coverage::Collect(Isolate* isolate) {
SharedToCounterMap counter_map;
// Feed invocation count into the counter map.
@@ -89,15 +94,16 @@ std::vector<Coverage::ScriptData> Coverage::Collect(Isolate* isolate) {
// Iterate shared function infos of every script and build a mapping
// between source ranges and invocation counts.
- std::vector<Coverage::ScriptData> result;
+ Coverage* result = new Coverage();
Script::Iterator scripts(isolate);
while (Script* script = scripts.Next()) {
// Dismiss non-user scripts.
if (script->type() != Script::TYPE_NORMAL) continue;
// Create and add new script data.
- int source_length = String::cast(script->source())->length();
- result.emplace_back(Handle<Script>(script, isolate), source_length);
+ int source_end = String::cast(script->source())->length();
+ Handle<Script> script_handle(script, isolate);
+ result->emplace_back(isolate, script_handle, source_end);
std::vector<SharedFunctionInfo*> sorted;
@@ -105,14 +111,13 @@ std::vector<Coverage::ScriptData> Coverage::Collect(Isolate* isolate) {
// Collect a list of shared function infos sorted by start position.
// Shared function infos are usually already sorted. Except for classes.
// If the start position is the same, sort from outer to inner function.
- HandleScope scope(isolate);
- SharedFunctionInfo::ScriptIterator infos(Handle<Script>(script, isolate));
+ SharedFunctionInfo::ScriptIterator infos(script_handle);
while (SharedFunctionInfo* info = infos.Next()) sorted.push_back(info);
std::sort(sorted.begin(), sorted.end(), CompareSharedFunctionInfo);
}
- std::vector<Range*> stack;
- stack.push_back(&result.back().toplevel);
+ std::vector<CoverageRange*> stack;
+ stack.push_back(&result->back().toplevel);
// Use sorted list to reconstruct function nesting.
for (SharedFunctionInfo* info : sorted) {
@@ -122,56 +127,53 @@ std::vector<Coverage::ScriptData> Coverage::Collect(Isolate* isolate) {
if (info->is_toplevel()) {
// Top-level function is available.
DCHECK_EQ(1, stack.size());
- result.back().toplevel.start = start;
- result.back().toplevel.end = end;
- result.back().toplevel.count = count;
+ result->back().toplevel.start = start;
+ result->back().toplevel.end = end;
+ result->back().toplevel.count = count;
} else {
// The shared function infos are sorted by start.
DCHECK_LE(stack.back()->start, start);
// Drop the stack to the outer function.
while (start >= stack.back()->end) stack.pop_back();
- Range* outer = stack.back();
+ CoverageRange* outer = stack.back();
// New nested function.
DCHECK_LE(end, outer->end);
- outer->inner.emplace_back(start, end, count);
- Range& nested = outer->inner.back();
- String* name = info->DebugName();
- nested.name.resize(name->length());
- String::WriteToFlat(name, nested.name.data(), 0, name->length());
- stack.push_back(&nested);
+ Handle<String> name(info->DebugName(), isolate);
+ outer->inner.emplace_back(start, end, count, name);
+ stack.push_back(&outer->inner.back());
}
}
}
return result;
}
-void Coverage::EnablePrecise(Isolate* isolate) {
- HandleScope scope(isolate);
- // Remove all optimized function. Optimized and inlined functions do not
- // increment invocation count.
- Deoptimizer::DeoptimizeAll(isolate);
- // Collect existing feedback vectors.
- std::vector<Handle<FeedbackVector>> vectors;
- {
- HeapIterator heap_iterator(isolate->heap());
- while (HeapObject* current_obj = heap_iterator.next()) {
- if (!current_obj->IsFeedbackVector()) continue;
- FeedbackVector* vector = FeedbackVector::cast(current_obj);
- SharedFunctionInfo* shared = vector->shared_function_info();
- if (!shared->IsSubjectToDebugging()) continue;
- vector->clear_invocation_count();
- vectors.emplace_back(vector, isolate);
+void Coverage::TogglePrecise(Isolate* isolate, bool enable) {
+ if (enable) {
+ HandleScope scope(isolate);
+ // Remove all optimized function. Optimized and inlined functions do not
+ // increment invocation count.
+ Deoptimizer::DeoptimizeAll(isolate);
+ // Collect existing feedback vectors.
+ std::vector<Handle<FeedbackVector>> vectors;
+ {
+ HeapIterator heap_iterator(isolate->heap());
+ while (HeapObject* current_obj = heap_iterator.next()) {
+ if (!current_obj->IsFeedbackVector()) continue;
+ FeedbackVector* vector = FeedbackVector::cast(current_obj);
+ SharedFunctionInfo* shared = vector->shared_function_info();
+ if (!shared->IsSubjectToDebugging()) continue;
+ vector->clear_invocation_count();
+ vectors.emplace_back(vector, isolate);
+ }
}
+ // Add collected feedback vectors to the root list lest we lose them to GC.
+ Handle<ArrayList> list =
+ ArrayList::New(isolate, static_cast<int>(vectors.size()));
+ for (const auto& vector : vectors) list = ArrayList::Add(list, vector);
+ isolate->SetCodeCoverageList(*list);
+ } else {
+ isolate->SetCodeCoverageList(isolate->heap()->undefined_value());
}
- // Add collected feedback vectors to the root list lest we lose them to GC.
- Handle<ArrayList> list =
- ArrayList::New(isolate, static_cast<int>(vectors.size()));
- for (const auto& vector : vectors) list = ArrayList::Add(list, vector);
- isolate->SetCodeCoverageList(*list);
-}
-
-void Coverage::DisablePrecise(Isolate* isolate) {
- isolate->SetCodeCoverageList(isolate->heap()->undefined_value());
}
} // namespace internal
« no previous file with comments | « src/debug/debug-coverage.h ('k') | src/debug/debug-interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698