LCOV - code coverage report
Current view: top level - src/heap - objects-visiting-inl.h (source / functions) Hit Total Coverage
Test: app.info Lines: 24 37 64.9 %
Date: 2019-02-19 Functions: 0 4 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_HEAP_OBJECTS_VISITING_INL_H_
       6             : #define V8_HEAP_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/objects-body-descriptors-inl.h"
      14             : #include "src/objects-inl.h"
      15             : #include "src/objects/free-space-inl.h"
      16             : #include "src/objects/js-weak-refs-inl.h"
      17             : #include "src/objects/oddball.h"
      18             : #include "src/wasm/wasm-objects.h"
      19             : 
      20             : namespace v8 {
      21             : namespace internal {
      22             : 
      23             : template <typename ResultType, typename ConcreteVisitor>
      24             : template <typename T>
      25             : T HeapVisitor<ResultType, ConcreteVisitor>::Cast(HeapObject object) {
      26             :   return T::cast(object);
      27             : }
      28             : 
      29             : template <typename ResultType, typename ConcreteVisitor>
      30             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(HeapObject object) {
      31    54134516 :   return Visit(object->map(), object);
      32             : }
      33             : 
      34             : template <typename ResultType, typename ConcreteVisitor>
      35             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit(Map map,
      36             :                                                            HeapObject object) {
      37             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
      38   747748071 :   switch (map->visitor_id()) {
      39             : #define CASE(TypeName, Type)         \
      40             :   case kVisit##TypeName:             \
      41             :     return visitor->Visit##TypeName( \
      42             :         map, ConcreteVisitor::template Cast<TypeName>(object));
      43   167295456 :     TYPED_VISITOR_ID_LIST(CASE)
      44             : #undef CASE
      45             :     case kVisitShortcutCandidate:
      46             :       return visitor->VisitShortcutCandidate(
      47    10227839 :           map, ConcreteVisitor::template Cast<ConsString>(object));
      48             :     case kVisitDataObject:
      49             :       return visitor->VisitDataObject(map, object);
      50             :     case kVisitJSObjectFast:
      51             :       return visitor->VisitJSObjectFast(
      52    12168670 :           map, ConcreteVisitor::template Cast<JSObject>(object));
      53             :     case kVisitJSApiObject:
      54             :       return visitor->VisitJSApiObject(
      55       76718 :           map, ConcreteVisitor::template Cast<JSObject>(object));
      56             :     case kVisitStruct:
      57           0 :       return visitor->VisitStruct(map, object);
      58             :     case kVisitFreeSpace:
      59           2 :       return visitor->VisitFreeSpace(map, FreeSpace::cast(object));
      60             :     case kVisitWeakArray:
      61           0 :       return visitor->VisitWeakArray(map, object);
      62             :     case kDataOnlyVisitorIdCount:
      63             :     case kVisitorIdCount:
      64           0 :       UNREACHABLE();
      65             :   }
      66           0 :   UNREACHABLE();
      67             :   // Make the compiler happy.
      68             :   return ResultType();
      69             : }
      70             : 
      71             : template <typename ResultType, typename ConcreteVisitor>
      72             : void HeapVisitor<ResultType, ConcreteVisitor>::VisitMapPointer(
      73             :     HeapObject host, MapWordSlot map_slot) {
      74             :   DCHECK(!host->map_word().IsForwardingAddress());
      75   385073397 :   static_cast<ConcreteVisitor*>(this)->VisitPointer(host, ObjectSlot(map_slot));
      76             : }
      77             : 
      78             : #define VISIT(TypeName, Type)                                                  \
      79             :   template <typename ResultType, typename ConcreteVisitor>                     \
      80             :   ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##TypeName(        \
      81             :       Map map, Type object) {                                                  \
      82             :     ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);            \
      83             :     if (!visitor->ShouldVisit(object)) return ResultType();                    \
      84             :     if (!visitor->AllowDefaultJSObjectVisit()) {                               \
      85             :       DCHECK_WITH_MSG(!map->IsJSObjectMap(),                                   \
      86             :                       "Implement custom visitor for new JSObject subclass in " \
      87             :                       "concurrent marker");                                    \
      88             :     }                                                                          \
      89             :     int size = TypeName::BodyDescriptor::SizeOf(map, object);                  \
      90             :     if (visitor->ShouldVisitMapPointer())                                      \
      91             :       visitor->VisitMapPointer(object, object->map_slot());                    \
      92             :     TypeName::BodyDescriptor::IterateBody(map, object, size, visitor);         \
      93             :     return static_cast<ResultType>(size);                                      \
      94             :   }
      95   635033809 : TYPED_VISITOR_ID_LIST(VISIT)
      96             : #undef VISIT
      97             : 
      98             : template <typename ResultType, typename ConcreteVisitor>
      99             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
     100             :     Map map, ConsString object) {
     101    10228108 :   return static_cast<ConcreteVisitor*>(this)->VisitConsString(map, object);
     102             : }
     103             : 
     104             : template <typename ResultType, typename ConcreteVisitor>
     105             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject(
     106             :     Map map, HeapObject object) {
     107             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     108    11226691 :   if (!visitor->ShouldVisit(object)) return ResultType();
     109    19130933 :   int size = map->instance_size();
     110             :   if (visitor->ShouldVisitMapPointer()) {
     111    11244485 :     visitor->VisitMapPointer(object, object->map_slot());
     112             :   }
     113             :   return static_cast<ResultType>(size);
     114             : }
     115             : 
     116             : template <typename ResultType, typename ConcreteVisitor>
     117             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
     118             :     Map map, JSObject object) {
     119             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     120             :   if (!visitor->ShouldVisit(object)) return ResultType();
     121    21328167 :   int size = JSObject::FastBodyDescriptor::SizeOf(map, object);
     122             :   if (visitor->ShouldVisitMapPointer())
     123             :     visitor->VisitMapPointer(object, object->map_slot());
     124    21338296 :   JSObject::FastBodyDescriptor::IterateBody(map, object, size, visitor);
     125             :   return static_cast<ResultType>(size);
     126             : }
     127             : 
     128             : template <typename ResultType, typename ConcreteVisitor>
     129             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
     130             :     Map map, JSObject object) {
     131             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     132             :   if (!visitor->ShouldVisit(object)) return ResultType();
     133             :   int size = JSObject::BodyDescriptor::SizeOf(map, object);
     134             :   if (visitor->ShouldVisitMapPointer())
     135             :     visitor->VisitMapPointer(object, object->map_slot());
     136             :   JSObject::BodyDescriptor::IterateBody(map, object, size, visitor);
     137             :   return static_cast<ResultType>(size);
     138             : }
     139             : 
     140             : template <typename ResultType, typename ConcreteVisitor>
     141             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
     142             :     Map map, HeapObject object) {
     143             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     144    12061977 :   if (!visitor->ShouldVisit(object)) return ResultType();
     145    19662778 :   int size = map->instance_size();
     146             :   if (visitor->ShouldVisitMapPointer()) {
     147    12064910 :     visitor->VisitMapPointer(object, object->map_slot());
     148             :   }
     149    19650900 :   StructBodyDescriptor::IterateBody(map, object, size, visitor);
     150             :   return static_cast<ResultType>(size);
     151             : }
     152             : 
     153             : template <typename ResultType, typename ConcreteVisitor>
     154             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitFreeSpace(
     155             :     Map map, FreeSpace object) {
     156             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     157           0 :   if (!visitor->ShouldVisit(object)) return ResultType();
     158             :   if (visitor->ShouldVisitMapPointer()) {
     159           0 :     visitor->VisitMapPointer(object, object->map_slot());
     160             :   }
     161           2 :   return static_cast<ResultType>(object->size());
     162             : }
     163             : 
     164             : template <typename ResultType, typename ConcreteVisitor>
     165             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitWeakArray(
     166             :     Map map, HeapObject object) {
     167             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     168     1380148 :   if (!visitor->ShouldVisit(object)) return ResultType();
     169     3345217 :   int size = WeakArrayBodyDescriptor::SizeOf(map, object);
     170             :   if (visitor->ShouldVisitMapPointer()) {
     171     1379583 :     visitor->VisitMapPointer(object, object->map_slot());
     172             :   }
     173     3343267 :   WeakArrayBodyDescriptor::IterateBody(map, object, size, visitor);
     174             :   return size;
     175             : }
     176             : 
     177             : template <typename ConcreteVisitor>
     178             : int NewSpaceVisitor<ConcreteVisitor>::VisitNativeContext(Map map,
     179             :                                                          NativeContext object) {
     180             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     181           0 :   int size = NativeContext::BodyDescriptor::SizeOf(map, object);
     182           0 :   NativeContext::BodyDescriptor::IterateBody(map, object, size, visitor);
     183             :   return size;
     184             : }
     185             : 
     186             : template <typename ConcreteVisitor>
     187             : int NewSpaceVisitor<ConcreteVisitor>::VisitJSApiObject(Map map,
     188             :                                                        JSObject object) {
     189             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     190           0 :   return visitor->VisitJSObject(map, object);
     191             : }
     192             : 
     193             : template <typename ConcreteVisitor>
     194           0 : int NewSpaceVisitor<ConcreteVisitor>::VisitSharedFunctionInfo(
     195             :     Map map, SharedFunctionInfo object) {
     196           0 :   UNREACHABLE();
     197             :   return 0;
     198             : }
     199             : 
     200             : template <typename ConcreteVisitor>
     201           0 : int NewSpaceVisitor<ConcreteVisitor>::VisitWeakCell(Map map,
     202             :                                                     WeakCell weak_cell) {
     203           0 :   UNREACHABLE();
     204             :   return 0;
     205             : }
     206             : 
     207             : }  // namespace internal
     208             : }  // namespace v8
     209             : 
     210             : #endif  // V8_HEAP_OBJECTS_VISITING_INL_H_

Generated by: LCOV version 1.10