libv8-node 15.14.0.1-aarch64-linux-musl → 18.8.0.0-aarch64-linux-musl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libv8-node/location.rb +1 -1
  3. data/ext/libv8-node/paths.rb +5 -1
  4. data/lib/libv8/node/version.rb +3 -3
  5. data/vendor/v8/{out.gn → aarch64-linux-musl}/libv8/obj/libv8_monolith.a +0 -0
  6. data/vendor/v8/include/cppgc/allocation.h +184 -47
  7. data/vendor/v8/include/cppgc/common.h +9 -6
  8. data/vendor/v8/include/cppgc/cross-thread-persistent.h +465 -0
  9. data/vendor/v8/include/cppgc/custom-space.h +37 -2
  10. data/vendor/v8/include/cppgc/default-platform.h +40 -49
  11. data/vendor/v8/include/cppgc/ephemeron-pair.h +30 -0
  12. data/vendor/v8/include/cppgc/explicit-management.h +100 -0
  13. data/vendor/v8/include/cppgc/garbage-collected.h +19 -29
  14. data/vendor/v8/include/cppgc/heap-consistency.h +266 -0
  15. data/vendor/v8/include/cppgc/heap-state.h +82 -0
  16. data/vendor/v8/include/cppgc/heap-statistics.h +120 -0
  17. data/vendor/v8/include/cppgc/heap.h +73 -6
  18. data/vendor/v8/include/cppgc/internal/api-constants.h +11 -3
  19. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +27 -15
  20. data/vendor/v8/include/cppgc/internal/compiler-specific.h +2 -2
  21. data/vendor/v8/include/cppgc/internal/finalizer-trait.h +4 -1
  22. data/vendor/v8/include/cppgc/internal/gc-info.h +124 -13
  23. data/vendor/v8/include/cppgc/internal/logging.h +3 -3
  24. data/vendor/v8/include/cppgc/internal/name-trait.h +122 -0
  25. data/vendor/v8/include/cppgc/internal/persistent-node.h +116 -16
  26. data/vendor/v8/include/cppgc/internal/pointer-policies.h +84 -32
  27. data/vendor/v8/include/cppgc/internal/write-barrier.h +392 -35
  28. data/vendor/v8/include/cppgc/liveness-broker.h +11 -2
  29. data/vendor/v8/include/cppgc/macros.h +2 -0
  30. data/vendor/v8/include/cppgc/member.h +91 -26
  31. data/vendor/v8/include/cppgc/name-provider.h +65 -0
  32. data/vendor/v8/include/cppgc/object-size-trait.h +58 -0
  33. data/vendor/v8/include/cppgc/persistent.h +70 -41
  34. data/vendor/v8/include/cppgc/platform.h +52 -26
  35. data/vendor/v8/include/cppgc/prefinalizer.h +36 -13
  36. data/vendor/v8/include/cppgc/process-heap-statistics.h +36 -0
  37. data/vendor/v8/include/cppgc/sentinel-pointer.h +32 -0
  38. data/vendor/v8/include/cppgc/source-location.h +2 -1
  39. data/vendor/v8/include/cppgc/testing.h +106 -0
  40. data/vendor/v8/include/cppgc/trace-trait.h +8 -3
  41. data/vendor/v8/include/cppgc/type-traits.h +163 -32
  42. data/vendor/v8/include/cppgc/visitor.h +194 -28
  43. data/vendor/v8/include/libplatform/libplatform.h +11 -11
  44. data/vendor/v8/include/libplatform/v8-tracing.h +2 -1
  45. data/vendor/v8/include/v8-array-buffer.h +445 -0
  46. data/vendor/v8/include/v8-callbacks.h +397 -0
  47. data/vendor/v8/include/v8-container.h +129 -0
  48. data/vendor/v8/include/v8-context.h +407 -0
  49. data/vendor/v8/include/v8-cppgc.h +151 -159
  50. data/vendor/v8/include/v8-data.h +80 -0
  51. data/vendor/v8/include/v8-date.h +43 -0
  52. data/vendor/v8/include/v8-debug.h +168 -0
  53. data/vendor/v8/include/v8-embedder-heap.h +218 -0
  54. data/vendor/v8/include/v8-embedder-state-scope.h +51 -0
  55. data/vendor/v8/include/v8-exception.h +217 -0
  56. data/vendor/v8/include/v8-extension.h +62 -0
  57. data/vendor/v8/include/v8-external.h +37 -0
  58. data/vendor/v8/include/v8-fast-api-calls.h +703 -152
  59. data/vendor/v8/include/v8-forward.h +81 -0
  60. data/vendor/v8/include/v8-function-callback.h +475 -0
  61. data/vendor/v8/include/v8-function.h +125 -0
  62. data/vendor/v8/include/v8-initialization.h +315 -0
  63. data/vendor/v8/include/v8-inspector.h +76 -27
  64. data/vendor/v8/include/v8-internal.h +285 -51
  65. data/vendor/v8/include/v8-isolate.h +1709 -0
  66. data/vendor/v8/include/v8-json.h +47 -0
  67. data/vendor/v8/include/v8-local-handle.h +455 -0
  68. data/vendor/v8/include/v8-locker.h +149 -0
  69. data/vendor/v8/include/v8-maybe.h +137 -0
  70. data/vendor/v8/include/v8-memory-span.h +43 -0
  71. data/vendor/v8/include/v8-message.h +216 -0
  72. data/vendor/v8/include/v8-metrics.h +131 -9
  73. data/vendor/v8/include/v8-microtask-queue.h +152 -0
  74. data/vendor/v8/include/v8-microtask.h +28 -0
  75. data/vendor/v8/include/v8-object.h +775 -0
  76. data/vendor/v8/include/v8-persistent-handle.h +590 -0
  77. data/vendor/v8/include/v8-platform.h +433 -25
  78. data/vendor/v8/include/v8-primitive-object.h +118 -0
  79. data/vendor/v8/include/v8-primitive.h +866 -0
  80. data/vendor/v8/include/v8-profiler.h +149 -10
  81. data/vendor/v8/include/v8-promise.h +174 -0
  82. data/vendor/v8/include/v8-proxy.h +50 -0
  83. data/vendor/v8/include/v8-regexp.h +105 -0
  84. data/vendor/v8/include/v8-script.h +747 -0
  85. data/vendor/v8/include/v8-snapshot.h +196 -0
  86. data/vendor/v8/include/v8-statistics.h +217 -0
  87. data/vendor/v8/include/v8-template.h +1079 -0
  88. data/vendor/v8/include/v8-traced-handle.h +420 -0
  89. data/vendor/v8/include/v8-typed-array.h +282 -0
  90. data/vendor/v8/include/v8-unwinder-state.h +31 -0
  91. data/vendor/v8/include/v8-unwinder.h +132 -0
  92. data/vendor/v8/include/v8-util.h +8 -2
  93. data/vendor/v8/include/v8-value-serializer-version.h +1 -1
  94. data/vendor/v8/include/v8-value-serializer.h +279 -0
  95. data/vendor/v8/include/v8-value.h +526 -0
  96. data/vendor/v8/include/v8-version.h +4 -4
  97. data/vendor/v8/include/v8-wasm.h +257 -0
  98. data/vendor/v8/include/v8-weak-callback-info.h +87 -0
  99. data/vendor/v8/include/v8.h +41 -12051
  100. data/vendor/v8/include/v8config.h +142 -21
  101. metadata +64 -10
  102. data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +0 -30
  103. data/vendor/v8/include/cppgc/internal/process-heap.h +0 -34
@@ -5,6 +5,9 @@
5
5
  #ifndef INCLUDE_CPPGC_PLATFORM_H_
6
6
  #define INCLUDE_CPPGC_PLATFORM_H_
7
7
 
8
+ #include <memory>
9
+
10
+ #include "cppgc/source-location.h"
8
11
  #include "v8-platform.h" // NOLINT(build/include_directory)
9
12
  #include "v8config.h" // NOLINT(build/include_directory)
10
13
 
@@ -20,6 +23,7 @@ using PageAllocator = v8::PageAllocator;
20
23
  using Task = v8::Task;
21
24
  using TaskPriority = v8::TaskPriority;
22
25
  using TaskRunner = v8::TaskRunner;
26
+ using TracingController = v8::TracingController;
23
27
 
24
28
  /**
25
29
  * Platform interface used by Heap. Contains allocators and executors.
@@ -51,22 +55,23 @@ class V8_EXPORT Platform {
51
55
  }
52
56
 
53
57
  /**
54
- * Posts |job_task| to run in parallel. Returns a JobHandle associated with
55
- * the Job, which can be joined or canceled.
58
+ * Posts `job_task` to run in parallel. Returns a `JobHandle` associated with
59
+ * the `Job`, which can be joined or canceled.
56
60
  * This avoids degenerate cases:
57
- * - Calling CallOnWorkerThread() for each work item, causing significant
61
+ * - Calling `CallOnWorkerThread()` for each work item, causing significant
58
62
  * overhead.
59
- * - Fixed number of CallOnWorkerThread() calls that split the work and might
60
- * run for a long time. This is problematic when many components post
63
+ * - Fixed number of `CallOnWorkerThread()` calls that split the work and
64
+ * might run for a long time. This is problematic when many components post
61
65
  * "num cores" tasks and all expect to use all the cores. In these cases,
62
66
  * the scheduler lacks context to be fair to multiple same-priority requests
63
67
  * and/or ability to request lower priority work to yield when high priority
64
68
  * work comes in.
65
- * A canonical implementation of |job_task| looks like:
69
+ * A canonical implementation of `job_task` looks like:
70
+ * \code
66
71
  * class MyJobTask : public JobTask {
67
72
  * public:
68
73
  * MyJobTask(...) : worker_queue_(...) {}
69
- * // JobTask:
74
+ * // JobTask implementation.
70
75
  * void Run(JobDelegate* delegate) override {
71
76
  * while (!delegate->ShouldYield()) {
72
77
  * // Smallest unit of work.
@@ -80,51 +85,72 @@ class V8_EXPORT Platform {
80
85
  * return worker_queue_.GetSize(); // Thread safe.
81
86
  * }
82
87
  * };
88
+ *
89
+ * // ...
83
90
  * auto handle = PostJob(TaskPriority::kUserVisible,
84
91
  * std::make_unique<MyJobTask>(...));
85
92
  * handle->Join();
93
+ * \endcode
86
94
  *
87
- * PostJob() and methods of the returned JobHandle/JobDelegate, must never be
88
- * called while holding a lock that could be acquired by JobTask::Run or
89
- * JobTask::GetMaxConcurrency -- that could result in a deadlock. This is
90
- * because [1] JobTask::GetMaxConcurrency may be invoked while holding
91
- * internal lock (A), hence JobTask::GetMaxConcurrency can only use a lock (B)
92
- * if that lock is *never* held while calling back into JobHandle from any
93
- * thread (A=>B/B=>A deadlock) and [2] JobTask::Run or
94
- * JobTask::GetMaxConcurrency may be invoked synchronously from JobHandle
95
- * (B=>JobHandle::foo=>B deadlock).
95
+ * `PostJob()` and methods of the returned JobHandle/JobDelegate, must never
96
+ * be called while holding a lock that could be acquired by `JobTask::Run()`
97
+ * or `JobTask::GetMaxConcurrency()` -- that could result in a deadlock. This
98
+ * is because (1) `JobTask::GetMaxConcurrency()` may be invoked while holding
99
+ * internal lock (A), hence `JobTask::GetMaxConcurrency()` can only use a lock
100
+ * (B) if that lock is *never* held while calling back into `JobHandle` from
101
+ * any thread (A=>B/B=>A deadlock) and (2) `JobTask::Run()` or
102
+ * `JobTask::GetMaxConcurrency()` may be invoked synchronously from
103
+ * `JobHandle` (B=>JobHandle::foo=>B deadlock).
96
104
  *
97
- * A sufficient PostJob() implementation that uses the default Job provided in
98
- * libplatform looks like:
99
- * std::unique_ptr<JobHandle> PostJob(
100
- * TaskPriority priority, std::unique_ptr<JobTask> job_task) override {
101
- * return std::make_unique<DefaultJobHandle>(
102
- * std::make_shared<DefaultJobState>(
103
- * this, std::move(job_task), kNumThreads));
105
+ * A sufficient `PostJob()` implementation that uses the default Job provided
106
+ * in libplatform looks like:
107
+ * \code
108
+ * std::unique_ptr<JobHandle> PostJob(
109
+ * TaskPriority priority, std::unique_ptr<JobTask> job_task) override {
110
+ * return std::make_unique<DefaultJobHandle>(
111
+ * std::make_shared<DefaultJobState>(
112
+ * this, std::move(job_task), kNumThreads));
104
113
  * }
114
+ * \endcode
105
115
  */
106
116
  virtual std::unique_ptr<JobHandle> PostJob(
107
117
  TaskPriority priority, std::unique_ptr<JobTask> job_task) {
108
118
  return nullptr;
109
119
  }
120
+
121
+ /**
122
+ * Returns an instance of a `TracingController`. This must be non-nullptr. The
123
+ * default implementation returns an empty `TracingController` that consumes
124
+ * trace data without effect.
125
+ */
126
+ virtual TracingController* GetTracingController();
110
127
  };
111
128
 
112
129
  /**
113
130
  * Process-global initialization of the garbage collector. Must be called before
114
131
  * creating a Heap.
132
+ *
133
+ * Can be called multiple times when paired with `ShutdownProcess()`.
134
+ *
135
+ * \param page_allocator The allocator used for maintaining meta data. Must not
136
+ * change between multiple calls to InitializeProcess.
115
137
  */
116
- V8_EXPORT void InitializeProcess(PageAllocator*);
138
+ V8_EXPORT void InitializeProcess(PageAllocator* page_allocator);
117
139
 
118
140
  /**
119
- * Must be called after destroying the last used heap.
141
+ * Must be called after destroying the last used heap. Some process-global
142
+ * metadata may not be returned and reused upon a subsequent
143
+ * `InitializeProcess()` call.
120
144
  */
121
145
  V8_EXPORT void ShutdownProcess();
122
146
 
123
147
  namespace internal {
124
148
 
125
- V8_EXPORT void Abort();
149
+ V8_EXPORT void Fatal(const std::string& reason = std::string(),
150
+ const SourceLocation& = SourceLocation::Current());
126
151
 
127
152
  } // namespace internal
153
+
128
154
  } // namespace cppgc
129
155
 
130
156
  #endif // INCLUDE_CPPGC_PLATFORM_H_
@@ -6,23 +6,17 @@
6
6
  #define INCLUDE_CPPGC_PREFINALIZER_H_
7
7
 
8
8
  #include "cppgc/internal/compiler-specific.h"
9
- #include "cppgc/internal/prefinalizer-handler.h"
10
9
  #include "cppgc/liveness-broker.h"
11
10
 
12
11
  namespace cppgc {
13
12
 
14
13
  namespace internal {
15
14
 
16
- template <typename T>
17
- class PrefinalizerRegistration final {
15
+ class V8_EXPORT PrefinalizerRegistration final {
18
16
  public:
19
- explicit PrefinalizerRegistration(T* self) {
20
- static_assert(sizeof(&T::InvokePreFinalizer) > 0,
21
- "USING_PRE_FINALIZER(T) must be defined.");
17
+ using Callback = bool (*)(const cppgc::LivenessBroker&, void*);
22
18
 
23
- cppgc::internal::PreFinalizerRegistrationDispatcher::RegisterPrefinalizer(
24
- {self, T::InvokePreFinalizer});
25
- }
19
+ PrefinalizerRegistration(void*, Callback);
26
20
 
27
21
  void* operator new(size_t, void* location) = delete;
28
22
  void* operator new(size_t) = delete;
@@ -30,21 +24,50 @@ class PrefinalizerRegistration final {
30
24
 
31
25
  } // namespace internal
32
26
 
27
+ /**
28
+ * Macro must be used in the private section of `Class` and registers a
29
+ * prefinalization callback `void Class::PreFinalizer()`. The callback is
30
+ * invoked on garbage collection after the collector has found an object to be
31
+ * dead.
32
+ *
33
+ * Callback properties:
34
+ * - The callback is invoked before a possible destructor for the corresponding
35
+ * object.
36
+ * - The callback may access the whole object graph, irrespective of whether
37
+ * objects are considered dead or alive.
38
+ * - The callback is invoked on the same thread as the object was created on.
39
+ *
40
+ * Example:
41
+ * \code
42
+ * class WithPrefinalizer : public GarbageCollected<WithPrefinalizer> {
43
+ * CPPGC_USING_PRE_FINALIZER(WithPrefinalizer, Dispose);
44
+ *
45
+ * public:
46
+ * void Trace(Visitor*) const {}
47
+ * void Dispose() { prefinalizer_called = true; }
48
+ * ~WithPrefinalizer() {
49
+ * // prefinalizer_called == true
50
+ * }
51
+ * private:
52
+ * bool prefinalizer_called = false;
53
+ * };
54
+ * \endcode
55
+ */
33
56
  #define CPPGC_USING_PRE_FINALIZER(Class, PreFinalizer) \
34
57
  public: \
35
58
  static bool InvokePreFinalizer(const cppgc::LivenessBroker& liveness_broker, \
36
59
  void* object) { \
37
- static_assert(cppgc::internal::IsGarbageCollectedTypeV<Class>, \
60
+ static_assert(cppgc::IsGarbageCollectedOrMixinTypeV<Class>, \
38
61
  "Only garbage collected objects can have prefinalizers"); \
39
62
  Class* self = static_cast<Class*>(object); \
40
63
  if (liveness_broker.IsHeapObjectAlive(self)) return false; \
41
- self->Class::PreFinalizer(); \
64
+ self->PreFinalizer(); \
42
65
  return true; \
43
66
  } \
44
67
  \
45
68
  private: \
46
- CPPGC_NO_UNIQUE_ADDRESS cppgc::internal::PrefinalizerRegistration<Class> \
47
- prefinalizer_dummy_{this}; \
69
+ CPPGC_NO_UNIQUE_ADDRESS cppgc::internal::PrefinalizerRegistration \
70
+ prefinalizer_dummy_{this, Class::InvokePreFinalizer}; \
48
71
  static_assert(true, "Force semicolon.")
49
72
 
50
73
  } // namespace cppgc
@@ -0,0 +1,36 @@
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_PROCESS_HEAP_STATISTICS_H_
6
+ #define INCLUDE_CPPGC_PROCESS_HEAP_STATISTICS_H_
7
+
8
+ #include <atomic>
9
+ #include <cstddef>
10
+
11
+ #include "v8config.h" // NOLINT(build/include_directory)
12
+
13
+ namespace cppgc {
14
+ namespace internal {
15
+ class ProcessHeapStatisticsUpdater;
16
+ } // namespace internal
17
+
18
+ class V8_EXPORT ProcessHeapStatistics final {
19
+ public:
20
+ static size_t TotalAllocatedObjectSize() {
21
+ return total_allocated_object_size_.load(std::memory_order_relaxed);
22
+ }
23
+ static size_t TotalAllocatedSpace() {
24
+ return total_allocated_space_.load(std::memory_order_relaxed);
25
+ }
26
+
27
+ private:
28
+ static std::atomic_size_t total_allocated_space_;
29
+ static std::atomic_size_t total_allocated_object_size_;
30
+
31
+ friend class internal::ProcessHeapStatisticsUpdater;
32
+ };
33
+
34
+ } // namespace cppgc
35
+
36
+ #endif // INCLUDE_CPPGC_PROCESS_HEAP_STATISTICS_H_
@@ -0,0 +1,32 @@
1
+ // Copyright 2021 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_SENTINEL_POINTER_H_
6
+ #define INCLUDE_CPPGC_SENTINEL_POINTER_H_
7
+
8
+ #include <cstdint>
9
+
10
+ namespace cppgc {
11
+ namespace internal {
12
+
13
+ // Special tag type used to denote some sentinel member. The semantics of the
14
+ // sentinel is defined by the embedder.
15
+ struct SentinelPointer {
16
+ template <typename T>
17
+ operator T*() const {
18
+ static constexpr intptr_t kSentinelValue = 1;
19
+ return reinterpret_cast<T*>(kSentinelValue);
20
+ }
21
+ // Hidden friends.
22
+ friend bool operator==(SentinelPointer, SentinelPointer) { return true; }
23
+ friend bool operator!=(SentinelPointer, SentinelPointer) { return false; }
24
+ };
25
+
26
+ } // namespace internal
27
+
28
+ constexpr internal::SentinelPointer kSentinelPointer;
29
+
30
+ } // namespace cppgc
31
+
32
+ #endif // INCLUDE_CPPGC_SENTINEL_POINTER_H_
@@ -5,6 +5,7 @@
5
5
  #ifndef INCLUDE_CPPGC_SOURCE_LOCATION_H_
6
6
  #define INCLUDE_CPPGC_SOURCE_LOCATION_H_
7
7
 
8
+ #include <cstddef>
8
9
  #include <string>
9
10
 
10
11
  #include "v8config.h" // NOLINT(build/include_directory)
@@ -25,7 +26,7 @@ namespace cppgc {
25
26
 
26
27
  /**
27
28
  * Encapsulates source location information. Mimics C++20's
28
- * std::source_location.
29
+ * `std::source_location`.
29
30
  */
30
31
  class V8_EXPORT SourceLocation final {
31
32
  public:
@@ -0,0 +1,106 @@
1
+ // Copyright 2021 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_TESTING_H_
6
+ #define INCLUDE_CPPGC_TESTING_H_
7
+
8
+ #include "cppgc/common.h"
9
+ #include "cppgc/macros.h"
10
+ #include "v8config.h" // NOLINT(build/include_directory)
11
+
12
+ namespace cppgc {
13
+
14
+ class HeapHandle;
15
+
16
+ /**
17
+ * Namespace contains testing helpers.
18
+ */
19
+ namespace testing {
20
+
21
+ /**
22
+ * Overrides the state of the stack with the provided value. Parameters passed
23
+ * to explicit garbage collection calls still take precedence. Must not be
24
+ * nested.
25
+ *
26
+ * This scope is useful to make the garbage collector consider the stack when
27
+ * tasks that invoke garbage collection (through the provided platform) contain
28
+ * interesting pointers on its stack.
29
+ */
30
+ class V8_EXPORT V8_NODISCARD OverrideEmbedderStackStateScope final {
31
+ CPPGC_STACK_ALLOCATED();
32
+
33
+ public:
34
+ /**
35
+ * Constructs a scoped object that automatically enters and leaves the scope.
36
+ *
37
+ * \param heap_handle The corresponding heap.
38
+ */
39
+ explicit OverrideEmbedderStackStateScope(HeapHandle& heap_handle,
40
+ EmbedderStackState state);
41
+ ~OverrideEmbedderStackStateScope();
42
+
43
+ OverrideEmbedderStackStateScope(const OverrideEmbedderStackStateScope&) =
44
+ delete;
45
+ OverrideEmbedderStackStateScope& operator=(
46
+ const OverrideEmbedderStackStateScope&) = delete;
47
+
48
+ private:
49
+ HeapHandle& heap_handle_;
50
+ };
51
+
52
+ /**
53
+ * Testing interface for managed heaps that allows for controlling garbage
54
+ * collection timings. Embedders should use this class when testing the
55
+ * interaction of their code with incremental/concurrent garbage collection.
56
+ */
57
+ class V8_EXPORT StandaloneTestingHeap final {
58
+ public:
59
+ explicit StandaloneTestingHeap(HeapHandle&);
60
+
61
+ /**
62
+ * Start an incremental garbage collection.
63
+ */
64
+ void StartGarbageCollection();
65
+
66
+ /**
67
+ * Perform an incremental step. This will also schedule concurrent steps if
68
+ * needed.
69
+ *
70
+ * \param stack_state The state of the stack during the step.
71
+ */
72
+ bool PerformMarkingStep(EmbedderStackState stack_state);
73
+
74
+ /**
75
+ * Finalize the current garbage collection cycle atomically.
76
+ * Assumes that garbage collection is in progress.
77
+ *
78
+ * \param stack_state The state of the stack for finalizing the garbage
79
+ * collection cycle.
80
+ */
81
+ void FinalizeGarbageCollection(EmbedderStackState stack_state);
82
+
83
+ /**
84
+ * Toggle main thread marking on/off. Allows to stress concurrent marking
85
+ * (e.g. to better detect data races).
86
+ *
87
+ * \param should_mark Denotes whether the main thread should contribute to
88
+ * marking. Defaults to true.
89
+ */
90
+ void ToggleMainThreadMarking(bool should_mark);
91
+
92
+ /**
93
+ * Force enable compaction for the next garbage collection cycle.
94
+ */
95
+ void ForceCompactionForNextGarbageCollection();
96
+
97
+ private:
98
+ HeapHandle& heap_handle_;
99
+ };
100
+
101
+ V8_EXPORT bool IsHeapObjectOld(void*);
102
+
103
+ } // namespace testing
104
+ } // namespace cppgc
105
+
106
+ #endif // INCLUDE_CPPGC_TESTING_H_
@@ -55,8 +55,6 @@ struct V8_EXPORT TraceTraitFromInnerAddressImpl {
55
55
  static TraceDescriptor GetTraceDescriptor(const void* address);
56
56
  };
57
57
 
58
- } // namespace internal
59
-
60
58
  /**
61
59
  * Trait specifying how the garbage collector processes an object of type T.
62
60
  *
@@ -64,7 +62,7 @@ struct V8_EXPORT TraceTraitFromInnerAddressImpl {
64
62
  * type.
65
63
  */
66
64
  template <typename T>
67
- struct TraceTrait {
65
+ struct TraceTraitBase {
68
66
  static_assert(internal::IsTraceableV<T>, "T must have a Trace() method");
69
67
 
70
68
  /**
@@ -89,10 +87,17 @@ struct TraceTrait {
89
87
  }
90
88
  };
91
89
 
90
+ } // namespace internal
91
+
92
+ template <typename T>
93
+ struct TraceTrait : public internal::TraceTraitBase<T> {};
94
+
92
95
  namespace internal {
93
96
 
94
97
  template <typename T>
95
98
  struct TraceTraitImpl<T, false> {
99
+ static_assert(IsGarbageCollectedTypeV<T>,
100
+ "T must be of type GarbageCollected or GarbageCollectedMixin");
96
101
  static TraceDescriptor GetTraceDescriptor(const void* self) {
97
102
  return {self, TraceTrait<T>::Trace};
98
103
  }