| Index: src/heap/objects-visiting-inl.h
|
| diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h
|
| index df3bab76a14040191a0badde93b3666489d1b451..11bf679ec4d39598498d232d322ed6df295a8b28 100644
|
| --- a/src/heap/objects-visiting-inl.h
|
| +++ b/src/heap/objects-visiting-inl.h
|
| @@ -637,8 +637,7 @@ void StaticMarkingVisitor<StaticVisitor>::VisitJSFunctionWeakCode(
|
| }
|
|
|
| template <typename ResultType, typename ConcreteVisitor>
|
| -ResultType HeapVisitor<ResultType, ConcreteVisitor>::IterateBody(
|
| - HeapObject* object) {
|
| +ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(HeapObject* object) {
|
| Map* map = object->map();
|
| ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| switch (static_cast<VisitorId>(map->visitor_id())) {
|
| @@ -669,14 +668,28 @@ ResultType HeapVisitor<ResultType, ConcreteVisitor>::IterateBody(
|
| return ResultType();
|
| }
|
|
|
| -#define VISIT(type) \
|
| - template <typename ResultType, typename ConcreteVisitor> \
|
| - ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##type( \
|
| - Map* map, type* object) { \
|
| - int size = type::BodyDescriptor::SizeOf(map, object); \
|
| - type::BodyDescriptor::IterateBody(object, size, \
|
| - static_cast<ConcreteVisitor*>(this)); \
|
| - return static_cast<ResultType>(size); \
|
| +template <typename ResultType, typename ConcreteVisitor>
|
| +void HeapVisitor<ResultType, ConcreteVisitor>::VisitMapPointer(
|
| + HeapObject* host, HeapObject** map) {
|
| + static_cast<ConcreteVisitor*>(this)->VisitPointer(
|
| + host, reinterpret_cast<Object**>(map));
|
| +}
|
| +
|
| +template <typename ResultType, typename ConcreteVisitor>
|
| +bool HeapVisitor<ResultType, ConcreteVisitor>::ShouldVisit(HeapObject* object) {
|
| + return true;
|
| +}
|
| +
|
| +#define VISIT(type) \
|
| + template <typename ResultType, typename ConcreteVisitor> \
|
| + ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##type( \
|
| + Map* map, type* object) { \
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this); \
|
| + if (!visitor->ShouldVisit(object)) return ResultType(); \
|
| + int size = type::BodyDescriptor::SizeOf(map, object); \
|
| + visitor->VisitMapPointer(object, object->map_slot()); \
|
| + type::BodyDescriptor::IterateBody(object, size, visitor); \
|
| + return static_cast<ResultType>(size); \
|
| }
|
| TYPED_VISITOR_ID_LIST(VISIT)
|
| #undef VISIT
|
| @@ -684,7 +697,10 @@ TYPED_VISITOR_ID_LIST(VISIT)
|
| template <typename ResultType, typename ConcreteVisitor>
|
| ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
|
| Map* map, ConsString* object) {
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| + if (!visitor->ShouldVisit(object)) return ResultType();
|
| int size = ConsString::BodyDescriptor::SizeOf(map, object);
|
| + visitor->VisitMapPointer(object, object->map_slot());
|
| ConsString::BodyDescriptor::IterateBody(object, size,
|
| static_cast<ConcreteVisitor*>(this));
|
| return static_cast<ResultType>(size);
|
| @@ -693,7 +709,10 @@ ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
|
| template <typename ResultType, typename ConcreteVisitor>
|
| ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitNativeContext(
|
| Map* map, Context* object) {
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| + if (!visitor->ShouldVisit(object)) return ResultType();
|
| int size = Context::BodyDescriptor::SizeOf(map, object);
|
| + visitor->VisitMapPointer(object, object->map_slot());
|
| Context::BodyDescriptor::IterateBody(object, size,
|
| static_cast<ConcreteVisitor*>(this));
|
| return static_cast<ResultType>(size);
|
| @@ -702,14 +721,20 @@ ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitNativeContext(
|
| template <typename ResultType, typename ConcreteVisitor>
|
| ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject(
|
| Map* map, HeapObject* object) {
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| + if (!visitor->ShouldVisit(object)) return ResultType();
|
| int size = map->instance_size();
|
| + visitor->VisitMapPointer(object, object->map_slot());
|
| return static_cast<ResultType>(size);
|
| }
|
|
|
| template <typename ResultType, typename ConcreteVisitor>
|
| ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
|
| Map* map, JSObject* object) {
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| + if (!visitor->ShouldVisit(object)) return ResultType();
|
| int size = JSObject::FastBodyDescriptor::SizeOf(map, object);
|
| + visitor->VisitMapPointer(object, object->map_slot());
|
| JSObject::FastBodyDescriptor::IterateBody(
|
| object, size, static_cast<ConcreteVisitor*>(this));
|
| return static_cast<ResultType>(size);
|
| @@ -717,7 +742,10 @@ ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
|
| template <typename ResultType, typename ConcreteVisitor>
|
| ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
|
| Map* map, JSObject* object) {
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| + if (!visitor->ShouldVisit(object)) return ResultType();
|
| int size = JSObject::BodyDescriptor::SizeOf(map, object);
|
| + visitor->VisitMapPointer(object, object->map_slot());
|
| JSObject::BodyDescriptor::IterateBody(object, size,
|
| static_cast<ConcreteVisitor*>(this));
|
| return static_cast<ResultType>(size);
|
| @@ -725,7 +753,10 @@ ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
|
| template <typename ResultType, typename ConcreteVisitor>
|
| ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
|
| Map* map, HeapObject* object) {
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| + if (!visitor->ShouldVisit(object)) return ResultType();
|
| int size = map->instance_size();
|
| + visitor->VisitMapPointer(object, object->map_slot());
|
| StructBodyDescriptor::IterateBody(object, size,
|
| static_cast<ConcreteVisitor*>(this));
|
| return static_cast<ResultType>(size);
|
| @@ -733,6 +764,9 @@ ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
|
| template <typename ResultType, typename ConcreteVisitor>
|
| ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitFreeSpace(
|
| Map* map, FreeSpace* object) {
|
| + ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
|
| + if (!visitor->ShouldVisit(object)) return ResultType();
|
| + visitor->VisitMapPointer(object, object->map_slot());
|
| return static_cast<ResultType>(FreeSpace::cast(object)->size());
|
| }
|
|
|
|
|