5#ifndef V8_HEAP_SCAVENGER_INL_H_
6#define V8_HEAP_SCAVENGER_INL_H_
34 kProcessPromotedListThreshold;
38#ifdef THREAD_SANITIZER
42 if (
object.GetHeapObject(&heap_object)) {
55 if (!source->relaxed_compare_and_swap_map_word_forwarded(
79template <
typename THeapObjectSlot>
83 static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
84 std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
85 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
92 if (allocation.To(&target)) {
93 DCHECK(
heap()->marking_state()->IsUnmarked(target));
94 const bool self_success =
101 DCHECK(!Heap::InFromPage(*slot));
102 return Heap::InToPage(*slot)
116template <
typename THeapObjectSlot,
119 THeapObjectSlot slot,
123 static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
124 std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
125 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
130 object_size, alignment);
133 if (allocation.To(&target)) {
134 DCHECK(
heap()->non_atomic_marking_state()->IsUnmarked(target));
135 const bool self_success =
136 MigrateObject(map,
object, target, object_size, promotion_heap_choice);
141 target, object_size);
146 DCHECK(!Heap::InFromPage(*slot));
147 return Heap::InToPage(*slot)
174 if (object->relaxed_compare_and_swap_map_word_forwarded(
187template <
typename THeapObjectSlot,
192 static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
193 std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
194 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
195 SLOW_DCHECK(object->SizeFromMap(map) == object_size);
205 if (!
heap()->semi_space_new_space()->ShouldBePromoted(
object.address())) {
218 map, slot,
object, object_size, object_fields);
233template <
typename THeapObjectSlot>
235 THeapObjectSlot slot,
238 static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
239 std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
240 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
259template <
typename THeapObjectSlot>
263 static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
264 std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
265 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
290 first_map, slot, first, first->SizeFromMap(first_map),
292 object->set_map_word_forwarded(slot.ToHeapObject(),
kRelaxedStore);
301template <
typename THeapObjectSlot>
309 map, slot,
object, object_size, object_fields);
314template <
typename THeapObjectSlot>
318 static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
319 std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
320 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
323 int size = source->SizeFromMap(map);
326 VisitorId visitor_id = map->visitor_id();
327 switch (visitor_id) {
328 case kVisitThinString:
330 DCHECK(!(*slot).IsWeak());
333 case kVisitShortcutCandidate:
334 DCHECK(!(*slot).IsWeak());
338 case kVisitSeqOneByteString:
339 case kVisitSeqTwoByteString:
352template <
typename THeapObjectSlot>
355 static_assert(std::is_same<THeapObjectSlot, FullHeapObjectSlot>::value ||
356 std::is_same<THeapObjectSlot, HeapObjectSlot>::value,
357 "Only FullHeapObjectSlot and HeapObjectSlot are expected here");
358 DCHECK(Heap::InFromPage(
object));
372 if (dest ==
object) {
389 Heap::InToPage(dest) || Heap::IsLargeObject(dest) ||
406template <
typename TSlot>
409 std::is_same<TSlot, FullMaybeObjectSlot>::value ||
410 std::is_same<TSlot, MaybeObjectSlot>::value,
411 "Only FullMaybeObjectSlot and MaybeObjectSlot are expected here");
412 using THeapObjectSlot =
typename TSlot::THeapObjectSlot;
414 if (Heap::InFromPage(
object)) {
417 SlotCallbackResult
result =
426 }
else if (Heap::InToPage(
object)) {
460 template <
typename T>
466 template <
typename TSlot>
470 template <
typename TSlot>
488template <
typename TSlot>
492 using THeapObjectSlot =
typename TSlot::THeapObjectSlot;
497template <
typename TSlot>
500 for (TSlot slot =
start; slot <
end; ++slot) {
501 const std::optional<Tagged<Object>> optional_object =
503 if (!optional_object) {
506 typename TSlot::TObject
object = *optional_object;
509 if (
object.GetHeapObject(&heap_object)) {
518 object->YoungMarkExtension();
535#ifdef V8_COMPRESS_POINTERS
542 if (!slot.HasExternalPointerHandle())
return;
546 ExternalPointerTable& table =
heap->isolate()->external_pointer_table();
559 table->RawFieldOfElementAt(EphemeronHashTable::EntryToValueIndex(
i));
563 return table->SizeFromMap(map);
#define SLOW_DCHECK(condition)
size_t PushSegmentSize() const
V8_INLINE void Push(EntryType entry)
void FreeLast(AllocationSpace space, Tagged< HeapObject > object, int object_size)
AllocationResult Allocate(AllocationSpace space, int object_size, AllocationAlignment alignment)
ExternalPointerTagRange tag_range() const
static V8_INLINE bool InYoungGeneration(Tagged< Object > object)
static bool IsSelfForwarded(Tagged< HeapObject > object)
static AllocationAlignment RequiredAlignment(Tagged< Map > map)
std::optional< Tagged< Object > > GetObjectFilterReadOnlyAndSmiFast(TSlot slot) const
void OnMoveEvent(Tagged< HeapObject > source, Tagged< HeapObject > target, int size_in_bytes)
V8_EXPORT_PRIVATE void FatalProcessOutOfMemory(const char *location)
static void CopyBlock(Address dst, Address src, int byte_size)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
Tagged< Map > ToMap() const
bool IsForwardingAddress() const
static MapWord FromMap(const Tagged< Map > map)
Tagged< HeapObject > ToForwardingAddress(Tagged< HeapObject > map_word_host)
static constexpr ObjectFields ObjectFieldsFrom(VisitorId visitor_id)
static constexpr size_t AllocatableMemoryInDataPage()
V8_INLINE bool IsFlagSet(Flag flag) const
V8_INLINE bool InYoungGeneration() const
static V8_INLINE MemoryChunk * FromHeapObject(Tagged< HeapObject > object)
static V8_INLINE MutablePageMetadata * FromHeapObject(Tagged< HeapObject > o)
virtual void VisitPointer(Tagged< HeapObject > host, ObjectSlot p)
static void UpdateAllocationSite(Heap *heap, Tagged< Map > map, Tagged< HeapObject > object, int object_size, PretenuringFeedbackMap *pretenuring_feedback)
V8_INLINE void VisitPointers(Tagged< HeapObject > host, ObjectSlot start, ObjectSlot end) final
V8_INLINE size_t VisitJSArrayBuffer(Tagged< Map > map, Tagged< JSArrayBuffer > object, MaybeObjectSize)
ScavengeVisitor(Scavenger *scavenger)
V8_INLINE void VisitExternalPointer(Tagged< HeapObject > host, ExternalPointerSlot slot)
V8_INLINE size_t VisitEphemeronHashTable(Tagged< Map > map, Tagged< EphemeronHashTable > object, MaybeObjectSize)
V8_INLINE void VisitPointersImpl(Tagged< HeapObject > host, TSlot start, TSlot end)
Scavenger *const scavenger_
static V8_INLINE constexpr bool CanEncounterFillerOrFreeSpace()
static V8_INLINE Tagged< T > Cast(Tagged< HeapObject > object, const Heap *heap)
V8_INLINE size_t VisitJSApiObject(Tagged< Map > map, Tagged< JSObject > object, MaybeObjectSize)
V8_INLINE void VisitHeapObjectImpl(TSlot slot, Tagged< HeapObject > heap_object)
static constexpr int kPromotedListSegmentSize
V8_INLINE SlotCallbackResult EvacuateObject(THeapObjectSlot slot, Tagged< Map > map, Tagged< HeapObject > source)
EvacuationAllocator allocator_
PretenuringHandler::PretenuringFeedbackMap local_pretenuring_feedback_
V8_INLINE SlotCallbackResult RememberedSetEntryNeeded(CopyAndForwardResult result)
void AddEphemeronHashTable(Tagged< EphemeronHashTable > table)
const bool shared_string_table_
V8_INLINE CopyAndForwardResult PromoteObject(Tagged< Map > map, THeapObjectSlot slot, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
PromotedList::Local local_promoted_list_
void SynchronizePageAccess(Tagged< MaybeObject > object) const
SlotCallbackResult EvacuateThinString(Tagged< Map > map, THeapObjectSlot slot, Tagged< ThinString > object, int object_size)
V8_INLINE bool ShouldEagerlyProcessPromotedList() const
SlotCallbackResult EvacuateInPlaceInternalizableString(Tagged< Map > map, THeapObjectSlot slot, Tagged< String > string, int object_size, ObjectFields object_fields)
SlotCallbackResult ScavengeObject(THeapObjectSlot p, Tagged< HeapObject > object)
V8_INLINE SlotCallbackResult EvacuateObjectDefault(Tagged< Map > map, THeapObjectSlot slot, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
V8_INLINE CopyAndForwardResult SemiSpaceCopyObject(Tagged< Map > map, THeapObjectSlot slot, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
V8_INLINE bool MigrateObject(Tagged< Map > map, Tagged< HeapObject > source, Tagged< HeapObject > target, int size, PromotionHeapChoice promotion_heap_choice)
V8_INLINE bool HandleLargeObject(Tagged< Map > map, Tagged< HeapObject > object, int object_size, ObjectFields object_fields)
SlotCallbackResult EvacuateShortcutCandidate(Tagged< Map > map, THeapObjectSlot slot, Tagged< ConsString > object, int object_size)
SlotCallbackResult CheckAndScavengeObject(Heap *heap, TSlot slot)
CopiedList::Local local_copied_list_
const bool shortcut_strings_
SurvivingNewLargeObjectsMap local_surviving_new_large_objects_
static bool IsInPlaceInternalizable(Tagged< String > string)
bool GetHeapObject(Tagged< HeapObject > *result) const
ZoneVector< RpoNumber > & result
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr int kTaggedSize
static V8_INLINE constexpr bool IsSharedExternalPointerType(ExternalPointerTagRange tag_range)
Tagged< T > GCSafeCast(Tagged< Object > object, const Heap *heap)
Handle< To > UncheckedCast(Handle< From > value)
static bool IsShortcutCandidate(int type)
uint32_t ExternalPointerHandle
void UpdateHeapObjectReferenceSlot(THeapObjectSlot slot, Tagged< HeapObject > value)
@ SUCCESS_YOUNG_GENERATION
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr RelaxedLoadTag kRelaxedLoad
static constexpr RelaxedStoreTag kRelaxedStore
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
constexpr bool IsEmpty() const
#define V8_UNLIKELY(condition)