LCOV - code coverage report
Current view: top level - src/heap - objects-visiting-inl.h (source / functions) Hit Total Coverage
Test: app.info Lines: 22 32 68.8 %
Date: 2017-10-20 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2012 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_OBJECTS_VISITING_INL_H_
       6             : #define V8_OBJECTS_VISITING_INL_H_
       7             : 
       8             : #include "src/heap/objects-visiting.h"
       9             : 
      10             : #include "src/heap/array-buffer-tracker.h"
      11             : #include "src/heap/embedder-tracing.h"
      12             : #include "src/heap/mark-compact.h"
      13             : #include "src/macro-assembler.h"
      14             : #include "src/objects-body-descriptors-inl.h"
      15             : 
      16             : namespace v8 {
      17             : namespace internal {
      18             : 
      19             : template <typename ResultType, typename ConcreteVisitor>
      20             : template <typename T>
      21             : T* HeapVisitor<ResultType, ConcreteVisitor>::Cast(HeapObject* object) {
      22     2519317 :   return T::cast(object);
      23             : }
      24             : 
      25             : template <typename ResultType, typename ConcreteVisitor>
      26             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(HeapObject* object) {
      27    58170509 :   return Visit(object->map(), object);
      28             : }
      29             : 
      30             : template <typename ResultType, typename ConcreteVisitor>
      31             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(Map* map,
      32             :                                                            HeapObject* object) {
      33             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
      34   762095395 :   switch (static_cast<VisitorId>(map->visitor_id())) {
      35             : #define CASE(type)                   \
      36             :   case kVisit##type:                 \
      37             :     return visitor->Visit##type(map, \
      38             :                                 ConcreteVisitor::template Cast<type>(object));
      39   168628362 :     TYPED_VISITOR_ID_LIST(CASE)
      40             : #undef CASE
      41             :     case kVisitShortcutCandidate:
      42             :       return visitor->VisitShortcutCandidate(
      43    12654440 :           map, ConcreteVisitor::template Cast<ConsString>(object));
      44             :     case kVisitNativeContext:
      45             :       return visitor->VisitNativeContext(
      46       51326 :           map, ConcreteVisitor::template Cast<Context>(object));
      47             :     case kVisitDataObject:
      48             :       return visitor->VisitDataObject(map, object);
      49             :     case kVisitJSObjectFast:
      50             :       return visitor->VisitJSObjectFast(
      51     9953310 :           map, ConcreteVisitor::template Cast<JSObject>(object));
      52             :     case kVisitJSApiObject:
      53             :       return visitor->VisitJSApiObject(
      54       49282 :           map, ConcreteVisitor::template Cast<JSObject>(object));
      55             :     case kVisitStruct:
      56           0 :       return visitor->VisitStruct(map, object);
      57             :     case kVisitFreeSpace:
      58           0 :       return visitor->VisitFreeSpace(map, FreeSpace::cast(object));
      59             :     case kVisitorIdCount:
      60           0 :       UNREACHABLE();
      61             :   }
      62           0 :   UNREACHABLE();
      63             :   // Make the compiler happy.
      64             :   return ResultType();
      65             : }
      66             : 
      67             : template <typename ResultType, typename ConcreteVisitor>
      68             : void HeapVisitor<ResultType, ConcreteVisitor>::VisitMapPointer(
      69             :     HeapObject* host, HeapObject** map) {
      70   355221953 :   static_cast<ConcreteVisitor*>(this)->VisitPointer(
      71             :       host, reinterpret_cast<Object**>(map));
      72             : }
      73             : 
      74             : #define VISIT(type)                                                 \
      75             :   template <typename ResultType, typename ConcreteVisitor>          \
      76             :   ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##type( \
      77             :       Map* map, type* object) {                                     \
      78             :     ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this); \
      79             :     if (!visitor->ShouldVisit(object)) return ResultType();         \
      80             :     int size = type::BodyDescriptor::SizeOf(map, object);           \
      81             :     if (visitor->ShouldVisitMapPointer())                           \
      82             :       visitor->VisitMapPointer(object, object->map_slot());         \
      83             :     type::BodyDescriptor::IterateBody(object, size, visitor);       \
      84             :     return static_cast<ResultType>(size);                           \
      85             :   }
      86   213519130 : TYPED_VISITOR_ID_LIST(VISIT)
      87             : #undef VISIT
      88             : 
      89             : template <typename ResultType, typename ConcreteVisitor>
      90             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
      91             :     Map* map, ConsString* object) {
      92    12651574 :   return static_cast<ConcreteVisitor*>(this)->VisitConsString(map, object);
      93             : }
      94             : 
      95             : template <typename ResultType, typename ConcreteVisitor>
      96             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitNativeContext(
      97             :     Map* map, Context* object) {
      98             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
      99             :   if (!visitor->ShouldVisit(object)) return ResultType();
     100             :   int size = Context::BodyDescriptor::SizeOf(map, object);
     101             :   if (visitor->ShouldVisitMapPointer())
     102             :     visitor->VisitMapPointer(object, object->map_slot());
     103             :   Context::BodyDescriptor::IterateBody(object, size, visitor);
     104             :   return static_cast<ResultType>(size);
     105             : }
     106             : 
     107             : template <typename ResultType, typename ConcreteVisitor>
     108             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject(
     109             :     Map* map, HeapObject* object) {
     110             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     111    14386974 :   if (!visitor->ShouldVisit(object)) return ResultType();
     112    21223156 :   int size = map->instance_size();
     113             :   if (visitor->ShouldVisitMapPointer())
     114    14419537 :     visitor->VisitMapPointer(object, object->map_slot());
     115             :   return static_cast<ResultType>(size);
     116             : }
     117             : 
     118             : template <typename ResultType, typename ConcreteVisitor>
     119             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
     120             :     Map* map, JSObject* object) {
     121             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     122             :   if (!visitor->ShouldVisit(object)) return ResultType();
     123    15599038 :   int size = JSObject::FastBodyDescriptor::SizeOf(map, object);
     124             :   if (visitor->ShouldVisitMapPointer())
     125             :     visitor->VisitMapPointer(object, object->map_slot());
     126    15591864 :   JSObject::FastBodyDescriptor::IterateBody(object, size, visitor);
     127             :   return static_cast<ResultType>(size);
     128             : }
     129             : 
     130             : template <typename ResultType, typename ConcreteVisitor>
     131             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
     132             :     Map* map, JSObject* object) {
     133             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     134             :   if (!visitor->ShouldVisit(object)) return ResultType();
     135             :   int size = JSObject::BodyDescriptor::SizeOf(map, object);
     136             :   if (visitor->ShouldVisitMapPointer())
     137             :     visitor->VisitMapPointer(object, object->map_slot());
     138             :   JSObject::BodyDescriptor::IterateBody(object, size, visitor);
     139             :   return static_cast<ResultType>(size);
     140             : }
     141             : 
     142             : template <typename ResultType, typename ConcreteVisitor>
     143             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
     144             :     Map* map, HeapObject* object) {
     145             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     146    10592068 :   if (!visitor->ShouldVisit(object)) return ResultType();
     147    18382861 :   int size = map->instance_size();
     148             :   if (visitor->ShouldVisitMapPointer())
     149    10600397 :     visitor->VisitMapPointer(object, object->map_slot());
     150    18378504 :   StructBodyDescriptor::IterateBody(object, size, visitor);
     151             :   return static_cast<ResultType>(size);
     152             : }
     153             : 
     154             : template <typename ResultType, typename ConcreteVisitor>
     155             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitFreeSpace(
     156             :     Map* map, FreeSpace* object) {
     157             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     158           0 :   if (!visitor->ShouldVisit(object)) return ResultType();
     159             :   if (visitor->ShouldVisitMapPointer())
     160           0 :     visitor->VisitMapPointer(object, object->map_slot());
     161           0 :   return static_cast<ResultType>(FreeSpace::cast(object)->size());
     162             : }
     163             : 
     164             : template <typename ConcreteVisitor>
     165             : int NewSpaceVisitor<ConcreteVisitor>::VisitJSFunction(Map* map,
     166             :                                                       JSFunction* object) {
     167             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     168      877975 :   int size = JSFunction::BodyDescriptorWeak::SizeOf(map, object);
     169      877095 :   JSFunction::BodyDescriptorWeak::IterateBody(object, size, visitor);
     170             :   return size;
     171             : }
     172             : 
     173             : template <typename ConcreteVisitor>
     174             : int NewSpaceVisitor<ConcreteVisitor>::VisitNativeContext(Map* map,
     175             :                                                          Context* object) {
     176             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     177           0 :   int size = Context::BodyDescriptor::SizeOf(map, object);
     178           0 :   Context::BodyDescriptor::IterateBody(object, size, visitor);
     179             :   return size;
     180             : }
     181             : 
     182             : template <typename ConcreteVisitor>
     183             : int NewSpaceVisitor<ConcreteVisitor>::VisitJSApiObject(Map* map,
     184             :                                                        JSObject* object) {
     185             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     186           0 :   return visitor->VisitJSObject(map, object);
     187             : }
     188             : 
     189             : }  // namespace internal
     190             : }  // namespace v8
     191             : 
     192             : #endif  // V8_OBJECTS_VISITING_INL_H_

Generated by: LCOV version 1.10