| // 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 V8_HEAP_CPPGC_MARKING_VERIFIER_H_ | 
 | #define V8_HEAP_CPPGC_MARKING_VERIFIER_H_ | 
 |  | 
 | #include <unordered_set> | 
 |  | 
 | #include "src/heap/base/stack.h" | 
 | #include "src/heap/cppgc/heap-object-header.h" | 
 | #include "src/heap/cppgc/heap-visitor.h" | 
 | #include "src/heap/cppgc/heap.h" | 
 | #include "src/heap/cppgc/visitor.h" | 
 |  | 
 | namespace cppgc { | 
 | namespace internal { | 
 |  | 
 | class VerificationState { | 
 |  public: | 
 |   void VerifyMarked(const void*) const; | 
 |   void SetCurrentParent(const HeapObjectHeader* header) { parent_ = header; } | 
 |  | 
 |  private: | 
 |   const HeapObjectHeader* parent_ = nullptr; | 
 | }; | 
 |  | 
 | class V8_EXPORT_PRIVATE MarkingVerifierBase | 
 |     : private HeapVisitor<MarkingVerifierBase>, | 
 |       public ConservativeTracingVisitor, | 
 |       public heap::base::StackVisitor { | 
 |   friend class HeapVisitor<MarkingVerifierBase>; | 
 |  | 
 |  public: | 
 |   ~MarkingVerifierBase() override = default; | 
 |  | 
 |   MarkingVerifierBase(const MarkingVerifierBase&) = delete; | 
 |   MarkingVerifierBase& operator=(const MarkingVerifierBase&) = delete; | 
 |  | 
 |   void Run(Heap::Config::StackState); | 
 |  | 
 |  protected: | 
 |   MarkingVerifierBase(HeapBase&, std::unique_ptr<cppgc::Visitor>); | 
 |  | 
 |   virtual void SetCurrentParent(const HeapObjectHeader*) = 0; | 
 |  | 
 |  private: | 
 |   void VisitInConstructionConservatively(HeapObjectHeader&, | 
 |                                          TraceConservativelyCallback) final; | 
 |   void VisitPointer(const void*) final; | 
 |  | 
 |   bool VisitHeapObjectHeader(HeapObjectHeader*); | 
 |  | 
 |   std::unique_ptr<cppgc::Visitor> visitor_; | 
 |  | 
 |   std::unordered_set<const HeapObjectHeader*> in_construction_objects_heap_; | 
 |   std::unordered_set<const HeapObjectHeader*> in_construction_objects_stack_; | 
 |   std::unordered_set<const HeapObjectHeader*>* in_construction_objects_ = | 
 |       &in_construction_objects_heap_; | 
 | }; | 
 |  | 
 | class V8_EXPORT_PRIVATE MarkingVerifier final : public MarkingVerifierBase { | 
 |  public: | 
 |   explicit MarkingVerifier(HeapBase&); | 
 |   ~MarkingVerifier() final = default; | 
 |  | 
 |   void SetCurrentParent(const HeapObjectHeader*) final; | 
 |  | 
 |  private: | 
 |   VerificationState state_; | 
 | }; | 
 |  | 
 | }  // namespace internal | 
 | }  // namespace cppgc | 
 |  | 
 | #endif  // V8_HEAP_CPPGC_MARKING_VERIFIER_H_ |