v8/test/mjsunit/code-coverage-precise.js
yangguo 8422e25bb2 [debugger] add precise mode for code coverage.
Collecting precise invocation counts need to be explicitly
enabled. Once enabled, we disable optimization (optimized
code does not increment invocation count, and may inline
callees), and make sure feedback vectors interesting for
code coverage is not garbage-collected.

R=hpayer@chromium.org, jgruber@chromium.org
BUG=v8:5808

Review-Url: https://codereview.chromium.org/2686063002
Cr-Commit-Position: refs/heads/master@{#43082}
2017-02-10 08:21:03 +00:00

98 lines
1.9 KiB
JavaScript

// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax --no-always-opt
// Test precise code coverage.
function GetCoverage(source) {
var scripts = %DebugGetLoadedScripts();
for (var script of scripts) {
if (script.source == source) {
var coverage = %DebugCollectCoverage();
for (var data of coverage) {
if (data.script_id == script.id) return data.entries;
}
}
}
return undefined;
}
function ApplyCoverageToSource(source, coverage) {
var result = "";
var cursor = 0;
for (var entry of coverage) {
var chunk = source.substring(cursor, entry.end_position);
cursor = entry.end_position;
result += `[${chunk}[${entry.count}]]`;
}
return result;
}
function TestCoverage(name, source, expectation) {
source = source.trim();
eval(source);
var coverage = GetCoverage(source);
if (expectation === undefined) {
assertEquals(undefined, coverage);
} else {
expectation = expectation.trim();
var result = ApplyCoverageToSource(source, coverage);
print(result);
assertEquals(expectation, result, name + " failed");
}
}
// Without precise coverage enabled, we lose coverage data to the GC.
TestCoverage(
"call an IIFE",
`
(function f() {})();
`,
undefined // The IIFE has been garbage-collected.
);
TestCoverage(
"call locally allocated function",
`
for (var i = 0; i < 10; i++) {
let f = () => 1;
i += f();
}
`,
undefined
);
// This does not happen with precise coverage enabled.
%DebugTogglePreciseCoverage(true);
TestCoverage(
"call an IIFE",
`
(function f() {})();
`,
`
[(function f() {})();[1]]
`
);
TestCoverage(
"call locally allocated function",
`
for (var i = 0; i < 10; i++) {
let f = () => 1;
i += f();
}
`,
`
[for (var i = 0; i < 10; i++) {
let f = [1]][() => 1[5]][;
i += f();
}[1]]
`
);
%DebugTogglePreciseCoverage(false);