5#ifndef INCLUDE_CPPGC_INTERNAL_GC_INFO_H_
6#define INCLUDE_CPPGC_INTERNAL_GC_INFO_H_
12#include "cppgc/internal/finalizer-trait.h"
13#include "cppgc/internal/logging.h"
14#include "cppgc/internal/name-trait.h"
15#include "cppgc/trace-trait.h"
21using GCInfoIndex = uint16_t;
28 std::atomic<GCInfoIndex>& registered_index) {
29 return EnsureGCInfoIndexTraitDispatch<T>{}(registered_index);
34 bool = NameTrait<T>::HasNonHiddenName()>
35 struct EnsureGCInfoIndexTraitDispatch;
38 EnsureGCInfoIndex(std::atomic<GCInfoIndex>&, TraceCallback,
39 FinalizationCallback, NameCallback);
41 std::atomic<GCInfoIndex>&, TraceCallback, FinalizationCallback);
43 EnsureGCInfoIndex(std::atomic<GCInfoIndex>&, TraceCallback, NameCallback);
45 EnsureGCInfoIndex(std::atomic<GCInfoIndex>&, TraceCallback);
48#define DISPATCH(has_finalizer, has_non_hidden_name, function)
50 struct EnsureGCInfoIndexTrait::EnsureGCInfoIndexTraitDispatch<
51 T, has_finalizer, has_non_hidden_name> {
53 operator
()(std::atomic<GCInfoIndex>& registered_index) {
62 EnsureGCInfoIndex(registered_index,
65 NameTrait<T>::GetName))
67 EnsureGCInfoIndex(registered_index,
71 EnsureGCInfoIndex(registered_index,
73 NameTrait<T>::GetName))
75 EnsureGCInfoIndex(registered_index,
83struct GCInfoTrait
final {
85 static_assert(
sizeof(T),
"T must be fully defined");
86 static std::atomic<GCInfoIndex>
88 GCInfoIndex index = registered_index.load(std::memory_order_acquire);
90 index = EnsureGCInfoIndexTrait::EnsureIndex<T>(registered_index);
92 CPPGC_DCHECK(index == registered_index.load(std::memory_order_acquire));
97 static constexpr void CheckCallbacksAreDefined() {
99 (
void)
static_cast<TraceCallback>(
TraceTrait<T>::Trace);
100 (
void)
static_cast<FinalizationCallback>(
FinalizerTrait<T>::kCallback);
101 (
void)
static_cast<NameCallback>(NameTrait<T>::GetName);
108template <
typename T,
typename ParentMostGarbageCollectedType>
109struct GCInfoFolding
final {
111 std::has_virtual_destructor_v<ParentMostGarbageCollectedType>;
113 std::is_trivially_destructible_v<ParentMostGarbageCollectedType> &&
114 std::is_trivially_destructible_v<T>;
116 internal::HasFinalizeGarbageCollectedObject<
117 ParentMostGarbageCollectedType>::value;
118#ifdef CPPGC_SUPPORTS_OBJECT_NAMES
119 static constexpr bool kWantsDetailedObjectNames =
true;
134 GCInfoTrait<T>::CheckCallbacksAreDefined();
135 GCInfoTrait<ParentMostGarbageCollectedType>::CheckCallbacksAreDefined();
144 std::conditional_t<WantToFold(), ParentMostGarbageCollectedType, T>;
#define DISPATCH(has_finalizer, has_non_hidden_name, function)
#define CPPGC_DCHECK(condition)
static V8_INLINE GCInfoIndex EnsureIndex(std::atomic< GCInfoIndex > ®istered_index)
static constexpr bool kHasCustomFinalizerDispatchAtBase
static constexpr bool kHasVirtualDestructorAtBase
static constexpr bool kWantsDetailedObjectNames
static constexpr bool kBothTypesAreTriviallyDestructible
static constexpr bool WantToFold()
#define V8_UNLIKELY(condition)