Commit 64754cf2 authored by Yang Guo's avatar Yang Guo Committed by Commit Bot

[debug] collect coverage for functions on the stack when enabling.

BUG=v8:5808

Change-Id: I7bb3c3655e17271b44de881416e150ef51811154
Reviewed-on: https://chromium-review.googlesource.com/457336
Commit-Queue: Yang Guo <yangguo@chromium.org>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#43939}
parent 721e226b
......@@ -6,6 +6,7 @@
#include "src/base/hashmap.h"
#include "src/deoptimizer.h"
#include "src/frames-inl.h"
#include "src/isolate.h"
#include "src/objects-inl.h"
#include "src/objects.h"
......@@ -148,6 +149,13 @@ void Coverage::TogglePrecise(Isolate* isolate, bool enable) {
ArrayList::New(isolate, static_cast<int>(vectors.size()));
for (const auto& vector : vectors) list = ArrayList::Add(list, vector);
isolate->SetCodeCoverageList(*list);
// Increment count for functions currently on the stack. We won't observe
// entry of these functions, but we know they have coverage.
for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) {
JSFunction* function = it.frame()->function();
if (!function->shared()->IsSubjectToDebugging()) continue;
function->feedback_vector()->increment_invocation_count();
}
} else {
isolate->SetCodeCoverageList(isolate->heap()->undefined_value());
}
......
......@@ -98,6 +98,11 @@ int FeedbackVector::invocation_count() const {
return Smi::cast(get(kInvocationCountIndex))->value();
}
void FeedbackVector::increment_invocation_count() {
int count = invocation_count() + 1;
if (Smi::IsValid(count)) set(kInvocationCountIndex, Smi::FromInt(count));
}
void FeedbackVector::clear_invocation_count() {
set(kInvocationCountIndex, Smi::kZero);
}
......
......@@ -299,6 +299,7 @@ class FeedbackVector : public FixedArray {
inline FeedbackMetadata* metadata() const;
inline SharedFunctionInfo* shared_function_info() const;
inline int invocation_count() const;
inline void increment_invocation_count();
inline void clear_invocation_count();
// Conversion from a slot to an integer index to the underlying array.
......
......@@ -347,3 +347,82 @@ Running test: testBestEffortCoveragePrecise
]
}
}
Running test: testEnablePreciseCoverageAtPause
{
id : <messageId>
result : {
result : {
type : undefined
}
}
}
{
id : <messageId>
result : {
result : [
[0] : {
functions : [
[0] : {
functionName :
ranges : [
[0] : {
count : 1
endOffset : 114
startOffset : 0
}
]
}
[1] : {
functionName : g
ranges : [
[0] : {
count : 1
endOffset : 29
startOffset : 1
}
]
}
[2] : {
functionName : f
ranges : [
[0] : {
count : 4
endOffset : 83
startOffset : 30
}
]
}
[3] : {
functionName : h
ranges : [
[0] : {
count : 0
endOffset : 107
startOffset : 84
}
]
}
]
scriptId : <scriptId>
url : 5
}
[1] : {
functions : [
[0] : {
functionName :
ranges : [
[0] : {
count : 1
endOffset : 11
startOffset : 0
}
]
}
]
scriptId : <scriptId>
url :
}
]
}
}
......@@ -14,6 +14,21 @@ function fib(x) {
fib(5);
`;
var break_source =
`
function g() {
debugger;
}
function f(x) {
if (x == 0) g();
else f(x - 1);
}
function h() {
g();
}
f(3);
`;
InspectorTest.log("Test collecting code coverage data with Profiler.collectCoverage.");
function ClearAndGC() {
......@@ -118,4 +133,25 @@ InspectorTest.runTestSuite([
.then(Protocol.Runtime.disable)
.then(next);
},
function testEnablePreciseCoverageAtPause(next)
{
function handleDebuggerPause() {
Protocol.Profiler.enable()
.then(Protocol.Profiler.startPreciseCoverage)
.then(Protocol.Debugger.resume)
}
Protocol.Debugger.enable();
Protocol.Debugger.oncePaused().then(handleDebuggerPause);
Protocol.Runtime.enable()
.then(() => Protocol.Runtime.compileScript({ expression: break_source, sourceURL: "5", persistScript: true }))
.then((result) => Protocol.Runtime.runScript({ scriptId: result.result.scriptId }))
.then(InspectorTest.logMessage)
.then(ClearAndGC)
.then(Protocol.Profiler.takePreciseCoverage)
.then(LogSorted)
.then(Protocol.Profiler.stopPreciseCoverage)
.then(Protocol.Profiler.disable)
.then(Protocol.Runtime.disable)
.then(next);
},
]);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment