Chromium Code Reviews| Index: src/heap/objects-visiting.h |
| diff --git a/src/heap/objects-visiting.h b/src/heap/objects-visiting.h |
| index 787410d76f14ef7627ba2058ec25897c02d2202c..cf3e838c4e6c7213604ab055704622dafa56216e 100644 |
| --- a/src/heap/objects-visiting.h |
| +++ b/src/heap/objects-visiting.h |
| @@ -191,21 +191,37 @@ class VisitorDispatchTable { |
| template <typename StaticVisitor, typename BodyDescriptor, typename ReturnType> |
| class FlexibleBodyVisitor : public AllStatic { |
| public: |
| - INLINE(static ReturnType Visit(Map* map, HeapObject* object)) { |
| + V8_INLINE static ReturnType Visit(Map* map, HeapObject* object) { |
| int object_size = BodyDescriptor::SizeOf(map, object); |
| BodyDescriptor::template IterateBody<StaticVisitor>(object, object_size); |
| return static_cast<ReturnType>(object_size); |
| } |
| + V8_INLINE static ReturnType Visit(Map* map, HeapObject* object, |
|
ulan
2015/11/12 12:27:27
Is this leftover from the previous patch?
|
| + StaticVisitor* v) { |
| + int object_size = BodyDescriptor::SizeOf(map, object); |
| + BodyDescriptor::template IterateBody(object, object_size, v); |
| + return static_cast<ReturnType>(object_size); |
| + } |
| + |
| + // This specialization is only suitable for objects containing pointer fields. |
| + template <int object_size> |
| + V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object) { |
| + DCHECK(BodyDescriptor::SizeOf(map, object) == object_size); |
| + DCHECK(!FLAG_unbox_double_fields || map->HasFastPointerLayout()); |
| + BodyDescriptor::template IteratePointers<StaticVisitor>( |
| + object->GetHeap(), object, BodyDescriptor::kStartOffset, object_size); |
| + return static_cast<ReturnType>(object_size); |
| + } |
| + |
| // This specialization is only suitable for objects containing pointer fields. |
| template <int object_size> |
| - static inline ReturnType VisitSpecialized(Map* map, HeapObject* object) { |
| + V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object, |
| + StaticVisitor* v) { |
| DCHECK(BodyDescriptor::SizeOf(map, object) == object_size); |
| DCHECK(!FLAG_unbox_double_fields || map->HasFastPointerLayout()); |
| - StaticVisitor::VisitPointers( |
| - object->GetHeap(), object, |
| - HeapObject::RawField(object, BodyDescriptor::kStartOffset), |
| - HeapObject::RawField(object, object_size)); |
| + BodyDescriptor::template IteratePointers( |
| + object, BodyDescriptor::kStartOffset, object_size, v); |
| return static_cast<ReturnType>(object_size); |
| } |
| }; |
| @@ -214,10 +230,45 @@ class FlexibleBodyVisitor : public AllStatic { |
| template <typename StaticVisitor, typename BodyDescriptor, typename ReturnType> |
| class FixedBodyVisitor : public AllStatic { |
| public: |
| - INLINE(static ReturnType Visit(Map* map, HeapObject* object)) { |
| + V8_INLINE static ReturnType Visit(Map* map, HeapObject* object) { |
| BodyDescriptor::template IterateBody<StaticVisitor>(object); |
| return static_cast<ReturnType>(BodyDescriptor::kSize); |
| } |
| + |
| + V8_INLINE static ReturnType Visit(Map* map, HeapObject* object, |
| + StaticVisitor* v) { |
| + BodyDescriptor::template IterateBody(object, v); |
| + return static_cast<ReturnType>(BodyDescriptor::kSize); |
| + } |
| +}; |
| + |
| + |
| +template <typename StaticVisitor, typename BodyDescriptor, typename ReturnType> |
| +class DataBodyVisitor { |
| + public: |
| + V8_INLINE static ReturnType Visit(Map* map, HeapObject* object) { |
| + int object_size = BodyDescriptor::SizeOf(map, object); |
| + return static_cast<ReturnType>(object_size); |
| + } |
| + |
| + V8_INLINE static ReturnType Visit(Map* map, HeapObject* object, |
| + StaticVisitor* v) { |
| + int object_size = BodyDescriptor::SizeOf(map, object); |
| + return static_cast<ReturnType>(object_size); |
| + } |
| + |
| + template <int object_size> |
| + V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object) { |
| + DCHECK(BodyDescriptor::SizeOf(map, object) == object_size); |
| + return static_cast<ReturnType>(object_size); |
| + } |
| + |
| + template <int object_size> |
| + V8_INLINE static ReturnType VisitSpecialized(Map* map, HeapObject* object, |
| + StaticVisitor* v) { |
| + DCHECK(BodyDescriptor::SizeOf(map, object) == object_size); |
| + return static_cast<ReturnType>(object_size); |
| + } |
| }; |
| @@ -296,17 +347,8 @@ class StaticNewSpaceVisitor : public StaticVisitorBase { |
| INLINE(static int VisitJSDataView(Map* map, HeapObject* object)); |
| INLINE(static int VisitBytecodeArray(Map* map, HeapObject* object)); |
| - class DataObjectVisitor { |
| - public: |
| - template <int object_size> |
| - static inline int VisitSpecialized(Map* map, HeapObject* object) { |
| - return object_size; |
| - } |
| - |
| - INLINE(static int Visit(Map* map, HeapObject* object)) { |
| - return map->instance_size(); |
| - } |
| - }; |
| + typedef DataBodyVisitor<StaticVisitor, StructBodyDescriptor, int> |
| + DataObjectVisitor; |
| typedef FlexibleBodyVisitor<StaticVisitor, StructBodyDescriptor, int> |
| StructVisitor; |
| @@ -401,13 +443,8 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
| static void VisitJSFunctionStrongCode(Map* map, HeapObject* object); |
| static void VisitJSFunctionWeakCode(Map* map, HeapObject* object); |
| - class DataObjectVisitor { |
| - public: |
| - template <int size> |
| - static inline void VisitSpecialized(Map* map, HeapObject* object) {} |
| - |
| - INLINE(static void Visit(Map* map, HeapObject* object)) {} |
| - }; |
| + typedef DataBodyVisitor<StaticVisitor, StructBodyDescriptor, void> |
| + DataObjectVisitor; |
| typedef FlexibleBodyVisitor<StaticVisitor, FixedArray::BodyDescriptor, void> |
| FixedArrayVisitor; |