• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright 2012 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_OBJECTS_VISITING_H_
6  #define V8_HEAP_OBJECTS_VISITING_H_
7  
8  #include "src/objects/fixed-array.h"
9  #include "src/objects/map.h"
10  #include "src/objects/objects.h"
11  #include "src/objects/visitors.h"
12  
13  namespace v8 {
14  namespace internal {
15  
16  #define TYPED_VISITOR_ID_LIST(V)        \
17    V(AllocationSite)                     \
18    V(BigInt)                             \
19    V(ByteArray)                          \
20    V(BytecodeArray)                      \
21    V(Cell)                               \
22    V(Code)                               \
23    V(CodeDataContainer)                  \
24    V(CoverageInfo)                       \
25    V(DataHandler)                        \
26    V(EmbedderDataArray)                  \
27    V(EphemeronHashTable)                 \
28    V(FeedbackCell)                       \
29    V(FeedbackMetadata)                   \
30    V(FixedDoubleArray)                   \
31    V(JSArrayBuffer)                      \
32    V(JSDataView)                         \
33    V(JSExternalObject)                   \
34    V(JSFinalizationRegistry)             \
35    V(JSFunction)                         \
36    V(JSObject)                           \
37    V(JSTypedArray)                       \
38    V(WeakCell)                           \
39    V(JSWeakCollection)                   \
40    V(JSWeakRef)                          \
41    V(Map)                                \
42    V(NativeContext)                      \
43    V(Oddball)                            \
44    V(PreparseData)                       \
45    V(PromiseOnStack)                     \
46    V(PropertyArray)                      \
47    V(PropertyCell)                       \
48    V(PrototypeInfo)                      \
49    V(SmallOrderedHashMap)                \
50    V(SmallOrderedHashSet)                \
51    V(SmallOrderedNameDictionary)         \
52    V(SourceTextModule)                   \
53    V(SwissNameDictionary)                \
54    V(Symbol)                             \
55    V(SyntheticModule)                    \
56    V(TransitionArray)                    \
57    IF_WASM(V, WasmApiFunctionRef)        \
58    IF_WASM(V, WasmArray)                 \
59    IF_WASM(V, WasmCapiFunctionData)      \
60    IF_WASM(V, WasmExportedFunctionData)  \
61    IF_WASM(V, WasmFunctionData)          \
62    IF_WASM(V, WasmIndirectFunctionTable) \
63    IF_WASM(V, WasmInstanceObject)        \
64    IF_WASM(V, WasmInternalFunction)      \
65    IF_WASM(V, WasmJSFunctionData)        \
66    IF_WASM(V, WasmStruct)                \
67    IF_WASM(V, WasmSuspenderObject)       \
68    IF_WASM(V, WasmOnFulfilledData)       \
69    IF_WASM(V, WasmTypeInfo)
70  
71  #define FORWARD_DECLARE(TypeName) class TypeName;
72  TYPED_VISITOR_ID_LIST(FORWARD_DECLARE)
TORQUE_VISITOR_ID_LIST(FORWARD_DECLARE)73  TORQUE_VISITOR_ID_LIST(FORWARD_DECLARE)
74  #undef FORWARD_DECLARE
75  
76  // The base class for visitors that need to dispatch on object type. The default
77  // behavior of all visit functions is to iterate body of the given object using
78  // the BodyDescriptor of the object.
79  //
80  // The visit functions return the size of the object cast to ResultType.
81  //
82  // This class is intended to be used in the following way:
83  //
84  //   class SomeVisitor : public HeapVisitor<ResultType, SomeVisitor> {
85  //     ...
86  //   }
87  template <typename ResultType, typename ConcreteVisitor>
88  class HeapVisitor : public ObjectVisitorWithCageBases {
89   public:
90    inline HeapVisitor(PtrComprCageBase cage_base,
91                       PtrComprCageBase code_cage_base);
92    inline explicit HeapVisitor(Isolate* isolate);
93    inline explicit HeapVisitor(Heap* heap);
94  
95    V8_INLINE ResultType Visit(HeapObject object);
96    V8_INLINE ResultType Visit(Map map, HeapObject object);
97    // A callback for visiting the map pointer in the object header.
98    V8_INLINE void VisitMapPointer(HeapObject host);
99  
100   protected:
101    // A guard predicate for visiting the object.
102    // If it returns false then the default implementations of the Visit*
103    // functions bailout from iterating the object pointers.
104    V8_INLINE bool ShouldVisit(HeapObject object) { return true; }
105    // Guard predicate for visiting the objects map pointer separately.
106    V8_INLINE bool ShouldVisitMapPointer() { return true; }
107    // If this predicate returns false, then the heap visitor will fail
108    // in default Visit implemention for subclasses of JSObject.
109    V8_INLINE bool AllowDefaultJSObjectVisit() { return true; }
110  
111  #define VISIT(TypeName) \
112    V8_INLINE ResultType Visit##TypeName(Map map, TypeName object);
113    TYPED_VISITOR_ID_LIST(VISIT)
114    TORQUE_VISITOR_ID_LIST(VISIT)
115  #undef VISIT
116    V8_INLINE ResultType VisitShortcutCandidate(Map map, ConsString object);
117    V8_INLINE ResultType VisitDataObject(Map map, HeapObject object);
118    V8_INLINE ResultType VisitJSObjectFast(Map map, JSObject object);
119    V8_INLINE ResultType VisitJSApiObject(Map map, JSObject object);
120    V8_INLINE ResultType VisitStruct(Map map, HeapObject object);
121    V8_INLINE ResultType VisitFreeSpace(Map map, FreeSpace object);
122  
123    template <typename T>
124    static V8_INLINE T Cast(HeapObject object);
125  };
126  
127  template <typename ConcreteVisitor>
128  class NewSpaceVisitor : public HeapVisitor<int, ConcreteVisitor> {
129   public:
130    V8_INLINE NewSpaceVisitor(Isolate* isolate);
131  
ShouldVisitMapPointer()132    V8_INLINE bool ShouldVisitMapPointer() { return false; }
133  
134    // Special cases for young generation.
135  
136    V8_INLINE int VisitNativeContext(Map map, NativeContext object);
137    V8_INLINE int VisitJSApiObject(Map map, JSObject object);
138  
VisitBytecodeArray(Map map,BytecodeArray object)139    int VisitBytecodeArray(Map map, BytecodeArray object) {
140      UNREACHABLE();
141      return 0;
142    }
143  
144    int VisitSharedFunctionInfo(Map map, SharedFunctionInfo object);
145    int VisitWeakCell(Map map, WeakCell weak_cell);
146  };
147  
148  class WeakObjectRetainer;
149  
150  // A weak list is single linked list where each element has a weak pointer to
151  // the next element. Given the head of the list, this function removes dead
152  // elements from the list and if requested records slots for next-element
153  // pointers. The template parameter T is a WeakListVisitor that defines how to
154  // access the next-element pointers.
155  template <class T>
156  Object VisitWeakList(Heap* heap, Object list, WeakObjectRetainer* retainer);
157  }  // namespace internal
158  }  // namespace v8
159  
160  #endif  // V8_HEAP_OBJECTS_VISITING_H_
161