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 63699879 : 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 801429957 : 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 141743112 : TYPED_VISITOR_ID_LIST(CASE)
44 : #undef CASE
45 : case kVisitShortcutCandidate:
46 : return visitor->VisitShortcutCandidate(
47 3637257 : map, ConcreteVisitor::template Cast<ConsString>(object));
48 : case kVisitDataObject:
49 : return visitor->VisitDataObject(map, object);
50 : case kVisitJSObjectFast:
51 : return visitor->VisitJSObjectFast(
52 55651566 : map, ConcreteVisitor::template Cast<JSObject>(object));
53 : case kVisitJSApiObject:
54 : return visitor->VisitJSApiObject(
55 81821 : 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 kVisitorIdCount:
63 0 : UNREACHABLE();
64 : }
65 0 : UNREACHABLE();
66 : // Make the compiler happy.
67 : return ResultType();
68 : }
69 :
70 : template <typename ResultType, typename ConcreteVisitor>
71 : void HeapVisitor<ResultType, ConcreteVisitor>::VisitMapPointer(
72 : HeapObject host, MapWordSlot map_slot) {
73 : DCHECK(!host->map_word().IsForwardingAddress());
74 415426481 : static_cast<ConcreteVisitor*>(this)->VisitPointer(host, ObjectSlot(map_slot));
75 : }
76 :
77 : #define VISIT(TypeName, Type) \
78 : template <typename ResultType, typename ConcreteVisitor> \
79 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##TypeName( \
80 : Map map, Type object) { \
81 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this); \
82 : if (!visitor->ShouldVisit(object)) return ResultType(); \
83 : if (!visitor->AllowDefaultJSObjectVisit()) { \
84 : DCHECK_WITH_MSG(!map->IsJSObjectMap(), \
85 : "Implement custom visitor for new JSObject subclass in " \
86 : "concurrent marker"); \
87 : } \
88 : int size = TypeName::BodyDescriptor::SizeOf(map, object); \
89 : if (visitor->ShouldVisitMapPointer()) \
90 : visitor->VisitMapPointer(object, object->map_slot()); \
91 : TypeName::BodyDescriptor::IterateBody(map, object, size, visitor); \
92 : return static_cast<ResultType>(size); \
93 : }
94 656249300 : TYPED_VISITOR_ID_LIST(VISIT)
95 : #undef VISIT
96 :
97 : template <typename ResultType, typename ConcreteVisitor>
98 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
99 : Map map, ConsString object) {
100 3637489 : return static_cast<ConcreteVisitor*>(this)->VisitConsString(map, object);
101 : }
102 :
103 : template <typename ResultType, typename ConcreteVisitor>
104 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject(
105 : Map map, HeapObject object) {
106 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
107 13640499 : if (!visitor->ShouldVisit(object)) return ResultType();
108 27317387 : int size = map->instance_size();
109 : if (visitor->ShouldVisitMapPointer()) {
110 13643195 : visitor->VisitMapPointer(object, object->map_slot());
111 : }
112 : return static_cast<ResultType>(size);
113 : }
114 :
115 : template <typename ResultType, typename ConcreteVisitor>
116 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
117 : Map map, JSObject object) {
118 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
119 : if (!visitor->ShouldVisit(object)) return ResultType();
120 45347137 : int size = JSObject::FastBodyDescriptor::SizeOf(map, object);
121 : if (visitor->ShouldVisitMapPointer())
122 : visitor->VisitMapPointer(object, object->map_slot());
123 45351525 : JSObject::FastBodyDescriptor::IterateBody(map, object, size, visitor);
124 : return static_cast<ResultType>(size);
125 : }
126 :
127 : template <typename ResultType, typename ConcreteVisitor>
128 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
129 : Map map, JSObject object) {
130 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
131 : if (!visitor->ShouldVisit(object)) return ResultType();
132 : int size = JSObject::BodyDescriptor::SizeOf(map, object);
133 : if (visitor->ShouldVisitMapPointer())
134 : visitor->VisitMapPointer(object, object->map_slot());
135 : JSObject::BodyDescriptor::IterateBody(map, object, size, visitor);
136 : return static_cast<ResultType>(size);
137 : }
138 :
139 : template <typename ResultType, typename ConcreteVisitor>
140 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
141 : Map map, HeapObject object) {
142 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
143 12838907 : if (!visitor->ShouldVisit(object)) return ResultType();
144 21069271 : int size = map->instance_size();
145 : if (visitor->ShouldVisitMapPointer()) {
146 12842063 : visitor->VisitMapPointer(object, object->map_slot());
147 : }
148 21060383 : StructBodyDescriptor::IterateBody(map, object, size, visitor);
149 : return static_cast<ResultType>(size);
150 : }
151 :
152 : template <typename ResultType, typename ConcreteVisitor>
153 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitFreeSpace(
154 : Map map, FreeSpace object) {
155 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
156 0 : if (!visitor->ShouldVisit(object)) return ResultType();
157 : if (visitor->ShouldVisitMapPointer()) {
158 0 : visitor->VisitMapPointer(object, object->map_slot());
159 : }
160 2 : return static_cast<ResultType>(object->size());
161 : }
162 :
163 : template <typename ConcreteVisitor>
164 : int NewSpaceVisitor<ConcreteVisitor>::VisitNativeContext(Map map,
165 : NativeContext object) {
166 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
167 0 : int size = NativeContext::BodyDescriptor::SizeOf(map, object);
168 0 : NativeContext::BodyDescriptor::IterateBody(map, object, size, visitor);
169 : return size;
170 : }
171 :
172 : template <typename ConcreteVisitor>
173 : int NewSpaceVisitor<ConcreteVisitor>::VisitJSApiObject(Map map,
174 : JSObject object) {
175 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
176 0 : return visitor->VisitJSObject(map, object);
177 : }
178 :
179 : template <typename ConcreteVisitor>
180 0 : int NewSpaceVisitor<ConcreteVisitor>::VisitSharedFunctionInfo(
181 : Map map, SharedFunctionInfo object) {
182 0 : UNREACHABLE();
183 : return 0;
184 : }
185 :
186 : template <typename ConcreteVisitor>
187 0 : int NewSpaceVisitor<ConcreteVisitor>::VisitJSWeakCell(Map map,
188 : JSWeakCell js_weak_cell) {
189 0 : UNREACHABLE();
190 : return 0;
191 : }
192 :
193 : template <typename ResultType, typename ConcreteVisitor>
194 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitWeakArray(
195 : Map map, HeapObject object) {
196 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
197 1413905 : if (!visitor->ShouldVisit(object)) return ResultType();
198 3502738 : int size = WeakArrayBodyDescriptor::SizeOf(map, object);
199 : if (visitor->ShouldVisitMapPointer()) {
200 1413500 : visitor->VisitMapPointer(object, object->map_slot());
201 : }
202 3501277 : WeakArrayBodyDescriptor::IterateBody(map, object, size, visitor);
203 : return size;
204 : }
205 :
206 : } // namespace internal
207 : } // namespace v8
208 :
209 : #endif // V8_HEAP_OBJECTS_VISITING_INL_H_
|