File indexing completed on 2025-02-22 10:42:26
0001
0002
0003
0004
0005 #ifndef INCLUDE_CPPGC_TRACE_TRAIT_H_
0006 #define INCLUDE_CPPGC_TRACE_TRAIT_H_
0007
0008 #include <type_traits>
0009
0010 #include "cppgc/type-traits.h"
0011 #include "v8config.h" // NOLINT(build/include_directory)
0012
0013 namespace cppgc {
0014
0015 class Visitor;
0016
0017 namespace internal {
0018
0019 class RootVisitor;
0020
0021 using TraceRootCallback = void (*)(RootVisitor&, const void* object);
0022
0023
0024
0025 template <typename T,
0026 bool =
0027 IsGarbageCollectedMixinTypeV<typename std::remove_const<T>::type>>
0028 struct TraceTraitImpl;
0029
0030 }
0031
0032
0033
0034
0035
0036
0037
0038 using TraceCallback = void (*)(Visitor* visitor, const void* object);
0039
0040
0041
0042
0043
0044 struct TraceDescriptor {
0045
0046
0047
0048
0049 const void* base_object_payload;
0050
0051
0052
0053 TraceCallback callback;
0054 };
0055
0056
0057
0058
0059
0060
0061
0062 using TraceDescriptorCallback = TraceDescriptor (*)(const void* address);
0063
0064 namespace internal {
0065
0066 struct V8_EXPORT TraceTraitFromInnerAddressImpl {
0067 static TraceDescriptor GetTraceDescriptor(const void* address);
0068 };
0069
0070
0071
0072
0073
0074
0075
0076 template <typename T>
0077 struct TraceTraitBase {
0078 static_assert(internal::IsTraceableV<T>, "T must have a Trace() method");
0079
0080
0081
0082
0083
0084
0085
0086 static TraceDescriptor GetTraceDescriptor(const void* self) {
0087 return internal::TraceTraitImpl<T>::GetTraceDescriptor(
0088 static_cast<const T*>(self));
0089 }
0090
0091
0092
0093
0094
0095
0096
0097 static void Trace(Visitor* visitor, const void* self) {
0098 static_cast<const T*>(self)->Trace(visitor);
0099 }
0100 };
0101
0102 }
0103
0104 template <typename T>
0105 struct TraceTrait : public internal::TraceTraitBase<T> {};
0106
0107 namespace internal {
0108
0109 template <typename T>
0110 struct TraceTraitImpl<T, false> {
0111 static_assert(IsGarbageCollectedTypeV<T>,
0112 "T must be of type GarbageCollected or GarbageCollectedMixin");
0113 static TraceDescriptor GetTraceDescriptor(const void* self) {
0114 return {self, TraceTrait<T>::Trace};
0115 }
0116 };
0117
0118 template <typename T>
0119 struct TraceTraitImpl<T, true> {
0120 static TraceDescriptor GetTraceDescriptor(const void* self) {
0121 return internal::TraceTraitFromInnerAddressImpl::GetTraceDescriptor(self);
0122 }
0123 };
0124
0125 }
0126 }
0127
0128 #endif