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