#ifndef V8_HEAP_YOUNG_GENERATION_MARKING_VISITOR_INL_H_
#define V8_HEAP_YOUNG_GENERATION_MARKING_VISITOR_INL_H_
#include "src/common/globals.h"
#include "src/heap/marking-worklist-inl.h"
#include "src/heap/minor-mark-sweep.h"
#include "src/heap/mutable-page-metadata.h"
#include "src/heap/objects-visiting-inl.h"
#include "src/heap/objects-visiting.h"
#include "src/heap/pretenuring-handler-inl.h"
#include "src/heap/remembered-set-inl.h"
#include "src/heap/young-generation-marking-visitor.h"
namespace v8 {
namespace internal {
template <YoungGenerationMarkingVisitationMode marking_mode>
YoungGenerationMarkingVisitor<marking_mode>::YoungGenerationMarkingVisitor(
Heap* heap,
PretenuringHandler::PretenuringFeedbackMap* local_pretenuring_feedback)
: … { … }
template <YoungGenerationMarkingVisitationMode marking_mode>
YoungGenerationMarkingVisitor<marking_mode>::~YoungGenerationMarkingVisitor() { … }
template <YoungGenerationMarkingVisitationMode marking_mode>
void YoungGenerationMarkingVisitor<marking_mode>::VisitCppHeapPointer(
Tagged<HeapObject> host, CppHeapPointerSlot slot) { … }
template <YoungGenerationMarkingVisitationMode marking_mode>
int YoungGenerationMarkingVisitor<marking_mode>::VisitJSArrayBuffer(
Tagged<Map> map, Tagged<JSArrayBuffer> object) { … }
template <YoungGenerationMarkingVisitationMode marking_mode>
template <typename T, typename TBodyDescriptor>
int YoungGenerationMarkingVisitor<marking_mode>::VisitJSObjectSubclass(
Tagged<Map> map, Tagged<T> object) { … }
template <YoungGenerationMarkingVisitationMode marking_mode>
int YoungGenerationMarkingVisitor<marking_mode>::VisitEphemeronHashTable(
Tagged<Map> map, Tagged<EphemeronHashTable> table) { … }
#ifdef V8_COMPRESS_POINTERS
template <YoungGenerationMarkingVisitationMode marking_mode>
void YoungGenerationMarkingVisitor<marking_mode>::VisitExternalPointer(
Tagged<HeapObject> host, ExternalPointerSlot slot) { … }
#endif
template <YoungGenerationMarkingVisitationMode marking_mode>
template <typename TSlot>
void YoungGenerationMarkingVisitor<marking_mode>::VisitPointersImpl(
Tagged<HeapObject> host, TSlot start, TSlot end) { … }
template <YoungGenerationMarkingVisitationMode marking_mode>
template <typename TSlot>
V8_INLINE bool
YoungGenerationMarkingVisitor<marking_mode>::VisitObjectViaSlotInRememberedSet(
TSlot slot) { … }
template <YoungGenerationMarkingVisitationMode marking_mode>
template <typename YoungGenerationMarkingVisitor<
marking_mode>::ObjectVisitationMode visitation_mode,
typename YoungGenerationMarkingVisitor<
marking_mode>::SlotTreatmentMode slot_treatment_mode,
typename TSlot>
V8_INLINE bool YoungGenerationMarkingVisitor<marking_mode>::VisitObjectViaSlot(
TSlot slot) { … }
#ifdef V8_MINORMS_STRING_SHORTCUTTING
template <YoungGenerationMarkingVisitationMode marking_mode>
V8_INLINE bool YoungGenerationMarkingVisitor<marking_mode>::ShortCutStrings(
HeapObjectSlot slot, Tagged<HeapObject>* heap_object) {
DCHECK_EQ(YoungGenerationMarkingVisitationMode::kParallel, marking_mode);
if (shortcut_strings_) {
DCHECK(V8_STATIC_ROOTS_BOOL);
#if V8_STATIC_ROOTS_BOOL
ObjectSlot map_slot = (*heap_object)->map_slot();
Address map_address = map_slot.load_map().ptr();
if (map_address == StaticReadOnlyRoot::kThinOneByteStringMap ||
map_address == StaticReadOnlyRoot::kThinTwoByteStringMap) {
DCHECK_EQ((*heap_object)
->map(ObjectVisitorWithCageBases::cage_base())
->visitor_id(),
VisitorId::kVisitThinString);
*heap_object = Cast<ThinString>(*heap_object)->actual();
DCHECK(!Heap::InYoungGeneration(*heap_object));
slot.StoreHeapObject(*heap_object);
return false;
} else if (map_address == StaticReadOnlyRoot::kConsOneByteStringMap ||
map_address == StaticReadOnlyRoot::kConsTwoByteStringMap) {
const VisitorId visitor_id =
(*heap_object)
->map(ObjectVisitorWithCageBases::cage_base())
->visitor_id();
if (visitor_id == VisitorId::kVisitShortcutCandidate) {
Tagged<ConsString> string = Cast<ConsString>(*heap_object);
if (static_cast<Tagged_t>(string->second().ptr()) ==
StaticReadOnlyRoot::kempty_string) {
*heap_object = string->first();
slot.StoreHeapObject(*heap_object);
if (!Heap::InYoungGeneration(*heap_object)) {
return false;
}
}
}
}
#endif
}
return true;
}
#endif
template <YoungGenerationMarkingVisitationMode marking_mode>
V8_INLINE void
YoungGenerationMarkingVisitor<marking_mode>::IncrementLiveBytesCached(
MutablePageMetadata* chunk, intptr_t by) { … }
}
}
#endif