| 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());
 | 
|  }
 | 
|  
 | 
| 
 |