Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-22 10:42:26

0001 // Copyright 2020 the V8 project authors. All rights reserved.
0002 // Use of this source code is governed by a BSD-style license that can be
0003 // found in the LICENSE file.
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 // Implementation of the default TraceTrait handling GarbageCollected and
0024 // GarbageCollectedMixin.
0025 template <typename T,
0026           bool =
0027               IsGarbageCollectedMixinTypeV<typename std::remove_const<T>::type>>
0028 struct TraceTraitImpl;
0029 
0030 }  // namespace internal
0031 
0032 /**
0033  * Callback for invoking tracing on a given object.
0034  *
0035  * \param visitor The visitor to dispatch to.
0036  * \param object The object to invoke tracing on.
0037  */
0038 using TraceCallback = void (*)(Visitor* visitor, const void* object);
0039 
0040 /**
0041  * Describes how to trace an object, i.e., how to visit all Oilpan-relevant
0042  * fields of an object.
0043  */
0044 struct TraceDescriptor {
0045   /**
0046    * Adjusted base pointer, i.e., the pointer to the class inheriting directly
0047    * from GarbageCollected, of the object that is being traced.
0048    */
0049   const void* base_object_payload;
0050   /**
0051    * Callback for tracing the object.
0052    */
0053   TraceCallback callback;
0054 };
0055 
0056 /**
0057  * Callback for getting a TraceDescriptor for a given address.
0058  *
0059  * \param address Possibly inner address of an object.
0060  * \returns a TraceDescriptor for the provided address.
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  * Trait specifying how the garbage collector processes an object of type T.
0072  *
0073  * Advanced users may override handling by creating a specialization for their
0074  * type.
0075  */
0076 template <typename T>
0077 struct TraceTraitBase {
0078   static_assert(internal::IsTraceableV<T>, "T must have a Trace() method");
0079 
0080   /**
0081    * Accessor for retrieving a TraceDescriptor to process an object of type T.
0082    *
0083    * \param self The object to be processed.
0084    * \returns a TraceDescriptor to process the object.
0085    */
0086   static TraceDescriptor GetTraceDescriptor(const void* self) {
0087     return internal::TraceTraitImpl<T>::GetTraceDescriptor(
0088         static_cast<const T*>(self));
0089   }
0090 
0091   /**
0092    * Function invoking the tracing for an object of type T.
0093    *
0094    * \param visitor The visitor to dispatch to.
0095    * \param self The object to invoke tracing on.
0096    */
0097   static void Trace(Visitor* visitor, const void* self) {
0098     static_cast<const T*>(self)->Trace(visitor);
0099   }
0100 };
0101 
0102 }  // namespace internal
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 }  // namespace internal
0126 }  // namespace cppgc
0127 
0128 #endif  // INCLUDE_CPPGC_TRACE_TRAIT_H_