Line data Source code
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_INL_H_
6 : #define V8_HEAP_OBJECTS_VISITING_INL_H_
7 :
8 : #include "src/heap/objects-visiting.h"
9 :
10 : #include "src/heap/array-buffer-tracker.h"
11 : #include "src/heap/embedder-tracing.h"
12 : #include "src/heap/mark-compact.h"
13 : #include "src/objects-body-descriptors-inl.h"
14 : #include "src/objects-inl.h"
15 : #include "src/objects/free-space-inl.h"
16 : #include "src/objects/js-weak-refs-inl.h"
17 : #include "src/objects/oddball.h"
18 : #include "src/objects/ordered-hash-table.h"
19 : #include "src/wasm/wasm-objects.h"
20 :
21 : namespace v8 {
22 : namespace internal {
23 :
24 : template <typename ResultType, typename ConcreteVisitor>
25 : template <typename T>
26 : T HeapVisitor<ResultType, ConcreteVisitor>::Cast(HeapObject object) {
27 : return T::cast(object);
28 : }
29 :
30 : template <typename ResultType, typename ConcreteVisitor>
31 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(HeapObject object) {
32 : return Visit(object->map(), object);
33 : }
34 :
35 : template <typename ResultType, typename ConcreteVisitor>
36 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(Map map,
37 : HeapObject object) {
38 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
39 689215804 : switch (map->visitor_id()) {
40 : #define CASE(TypeName, Type) \
41 : case kVisit##TypeName: \
42 : return visitor->Visit##TypeName( \
43 : map, ConcreteVisitor::template Cast<TypeName>(object));
44 47808989 : TYPED_VISITOR_ID_LIST(CASE)
45 : #undef CASE
46 : case kVisitShortcutCandidate:
47 : return visitor->VisitShortcutCandidate(
48 : map, ConcreteVisitor::template Cast<ConsString>(object));
49 : case kVisitDataObject:
50 : return visitor->VisitDataObject(map, object);
51 : case kVisitJSObjectFast:
52 : return visitor->VisitJSObjectFast(
53 11865425 : map, ConcreteVisitor::template Cast<JSObject>(object));
54 : case kVisitJSApiObject:
55 : return visitor->VisitJSApiObject(
56 71542 : map, ConcreteVisitor::template Cast<JSObject>(object));
57 : case kVisitStruct:
58 0 : return visitor->VisitStruct(map, object);
59 : case kVisitFreeSpace:
60 : return visitor->VisitFreeSpace(map, FreeSpace::cast(object));
61 : case kVisitWeakArray:
62 0 : return visitor->VisitWeakArray(map, object);
63 : case kDataOnlyVisitorIdCount:
64 : case kVisitorIdCount:
65 0 : UNREACHABLE();
66 : }
67 0 : UNREACHABLE();
68 : // Make the compiler happy.
69 : return ResultType();
70 : }
71 :
72 : template <typename ResultType, typename ConcreteVisitor>
73 : void HeapVisitor<ResultType, ConcreteVisitor>::VisitMapPointer(
74 : HeapObject host, MapWordSlot map_slot) {
75 : DCHECK(!host->map_word().IsForwardingAddress());
76 124105072 : static_cast<ConcreteVisitor*>(this)->VisitPointer(host, ObjectSlot(map_slot));
77 : }
78 :
79 : #define VISIT(TypeName, Type) \
80 : template <typename ResultType, typename ConcreteVisitor> \
81 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##TypeName( \
82 : Map map, Type object) { \
83 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this); \
84 : if (!visitor->ShouldVisit(object)) return ResultType(); \
85 : if (!visitor->AllowDefaultJSObjectVisit()) { \
86 : DCHECK_WITH_MSG(!map->IsJSObjectMap(), \
87 : "Implement custom visitor for new JSObject subclass in " \
88 : "concurrent marker"); \
89 : } \
90 : int size = TypeName::BodyDescriptor::SizeOf(map, object); \
91 : if (visitor->ShouldVisitMapPointer()) \
92 : visitor->VisitMapPointer(object, object->map_slot()); \
93 : TypeName::BodyDescriptor::IterateBody(map, object, size, visitor); \
94 : return static_cast<ResultType>(size); \
95 : }
96 202850457 : TYPED_VISITOR_ID_LIST(VISIT)
97 : #undef VISIT
98 :
99 : template <typename ResultType, typename ConcreteVisitor>
100 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
101 : Map map, ConsString object) {
102 9164424 : return static_cast<ConcreteVisitor*>(this)->VisitConsString(map, object);
103 : }
104 :
105 : template <typename ResultType, typename ConcreteVisitor>
106 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject(
107 : Map map, HeapObject object) {
108 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
109 10336973 : if (!visitor->ShouldVisit(object)) return ResultType();
110 4153605 : int size = map->instance_size();
111 : if (visitor->ShouldVisitMapPointer()) {
112 : visitor->VisitMapPointer(object, object->map_slot());
113 : }
114 : return static_cast<ResultType>(size);
115 : }
116 :
117 : template <typename ResultType, typename ConcreteVisitor>
118 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
119 : Map map, JSObject object) {
120 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
121 : if (!visitor->ShouldVisit(object)) return ResultType();
122 3395227 : int size = JSObject::FastBodyDescriptor::SizeOf(map, object);
123 : if (visitor->ShouldVisitMapPointer())
124 : visitor->VisitMapPointer(object, object->map_slot());
125 3395227 : JSObject::FastBodyDescriptor::IterateBody(map, object, size, visitor);
126 : return static_cast<ResultType>(size);
127 : }
128 :
129 : template <typename ResultType, typename ConcreteVisitor>
130 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
131 : Map map, JSObject object) {
132 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
133 : if (!visitor->ShouldVisit(object)) return ResultType();
134 : int size = JSObject::BodyDescriptor::SizeOf(map, object);
135 : if (visitor->ShouldVisitMapPointer())
136 : visitor->VisitMapPointer(object, object->map_slot());
137 : JSObject::BodyDescriptor::IterateBody(map, object, size, visitor);
138 : return static_cast<ResultType>(size);
139 : }
140 :
141 : template <typename ResultType, typename ConcreteVisitor>
142 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
143 : Map map, HeapObject object) {
144 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
145 12156631 : if (!visitor->ShouldVisit(object)) return ResultType();
146 457268 : int size = map->instance_size();
147 : if (visitor->ShouldVisitMapPointer()) {
148 : visitor->VisitMapPointer(object, object->map_slot());
149 : }
150 457268 : StructBodyDescriptor::IterateBody(map, object, size, visitor);
151 : return static_cast<ResultType>(size);
152 : }
153 :
154 : template <typename ResultType, typename ConcreteVisitor>
155 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitFreeSpace(
156 : Map map, FreeSpace object) {
157 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
158 0 : if (!visitor->ShouldVisit(object)) return ResultType();
159 : if (visitor->ShouldVisitMapPointer()) {
160 : visitor->VisitMapPointer(object, object->map_slot());
161 : }
162 0 : return static_cast<ResultType>(object->size());
163 : }
164 :
165 : template <typename ResultType, typename ConcreteVisitor>
166 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitWeakArray(
167 : Map map, HeapObject object) {
168 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
169 1315198 : if (!visitor->ShouldVisit(object)) return ResultType();
170 850083 : int size = WeakArrayBodyDescriptor::SizeOf(map, object);
171 : if (visitor->ShouldVisitMapPointer()) {
172 : visitor->VisitMapPointer(object, object->map_slot());
173 : }
174 850083 : WeakArrayBodyDescriptor::IterateBody(map, object, size, visitor);
175 : return size;
176 : }
177 :
178 : template <typename ConcreteVisitor>
179 : int NewSpaceVisitor<ConcreteVisitor>::VisitNativeContext(Map map,
180 : NativeContext object) {
181 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
182 : int size = NativeContext::BodyDescriptor::SizeOf(map, object);
183 0 : NativeContext::BodyDescriptor::IterateBody(map, object, size, visitor);
184 : return size;
185 : }
186 :
187 : template <typename ConcreteVisitor>
188 : int NewSpaceVisitor<ConcreteVisitor>::VisitJSApiObject(Map map,
189 : JSObject object) {
190 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
191 0 : return visitor->VisitJSObject(map, object);
192 : }
193 :
194 : template <typename ConcreteVisitor>
195 0 : int NewSpaceVisitor<ConcreteVisitor>::VisitSharedFunctionInfo(
196 : Map map, SharedFunctionInfo object) {
197 0 : UNREACHABLE();
198 : return 0;
199 : }
200 :
201 : template <typename ConcreteVisitor>
202 0 : int NewSpaceVisitor<ConcreteVisitor>::VisitWeakCell(Map map,
203 : WeakCell weak_cell) {
204 0 : UNREACHABLE();
205 : return 0;
206 : }
207 :
208 : } // namespace internal
209 : } // namespace v8
210 :
211 : #endif // V8_HEAP_OBJECTS_VISITING_INL_H_
|