| 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> {};
|
|
|