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