text: // 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_
  