25static_assert(Heap::kMinObjectSizeInTaggedWords >= 2);
28MarkingVerifierBase::MarkingVerifierBase(Heap*
heap)
31void MarkingVerifierBase::VisitMapPointer(Tagged<HeapObject>
object) {
32 VerifyMap(object->map(cage_base()));
35void MarkingVerifierBase::VerifyRoots() {
36 heap_->IterateRootsIncludingClients(
this,
37 base::EnumSet<SkipRoot>{SkipRoot::kWeak});
40void MarkingVerifierBase::VerifyMarkingOnPage(
const PageMetadata* page,
44 for (
auto [
object, size] : LiveObjectRange(page)) {
45 Address current =
object.address();
46 if (current <
start)
continue;
47 if (current >=
end)
break;
48 CHECK(IsMarked(
object));
49 CHECK(current >= next_object_must_be_here_or_later);
51 next_object_must_be_here_or_later = current +
size;
54 CHECK(bitmap(page)->AllBitsSetInRange(
55 MarkingBitmap::AddressToIndex(current),
56 MarkingBitmap::LimitAddressToIndex(
57 next_object_must_be_here_or_later)) ||
58 bitmap(page)->AllBitsClearInRange(
59 MarkingBitmap::AddressToIndex(current) + 1,
60 MarkingBitmap::LimitAddressToIndex(
61 next_object_must_be_here_or_later)));
62 current = next_object_must_be_here_or_later;
66void MarkingVerifierBase::VerifyMarking(NewSpace* space) {
70 VerifyMarking(PagedNewSpace::From(space)->paged_space());
74 for (PageMetadata* page : *space) {
75 VerifyMarkingOnPage(page, page->area_start(), page->area_end());
79void MarkingVerifierBase::VerifyMarking(PagedSpaceBase* space) {
80 for (PageMetadata* p : *space) {
81 VerifyMarkingOnPage(p, p->area_start(), p->area_end());
85void MarkingVerifierBase::VerifyMarking(LargeObjectSpace* lo_space) {
86 if (!lo_space)
return;
87 LargeObjectSpaceObjectIterator it(lo_space);
88 for (Tagged<HeapObject> obj = it.Next(); !obj.is_null(); obj = it.Next()) {
96template <ExternalStringTableCleaningMode mode>
102 static_cast<int>(Root::kExternalStringsTable));
107 if (!IsHeapObject(o))
continue;
111 if (MarkingHelper::IsMarkedOrAlwaysLive(
heap_, marking_state, heap_object))
113 if ((mode == ExternalStringTableCleaningMode::kYoungOnly) &&
114 !HeapLayout::InYoungGeneration(heap_object))
116 if (IsExternalString(o)) {
117 heap_->FinalizeExternalString(Cast<String>(o));
127StringForwardingTableCleanerBase::StringForwardingTableCleanerBase(
Heap*
heap)
135 record->DisposeExternalResource();
143 if (!cpp_heap)
return true;
145 return cpp_heap->IsMarkingDone() && local_marking_worklists->
IsWrapperEmpty();
149void VerifyRememberedSetsAfterEvacuation(Heap*
heap,
152 bool new_space_is_empty =
153 !
heap->new_space() ||
heap->new_space()->Size() == 0;
157 MemoryChunkIterator chunk_iterator(
heap);
159 while (chunk_iterator.HasNext()) {
160 MutablePageMetadata* chunk = chunk_iterator.Next();
169 if (new_space_is_empty &&
196 heap, [](MutablePageMetadata* chunk) {
static CppHeap * From(v8::CppHeap *heap)
bool IsWrapperEmpty() const
static void ForAll(Heap *heap, Callback callback)
void DisposeExternalResource(StringForwardingTable::Record *record)
std::unordered_set< Address > disposed_resources_
NonAtomicMarkingState * marking_state_
void VisitObject(Isolate *isolate, Tagged< HeapObject > object, ObjectVisitor *visitor)
bool IsCppHeapMarkingFinished(Heap *heap, MarkingWorklists::Local *local_marking_worklists)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr bool IsAnyNewSpace(AllocationSpace space)
@ TRUSTED_TO_SHARED_TRUSTED
static constexpr Address kNullAddress
constexpr bool IsAnySharedSpace(AllocationSpace space)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)