5#ifndef V8_HEAP_HEAP_WRITE_BARRIER_INL_H_
6#define V8_HEAP_HEAP_WRITE_BARRIER_INL_H_
33 const bool is_marking = host_chunk->
IsMarking();
44 const bool pointers_from_here_are_interesting =
46 if (pointers_from_here_are_interesting &&
63 if (
v8_flags.disable_write_barriers) {
88 SLOW_DCHECK(!WriteBarrier::IsRequired(host, value));
95 DCHECK(!DisallowGarbageCollection::IsAllowed());
110 SLOW_DCHECK(!WriteBarrier::IsRequired(host, value));
114 if (!value.GetHeapObject(&value_object)) {
125 SLOW_DCHECK(!WriteBarrier::IsRequired(host, value));
129 if (!value.GetHeapObject(&value_object)) {
141 SLOW_DCHECK(!WriteBarrier::IsRequired(host, value));
146 if (!value.IsHeapObject())
return;
153 const bool pointers_from_here_are_interesting =
155 const bool is_marking = host_chunk->
IsMarking();
157 if (pointers_from_here_are_interesting &&
188 SLOW_DCHECK(!WriteBarrier::IsRequired(host, value));
205 WriteBarrier::VerifyDispatchHandleMarkingState(host,
handle, mode));
218 SLOW_DCHECK(!WriteBarrier::IsRequired(host, value));
248 if (!value.IsHeapObject()) {
258 if (!value.GetHeapObject(&value_heap_object)) {
305 int number_of_own_descriptors) {
309 MarkingSlow(descriptor_array, number_of_own_descriptors);
344 if (!value.IsHeapObject()) {
357#if defined(CPPGC_YOUNG_GENERATION)
387 auto* cpp_heap = memory_chunk->GetHeap()->cpp_heap();
392#if defined(ENABLE_SLOW_DCHECKS) || defined(V8_ENABLE_DEBUG_CODE)
402 if (value.IsCleared()) {
413#ifdef ENABLE_SLOW_DCHECKS
416bool WriteBarrier::IsRequired(
const HeapObjectLayout* host, T value) {
423 if (value.IsCleared()) {
#define SLOW_DCHECK(condition)
V8_INLINE void RememberCrossHeapReferenceIfNeeded(v8::internal::Tagged< v8::internal::JSObject > host_obj, void *value)
static CppHeap * From(v8::CppHeap *heap)
static V8_INLINE bool InYoungGeneration(Tagged< Object > object)
static V8_INLINE bool InReadOnlySpace(Tagged< HeapObject > object)
static V8_INLINE bool InCodeSpace(Tagged< HeapObject > object)
V8_INLINE bool InWritableSharedSpace() const
V8_INLINE bool IsYoungOrSharedChunk() const
V8_INLINE bool InYoungGeneration() const
static V8_INLINE MemoryChunk * FromHeapObject(Tagged< HeapObject > object)
V8_INLINE bool IsMarking() const
static V8_EXPORT_PRIVATE bool Contains(Address address)
static void MarkingFromTracedHandle(Tagged< Object > value)
static void CombinedGenerationalAndSharedEphemeronBarrierSlow(Tagged< EphemeronHashTable > table, Address slot, Tagged< HeapObject > value)
static void Marking(Tagged< HeapObject > host, HeapObjectSlot, Tagged< HeapObject > value)
static void MarkingSlowFromCppHeapWrappable(Heap *heap, Tagged< JSObject > host, CppHeapPointerSlot slot, void *object)
static void ForDescriptorArray(Tagged< DescriptorArray >, int number_of_own_descriptors)
static void CombinedWriteBarrierInternal(Tagged< HeapObject > host, HeapObjectSlot slot, Tagged< HeapObject > value, WriteBarrierMode mode)
static void ForEphemeronHashTable(Tagged< EphemeronHashTable > host, ObjectSlot slot, Tagged< Object > value, WriteBarrierMode mode)
static bool PageFlagsAreConsistent(Tagged< HeapObject > object)
static WriteBarrierMode GetWriteBarrierModeForObject(Tagged< HeapObject > object, const DisallowGarbageCollection &promise)
static bool IsMarking(Tagged< HeapObject > object)
static void ForJSDispatchHandle(Tagged< HeapObject > host, JSDispatchHandle handle, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static MarkingBarrier * CurrentMarkingBarrier(Tagged< HeapObject > verification_candidate)
static void GenerationalForRelocInfo(Tagged< InstructionStream > host, RelocInfo *rinfo, Tagged< HeapObject > object)
static void ForCppHeapPointer(Tagged< JSObject > host, CppHeapPointerSlot slot, void *value)
static void ForRelocInfo(Tagged< InstructionStream > host, RelocInfo *rinfo, Tagged< HeapObject > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static void SharedSlow(Tagged< TrustedObject > host, ProtectedPointerSlot slot, Tagged< TrustedObject > value)
static bool IsImmortalImmovableHeapObject(Tagged< HeapObject > object)
static void MarkingSlow(Tagged< HeapObject > host, HeapObjectSlot, Tagged< HeapObject > value)
static void MarkingForRelocInfo(Tagged< InstructionStream > host, RelocInfo *, Tagged< HeapObject > value)
static void SharedForRelocInfo(Tagged< InstructionStream > host, RelocInfo *, Tagged< HeapObject > value)
static void MarkingSlowFromTracedHandle(Tagged< HeapObject > value)
static void MarkingForTesting(Tagged< HeapObject > host, ObjectSlot, Tagged< Object > value)
static void ForProtectedPointer(Tagged< TrustedObject > host, ProtectedPointerSlot slot, Tagged< TrustedObject > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static void ForArrayBufferExtension(Tagged< JSArrayBuffer > host, ArrayBufferExtension *extension)
static void GenerationalBarrierForCodeSlow(Tagged< InstructionStream > host, RelocInfo *rinfo, Tagged< HeapObject > value)
static void ForExternalPointer(Tagged< HeapObject > host, ExternalPointerSlot slot, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static void CombinedGenerationalAndSharedBarrierSlow(Tagged< HeapObject > object, Address slot, Tagged< HeapObject > value)
static void ForIndirectPointer(Tagged< HeapObject > host, IndirectPointerSlot slot, Tagged< HeapObject > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static void GenerationalBarrierForCppHeapPointer(Tagged< JSObject > host, void *value)
static void ForValue(Tagged< HeapObject > host, MaybeObjectSlot slot, Tagged< T > value, WriteBarrierMode mode)
#define V8_ENABLE_LEAPTIERING_BOOL
#define V8_ENABLE_SANDBOX_BOOL
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
static V8_INLINE bool HasWeakHeapObjectTag(const Tagged< Object > value)
@ UNSAFE_SKIP_WRITE_BARRIER
SlotTraits::TObjectSlot ObjectSlot
Tagged(T object) -> Tagged< T >
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
kInterpreterTrampolineOffset Tagged< HeapObject >
V8_EXPORT_PRIVATE FlagValues v8_flags
SlotTraits::THeapObjectSlot HeapObjectSlot
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_LIKELY(condition)
#define V8_UNLIKELY(condition)