// 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.
|
|
#ifndef V8_DEBUG_DEBUG_COVERAGE_H_
|
#define V8_DEBUG_DEBUG_COVERAGE_H_
|
|
#include <vector>
|
|
#include "src/debug/debug-interface.h"
|
#include "src/objects.h"
|
|
namespace v8 {
|
namespace internal {
|
|
// Forward declaration.
|
class Isolate;
|
|
struct CoverageBlock {
|
CoverageBlock(int s, int e, uint32_t c) : start(s), end(e), count(c) {}
|
CoverageBlock() : CoverageBlock(kNoSourcePosition, kNoSourcePosition, 0) {}
|
int start;
|
int end;
|
uint32_t count;
|
};
|
|
struct CoverageFunction {
|
CoverageFunction(int s, int e, uint32_t c, Handle<String> n)
|
: start(s), end(e), count(c), name(n), has_block_coverage(false) {}
|
int start;
|
int end;
|
uint32_t count;
|
Handle<String> name;
|
// Blocks are sorted by start position, from outer to inner blocks.
|
std::vector<CoverageBlock> blocks;
|
bool has_block_coverage;
|
};
|
|
struct CoverageScript {
|
// Initialize top-level function in case it has been garbage-collected.
|
explicit CoverageScript(Handle<Script> s) : script(s) {}
|
Handle<Script> script;
|
// Functions are sorted by start position, from outer to inner function.
|
std::vector<CoverageFunction> functions;
|
};
|
|
class Coverage : public std::vector<CoverageScript> {
|
public:
|
// Collecting precise coverage only works if the modes kPreciseCount or
|
// kPreciseBinary is selected. The invocation count is reset on collection.
|
// In case of kPreciseCount, an updated count since last collection is
|
// returned. In case of kPreciseBinary, a count of 1 is returned if a
|
// function has been executed for the first time since last collection.
|
static std::unique_ptr<Coverage> CollectPrecise(Isolate* isolate);
|
// Collecting best effort coverage always works, but may be imprecise
|
// depending on selected mode. The invocation count is not reset.
|
static std::unique_ptr<Coverage> CollectBestEffort(Isolate* isolate);
|
|
// Select code coverage mode.
|
static void SelectMode(Isolate* isolate, debug::Coverage::Mode mode);
|
|
private:
|
static std::unique_ptr<Coverage> Collect(
|
Isolate* isolate, v8::debug::Coverage::Mode collectionMode);
|
|
Coverage() {}
|
};
|
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_DEBUG_DEBUG_COVERAGE_H_
|