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)