LCOV - code coverage report
Current view: top level - src/objects - maybe-object-inl.h (source / functions) Hit Total Coverage
Test: app.info Lines: 43 43 100.0 %
Date: 2019-01-20 Functions: 10 10 100.0 %

          Line data    Source code
       1             : // Copyright 2018 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_MAYBE_OBJECT_INL_H_
       6             : #define V8_OBJECTS_MAYBE_OBJECT_INL_H_
       7             : 
       8             : #include "src/objects/maybe-object.h"
       9             : 
      10             : #ifdef V8_COMPRESS_POINTERS
      11             : #include "src/isolate.h"
      12             : #endif
      13             : #include "src/objects-inl.h"
      14             : #include "src/objects/slots-inl.h"
      15             : 
      16             : namespace v8 {
      17             : namespace internal {
      18             : 
      19     1685387 : bool MaybeObject::ToSmi(Smi* value) {
      20     1685387 :   if (HAS_SMI_TAG(ptr_)) {
      21     1498118 :     *value = Smi::cast(Object(ptr_));
      22     1498118 :     return true;
      23             :   }
      24             :   return false;
      25             : }
      26             : 
      27  3744308956 : Smi MaybeObject::ToSmi() const {
      28             :   DCHECK(HAS_SMI_TAG(ptr_));
      29  7488620959 :   return Smi::cast(Object(ptr_));
      30             : }
      31             : 
      32             : bool MaybeObject::IsStrongOrWeak() const {
      33   273776914 :   if (IsSmi() || IsCleared()) {
      34             :     return false;
      35             :   }
      36             :   return true;
      37             : }
      38             : 
      39  3131541760 : bool MaybeObject::GetHeapObject(HeapObject* result) const {
      40  4056114317 :   if (IsSmi() || IsCleared()) {
      41             :     return false;
      42             :   }
      43   914113472 :   *result = GetHeapObject();
      44   914946490 :   return true;
      45             : }
      46             : 
      47     7033699 : bool MaybeObject::GetHeapObject(HeapObject* result,
      48             :                                 HeapObjectReferenceType* reference_type) const {
      49    13505709 :   if (IsSmi() || IsCleared()) {
      50             :     return false;
      51             :   }
      52             :   *reference_type = HasWeakHeapObjectTag(ptr_)
      53             :                         ? HeapObjectReferenceType::WEAK
      54     6471770 :                         : HeapObjectReferenceType::STRONG;
      55     6471770 :   *result = GetHeapObject();
      56     6471770 :   return true;
      57             : }
      58             : 
      59             : bool MaybeObject::IsStrong() const {
      60      476882 :   return !HasWeakHeapObjectTag(ptr_) && !IsSmi();
      61             : }
      62             : 
      63   838616839 : bool MaybeObject::GetHeapObjectIfStrong(HeapObject* result) const {
      64  2355498299 :   if (!HasWeakHeapObjectTag(ptr_) && !IsSmi()) {
      65   423438736 :     *result = HeapObject::cast(Object(ptr_));
      66   423438736 :     return true;
      67             :   }
      68             :   return false;
      69             : }
      70             : 
      71  1089673445 : HeapObject MaybeObject::GetHeapObjectAssumeStrong() const {
      72             :   DCHECK(IsStrong());
      73  2179346922 :   return HeapObject::cast(Object(ptr_));
      74             : }
      75             : 
      76         913 : bool MaybeObject::IsWeak() const {
      77  1498675125 :   return HasWeakHeapObjectTag(ptr_) && !IsCleared();
      78             : }
      79             : 
      80          20 : bool MaybeObject::IsWeakOrCleared() const { return HasWeakHeapObjectTag(ptr_); }
      81             : 
      82   581072925 : bool MaybeObject::GetHeapObjectIfWeak(HeapObject* result) const {
      83   581072925 :   if (IsWeak()) {
      84   162459642 :     *result = GetHeapObject();
      85   162477935 :     return true;
      86             :   }
      87             :   return false;
      88             : }
      89             : 
      90             : HeapObject MaybeObject::GetHeapObjectAssumeWeak() const {
      91             :   DCHECK(IsWeak());
      92    79322755 :   return GetHeapObject();
      93             : }
      94             : 
      95  1200425607 : HeapObject MaybeObject::GetHeapObject() const {
      96             :   DCHECK(!IsSmi());
      97             :   DCHECK(!IsCleared());
      98  2403439756 :   return HeapObject::cast(Object(ptr_ & ~kWeakHeapObjectMask));
      99             : }
     100             : 
     101       26378 : Object MaybeObject::GetHeapObjectOrSmi() const {
     102       26378 :   if (IsSmi()) {
     103       24170 :     return Object(ptr_);
     104             :   }
     105        2208 :   return GetHeapObject();
     106             : }
     107             : 
     108     1139602 : bool MaybeObject::IsObject() const { return IsSmi() || IsStrong(); }
     109             : 
     110             : MaybeObject MaybeObject::MakeWeak(MaybeObject object) {
     111             :   DCHECK(object.IsStrongOrWeak());
     112       65223 :   return MaybeObject(object.ptr_ | kWeakHeapObjectMask);
     113             : }
     114             : 
     115             : // static
     116             : HeapObjectReference HeapObjectReference::ClearedValue(Isolate* isolate) {
     117             :   // Construct cleared weak ref value.
     118             :   Address raw_value = kClearedWeakHeapObjectLower32;
     119             : #ifdef V8_COMPRESS_POINTERS
     120             :   // This is necessary to make pointer decompression computation also
     121             :   // suitable for cleared weak references.
     122             :   Address isolate_root = isolate->isolate_root();
     123             :   raw_value |= isolate_root;
     124             :   DCHECK_EQ(raw_value & (~static_cast<Address>(kClearedWeakHeapObjectLower32)),
     125             :             isolate_root);
     126             : #endif
     127             :   // The rest of the code will check only the lower 32-bits.
     128             :   DCHECK_EQ(kClearedWeakHeapObjectLower32, static_cast<uint32_t>(raw_value));
     129    10162894 :   return HeapObjectReference(raw_value);
     130             : }
     131             : 
     132             : template <typename THeapObjectSlot>
     133             : void HeapObjectReference::Update(THeapObjectSlot slot, HeapObject value) {
     134             :   static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
     135             :                     std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
     136             :                 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
     137   148526670 :   Address old_value = (*slot).ptr();
     138             :   DCHECK(!HAS_SMI_TAG(old_value));
     139   148246238 :   Address new_value = value->ptr();
     140             :   DCHECK(Internals::HasHeapObjectTag(new_value));
     141             : 
     142             : #ifdef DEBUG
     143             :   bool weak_before = HasWeakHeapObjectTag(old_value);
     144             : #endif
     145             : 
     146   148145625 :   slot.store(
     147             :       HeapObjectReference(new_value | (old_value & kWeakHeapObjectMask)));
     148             : 
     149             : #ifdef DEBUG
     150             :   bool weak_after = HasWeakHeapObjectTag((*slot).ptr());
     151             :   DCHECK_EQ(weak_before, weak_after);
     152             : #endif
     153             : }
     154             : 
     155             : }  // namespace internal
     156             : }  // namespace v8
     157             : 
     158             : #endif  // V8_OBJECTS_MAYBE_OBJECT_INL_H_

Generated by: LCOV version 1.10