Coverage Report

Created: 2025-07-04 09:33

/src/node/deps/v8/include/cppgc/garbage-collected.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2020 the V8 project authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
#ifndef INCLUDE_CPPGC_GARBAGE_COLLECTED_H_
6
#define INCLUDE_CPPGC_GARBAGE_COLLECTED_H_
7
8
#include "cppgc/internal/api-constants.h"
9
#include "cppgc/platform.h"
10
#include "cppgc/trace-trait.h"
11
#include "cppgc/type-traits.h"
12
13
namespace cppgc {
14
15
class Visitor;
16
17
/**
18
 * Base class for managed objects. Only descendent types of `GarbageCollected`
19
 * can be constructed using `MakeGarbageCollected()`. Must be inherited from as
20
 * left-most base class.
21
 *
22
 * Types inheriting from GarbageCollected must provide a method of
23
 * signature `void Trace(cppgc::Visitor*) const` that dispatchs all managed
24
 * pointers to the visitor and delegates to garbage-collected base classes.
25
 * The method must be virtual if the type is not directly a child of
26
 * GarbageCollected and marked as final.
27
 *
28
 * \code
29
 * // Example using final class.
30
 * class FinalType final : public GarbageCollected<FinalType> {
31
 *  public:
32
 *   void Trace(cppgc::Visitor* visitor) const {
33
 *     // Dispatch using visitor->Trace(...);
34
 *   }
35
 * };
36
 *
37
 * // Example using non-final base class.
38
 * class NonFinalBase : public GarbageCollected<NonFinalBase> {
39
 *  public:
40
 *   virtual void Trace(cppgc::Visitor*) const {}
41
 * };
42
 *
43
 * class FinalChild final : public NonFinalBase {
44
 *  public:
45
 *   void Trace(cppgc::Visitor* visitor) const final {
46
 *     // Dispatch using visitor->Trace(...);
47
 *     NonFinalBase::Trace(visitor);
48
 *   }
49
 * };
50
 * \endcode
51
 */
52
template <typename T>
53
class GarbageCollected {
54
 public:
55
  using IsGarbageCollectedTypeMarker = void;
56
  using ParentMostGarbageCollectedType = T;
57
58
  // Must use MakeGarbageCollected.
59
  void* operator new(size_t) = delete;
60
  void* operator new[](size_t) = delete;
61
  // The garbage collector is taking care of reclaiming the object. Also,
62
  // virtual destructor requires an unambiguous, accessible 'operator delete'.
63
  void operator delete(void*) {
64
#ifdef V8_ENABLE_CHECKS
65
    internal::Fatal(
66
        "Manually deleting a garbage collected object is not allowed");
67
#endif  // V8_ENABLE_CHECKS
68
  }
69
  void operator delete[](void*) = delete;
70
71
 protected:
72
  GarbageCollected() = default;
73
};
74
75
/**
76
 * Base class for managed mixin objects. Such objects cannot be constructed
77
 * directly but must be mixed into the inheritance hierarchy of a
78
 * GarbageCollected object.
79
 *
80
 * Types inheriting from GarbageCollectedMixin must override a virtual method
81
 * of signature `void Trace(cppgc::Visitor*) const` that dispatchs all managed
82
 * pointers to the visitor and delegates to base classes.
83
 *
84
 * \code
85
 * class Mixin : public GarbageCollectedMixin {
86
 *  public:
87
 *   void Trace(cppgc::Visitor* visitor) const override {
88
 *     // Dispatch using visitor->Trace(...);
89
 *   }
90
 * };
91
 * \endcode
92
 */
93
class GarbageCollectedMixin {
94
 public:
95
  using IsGarbageCollectedMixinTypeMarker = void;
96
97
  /**
98
   * This Trace method must be overriden by objects inheriting from
99
   * GarbageCollectedMixin.
100
   */
101
0
  virtual void Trace(cppgc::Visitor*) const {}
102
};
103
104
}  // namespace cppgc
105
106
#endif  // INCLUDE_CPPGC_GARBAGE_COLLECTED_H_