|  | // Copyright 2020 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef INCLUDE_CPPGC_LIVENESS_BROKER_H_ | 
|  | #define INCLUDE_CPPGC_LIVENESS_BROKER_H_ | 
|  |  | 
|  | #include "cppgc/heap.h" | 
|  | #include "cppgc/member.h" | 
|  | #include "cppgc/trace-trait.h" | 
|  | #include "v8config.h"  // NOLINT(build/include_directory) | 
|  |  | 
|  | namespace cppgc { | 
|  |  | 
|  | namespace internal { | 
|  | class LivenessBrokerFactory; | 
|  | }  // namespace internal | 
|  |  | 
|  | /** | 
|  | * The broker is passed to weak callbacks to allow (temporarily) querying | 
|  | * the liveness state of an object. References to non-live objects must be | 
|  | * cleared when `IsHeapObjectAlive()` returns false. | 
|  | * | 
|  | * \code | 
|  | * class GCedWithCustomWeakCallback final | 
|  | *   : public GarbageCollected<GCedWithCustomWeakCallback> { | 
|  | *  public: | 
|  | *   UntracedMember<Bar> bar; | 
|  | * | 
|  | *   void CustomWeakCallbackMethod(const LivenessBroker& broker) { | 
|  | *     if (!broker.IsHeapObjectAlive(bar)) | 
|  | *       bar = nullptr; | 
|  | *   } | 
|  | * | 
|  | *   void Trace(cppgc::Visitor* visitor) const { | 
|  | *     visitor->RegisterWeakCallbackMethod< | 
|  | *         GCedWithCustomWeakCallback, | 
|  | *         &GCedWithCustomWeakCallback::CustomWeakCallbackMethod>(this); | 
|  | *   } | 
|  | * }; | 
|  | * \endcode | 
|  | */ | 
|  | class V8_EXPORT LivenessBroker final { | 
|  | public: | 
|  | template <typename T> | 
|  | bool IsHeapObjectAlive(const T* object) const { | 
|  | return object && | 
|  | IsHeapObjectAliveImpl( | 
|  | TraceTrait<T>::GetTraceDescriptor(object).base_object_payload); | 
|  | } | 
|  |  | 
|  | template <typename T> | 
|  | bool IsHeapObjectAlive(const UntracedMember<T>& untraced_member) const { | 
|  | return (untraced_member != kSentinelPointer) && | 
|  | IsHeapObjectAlive<T>(untraced_member.Get()); | 
|  | } | 
|  |  | 
|  | private: | 
|  | LivenessBroker() = default; | 
|  |  | 
|  | bool IsHeapObjectAliveImpl(const void*) const; | 
|  |  | 
|  | friend class internal::LivenessBrokerFactory; | 
|  | }; | 
|  |  | 
|  | }  // namespace cppgc | 
|  |  | 
|  | #endif  // INCLUDE_CPPGC_LIVENESS_BROKER_H_ |