1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_OBJECTS_BODY_DESCRIPTORS_INL_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_OBJECTS_BODY_DESCRIPTORS_INL_H_ 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/assembler-inl.h" 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/objects-body-descriptors.h" 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/transitions.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <int start_offset> 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint FlexibleBodyDescriptor<start_offset>::SizeOf(Map* map, HeapObject* object) { 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return object->SizeFromMap(map); 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool BodyDescriptorBase::IsValidSlotImpl(HeapObject* obj, int offset) { 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) { 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(FLAG_unbox_double_fields); 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(IsAligned(offset, kPointerSize)); 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LayoutDescriptorHelper helper(obj->map()); 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!helper.all_fields_tagged()); 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return helper.IsTagged(offset); 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename ObjectVisitor> 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset, 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end_offset, ObjectVisitor* v) { 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) { 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers(obj, start_offset, end_offset, v); 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(FLAG_unbox_double_fields); 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(IsAligned(start_offset, kPointerSize) && 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IsAligned(end_offset, kPointerSize)); 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LayoutDescriptorHelper helper(obj->map()); 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!helper.all_fields_tagged()); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int offset = start_offset; offset < end_offset;) { 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end_of_region_offset; 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) { 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers(obj, offset, end_of_region_offset, v); 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch offset = end_of_region_offset; 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename StaticVisitor> 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj, 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int start_offset, int end_offset) { 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) { 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers<StaticVisitor>(heap, obj, start_offset, end_offset); 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(FLAG_unbox_double_fields); 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(IsAligned(start_offset, kPointerSize) && 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IsAligned(end_offset, kPointerSize)); 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LayoutDescriptorHelper helper(obj->map()); 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!helper.all_fields_tagged()); 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int offset = start_offset; offset < end_offset;) { 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end_of_region_offset; 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) { 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers<StaticVisitor>(heap, obj, offset, end_of_region_offset); 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch offset = end_of_region_offset; 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename ObjectVisitor> 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochDISABLE_CFI_PERF 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BodyDescriptorBase::IteratePointers(HeapObject* obj, int start_offset, 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end_offset, ObjectVisitor* v) { 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v->VisitPointers(HeapObject::RawField(obj, start_offset), 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, end_offset)); 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename StaticVisitor> 90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochDISABLE_CFI_PERF 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BodyDescriptorBase::IteratePointers(Heap* heap, HeapObject* obj, 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int start_offset, int end_offset) { 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticVisitor::VisitPointers(heap, obj, 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, start_offset), 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, end_offset)); 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename ObjectVisitor> 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BodyDescriptorBase::IteratePointer(HeapObject* obj, int offset, 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v->VisitPointer(HeapObject::RawField(obj, offset)); 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename StaticVisitor> 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BodyDescriptorBase::IteratePointer(Heap* heap, HeapObject* obj, 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int offset) { 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticVisitor::VisitPointer(heap, obj, HeapObject::RawField(obj, offset)); 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Iterates the function object according to the visiting policy. 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <JSFunction::BodyVisitingPolicy body_visiting_policy> 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSFunction::BodyDescriptorImpl final : public BodyDescriptorBase { 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kNonWeakFieldsEndOffset == kCodeEntryOffset); 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kCodeEntryOffset + kPointerSize == kNextFunctionLinkOffset); 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kNextFunctionLinkOffset + kPointerSize == kSize); 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (offset < kSize) return true; 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return IsValidSlotImpl(obj, offset); 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers(obj, kPropertiesOffset, kNonWeakFieldsEndOffset, v); 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (body_visiting_policy & kVisitCodeEntry) { 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v->VisitCodeEntry(obj->address() + kCodeEntryOffset); 133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (body_visiting_policy & kVisitNextFunction) { 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers(obj, kNextFunctionLinkOffset, kSize, v); 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl(obj, kSize, object_size, v); 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = obj->GetHeap(); 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset, 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNonWeakFieldsEndOffset); 146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (body_visiting_policy & kVisitCodeEntry) { 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticVisitor::VisitCodeEntry(heap, obj, 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch obj->address() + kCodeEntryOffset); 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (body_visiting_policy & kVisitNextFunction) { 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers<StaticVisitor>(heap, obj, kNextFunctionLinkOffset, kSize); 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size); 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return map->instance_size(); 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSArrayBuffer::BodyDescriptor final : public BodyDescriptorBase { 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kByteLengthOffset + kPointerSize == kBackingStoreOffset); 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kBackingStoreOffset + kPointerSize == kBitFieldSlot); 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kBitFieldSlot + kPointerSize == kSize); 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (offset < kBackingStoreOffset) return true; 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (offset < kSize) return false; 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return IsValidSlotImpl(obj, offset); 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers(obj, kPropertiesOffset, kBackingStoreOffset, v); 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl(obj, kSize, object_size, v); 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = obj->GetHeap(); 186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset, 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kBackingStoreOffset); 188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size); 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return map->instance_size(); 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass BytecodeArray::BodyDescriptor final : public BodyDescriptorBase { 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { 200109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return offset >= kConstantPoolOffset && 201109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch offset <= kSourcePositionTableOffset; 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointer(obj, kConstantPoolOffset, v); 208109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch IteratePointer(obj, kHandlerTableOffset, v); 209109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch IteratePointer(obj, kSourcePositionTableOffset, v); 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = obj->GetHeap(); 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointer<StaticVisitor>(heap, obj, kConstantPoolOffset); 216109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch IteratePointer<StaticVisitor>(heap, obj, kHandlerTableOffset); 217109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch IteratePointer<StaticVisitor>(heap, obj, kSourcePositionTableOffset); 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* obj) { 221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<BytecodeArray*>(obj)->BytecodeArraySize(); 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FixedTypedArrayBase::BodyDescriptor final : public BodyDescriptorBase { 227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { 229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return offset == kBasePointerOffset; 230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointer(obj, kBasePointerOffset, v); 236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = obj->GetHeap(); 241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointer<StaticVisitor>(heap, obj, kBasePointerOffset); 242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { 245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<FixedTypedArrayBase*>(object)->size(); 246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <JSWeakCollection::BodyVisitingPolicy body_visiting_policy> 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSWeakCollection::BodyDescriptorImpl final : public BodyDescriptorBase { 252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kTableOffset + kPointerSize == kNextOffset); 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kNextOffset + kPointerSize == kSize); 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return IsValidSlotImpl(obj, offset); 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (body_visiting_policy == kVisitStrong) { 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl(obj, kPropertiesOffset, object_size, v); 265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers(obj, kPropertiesOffset, kTableOffset, v); 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl(obj, kSize, object_size, v); 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = obj->GetHeap(); 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (body_visiting_policy == kVisitStrong) { 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl<StaticVisitor>(heap, obj, kPropertiesOffset, object_size); 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset, 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kTableOffset); 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size); 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return map->instance_size(); 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Foreign::BodyDescriptor final : public BodyDescriptorBase { 290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { return false; } 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v->VisitExternalReference(reinterpret_cast<Address*>( 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, kForeignAddressOffset))); 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticVisitor::VisitExternalReference(reinterpret_cast<Address*>( 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, kForeignAddressOffset))); 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { return kSize; } 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ExternalOneByteString::BodyDescriptor final : public BodyDescriptorBase { 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { return false; } 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef v8::String::ExternalOneByteStringResource Resource; 318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v->VisitExternalOneByteString(reinterpret_cast<Resource**>( 319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, kResourceOffset))); 320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef v8::String::ExternalOneByteStringResource Resource; 325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticVisitor::VisitExternalOneByteString(reinterpret_cast<Resource**>( 326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, kResourceOffset))); 327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { return kSize; } 330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase { 334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { return false; } 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef v8::String::ExternalStringResource Resource; 341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v->VisitExternalTwoByteString(reinterpret_cast<Resource**>( 342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, kResourceOffset))); 343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef v8::String::ExternalStringResource Resource; 348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticVisitor::VisitExternalTwoByteString(reinterpret_cast<Resource**>( 349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HeapObject::RawField(obj, kResourceOffset))); 350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { return kSize; } 353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Code::BodyDescriptor final : public BodyDescriptorBase { 357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kRelocationInfoOffset + kPointerSize == kHandlerTableOffset); 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kHandlerTableOffset + kPointerSize == 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kDeoptimizationDataOffset); 361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kDeoptimizationDataOffset + kPointerSize == 362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSourcePositionTableOffset); 363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(kSourcePositionTableOffset + kPointerSize == 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kTypeFeedbackInfoOffset); 36562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch STATIC_ASSERT(kTypeFeedbackInfoOffset + kPointerSize == 36662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kNextCodeLinkOffset); 367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsValidSlot(HeapObject* obj, int offset) { 369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Slots in code can't be invalid because we never trim code objects. 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, ObjectVisitor* v) { 375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int mode_mask = RelocInfo::kCodeTargetMask | 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::CELL) | 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) | 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) | 381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) | 382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::kDebugBreakSlotMask; 383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers(obj, kRelocationInfoOffset, kNextCodeLinkOffset, v); 385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v->VisitNextCodeLink(HeapObject::RawField(obj, kNextCodeLinkOffset)); 386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocIterator it(reinterpret_cast<Code*>(obj), mode_mask); 388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate = obj->GetIsolate(); 389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (; !it.done(); it.next()) { 390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch it.rinfo()->Visit(isolate, v); 391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size, 396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBody(obj, v); 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj) { 402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int mode_mask = RelocInfo::kCodeTargetMask | 403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | 404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::CELL) | 405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) | 406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | 407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) | 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) | 409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocInfo::kDebugBreakSlotMask; 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = obj->GetHeap(); 412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IteratePointers<StaticVisitor>(heap, obj, kRelocationInfoOffset, 413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNextCodeLinkOffset); 414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticVisitor::VisitNextCodeLink( 415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch heap, HeapObject::RawField(obj, kNextCodeLinkOffset)); 416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RelocIterator it(reinterpret_cast<Code*>(obj), mode_mask); 418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (; !it.done(); it.next()) { 419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch it.rinfo()->template Visit<StaticVisitor>(heap); 420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename StaticVisitor> 424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void IterateBody(HeapObject* obj, int object_size) { 425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBody<StaticVisitor>(obj); 426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int SizeOf(Map* map, HeapObject* object) { 429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<Code*>(object)->CodeSize(); 430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Op, typename ReturnType, typename T1, typename T2, 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typename T3> 436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochReturnType BodyDescriptorApply(InstanceType type, T1 p1, T2 p2, T3 p3) { 437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (type < FIRST_NONSTRING_TYPE) { 438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (type & kStringRepresentationMask) { 439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case kSeqStringTag: 440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ReturnType(); 441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case kConsStringTag: 442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<ConsString::BodyDescriptor>(p1, p2, p3); 44362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case kThinStringTag: 44462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return Op::template apply<ThinString::BodyDescriptor>(p1, p2, p3); 445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case kSlicedStringTag: 446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<SlicedString::BodyDescriptor>(p1, p2, p3); 447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case kExternalStringTag: 448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if ((type & kStringEncodingMask) == kOneByteStringTag) { 449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<ExternalOneByteString::BodyDescriptor>( 450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch p1, p2, p3); 451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<ExternalTwoByteString::BodyDescriptor>( 453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch p1, p2, p3); 454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ReturnType(); 458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (type) { 461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FIXED_ARRAY_TYPE: 462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<FixedArray::BodyDescriptor>(p1, p2, p3); 463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FIXED_DOUBLE_ARRAY_TYPE: 464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ReturnType(); 465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TRANSITION_ARRAY_TYPE: 466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<TransitionArray::BodyDescriptor>(p1, p2, p3); 467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_OBJECT_TYPE: 46813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case JS_ERROR_TYPE: 46913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case JS_ARGUMENTS_TYPE: 47062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case JS_ASYNC_FROM_SYNC_ITERATOR_TYPE: 47162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case JS_PROMISE_CAPABILITY_TYPE: 472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_PROMISE_TYPE: 473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_GENERATOR_OBJECT_TYPE: 475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_VALUE_TYPE: 476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_DATE_TYPE: 477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_ARRAY_TYPE: 478c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_MODULE_NAMESPACE_TYPE: 479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_TYPED_ARRAY_TYPE: 480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_DATA_VIEW_TYPE: 481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_SET_TYPE: 482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_MAP_TYPE: 483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_SET_ITERATOR_TYPE: 484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_MAP_ITERATOR_TYPE: 485f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case JS_STRING_ITERATOR_TYPE: 486c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 487c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_TYPED_ARRAY_KEY_ITERATOR_TYPE: 488c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_ARRAY_KEY_ITERATOR_TYPE: 489c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE: 490c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE: 491c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_INT8_ARRAY_KEY_VALUE_ITERATOR_TYPE: 492c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT16_ARRAY_KEY_VALUE_ITERATOR_TYPE: 493c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_INT16_ARRAY_KEY_VALUE_ITERATOR_TYPE: 494c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT32_ARRAY_KEY_VALUE_ITERATOR_TYPE: 495c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_INT32_ARRAY_KEY_VALUE_ITERATOR_TYPE: 496c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FLOAT32_ARRAY_KEY_VALUE_ITERATOR_TYPE: 497c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FLOAT64_ARRAY_KEY_VALUE_ITERATOR_TYPE: 498c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT8_CLAMPED_ARRAY_KEY_VALUE_ITERATOR_TYPE: 499c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE: 500c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_HOLEY_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE: 501c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_ARRAY_KEY_VALUE_ITERATOR_TYPE: 502c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_HOLEY_ARRAY_KEY_VALUE_ITERATOR_TYPE: 503c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE: 504c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_HOLEY_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE: 505c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE: 506c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE: 507c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_INT8_ARRAY_VALUE_ITERATOR_TYPE: 508c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT16_ARRAY_VALUE_ITERATOR_TYPE: 509c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_INT16_ARRAY_VALUE_ITERATOR_TYPE: 510c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT32_ARRAY_VALUE_ITERATOR_TYPE: 511c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_INT32_ARRAY_VALUE_ITERATOR_TYPE: 512c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FLOAT32_ARRAY_VALUE_ITERATOR_TYPE: 513c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FLOAT64_ARRAY_VALUE_ITERATOR_TYPE: 514c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_UINT8_CLAMPED_ARRAY_VALUE_ITERATOR_TYPE: 515c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_SMI_ARRAY_VALUE_ITERATOR_TYPE: 516c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_HOLEY_SMI_ARRAY_VALUE_ITERATOR_TYPE: 517c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_ARRAY_VALUE_ITERATOR_TYPE: 518c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_HOLEY_ARRAY_VALUE_ITERATOR_TYPE: 519c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE: 520c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE: 521c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch case JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE: 522c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_REGEXP_TYPE: 524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_GLOBAL_PROXY_TYPE: 525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_GLOBAL_OBJECT_TYPE: 526bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch case JS_API_OBJECT_TYPE: 5273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case JS_SPECIAL_API_OBJECT_TYPE: 528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_MESSAGE_OBJECT_TYPE: 529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_BOUND_FUNCTION_TYPE: 530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<JSObject::BodyDescriptor>(p1, p2, p3); 531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_WEAK_MAP_TYPE: 532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_WEAK_SET_TYPE: 533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<JSWeakCollection::BodyDescriptor>(p1, p2, p3); 534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_ARRAY_BUFFER_TYPE: 535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<JSArrayBuffer::BodyDescriptor>(p1, p2, p3); 536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_FUNCTION_TYPE: 537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<JSFunction::BodyDescriptor>(p1, p2, p3); 538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case ODDBALL_TYPE: 539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<Oddball::BodyDescriptor>(p1, p2, p3); 540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_PROXY_TYPE: 541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<JSProxy::BodyDescriptor>(p1, p2, p3); 542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FOREIGN_TYPE: 543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<Foreign::BodyDescriptor>(p1, p2, p3); 544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MAP_TYPE: 545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<Map::BodyDescriptor>(p1, p2, p3); 546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case CODE_TYPE: 547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<Code::BodyDescriptor>(p1, p2, p3); 548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case CELL_TYPE: 549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<Cell::BodyDescriptor>(p1, p2, p3); 550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case PROPERTY_CELL_TYPE: 551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<PropertyCell::BodyDescriptor>(p1, p2, p3); 552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case WEAK_CELL_TYPE: 553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<WeakCell::BodyDescriptor>(p1, p2, p3); 554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case SYMBOL_TYPE: 555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<Symbol::BodyDescriptor>(p1, p2, p3); 556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case BYTECODE_ARRAY_TYPE: 557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<BytecodeArray::BodyDescriptor>(p1, p2, p3); 558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case HEAP_NUMBER_TYPE: 560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case MUTABLE_HEAP_NUMBER_TYPE: 561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FILLER_TYPE: 562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case BYTE_ARRAY_TYPE: 563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FREE_SPACE_TYPE: 564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ReturnType(); 565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case FIXED_##TYPE##_ARRAY_TYPE: \ 568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<FixedTypedArrayBase::BodyDescriptor>(p1, p2, p3); 569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TYPED_ARRAYS(TYPED_ARRAY_CASE) 570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef TYPED_ARRAY_CASE 571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case SHARED_FUNCTION_INFO_TYPE: { 573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<SharedFunctionInfo::BodyDescriptor>(p1, p2, p3); 574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STRUCT_LIST(MAKE_STRUCT_CASE) 578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef MAKE_STRUCT_CASE 579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (type == ALLOCATION_SITE_TYPE) { 580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<AllocationSite::BodyDescriptor>(p1, p2, p3); 581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Op::template apply<StructBodyDescriptor>(p1, p2, p3); 583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("Unknown type: %d\n", type); 586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ReturnType(); 588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename ObjectVisitor> 593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HeapObject::IterateFast(ObjectVisitor* v) { 594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BodyDescriptorBase::IteratePointer(this, kMapOffset, v); 595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyFast(v); 596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename ObjectVisitor> 600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HeapObject::IterateBodyFast(ObjectVisitor* v) { 601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Map* m = map(); 602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IterateBodyFast(m->instance_type(), SizeFromMap(m), v); 603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct CallIterateBody { 607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename BodyDescriptor, typename ObjectVisitor> 608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void apply(HeapObject* obj, int object_size, ObjectVisitor* v) { 609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BodyDescriptor::IterateBody(obj, object_size, v); 610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename ObjectVisitor> 614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HeapObject::IterateBodyFast(InstanceType type, int object_size, 615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v) { 616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BodyDescriptorApply<CallIterateBody, void>(type, this, object_size, v); 617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_OBJECTS_BODY_DESCRIPTORS_INL_H_ 622