OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_OBJECTS_VISITING_H_ | 5 #ifndef V8_OBJECTS_VISITING_H_ |
6 #define V8_OBJECTS_VISITING_H_ | 6 #define V8_OBJECTS_VISITING_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/layout-descriptor.h" | 9 #include "src/layout-descriptor.h" |
10 | 10 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 // Visitor ID should fit in one byte. | 104 // Visitor ID should fit in one byte. |
105 STATIC_ASSERT(kVisitorIdCount <= 256); | 105 STATIC_ASSERT(kVisitorIdCount <= 256); |
106 | 106 |
107 // Determine which specialized visitor should be used for given instance type | 107 // Determine which specialized visitor should be used for given instance type |
108 // and instance type. | 108 // and instance type. |
109 static VisitorId GetVisitorId(int instance_type, int instance_size, | 109 static VisitorId GetVisitorId(int instance_type, int instance_size, |
110 bool has_unboxed_fields); | 110 bool has_unboxed_fields); |
111 | 111 |
112 // Determine which specialized visitor should be used for given map. | 112 // Determine which specialized visitor should be used for given map. |
113 static VisitorId GetVisitorId(Map* map) { | 113 static VisitorId GetVisitorId(Map* map) { |
114 return GetVisitorId(map->instance_type(), map->instance_size(), | 114 return GetVisitorId( |
115 FLAG_unbox_double_fields && | 115 map->instance_type(), map->instance_size(), |
116 !map->layout_descriptor()->IsFastPointerLayout()); | 116 FLAG_unbox_double_fields && !map->HasFastPointerLayout()); |
117 } | 117 } |
118 | 118 |
119 // For visitors that allow specialization by size calculate VisitorId based | 119 // For visitors that allow specialization by size calculate VisitorId based |
120 // on size, base visitor id and generic visitor id. | 120 // on size, base visitor id and generic visitor id. |
121 static VisitorId GetVisitorIdForSize(VisitorId base, VisitorId generic, | 121 static VisitorId GetVisitorIdForSize(VisitorId base, VisitorId generic, |
122 int object_size, | 122 int object_size, |
123 bool has_unboxed_fields) { | 123 bool has_unboxed_fields) { |
124 DCHECK((base == kVisitDataObject) || (base == kVisitStruct) || | 124 DCHECK((base == kVisitDataObject) || (base == kVisitStruct) || |
125 (base == kVisitJSObject)); | 125 (base == kVisitJSObject)); |
126 DCHECK(IsAligned(object_size, kPointerSize)); | 126 DCHECK(IsAligned(object_size, kPointerSize)); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 private: | 191 private: |
192 base::AtomicWord callbacks_[StaticVisitorBase::kVisitorIdCount]; | 192 base::AtomicWord callbacks_[StaticVisitorBase::kVisitorIdCount]; |
193 }; | 193 }; |
194 | 194 |
195 | 195 |
196 template <typename StaticVisitor> | 196 template <typename StaticVisitor> |
197 class BodyVisitorBase : public AllStatic { | 197 class BodyVisitorBase : public AllStatic { |
198 public: | 198 public: |
199 INLINE(static void IteratePointers(Heap* heap, HeapObject* object, | 199 INLINE(static void IteratePointers(Heap* heap, HeapObject* object, |
200 int start_offset, int end_offset)) { | 200 int start_offset, int end_offset)) { |
201 DCHECK(!FLAG_unbox_double_fields || | 201 DCHECK(!FLAG_unbox_double_fields || object->map()->HasFastPointerLayout()); |
202 object->map()->layout_descriptor()->IsFastPointerLayout()); | |
203 IterateRawPointers(heap, object, start_offset, end_offset); | 202 IterateRawPointers(heap, object, start_offset, end_offset); |
204 } | 203 } |
205 | 204 |
206 INLINE(static void IterateBody(Heap* heap, HeapObject* object, | 205 INLINE(static void IterateBody(Heap* heap, HeapObject* object, |
207 int start_offset, int end_offset)) { | 206 int start_offset, int end_offset)) { |
208 if (!FLAG_unbox_double_fields || | 207 if (!FLAG_unbox_double_fields || object->map()->HasFastPointerLayout()) { |
209 object->map()->layout_descriptor()->IsFastPointerLayout()) { | |
210 IterateRawPointers(heap, object, start_offset, end_offset); | 208 IterateRawPointers(heap, object, start_offset, end_offset); |
211 } else { | 209 } else { |
212 IterateBodyUsingLayoutDescriptor(heap, object, start_offset, end_offset); | 210 IterateBodyUsingLayoutDescriptor(heap, object, start_offset, end_offset); |
213 } | 211 } |
214 } | 212 } |
215 | 213 |
216 private: | 214 private: |
217 INLINE(static void IterateRawPointers(Heap* heap, HeapObject* object, | 215 INLINE(static void IterateRawPointers(Heap* heap, HeapObject* object, |
218 int start_offset, int end_offset)) { | 216 int start_offset, int end_offset)) { |
219 StaticVisitor::VisitPointers(heap, | 217 StaticVisitor::VisitPointers(heap, |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 // the next element. Given the head of the list, this function removes dead | 488 // the next element. Given the head of the list, this function removes dead |
491 // elements from the list and if requested records slots for next-element | 489 // elements from the list and if requested records slots for next-element |
492 // pointers. The template parameter T is a WeakListVisitor that defines how to | 490 // pointers. The template parameter T is a WeakListVisitor that defines how to |
493 // access the next-element pointers. | 491 // access the next-element pointers. |
494 template <class T> | 492 template <class T> |
495 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer); | 493 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer); |
496 } | 494 } |
497 } // namespace v8::internal | 495 } // namespace v8::internal |
498 | 496 |
499 #endif // V8_OBJECTS_VISITING_H_ | 497 #endif // V8_OBJECTS_VISITING_H_ |
OLD | NEW |