| Index: src/objects-inl.h
 | 
| diff --git a/src/objects-inl.h b/src/objects-inl.h
 | 
| index f28cdc78e9805c7d0c27f38e920d0d8c702c923d..42d66718518279d8bf012b893e921cc44583a090 100644
 | 
| --- a/src/objects-inl.h
 | 
| +++ b/src/objects-inl.h
 | 
| @@ -7912,8 +7912,7 @@ void ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
 | 
|  void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
 | 
|                                           int end_offset, ObjectVisitor* v) {
 | 
|    if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
 | 
| -    v->VisitPointers(HeapObject::RawField(obj, start_offset),
 | 
| -                     HeapObject::RawField(obj, end_offset));
 | 
| +    IteratePointers(obj, start_offset, end_offset, v);
 | 
|    } else {
 | 
|      DCHECK(FLAG_unbox_double_fields);
 | 
|      DCHECK(IsAligned(start_offset, kPointerSize) &&
 | 
| @@ -7924,8 +7923,7 @@ void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
 | 
|      for (int offset = start_offset; offset < end_offset;) {
 | 
|        int end_of_region_offset;
 | 
|        if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) {
 | 
| -        v->VisitPointers(HeapObject::RawField(obj, offset),
 | 
| -                         HeapObject::RawField(obj, end_of_region_offset));
 | 
| +        IteratePointers(obj, offset, end_of_region_offset, v);
 | 
|        }
 | 
|        offset = end_of_region_offset;
 | 
|      }
 | 
| @@ -7934,13 +7932,10 @@ void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
 | 
|  
 | 
|  
 | 
|  template <typename StaticVisitor>
 | 
| -void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
 | 
| -                                         int end_offset) {
 | 
| -  Heap* heap = obj->GetHeap();
 | 
| +void BodyDescriptorBase::IterateBodyImpl(Heap* heap, HeapObject* obj,
 | 
| +                                         int start_offset, int end_offset) {
 | 
|    if (!FLAG_unbox_double_fields || obj->map()->HasFastPointerLayout()) {
 | 
| -    StaticVisitor::VisitPointers(heap, obj,
 | 
| -                                 HeapObject::RawField(obj, start_offset),
 | 
| -                                 HeapObject::RawField(obj, end_offset));
 | 
| +    IteratePointers<StaticVisitor>(heap, obj, start_offset, end_offset);
 | 
|    } else {
 | 
|      DCHECK(FLAG_unbox_double_fields);
 | 
|      DCHECK(IsAligned(start_offset, kPointerSize) &&
 | 
| @@ -7951,9 +7946,7 @@ void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
 | 
|      for (int offset = start_offset; offset < end_offset;) {
 | 
|        int end_of_region_offset;
 | 
|        if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) {
 | 
| -        StaticVisitor::VisitPointers(
 | 
| -            heap, obj, HeapObject::RawField(obj, offset),
 | 
| -            HeapObject::RawField(obj, end_of_region_offset));
 | 
| +        IteratePointers<StaticVisitor>(heap, obj, offset, end_of_region_offset);
 | 
|        }
 | 
|        offset = end_of_region_offset;
 | 
|      }
 | 
| @@ -7961,6 +7954,75 @@ void BodyDescriptorBase::IterateBodyImpl(HeapObject* obj, int start_offset,
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void BodyDescriptorBase::IteratePointers(HeapObject* obj, int start_offset,
 | 
| +                                         int end_offset, ObjectVisitor* v) {
 | 
| +  v->VisitPointers(HeapObject::RawField(obj, start_offset),
 | 
| +                   HeapObject::RawField(obj, end_offset));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +template <typename StaticVisitor>
 | 
| +void BodyDescriptorBase::IteratePointers(Heap* heap, HeapObject* obj,
 | 
| +                                         int start_offset, int end_offset) {
 | 
| +  StaticVisitor::VisitPointers(heap, obj,
 | 
| +                               HeapObject::RawField(obj, start_offset),
 | 
| +                               HeapObject::RawField(obj, end_offset));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +// Iterates the function object according to the visiting policy.
 | 
| +template <JSFunction::BodyVisitingPolicy body_visiting_policy>
 | 
| +class JSFunction::BodyDescriptorImpl : public BodyDescriptorBase {
 | 
| + public:
 | 
| +  STATIC_ASSERT(kNonWeakFieldsEndOffset == kCodeEntryOffset);
 | 
| +  STATIC_ASSERT(kCodeEntryOffset + kPointerSize == kNextFunctionLinkOffset);
 | 
| +  STATIC_ASSERT(kNextFunctionLinkOffset + kPointerSize == kSize);
 | 
| +
 | 
| +  static inline void IterateBody(HeapObject* obj, int object_size,
 | 
| +                                 ObjectVisitor* v) {
 | 
| +    IteratePointers(obj, kPropertiesOffset, kNonWeakFieldsEndOffset, v);
 | 
| +
 | 
| +    if (body_visiting_policy & kVisitCodeEntry) {
 | 
| +      v->VisitCodeEntry(obj->address() + kCodeEntryOffset);
 | 
| +    }
 | 
| +
 | 
| +    if (body_visiting_policy & kVisitNextFunction) {
 | 
| +      IteratePointers(obj, kNextFunctionLinkOffset, kSize, v);
 | 
| +    }
 | 
| +
 | 
| +    // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
 | 
| +    // properties
 | 
| +    // IterateBodyImpl(obj, kSize, object_size, v);
 | 
| +  }
 | 
| +
 | 
| +  template <typename StaticVisitor>
 | 
| +  static inline void IterateBody(HeapObject* obj, int object_size) {
 | 
| +    Heap* heap = obj->GetHeap();
 | 
| +    IteratePointers<StaticVisitor>(heap, obj, kPropertiesOffset,
 | 
| +                                   kNonWeakFieldsEndOffset);
 | 
| +
 | 
| +    if (body_visiting_policy & kVisitCodeEntry) {
 | 
| +      StaticVisitor::VisitCodeEntry(heap, obj,
 | 
| +                                    obj->address() + kCodeEntryOffset);
 | 
| +    }
 | 
| +
 | 
| +    if (body_visiting_policy & kVisitNextFunction) {
 | 
| +      IteratePointers<StaticVisitor>(heap, obj, kNextFunctionLinkOffset, kSize);
 | 
| +    }
 | 
| +
 | 
| +    // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
 | 
| +    // properties
 | 
| +    // IterateBodyImpl<StaticVisitor>(heap, obj, kSize, object_size);
 | 
| +  }
 | 
| +
 | 
| +  static inline int SizeOf(Map* map, HeapObject* object) {
 | 
| +    // TODO(ishell): v8:4531, fix when JFunctions are allowed to have in-object
 | 
| +    // properties
 | 
| +    return JSFunction::kSize;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +
 | 
|  template<class Derived, class TableType>
 | 
|  Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
 | 
|    TableType* table(TableType::cast(this->table()));
 | 
| 
 |