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-01-20 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    63699879 :   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   801429957 :   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   141743112 :     TYPED_VISITOR_ID_LIST(CASE)
      44             : #undef CASE
      45             :     case kVisitShortcutCandidate:
      46             :       return visitor->VisitShortcutCandidate(
      47     3637257 :           map, ConcreteVisitor::template Cast<ConsString>(object));
      48             :     case kVisitDataObject:
      49             :       return visitor->VisitDataObject(map, object);
      50             :     case kVisitJSObjectFast:
      51             :       return visitor->VisitJSObjectFast(
      52    55651566 :           map, ConcreteVisitor::template Cast<JSObject>(object));
      53             :     case kVisitJSApiObject:
      54             :       return visitor->VisitJSApiObject(
      55       81821 :           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 kVisitorIdCount:
      63           0 :       UNREACHABLE();
      64             :   }
      65           0 :   UNREACHABLE();
      66             :   // Make the compiler happy.
      67             :   return ResultType();
      68             : }
      69             : 
      70             : template <typename ResultType, typename ConcreteVisitor>
      71             : void HeapVisitor<ResultType, ConcreteVisitor>::VisitMapPointer(
      72             :     HeapObject host, MapWordSlot map_slot) {
      73             :   DCHECK(!host->map_word().IsForwardingAddress());
      74   415426481 :   static_cast<ConcreteVisitor*>(this)->VisitPointer(host, ObjectSlot(map_slot));
      75             : }
      76             : 
      77             : #define VISIT(TypeName, Type)                                                  \
      78             :   template <typename ResultType, typename ConcreteVisitor>                     \
      79             :   ResultType HeapVisitor<ResultType, ConcreteVisitor>::Visit##TypeName(        \
      80             :       Map map, Type object) {                                                  \
      81             :     ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);            \
      82             :     if (!visitor->ShouldVisit(object)) return ResultType();                    \
      83             :     if (!visitor->AllowDefaultJSObjectVisit()) {                               \
      84             :       DCHECK_WITH_MSG(!map->IsJSObjectMap(),                                   \
      85             :                       "Implement custom visitor for new JSObject subclass in " \
      86             :                       "concurrent marker");                                    \
      87             :     }                                                                          \
      88             :     int size = TypeName::BodyDescriptor::SizeOf(map, object);                  \
      89             :     if (visitor->ShouldVisitMapPointer())                                      \
      90             :       visitor->VisitMapPointer(object, object->map_slot());                    \
      91             :     TypeName::BodyDescriptor::IterateBody(map, object, size, visitor);         \
      92             :     return static_cast<ResultType>(size);                                      \
      93             :   }
      94   656249300 : TYPED_VISITOR_ID_LIST(VISIT)
      95             : #undef VISIT
      96             : 
      97             : template <typename ResultType, typename ConcreteVisitor>
      98             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitShortcutCandidate(
      99             :     Map map, ConsString object) {
     100     3637489 :   return static_cast<ConcreteVisitor*>(this)->VisitConsString(map, object);
     101             : }
     102             : 
     103             : template <typename ResultType, typename ConcreteVisitor>
     104             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitDataObject(
     105             :     Map map, HeapObject object) {
     106             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     107    13640499 :   if (!visitor->ShouldVisit(object)) return ResultType();
     108    27317387 :   int size = map->instance_size();
     109             :   if (visitor->ShouldVisitMapPointer()) {
     110    13643195 :     visitor->VisitMapPointer(object, object->map_slot());
     111             :   }
     112             :   return static_cast<ResultType>(size);
     113             : }
     114             : 
     115             : template <typename ResultType, typename ConcreteVisitor>
     116             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSObjectFast(
     117             :     Map map, JSObject object) {
     118             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     119             :   if (!visitor->ShouldVisit(object)) return ResultType();
     120    45347137 :   int size = JSObject::FastBodyDescriptor::SizeOf(map, object);
     121             :   if (visitor->ShouldVisitMapPointer())
     122             :     visitor->VisitMapPointer(object, object->map_slot());
     123    45351525 :   JSObject::FastBodyDescriptor::IterateBody(map, object, size, visitor);
     124             :   return static_cast<ResultType>(size);
     125             : }
     126             : 
     127             : template <typename ResultType, typename ConcreteVisitor>
     128             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitJSApiObject(
     129             :     Map map, JSObject object) {
     130             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     131             :   if (!visitor->ShouldVisit(object)) return ResultType();
     132             :   int size = JSObject::BodyDescriptor::SizeOf(map, object);
     133             :   if (visitor->ShouldVisitMapPointer())
     134             :     visitor->VisitMapPointer(object, object->map_slot());
     135             :   JSObject::BodyDescriptor::IterateBody(map, object, size, visitor);
     136             :   return static_cast<ResultType>(size);
     137             : }
     138             : 
     139             : template <typename ResultType, typename ConcreteVisitor>
     140             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitStruct(
     141             :     Map map, HeapObject object) {
     142             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     143    12838907 :   if (!visitor->ShouldVisit(object)) return ResultType();
     144    21069271 :   int size = map->instance_size();
     145             :   if (visitor->ShouldVisitMapPointer()) {
     146    12842063 :     visitor->VisitMapPointer(object, object->map_slot());
     147             :   }
     148    21060383 :   StructBodyDescriptor::IterateBody(map, object, size, visitor);
     149             :   return static_cast<ResultType>(size);
     150             : }
     151             : 
     152             : template <typename ResultType, typename ConcreteVisitor>
     153             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitFreeSpace(
     154             :     Map map, FreeSpace object) {
     155             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     156           0 :   if (!visitor->ShouldVisit(object)) return ResultType();
     157             :   if (visitor->ShouldVisitMapPointer()) {
     158           0 :     visitor->VisitMapPointer(object, object->map_slot());
     159             :   }
     160           2 :   return static_cast<ResultType>(object->size());
     161             : }
     162             : 
     163             : template <typename ConcreteVisitor>
     164             : int NewSpaceVisitor<ConcreteVisitor>::VisitNativeContext(Map map,
     165             :                                                          NativeContext object) {
     166             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     167           0 :   int size = NativeContext::BodyDescriptor::SizeOf(map, object);
     168           0 :   NativeContext::BodyDescriptor::IterateBody(map, object, size, visitor);
     169             :   return size;
     170             : }
     171             : 
     172             : template <typename ConcreteVisitor>
     173             : int NewSpaceVisitor<ConcreteVisitor>::VisitJSApiObject(Map map,
     174             :                                                        JSObject object) {
     175             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     176           0 :   return visitor->VisitJSObject(map, object);
     177             : }
     178             : 
     179             : template <typename ConcreteVisitor>
     180           0 : int NewSpaceVisitor<ConcreteVisitor>::VisitSharedFunctionInfo(
     181             :     Map map, SharedFunctionInfo object) {
     182           0 :   UNREACHABLE();
     183             :   return 0;
     184             : }
     185             : 
     186             : template <typename ConcreteVisitor>
     187           0 : int NewSpaceVisitor<ConcreteVisitor>::VisitJSWeakCell(Map map,
     188             :                                                       JSWeakCell js_weak_cell) {
     189           0 :   UNREACHABLE();
     190             :   return 0;
     191             : }
     192             : 
     193             : template <typename ResultType, typename ConcreteVisitor>
     194             : ResultType HeapVisitor<ResultType, ConcreteVisitor>::VisitWeakArray(
     195             :     Map map, HeapObject object) {
     196             :   ConcreteVisitor* visitor = static_cast<ConcreteVisitor*>(this);
     197     1413905 :   if (!visitor->ShouldVisit(object)) return ResultType();
     198     3502738 :   int size = WeakArrayBodyDescriptor::SizeOf(map, object);
     199             :   if (visitor->ShouldVisitMapPointer()) {
     200     1413500 :     visitor->VisitMapPointer(object, object->map_slot());
     201             :   }
     202     3501277 :   WeakArrayBodyDescriptor::IterateBody(map, object, size, visitor);
     203             :   return size;
     204             : }
     205             : 
     206             : }  // namespace internal
     207             : }  // namespace v8
     208             : 
     209             : #endif  // V8_HEAP_OBJECTS_VISITING_INL_H_

Generated by: LCOV version 1.10