• 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