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_OBJECTS_VISITING_INL_H_
6 : #define V8_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/macro-assembler.h"
14 : #include "src/objects-body-descriptors-inl.h"
15 :
16 : namespace v8 {
17 : namespace internal {
18 :
19 : template <typename ResultType, typename ConcreteVisitor>
20 : template <typename T>
21 : T* HeapVisitor<ResultType, ConcreteVisitor>::Cast(HeapObject* object) {
22 2519317 : return T::cast(object);
23 : }
24 :
25 : template <typename ResultType, typename ConcreteVisitor>
26 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(HeapObject* object) {
27 58170509 : return Visit(object->map(), object);
28 : }
29 :
30 : template <typename ResultType, typename ConcreteVisitor>
31 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(Map* map,
32 : HeapObject* object) {
33 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
34 762095395 : switch (static_cast<VisitorId>(map->visitor_id())) {
35 : #define CASE(type) \
36 : case kVisit##type: \
37 : return visitor->Visit##type(map, \
38 : ConcreteVisitor::template Cast<type>(object));
39 168628362 : TYPED_VISITOR_ID_LIST(CASE)
40 : #undef CASE
41 : case kVisitShortcutCandidate:
42 : return visitor->VisitShortcutCandidate(
43 12654440 : map, ConcreteVisitor::template Cast<ConsString>(object));
44 : case kVisitNativeContext:
45 : return visitor->VisitNativeContext(
46 51326 : map, ConcreteVisitor::template Cast<Context>(object));
47 : case kVisitDataObject:
48 : return visitor->VisitDataObject(map, object);
49 : case kVisitJSObjectFast:
50 : return visitor->VisitJSObjectFast(
51 9953310 : map, ConcreteVisitor::template Cast<JSObject>(object));
52 : case kVisitJSApiObject:
53 : return visitor->VisitJSApiObject(
54 49282 : map, ConcreteVisitor::template Cast<JSObject>(object));
55 : case kVisitStruct:
56 0 : return visitor->VisitStruct(map, object);
57 : case kVisitFreeSpace:
58 0 : return visitor->VisitFreeSpace(map, FreeSpace::cast(object));
59 : case kVisitorIdCount:
60 0 : UNREACHABLE();
61 : }
62 0 : UNREACHABLE();
63 : // Make the compiler happy.
64 : return ResultType();
65 : }
66 :
67 : template <typename ResultType, typename ConcreteVisitor>
68 : void HeapVisitor<ResultType, ConcreteVisitor>::VisitMapPointer(
69 : HeapObject* host, HeapObject** map) {
70 355221953 : static_cast<ConcreteVisitor*>(this)->VisitPointer(
71 : host, reinterpret_cast<Object**>(map));
72 : }
73 :
74 : #define VISIT(type) \
75 : template <typename ResultType, typename ConcreteVisitor> \
76 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##type( \
77 : Map* map, type* object) { \
78 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this); \
79 : if (!visitor->ShouldVisit(object)) return ResultType(); \
80 : int size = type::BodyDescriptor::SizeOf(map, object); \
81 : if (visitor->ShouldVisitMapPointer()) \
82 : visitor->VisitMapPointer(object, object->map_slot()); \
83 : type::BodyDescriptor::IterateBody(object, size, visitor); \
84 : return static_cast<ResultType>(size); \
85 : }
86 213519130 : TYPED_VISITOR_ID_LIST(VISIT)
87 : #undef VISIT
88 :
89 : template <typename ResultType, typename ConcreteVisitor>
90 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
91 : Map* map, ConsString* object) {
92 12651574 : return static_cast<ConcreteVisitor*>(this)->VisitConsString(map, object);
93 : }
94 :
95 : template <typename ResultType, typename ConcreteVisitor>
96 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitNativeContext(
97 : Map* map, Context* object) {
98 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
99 : if (!visitor->ShouldVisit(object)) return ResultType();
100 : int size = Context::BodyDescriptor::SizeOf(map, object);
101 : if (visitor->ShouldVisitMapPointer())
102 : visitor->VisitMapPointer(object, object->map_slot());
103 : Context::BodyDescriptor::IterateBody(object, size, visitor);
104 : return static_cast<ResultType>(size);
105 : }
106 :
107 : template <typename ResultType, typename ConcreteVisitor>
108 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject(
109 : Map* map, HeapObject* object) {
110 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
111 14386974 : if (!visitor->ShouldVisit(object)) return ResultType();
112 21223156 : int size = map->instance_size();
113 : if (visitor->ShouldVisitMapPointer())
114 14419537 : visitor->VisitMapPointer(object, object->map_slot());
115 : return static_cast<ResultType>(size);
116 : }
117 :
118 : template <typename ResultType, typename ConcreteVisitor>
119 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
120 : Map* map, JSObject* object) {
121 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
122 : if (!visitor->ShouldVisit(object)) return ResultType();
123 15599038 : int size = JSObject::FastBodyDescriptor::SizeOf(map, object);
124 : if (visitor->ShouldVisitMapPointer())
125 : visitor->VisitMapPointer(object, object->map_slot());
126 15591864 : JSObject::FastBodyDescriptor::IterateBody(object, size, visitor);
127 : return static_cast<ResultType>(size);
128 : }
129 :
130 : template <typename ResultType, typename ConcreteVisitor>
131 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
132 : Map* map, JSObject* object) {
133 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
134 : if (!visitor->ShouldVisit(object)) return ResultType();
135 : int size = JSObject::BodyDescriptor::SizeOf(map, object);
136 : if (visitor->ShouldVisitMapPointer())
137 : visitor->VisitMapPointer(object, object->map_slot());
138 : JSObject::BodyDescriptor::IterateBody(object, size, visitor);
139 : return static_cast<ResultType>(size);
140 : }
141 :
142 : template <typename ResultType, typename ConcreteVisitor>
143 : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
144 : Map* map, HeapObject* object) {
145 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
146 10592068 : if (!visitor->ShouldVisit(object)) return ResultType();
147 18382861 : int size = map->instance_size();
148 : if (visitor->ShouldVisitMapPointer())
149 10600397 : visitor->VisitMapPointer(object, object->map_slot());
150 18378504 : StructBodyDescriptor::IterateBody(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 0 : visitor->VisitMapPointer(object, object->map_slot());
161 0 : return static_cast<ResultType>(FreeSpace::cast(object)->size());
162 : }
163 :
164 : template <typename ConcreteVisitor>
165 : int NewSpaceVisitor<ConcreteVisitor>::VisitJSFunction(Map* map,
166 : JSFunction* object) {
167 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
168 877975 : int size = JSFunction::BodyDescriptorWeak::SizeOf(map, object);
169 877095 : JSFunction::BodyDescriptorWeak::IterateBody(object, size, visitor);
170 : return size;
171 : }
172 :
173 : template <typename ConcreteVisitor>
174 : int NewSpaceVisitor<ConcreteVisitor>::VisitNativeContext(Map* map,
175 : Context* object) {
176 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
177 0 : int size = Context::BodyDescriptor::SizeOf(map, object);
178 0 : Context::BodyDescriptor::IterateBody(object, size, visitor);
179 : return size;
180 : }
181 :
182 : template <typename ConcreteVisitor>
183 : int NewSpaceVisitor<ConcreteVisitor>::VisitJSApiObject(Map* map,
184 : JSObject* object) {
185 : ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
186 0 : return visitor->VisitJSObject(map, object);
187 : }
188 :
189 : } // namespace internal
190 : } // namespace v8
191 :
192 : #endif // V8_OBJECTS_VISITING_INL_H_
|