LCOV - code coverage report
Current view: top level - src/objects - embedder-data-slot-inl.h (source / functions) Hit Total Coverage
Test: app.info Lines: 21 21 100.0 %
Date: 2019-02-19 Functions: 0 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_EMBEDDER_DATA_SLOT_INL_H_
       6             : #define V8_OBJECTS_EMBEDDER_DATA_SLOT_INL_H_
       7             : 
       8             : #include "src/objects/embedder-data-slot.h"
       9             : 
      10             : #include "src/heap/heap-write-barrier-inl.h"
      11             : #include "src/objects-inl.h"
      12             : #include "src/objects/embedder-data-array.h"
      13             : #include "src/objects/js-objects-inl.h"
      14             : 
      15             : // Has to be the last include (doesn't have include guards):
      16             : #include "src/objects/object-macros.h"
      17             : 
      18             : namespace v8 {
      19             : namespace internal {
      20             : 
      21             : EmbedderDataSlot::EmbedderDataSlot(EmbedderDataArray array, int entry_index)
      22      112099 :     : SlotBase(FIELD_ADDR(array,
      23      112099 :                           EmbedderDataArray::OffsetOfElementAt(entry_index))) {}
      24             : 
      25             : EmbedderDataSlot::EmbedderDataSlot(JSObject object, int embedder_field_index)
      26      939523 :     : SlotBase(FIELD_ADDR(
      27      939526 :           object, object->GetEmbedderFieldOffset(embedder_field_index))) {}
      28             : 
      29             : Object EmbedderDataSlot::load_tagged() const {
      30      937792 :   return ObjectSlot(address() + kTaggedPayloadOffset).Relaxed_Load();
      31             : }
      32             : 
      33             : void EmbedderDataSlot::store_smi(Smi value) {
      34             :   ObjectSlot(address() + kTaggedPayloadOffset).Relaxed_Store(value);
      35             : #ifdef V8_COMPRESS_POINTERS
      36             :   ObjectSlot(address() + kRawPayloadOffset).Relaxed_Store(Smi::kZero);
      37             : #endif
      38             : }
      39             : 
      40             : // static
      41             : void EmbedderDataSlot::store_tagged(EmbedderDataArray array, int entry_index,
      42             :                                     Object value) {
      43          60 :   int slot_offset = EmbedderDataArray::OffsetOfElementAt(entry_index);
      44          60 :   ObjectSlot(FIELD_ADDR(array, slot_offset + kTaggedPayloadOffset))
      45          60 :       .Relaxed_Store(value);
      46          60 :   WRITE_BARRIER(array, slot_offset, value);
      47             : #ifdef V8_COMPRESS_POINTERS
      48             :   ObjectSlot(FIELD_ADDR(array, slot_offset + kRawPayloadOffset))
      49             :       .Relaxed_Store(Smi::kZero);
      50             : #endif
      51             : }
      52             : 
      53             : // static
      54             : void EmbedderDataSlot::store_tagged(JSObject object, int embedder_field_index,
      55             :                                     Object value) {
      56      824723 :   int slot_offset = object->GetEmbedderFieldOffset(embedder_field_index);
      57      824723 :   ObjectSlot(FIELD_ADDR(object, slot_offset + kTaggedPayloadOffset))
      58      824723 :       .Relaxed_Store(value);
      59      824724 :   WRITE_BARRIER(object, slot_offset, value);
      60             : #ifdef V8_COMPRESS_POINTERS
      61             :   ObjectSlot(FIELD_ADDR(object, slot_offset + kRawPayloadOffset))
      62             :       .Relaxed_Store(Smi::kZero);
      63             : #endif
      64             : }
      65             : 
      66             : bool EmbedderDataSlot::ToAlignedPointer(void** out_pointer) const {
      67             :   Object tagged_value =
      68         234 :       ObjectSlot(address() + kTaggedPayloadOffset).Relaxed_Load();
      69         468 :   if (!tagged_value->IsSmi()) return false;
      70             : #ifdef V8_COMPRESS_POINTERS
      71             :   STATIC_ASSERT(kSmiShiftSize == 0);
      72             :   STATIC_ASSERT(SmiValuesAre31Bits());
      73             :   Address value_lo = static_cast<uint32_t>(tagged_value->ptr());
      74             :   STATIC_ASSERT(kTaggedSize == kSystemPointerSize);
      75             :   Address value_hi =
      76             :       FullObjectSlot(address() + kRawPayloadOffset).Relaxed_Load()->ptr();
      77             :   Address value = value_lo | (value_hi << 32);
      78             :   *out_pointer = reinterpret_cast<void*>(value);
      79             : #else
      80         214 :   *out_pointer = reinterpret_cast<void*>(tagged_value->ptr());
      81             : #endif
      82             :   return true;
      83             : }
      84             : 
      85             : bool EmbedderDataSlot::store_aligned_pointer(void* ptr) {
      86      113569 :   Address value = reinterpret_cast<Address>(ptr);
      87      113569 :   if (!HAS_SMI_TAG(value)) return false;
      88             : #ifdef V8_COMPRESS_POINTERS
      89             :   STATIC_ASSERT(kSmiShiftSize == 0);
      90             :   STATIC_ASSERT(SmiValuesAre31Bits());
      91             :   // Sign-extend lower 32-bits in order to form a proper Smi value.
      92             :   STATIC_ASSERT(kTaggedSize == kSystemPointerSize);
      93             :   Address lo = static_cast<intptr_t>(static_cast<int32_t>(value));
      94             :   ObjectSlot(address() + kTaggedPayloadOffset).Relaxed_Store(Smi(lo));
      95             :   Address hi = value >> 32;
      96             :   ObjectSlot(address() + kRawPayloadOffset).Relaxed_Store(Object(hi));
      97             : #else
      98      113569 :   ObjectSlot(address() + kTaggedPayloadOffset).Relaxed_Store(Smi(value));
      99             : #endif
     100             :   return true;
     101             : }
     102             : 
     103             : EmbedderDataSlot::RawData EmbedderDataSlot::load_raw(
     104             :     const DisallowHeapAllocation& no_gc) const {
     105             :   STATIC_ASSERT(kTaggedSize == kSystemPointerSize);
     106             :   return RawData{
     107         360 :       ObjectSlot(address() + kTaggedPayloadOffset).Relaxed_Load()->ptr(),
     108             : #ifdef V8_COMPRESS_POINTERS
     109             :       FullObjectSlot(address() + kRawPayloadOffset).Relaxed_Load()->ptr()
     110             : #endif
     111             :   };
     112             : }
     113             : 
     114             : void EmbedderDataSlot::store_raw(const EmbedderDataSlot::RawData& data,
     115             :                                  const DisallowHeapAllocation& no_gc) {
     116             :   ObjectSlot(address() + kTaggedPayloadOffset)
     117          30 :       .Relaxed_Store(Object(data.data_[0]));
     118             : #ifdef V8_COMPRESS_POINTERS
     119             :   ObjectSlot(address() + kRawPayloadOffset)
     120             :       .Relaxed_Store(Object(data.data_[1]));
     121             : #endif
     122             : }
     123             : 
     124             : }  // namespace internal
     125             : }  // namespace v8
     126             : 
     127             : #include "src/objects/object-macros-undef.h"
     128             : 
     129             : #endif  // V8_OBJECTS_EMBEDDER_DATA_SLOT_INL_H_

Generated by: LCOV version 1.10