Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index d5197056de2967060cea9e29518c4bf97a6f7881..b3192ccb96852103eacdb4f76127be3db7888d88 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -1637,46 +1637,69 @@ 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, |
+ int end_offset, ObjectVisitor* v); |
+ |
+ template <typename StaticVisitor> |
+ static inline void IterateBodyImpl(HeapObject* obj, int start_offset, |
+ int end_offset); |
+}; |
+ |
+ |
// This class describes a body of an object of a fixed size |
// in which all pointer fields are located in the [start_offset, end_offset) |
// interval. |
-template<int start_offset, int end_offset, int size> |
-class FixedBodyDescriptor { |
+template <int start_offset, int end_offset, int size> |
+class FixedBodyDescriptor : public BodyDescriptorBase { |
public: |
static const int kStartOffset = start_offset; |
static const int kEndOffset = end_offset; |
static const int kSize = size; |
- static inline void IterateBody(HeapObject* obj, ObjectVisitor* v); |
+ static inline void IterateBody(HeapObject* obj, ObjectVisitor* v) { |
+ IterateBodyImpl(obj, start_offset, end_offset, v); |
+ } |
- template<typename StaticVisitor> |
+ template <typename StaticVisitor> |
static inline void IterateBody(HeapObject* obj) { |
- StaticVisitor::VisitPointers(HeapObject::RawField(obj, start_offset), |
- HeapObject::RawField(obj, end_offset)); |
+ IterateBodyImpl<StaticVisitor>(obj, start_offset, end_offset); |
} |
}; |
-// This class describes a body of an object of a variable size |
+// This base class describes a body of an object of a variable size |
// in which all pointer fields are located in the [start_offset, object_size) |
// interval. |
-template<int start_offset> |
-class FlexibleBodyDescriptor { |
+template <int start_offset> |
+class FlexibleBodyDescriptorBase : public BodyDescriptorBase { |
public: |
static const int kStartOffset = start_offset; |
- static inline void IterateBody(HeapObject* obj, |
- int object_size, |
- ObjectVisitor* v); |
+ static inline void IterateBody(HeapObject* obj, int object_size, |
+ ObjectVisitor* v) { |
+ IterateBodyImpl(obj, start_offset, object_size, v); |
+ } |
- template<typename StaticVisitor> |
+ template <typename StaticVisitor> |
static inline void IterateBody(HeapObject* obj, int object_size) { |
- StaticVisitor::VisitPointers(HeapObject::RawField(obj, start_offset), |
- HeapObject::RawField(obj, object_size)); |
+ IterateBodyImpl<StaticVisitor>(obj, start_offset, object_size); |
} |
}; |
+// This class describes a body of an object of a variable size |
+// in which all pointer fields are located in the [start_offset, object_size) |
+// interval. The size of the object is taken from the map. |
+template <int start_offset> |
+class FlexibleBodyDescriptor : public FlexibleBodyDescriptorBase<start_offset> { |
+ public: |
+ static inline int SizeOf(Map* map, HeapObject* object); |
+}; |
+ |
+ |
// The HeapNumber class describes heap allocated numbers that cannot be |
// represented in a Smi (small integer) |
class HeapNumber: public HeapObject { |
@@ -2477,10 +2500,7 @@ class JSObject: public JSReceiver { |
STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize); |
- class BodyDescriptor : public FlexibleBodyDescriptor<kPropertiesOffset> { |
- public: |
- static inline int SizeOf(Map* map, HeapObject* object); |
- }; |
+ typedef FlexibleBodyDescriptor<kPropertiesOffset> BodyDescriptor; |
Context* GetCreationContext(); |
@@ -2659,7 +2679,7 @@ class FixedArray: public FixedArrayBase { |
// object, the prefix of this array is sorted. |
void SortPairs(FixedArray* numbers, uint32_t len); |
- class BodyDescriptor : public FlexibleBodyDescriptor<kHeaderSize> { |
+ class BodyDescriptor : public FlexibleBodyDescriptorBase<kHeaderSize> { |
public: |
static inline int SizeOf(Map* map, HeapObject* object); |
}; |
@@ -10715,11 +10735,7 @@ class ObjectVisitor BASE_EMBEDDED { |
}; |
-class StructBodyDescriptor : public |
- FlexibleBodyDescriptor<HeapObject::kHeaderSize> { |
- public: |
- static inline int SizeOf(Map* map, HeapObject* object); |
-}; |
+typedef FlexibleBodyDescriptor<HeapObject::kHeaderSize> StructBodyDescriptor; |
// BooleanBit is a helper class for setting and getting a bit in an integer. |