slots-inl.h 5.01 KB
Newer Older
1 2 3 4 5 6 7 8
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_OBJECTS_SLOTS_INL_H_
#define V8_OBJECTS_SLOTS_INL_H_

#include "src/base/atomic-utils.h"
9
#include "src/common/globals.h"
10
#include "src/common/ptr-compr-inl.h"
11
#include "src/objects/compressed-slots.h"
12
#include "src/objects/heap-object.h"
13
#include "src/objects/maybe-object.h"
14
#include "src/objects/objects.h"
15
#include "src/objects/slots.h"
16
#include "src/utils/memcopy.h"
17

18 19 20
namespace v8 {
namespace internal {

21 22 23 24
//
// FullObjectSlot implementation.
//

25
FullObjectSlot::FullObjectSlot(Object* object)
26 27
    : SlotBase(reinterpret_cast<Address>(&object->ptr_)) {}

28
bool FullObjectSlot::contains_value(Address raw_value) const {
29
  return base::AsAtomicPointer::Relaxed_Load(location()) == raw_value;
30 31
}

32 33
Object FullObjectSlot::operator*() const { return Object(*location()); }

34
Object FullObjectSlot::load(IsolateRoot isolate) const { return **this; }
35

36
void FullObjectSlot::store(Object value) const { *location() = value.ptr(); }
37

38 39
Object FullObjectSlot::Acquire_Load() const {
  return Object(base::AsAtomicPointer::Acquire_Load(location()));
40 41
}

42
Object FullObjectSlot::Acquire_Load(IsolateRoot isolate) const {
43 44 45
  return Acquire_Load();
}

46 47
Object FullObjectSlot::Relaxed_Load() const {
  return Object(base::AsAtomicPointer::Relaxed_Load(location()));
48 49
}

50
Object FullObjectSlot::Relaxed_Load(IsolateRoot isolate) const {
51 52 53
  return Relaxed_Load();
}

54
void FullObjectSlot::Relaxed_Store(Object value) const {
55
  base::AsAtomicPointer::Relaxed_Store(location(), value.ptr());
56 57
}

58
void FullObjectSlot::Release_Store(Object value) const {
59
  base::AsAtomicPointer::Release_Store(location(), value.ptr());
60 61
}

62 63 64 65 66 67
Object FullObjectSlot::Relaxed_CompareAndSwap(Object old, Object target) const {
  Address result = base::AsAtomicPointer::Relaxed_CompareAndSwap(
      location(), old.ptr(), target.ptr());
  return Object(result);
}

68
Object FullObjectSlot::Release_CompareAndSwap(Object old, Object target) const {
69
  Address result = base::AsAtomicPointer::Release_CompareAndSwap(
70
      location(), old.ptr(), target.ptr());
71
  return Object(result);
72 73
}

74 75 76 77
//
// FullMaybeObjectSlot implementation.
//

78
MaybeObject FullMaybeObjectSlot::operator*() const {
79 80
  return MaybeObject(*location());
}
81

82
MaybeObject FullMaybeObjectSlot::load(IsolateRoot isolate) const {
83 84 85
  return **this;
}

86
void FullMaybeObjectSlot::store(MaybeObject value) const {
87 88
  *location() = value.ptr();
}
89

90
MaybeObject FullMaybeObjectSlot::Relaxed_Load() const {
91
  return MaybeObject(base::AsAtomicPointer::Relaxed_Load(location()));
92 93
}

94
MaybeObject FullMaybeObjectSlot::Relaxed_Load(IsolateRoot isolate) const {
95 96 97
  return Relaxed_Load();
}

98
void FullMaybeObjectSlot::Relaxed_Store(MaybeObject value) const {
99
  base::AsAtomicPointer::Relaxed_Store(location(), value->ptr());
100 101
}

102 103
void FullMaybeObjectSlot::Release_CompareAndSwap(MaybeObject old,
                                                 MaybeObject target) const {
104 105
  base::AsAtomicPointer::Release_CompareAndSwap(location(), old.ptr(),
                                                target.ptr());
106 107
}

108 109 110 111
//
// FullHeapObjectSlot implementation.
//

112
HeapObjectReference FullHeapObjectSlot::operator*() const {
113
  return HeapObjectReference(*location());
114
}
115

116
HeapObjectReference FullHeapObjectSlot::load(IsolateRoot isolate) const {
117 118 119
  return **this;
}

120
void FullHeapObjectSlot::store(HeapObjectReference value) const {
121
  *location() = value.ptr();
122 123
}

124 125
HeapObject FullHeapObjectSlot::ToHeapObject() const {
  DCHECK((*location() & kHeapObjectTagMask) == kHeapObjectTag);
126
  return HeapObject::cast(Object(*location()));
127 128 129
}

void FullHeapObjectSlot::StoreHeapObject(HeapObject value) const {
130
  *location() = value.ptr();
131 132
}

133 134 135 136
//
// Utils.
//

137 138 139 140 141 142 143 144
// Copies tagged words from |src| to |dst|. The data spans must not overlap.
// |src| and |dst| must be kTaggedSize-aligned.
inline void CopyTagged(Address dst, const Address src, size_t num_tagged) {
  static const size_t kBlockCopyLimit = 16;
  CopyImpl<kBlockCopyLimit>(reinterpret_cast<Tagged_t*>(dst),
                            reinterpret_cast<const Tagged_t*>(src), num_tagged);
}

145
// Sets |counter| number of kTaggedSize-sized values starting at |start| slot.
146
inline void MemsetTagged(Tagged_t* start, Object value, size_t counter) {
147
#ifdef V8_COMPRESS_POINTERS
148
  Tagged_t raw_value = CompressTagged(value.ptr());
149
  MemsetUint32(start, raw_value, counter);
150 151
#else
  Address raw_value = value.ptr();
152
  MemsetPointer(start, raw_value, counter);
153
#endif
154 155
}

156 157 158 159 160 161 162
// Sets |counter| number of kTaggedSize-sized values starting at |start| slot.
template <typename T>
inline void MemsetTagged(SlotBase<T, Tagged_t> start, Object value,
                         size_t counter) {
  MemsetTagged(start.location(), value, counter);
}

163 164
// Sets |counter| number of kSystemPointerSize-sized values starting at |start|
// slot.
165 166
inline void MemsetPointer(FullObjectSlot start, Object value, size_t counter) {
  MemsetPointer(start.location(), value.ptr(), counter);
167 168
}

169 170 171 172
}  // namespace internal
}  // namespace v8

#endif  // V8_OBJECTS_SLOTS_INL_H_