#ifndef V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_
#define V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_
#include "include/v8-internal.h"
#include "src/base/address-region.h"
#include "src/common/globals.h"
#include "src/heap/base/stack.h"
#include "src/heap/marking.h"
#include "src/heap/memory-chunk.h"
#include "src/objects/objects.h"
namespace v8 {
namespace internal {
class MemoryAllocator;
class RootVisitor;
template <typename ConcreteVisitor>
class V8_EXPORT_PRIVATE ConservativeStackVisitorBase
: public ::heap::base::StackVisitor {
public:
ConservativeStackVisitorBase(Isolate* isolate, RootVisitor* root_visitor);
void VisitPointer(const void* pointer) final;
Address FindBasePtr(Address maybe_inner_ptr,
PtrComprCageBase cage_base) const;
private:
void VisitConservativelyIfPointer(Address address);
void VisitConservativelyIfPointer(Address address,
PtrComprCageBase cage_base);
#ifdef V8_COMPRESS_POINTERS
bool IsInterestingCage(PtrComprCageBase cage_base) const;
#endif
const PtrComprCageBase cage_base_;
#ifdef V8_EXTERNAL_CODE_SPACE
const PtrComprCageBase code_cage_base_;
base::AddressRegion code_address_region_;
#endif
#ifdef V8_ENABLE_SANDBOX
const PtrComprCageBase trusted_cage_base_;
#endif
RootVisitor* const root_visitor_;
MemoryAllocator* const allocator_;
};
class V8_EXPORT_PRIVATE ConservativeStackVisitor
: public ConservativeStackVisitorBase<ConservativeStackVisitor> {
public:
ConservativeStackVisitor(Isolate* isolate, RootVisitor* root_visitor)
: ConservativeStackVisitorBase(isolate, root_visitor) {}
private:
static constexpr bool kOnlyVisitMainV8Cage = false;
static bool FilterPage(const MemoryChunk* chunk) {
return v8_flags.sticky_mark_bits || !chunk->IsFromPage();
}
static bool FilterLargeObject(Tagged<HeapObject>, MapWord) { return true; }
static bool FilterNormalObject(Tagged<HeapObject>, MapWord, MarkingBitmap*) {
return true;
}
static void HandleObjectFound(Tagged<HeapObject>, size_t, MarkingBitmap*) {}
friend class ConservativeStackVisitorBase<ConservativeStackVisitor>;
};
}
}
#endif