5 #ifndef V8_HEAP_HEAP_WRITE_BARRIER_INL_H_ 6 #define V8_HEAP_HEAP_WRITE_BARRIER_INL_H_ 11 #include "src/heap/heap-write-barrier.h" 13 #include "src/globals.h" 14 #include "src/objects-inl.h" 15 #include "src/objects/heap-object.h" 16 #include "src/objects/maybe-object-inl.h" 17 #include "src/objects/slots.h" 24 namespace heap_internals {
38 V8_INLINE
bool IsMarking()
const {
return GetFlags() & kMarkingBit; }
40 V8_INLINE
bool InNewSpace()
const {
41 constexpr
uintptr_t kNewSpaceMask = kFromSpaceBit | kToSpaceBit;
42 return GetFlags() & kNewSpaceMask;
46 return *
reinterpret_cast<const uintptr_t*
>(
47 reinterpret_cast<const uint8_t*
>(
this) + kFlagsOffset);
53 DCHECK(Heap::PageFlagsAreConsistent(
object));
55 heap_internals::MemoryChunk::FromHeapObject(value);
57 heap_internals::MemoryChunk::FromHeapObject(
object);
59 if (!value_chunk->InNewSpace() || object_chunk->InNewSpace())
return;
61 Heap::GenerationalBarrierSlow(
object, slot, value);
64 inline void MarkingBarrierInternal(
HeapObject*
object, Address slot,
66 DCHECK(Heap::PageFlagsAreConsistent(
object));
68 heap_internals::MemoryChunk::FromHeapObject(value);
70 if (!value_chunk->IsMarking())
return;
72 Heap::MarkingBarrierSlow(
object, slot, value);
77 inline void WriteBarrierForCode(Code host, RelocInfo* rinfo, Object* value) {
78 DCHECK(!HasWeakHeapObjectTag(value));
79 if (!value->IsHeapObject())
return;
80 HeapObject*
object = HeapObject::cast(value);
81 GenerationalBarrierForCode(host, rinfo,
object);
82 MarkingBarrierForCode(host, rinfo,
object);
85 inline void WriteBarrierForCode(Code host) {
86 Heap::WriteBarrierForCodeSlow(host);
89 inline void GenerationalBarrier(HeapObject*
object, ObjectSlot slot,
91 DCHECK(!HasWeakHeapObjectTag(*slot));
92 DCHECK(!HasWeakHeapObjectTag(value));
93 if (!value->IsHeapObject())
return;
94 heap_internals::GenerationalBarrierInternal(
object, slot.address(),
95 HeapObject::cast(value));
98 inline void GenerationalBarrier(HeapObject*
object, MaybeObjectSlot slot,
100 HeapObject* value_heap_object;
101 if (!value->GetHeapObject(&value_heap_object))
return;
102 heap_internals::GenerationalBarrierInternal(
object, slot.address(),
106 inline void GenerationalBarrier(HeapObjectPtr*
object, ObjectSlot slot,
108 DCHECK(!HasWeakHeapObjectTag(*slot));
109 DCHECK(!HasWeakHeapObjectTag(value));
110 if (!value->IsHeapObject())
return;
111 heap_internals::GenerationalBarrierInternal(
112 reinterpret_cast<HeapObject*>(object->ptr()), slot.address(),
113 HeapObject::cast(value));
116 inline void GenerationalBarrier(HeapObjectPtr*
object, MaybeObjectSlot slot,
118 HeapObject* value_heap_object;
119 if (!value->GetHeapObject(&value_heap_object))
return;
120 heap_internals::GenerationalBarrierInternal(
121 reinterpret_cast<HeapObject*>(object->ptr()), slot.address(),
125 inline void GenerationalBarrierForElements(Heap* heap, FixedArray array,
126 int offset,
int length) {
127 heap_internals::MemoryChunk* array_chunk =
128 heap_internals::MemoryChunk::FromHeapObject(array);
129 if (array_chunk->InNewSpace())
return;
131 Heap::GenerationalBarrierForElementsSlow(heap, array, offset, length);
134 inline void GenerationalBarrierForCode(Code host, RelocInfo* rinfo,
135 HeapObject*
object) {
136 heap_internals::MemoryChunk* object_chunk =
137 heap_internals::MemoryChunk::FromHeapObject(
object);
138 if (!object_chunk->InNewSpace())
return;
139 Heap::GenerationalBarrierForCodeSlow(host, rinfo,
object);
142 inline void MarkingBarrier(HeapObject*
object, ObjectSlot slot, Object* value) {
143 DCHECK_IMPLIES(slot.address() != kNullAddress, !HasWeakHeapObjectTag(*slot));
144 DCHECK(!HasWeakHeapObjectTag(value));
145 if (!value->IsHeapObject())
return;
146 heap_internals::MarkingBarrierInternal(
object, slot.address(),
147 HeapObject::cast(value));
150 inline void MarkingBarrier(HeapObject*
object, MaybeObjectSlot slot,
152 HeapObject* value_heap_object;
153 if (!value->GetHeapObject(&value_heap_object))
return;
154 heap_internals::MarkingBarrierInternal(
object, slot.address(),
158 inline void MarkingBarrier(HeapObjectPtr*
object, ObjectSlot slot,
160 DCHECK_IMPLIES(slot.address() != kNullAddress, !HasWeakHeapObjectTag(*slot));
161 DCHECK(!HasWeakHeapObjectTag(value));
162 if (!value->IsHeapObject())
return;
163 heap_internals::MarkingBarrierInternal(
164 reinterpret_cast<HeapObject*>(object->ptr()), slot.address(),
165 HeapObject::cast(value));
168 inline void MarkingBarrier(HeapObjectPtr*
object, MaybeObjectSlot slot,
170 HeapObject* value_heap_object;
171 if (!value->GetHeapObject(&value_heap_object))
return;
172 heap_internals::MarkingBarrierInternal(
173 reinterpret_cast<HeapObject*>(object->ptr()), slot.address(),
177 inline void MarkingBarrierForElements(Heap* heap, HeapObject*
object) {
178 heap_internals::MemoryChunk* object_chunk =
179 heap_internals::MemoryChunk::FromHeapObject(
object);
180 if (!object_chunk->IsMarking())
return;
182 Heap::MarkingBarrierForElementsSlow(heap,
object);
185 inline void MarkingBarrierForCode(Code host, RelocInfo* rinfo,
186 HeapObject*
object) {
187 DCHECK(!HasWeakHeapObjectTag(
object));
188 heap_internals::MemoryChunk* object_chunk =
189 heap_internals::MemoryChunk::FromHeapObject(
object);
190 if (!object_chunk->IsMarking())
return;
191 Heap::MarkingBarrierForCodeSlow(host, rinfo,
object);
197 #endif // V8_HEAP_HEAP_WRITE_BARRIER_INL_H_