| 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/heap/heap.h" | 9 #include "src/heap/heap.h" |
| 10 #include "src/heap/spaces.h" | 10 #include "src/heap/spaces.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 V(DataObjectGeneric) \ | 51 V(DataObjectGeneric) \ |
| 52 V(JSObject2) \ | 52 V(JSObject2) \ |
| 53 V(JSObject3) \ | 53 V(JSObject3) \ |
| 54 V(JSObject4) \ | 54 V(JSObject4) \ |
| 55 V(JSObject5) \ | 55 V(JSObject5) \ |
| 56 V(JSObject6) \ | 56 V(JSObject6) \ |
| 57 V(JSObject7) \ | 57 V(JSObject7) \ |
| 58 V(JSObject8) \ | 58 V(JSObject8) \ |
| 59 V(JSObject9) \ | 59 V(JSObject9) \ |
| 60 V(JSObjectGeneric) \ | 60 V(JSObjectGeneric) \ |
| 61 V(JSApiObject2) \ |
| 62 V(JSApiObject3) \ |
| 63 V(JSApiObject4) \ |
| 64 V(JSApiObject5) \ |
| 65 V(JSApiObject6) \ |
| 66 V(JSApiObject7) \ |
| 67 V(JSApiObject8) \ |
| 68 V(JSApiObject9) \ |
| 69 V(JSApiObjectGeneric) \ |
| 61 V(Struct2) \ | 70 V(Struct2) \ |
| 62 V(Struct3) \ | 71 V(Struct3) \ |
| 63 V(Struct4) \ | 72 V(Struct4) \ |
| 64 V(Struct5) \ | 73 V(Struct5) \ |
| 65 V(Struct6) \ | 74 V(Struct6) \ |
| 66 V(Struct7) \ | 75 V(Struct7) \ |
| 67 V(Struct8) \ | 76 V(Struct8) \ |
| 68 V(Struct9) \ | 77 V(Struct9) \ |
| 69 V(StructGeneric) \ | 78 V(StructGeneric) \ |
| 70 V(ConsString) \ | 79 V(ConsString) \ |
| (...skipping 18 matching lines...) Expand all Loading... |
| 89 // Ids of specialized visitors are declared in a linear order (without | 98 // Ids of specialized visitors are declared in a linear order (without |
| 90 // holes) starting from the id of visitor specialized for 2 words objects | 99 // holes) starting from the id of visitor specialized for 2 words objects |
| 91 // (base visitor id) and ending with the id of generic visitor. | 100 // (base visitor id) and ending with the id of generic visitor. |
| 92 // Method GetVisitorIdForSize depends on this ordering to calculate visitor | 101 // Method GetVisitorIdForSize depends on this ordering to calculate visitor |
| 93 // id of specialized visitor from given instance size, base visitor id and | 102 // id of specialized visitor from given instance size, base visitor id and |
| 94 // generic visitor's id. | 103 // generic visitor's id. |
| 95 enum VisitorId { | 104 enum VisitorId { |
| 96 #define VISITOR_ID_ENUM_DECL(id) kVisit##id, | 105 #define VISITOR_ID_ENUM_DECL(id) kVisit##id, |
| 97 VISITOR_ID_LIST(VISITOR_ID_ENUM_DECL) | 106 VISITOR_ID_LIST(VISITOR_ID_ENUM_DECL) |
| 98 #undef VISITOR_ID_ENUM_DECL | 107 #undef VISITOR_ID_ENUM_DECL |
| 99 kVisitorIdCount, | 108 kVisitorIdCount, |
| 100 kVisitDataObject = kVisitDataObject2, | 109 kVisitDataObject = kVisitDataObject2, |
| 101 kVisitJSObject = kVisitJSObject2, | 110 kVisitJSObject = kVisitJSObject2, |
| 111 kVisitJSApiObject = kVisitJSApiObject2, |
| 102 kVisitStruct = kVisitStruct2, | 112 kVisitStruct = kVisitStruct2, |
| 103 }; | 113 }; |
| 104 | 114 |
| 105 // Visitor ID should fit in one byte. | 115 // Visitor ID should fit in one byte. |
| 106 STATIC_ASSERT(kVisitorIdCount <= 256); | 116 STATIC_ASSERT(kVisitorIdCount <= 256); |
| 107 | 117 |
| 108 // Determine which specialized visitor should be used for given instance type | 118 // Determine which specialized visitor should be used for given instance type |
| 109 // and instance type. | 119 // and instance type. |
| 110 static VisitorId GetVisitorId(int instance_type, int instance_size, | 120 static VisitorId GetVisitorId(int instance_type, int instance_size, |
| 111 bool has_unboxed_fields); | 121 bool has_unboxed_fields); |
| 112 | 122 |
| 113 // Determine which specialized visitor should be used for given map. | 123 // Determine which specialized visitor should be used for given map. |
| 114 static VisitorId GetVisitorId(Map* map); | 124 static VisitorId GetVisitorId(Map* map); |
| 115 | 125 |
| 116 // For visitors that allow specialization by size calculate VisitorId based | 126 // For visitors that allow specialization by size calculate VisitorId based |
| 117 // on size, base visitor id and generic visitor id. | 127 // on size, base visitor id and generic visitor id. |
| 118 static VisitorId GetVisitorIdForSize(VisitorId base, VisitorId generic, | 128 static VisitorId GetVisitorIdForSize(VisitorId base, VisitorId generic, |
| 119 int object_size, | 129 int object_size, |
| 120 bool has_unboxed_fields) { | 130 bool has_unboxed_fields) { |
| 121 DCHECK((base == kVisitDataObject) || (base == kVisitStruct) || | 131 DCHECK((base == kVisitDataObject) || (base == kVisitStruct) || |
| 122 (base == kVisitJSObject)); | 132 (base == kVisitJSObject) || (base == kVisitJSApiObject)); |
| 123 DCHECK(IsAligned(object_size, kPointerSize)); | 133 DCHECK(IsAligned(object_size, kPointerSize)); |
| 124 DCHECK(Heap::kMinObjectSizeInWords * kPointerSize <= object_size); | 134 DCHECK(Heap::kMinObjectSizeInWords * kPointerSize <= object_size); |
| 125 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); | 135 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); |
| 126 DCHECK(!has_unboxed_fields || (base == kVisitJSObject)); | 136 DCHECK(!has_unboxed_fields || (base == kVisitJSObject) || |
| 137 (base == kVisitJSApiObject)); |
| 127 | 138 |
| 128 if (has_unboxed_fields) return generic; | 139 if (has_unboxed_fields) return generic; |
| 129 | 140 |
| 130 int visitor_id = Min( | 141 int visitor_id = Min( |
| 131 base + (object_size >> kPointerSizeLog2) - Heap::kMinObjectSizeInWords, | 142 base + (object_size >> kPointerSizeLog2) - Heap::kMinObjectSizeInWords, |
| 132 static_cast<int>(generic)); | 143 static_cast<int>(generic)); |
| 133 | 144 |
| 134 return static_cast<VisitorId>(visitor_id); | 145 return static_cast<VisitorId>(visitor_id); |
| 135 } | 146 } |
| 136 }; | 147 }; |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 | 404 |
| 394 INLINE(static void Visit(Map* map, HeapObject* object)) {} | 405 INLINE(static void Visit(Map* map, HeapObject* object)) {} |
| 395 }; | 406 }; |
| 396 | 407 |
| 397 typedef FlexibleBodyVisitor<StaticVisitor, FixedArray::BodyDescriptor, void> | 408 typedef FlexibleBodyVisitor<StaticVisitor, FixedArray::BodyDescriptor, void> |
| 398 FixedArrayVisitor; | 409 FixedArrayVisitor; |
| 399 | 410 |
| 400 typedef FlexibleBodyVisitor<StaticVisitor, JSObject::BodyDescriptor, void> | 411 typedef FlexibleBodyVisitor<StaticVisitor, JSObject::BodyDescriptor, void> |
| 401 JSObjectVisitor; | 412 JSObjectVisitor; |
| 402 | 413 |
| 414 class JSApiObjectVisitor : AllStatic { |
| 415 public: |
| 416 template <int size> |
| 417 static inline void VisitSpecialized(Map* map, HeapObject* object) { |
| 418 TracePossibleWrapper(object); |
| 419 JSObjectVisitor::template VisitSpecialized<size>(map, object); |
| 420 } |
| 421 |
| 422 INLINE(static void Visit(Map* map, HeapObject* object)) { |
| 423 TracePossibleWrapper(object); |
| 424 JSObjectVisitor::Visit(map, object); |
| 425 } |
| 426 |
| 427 private: |
| 428 INLINE(static void TracePossibleWrapper(HeapObject* object)) { |
| 429 if (object->GetHeap()->UsingEmbedderHeapTracer()) { |
| 430 DCHECK(object->IsJSObject()); |
| 431 object->GetHeap()->TracePossibleWrapper(JSObject::cast(object)); |
| 432 } |
| 433 } |
| 434 }; |
| 435 |
| 403 typedef FlexibleBodyVisitor<StaticVisitor, StructBodyDescriptor, void> | 436 typedef FlexibleBodyVisitor<StaticVisitor, StructBodyDescriptor, void> |
| 404 StructObjectVisitor; | 437 StructObjectVisitor; |
| 405 | 438 |
| 406 typedef void (*Callback)(Map* map, HeapObject* object); | 439 typedef void (*Callback)(Map* map, HeapObject* object); |
| 407 | 440 |
| 408 static VisitorDispatchTable<Callback> table_; | 441 static VisitorDispatchTable<Callback> table_; |
| 409 }; | 442 }; |
| 410 | 443 |
| 411 | 444 |
| 412 template <typename StaticVisitor> | 445 template <typename StaticVisitor> |
| 413 VisitorDispatchTable<typename StaticMarkingVisitor<StaticVisitor>::Callback> | 446 VisitorDispatchTable<typename StaticMarkingVisitor<StaticVisitor>::Callback> |
| 414 StaticMarkingVisitor<StaticVisitor>::table_; | 447 StaticMarkingVisitor<StaticVisitor>::table_; |
| 415 | 448 |
| 416 | 449 |
| 417 class WeakObjectRetainer; | 450 class WeakObjectRetainer; |
| 418 | 451 |
| 419 | 452 |
| 420 // A weak list is single linked list where each element has a weak pointer to | 453 // A weak list is single linked list where each element has a weak pointer to |
| 421 // the next element. Given the head of the list, this function removes dead | 454 // the next element. Given the head of the list, this function removes dead |
| 422 // elements from the list and if requested records slots for next-element | 455 // elements from the list and if requested records slots for next-element |
| 423 // pointers. The template parameter T is a WeakListVisitor that defines how to | 456 // pointers. The template parameter T is a WeakListVisitor that defines how to |
| 424 // access the next-element pointers. | 457 // access the next-element pointers. |
| 425 template <class T> | 458 template <class T> |
| 426 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer); | 459 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer); |
| 427 } // namespace internal | 460 } // namespace internal |
| 428 } // namespace v8 | 461 } // namespace v8 |
| 429 | 462 |
| 430 #endif // V8_OBJECTS_VISITING_H_ | 463 #endif // V8_OBJECTS_VISITING_H_ |
| OLD | NEW |