v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
heap-visitor.h
Go to the documentation of this file.
1// Copyright 2020 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_HEAP_CPPGC_HEAP_VISITOR_H_
6#define V8_HEAP_CPPGC_HEAP_VISITOR_H_
7
11
12namespace cppgc {
13namespace internal {
14
15// Visitor for heap, which also implements the accept (traverse) interface.
16// Implements preorder traversal of the heap. The order of traversal is defined.
17// Implemented as a CRTP visitor to avoid virtual calls and support better
18// inlining.
19template <typename Derived>
21 public:
23 if (VisitHeapImpl(heap)) return;
24 for (auto& space : heap) {
25 Traverse(*space.get());
26 }
27 }
28
29 void Traverse(BaseSpace& space) {
30 const bool is_stopped =
31 space.is_large()
34 if (is_stopped) return;
35 for (auto* page : space) {
36 Traverse(*page);
37 }
38 }
39
40 void Traverse(BasePage& page) {
41 if (page.is_large()) {
42 auto* large_page = LargePage::From(&page);
43 if (VisitLargePageImpl(*large_page)) return;
44 VisitHeapObjectHeaderImpl(*large_page->ObjectHeader());
45 } else {
46 auto* normal_page = NormalPage::From(&page);
47 if (VisitNormalPageImpl(*normal_page)) return;
48 for (auto& header : *normal_page) {
50 }
51 }
52 }
53
54 protected:
55 // Visitor functions return true if no deeper processing is required.
56 // Users are supposed to override functions that need special treatment.
57 bool VisitHeap(RawHeap&) { return false; }
58 bool VisitNormalPageSpace(NormalPageSpace&) { return false; }
59 bool VisitLargePageSpace(LargePageSpace&) { return false; }
60 bool VisitNormalPage(NormalPage&) { return false; }
61 bool VisitLargePage(LargePage&) { return false; }
62 bool VisitHeapObjectHeader(HeapObjectHeader&) { return false; }
63
64 private:
65 Derived& ToDerived() { return static_cast<Derived&>(*this); }
66
67 bool VisitHeapImpl(RawHeap& heap) { return ToDerived().VisitHeap(heap); }
69 return ToDerived().VisitNormalPageSpace(space);
70 }
72 return ToDerived().VisitLargePageSpace(space);
73 }
75 return ToDerived().VisitNormalPage(page);
76 }
78 return ToDerived().VisitLargePage(page);
79 }
81 return ToDerived().VisitHeapObjectHeader(header);
82 }
83};
84
85} // namespace internal
86} // namespace cppgc
87
88#endif // V8_HEAP_CPPGC_HEAP_VISITOR_H_
bool VisitHeapImpl(RawHeap &heap)
void Traverse(RawHeap &heap)
bool VisitHeapObjectHeader(HeapObjectHeader &)
void Traverse(BaseSpace &space)
bool VisitHeapObjectHeaderImpl(HeapObjectHeader &header)
bool VisitLargePageImpl(LargePage &page)
bool VisitLargePage(LargePage &)
bool VisitNormalPageSpaceImpl(NormalPageSpace &space)
bool VisitLargePageSpaceImpl(LargePageSpace &space)
bool VisitNormalPageSpace(NormalPageSpace &)
void Traverse(BasePage &page)
bool VisitNormalPageImpl(NormalPage &page)
bool VisitLargePageSpace(LargePageSpace &)
bool VisitNormalPage(NormalPage &)
static LargePageSpace & From(BaseSpace &space)
Definition heap-space.h:118
static LargePage * From(BasePage *page)
Definition heap-page.h:275
static NormalPageSpace & From(BaseSpace &space)
Definition heap-space.h:93
static NormalPage * From(BasePage *page)
Definition heap-page.h:205