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

Generated by: LCOV version 1.10