| Index: src/objects.h | 
| diff --git a/src/objects.h b/src/objects.h | 
| index 93f57333a150498810f73f264c74082e2147ff3b..0e9b1864a084a261b532699f5c21d801fa0fa6c7 100644 | 
| --- a/src/objects.h | 
| +++ b/src/objects.h | 
| @@ -1562,6 +1562,7 @@ class HeapObject: public Object { | 
| // first map pointer.  The object type is given in the first | 
| // parameter. This function does not access the map pointer in the | 
| // object, and so is safe to call while the map pointer is modified. | 
| +  void IterateBody(ObjectVisitor* v); | 
| void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); | 
|  | 
| // Returns the heap object's size in bytes | 
| @@ -1639,19 +1640,29 @@ class HeapObject: public Object { | 
|  | 
| // This is the base class for object's body descriptors. | 
| class BodyDescriptorBase { | 
| - protected: | 
| -  static inline void IterateBodyImpl(HeapObject* obj, int start_offset, | 
| + public: | 
| +  template <typename ObjectVisitor> | 
| +  static inline void IteratePointers(HeapObject* obj, int start_offset, | 
| int end_offset, ObjectVisitor* v); | 
|  | 
| template <typename StaticVisitor> | 
| -  static inline void IterateBodyImpl(Heap* heap, HeapObject* obj, | 
| +  static inline void IteratePointers(Heap* heap, HeapObject* obj, | 
| int start_offset, int end_offset); | 
|  | 
| -  static inline void IteratePointers(HeapObject* obj, int start_offset, | 
| +  template <typename ObjectVisitor> | 
| +  static inline void IteratePointer(HeapObject* obj, int offset, | 
| +                                    ObjectVisitor* v); | 
| + | 
| +  template <typename StaticVisitor> | 
| +  static inline void IteratePointer(Heap* heap, HeapObject* obj, int offset); | 
| + | 
| + protected: | 
| +  template <typename ObjectVisitor> | 
| +  static inline void IterateBodyImpl(HeapObject* obj, int start_offset, | 
| int end_offset, ObjectVisitor* v); | 
|  | 
| template <typename StaticVisitor> | 
| -  static inline void IteratePointers(Heap* heap, HeapObject* obj, | 
| +  static inline void IterateBodyImpl(Heap* heap, HeapObject* obj, | 
| int start_offset, int end_offset); | 
| }; | 
|  | 
| @@ -1666,6 +1677,7 @@ class FixedBodyDescriptor : public BodyDescriptorBase { | 
| static const int kEndOffset = end_offset; | 
| static const int kSize = size; | 
|  | 
| +  template <typename ObjectVisitor> | 
| static inline void IterateBody(HeapObject* obj, ObjectVisitor* v) { | 
| IterateBodyImpl(obj, start_offset, end_offset, v); | 
| } | 
| @@ -1686,6 +1698,7 @@ class FlexibleBodyDescriptorBase : public BodyDescriptorBase { | 
| public: | 
| static const int kStartOffset = start_offset; | 
|  | 
| +  template <typename ObjectVisitor> | 
| static inline void IterateBody(HeapObject* obj, int object_size, | 
| ObjectVisitor* v) { | 
| IterateBodyImpl(obj, start_offset, object_size, v); | 
| @@ -4443,6 +4456,8 @@ class BytecodeArray : public FixedArrayBase { | 
| // Maximal length of a single BytecodeArray. | 
| static const int kMaxLength = kMaxSize - kHeaderSize; | 
|  | 
| +  class BodyDescriptor; | 
| + | 
| private: | 
| DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray); | 
| }; | 
| @@ -4508,11 +4523,6 @@ class FixedTypedArrayBase: public FixedArrayBase { | 
| DECL_ACCESSORS(external_pointer, void) | 
|  | 
| // Dispatched behavior. | 
| -  inline void FixedTypedArrayBaseIterateBody(ObjectVisitor* v); | 
| - | 
| -  template <typename StaticVisitor> | 
| -  inline void FixedTypedArrayBaseIterateBody(); | 
| - | 
| DECLARE_CAST(FixedTypedArrayBase) | 
|  | 
| static const int kBasePointerOffset = FixedArrayBase::kHeaderSize; | 
| @@ -4522,6 +4532,8 @@ class FixedTypedArrayBase: public FixedArrayBase { | 
|  | 
| static const int kDataOffset = kHeaderSize; | 
|  | 
| +  class BodyDescriptor; | 
| + | 
| inline int size(); | 
|  | 
| static inline int TypedArraySize(InstanceType type, int length); | 
| @@ -9886,6 +9898,8 @@ class JSWeakCollection: public JSObject { | 
| static const int kNextOffset = kTableOffset + kPointerSize; | 
| static const int kSize = kNextOffset + kPointerSize; | 
|  | 
| +  class BodyDescriptor; | 
| + | 
| private: | 
| DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection); | 
| }; | 
| @@ -9964,11 +9978,6 @@ class JSArrayBuffer: public JSObject { | 
| DECLARE_VERIFIER(JSArrayBuffer) | 
|  | 
| static const int kByteLengthOffset = JSObject::kHeaderSize; | 
| - | 
| -  // NOTE: GC will visit objects fields: | 
| -  // 1. From JSObject::BodyDescriptor::kStartOffset to kByteLengthOffset + | 
| -  //    kPointerSize | 
| -  // 2. From start of the internal fields and up to the end of them | 
| static const int kBackingStoreOffset = kByteLengthOffset + kPointerSize; | 
| static const int kBitFieldSlot = kBackingStoreOffset + kPointerSize; | 
| #if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT | 
| @@ -9981,11 +9990,9 @@ class JSArrayBuffer: public JSObject { | 
| static const int kSizeWithInternalFields = | 
| kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize; | 
|  | 
| -  template <typename StaticVisitor> | 
| -  static inline void JSArrayBufferIterateBody(Heap* heap, HeapObject* obj); | 
| - | 
| -  static inline void JSArrayBufferIterateBody(HeapObject* obj, | 
| -                                              ObjectVisitor* v); | 
| +  // Iterates all fields in the object including internal ones except | 
| +  // kBackingStoreOffset and kBitFieldSlot. | 
| +  class BodyDescriptor; | 
|  | 
| class IsExternal : public BitField<bool, 1, 1> {}; | 
| class IsNeuterable : public BitField<bool, 2, 1> {}; | 
|  |