blob: 91cca87dd9f745ae2587911c872ac4a7f1d93740 [file] [log] [blame]
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_HEAP_CPPGC_MARKING_VISITOR_H_
#define V8_HEAP_CPPGC_MARKING_VISITOR_H_
#include "include/cppgc/trace-trait.h"
#include "src/base/macros.h"
#include "src/heap/base/stack.h"
#include "src/heap/cppgc/visitor.h"
namespace cppgc {
namespace internal {
class HeapBase;
class HeapObjectHeader;
class Marker;
class MarkingStateBase;
class MutatorMarkingState;
class ConcurrentMarkingState;
class V8_EXPORT_PRIVATE MarkingVisitorBase : public VisitorBase {
public:
MarkingVisitorBase(HeapBase&, MarkingStateBase&);
~MarkingVisitorBase() override = default;
protected:
void Visit(const void*, TraceDescriptor) final;
void VisitWeak(const void*, TraceDescriptor, WeakCallback, const void*) final;
void VisitEphemeron(const void*, TraceDescriptor) final;
void VisitWeakContainer(const void* self, TraceDescriptor strong_desc,
TraceDescriptor weak_desc, WeakCallback callback,
const void* data) final;
void RegisterWeakCallback(WeakCallback, const void*) final;
void HandleMovableReference(const void**) final;
MarkingStateBase& marking_state_;
};
class V8_EXPORT_PRIVATE MutatorMarkingVisitor : public MarkingVisitorBase {
public:
MutatorMarkingVisitor(HeapBase&, MutatorMarkingState&);
~MutatorMarkingVisitor() override = default;
protected:
void VisitRoot(const void*, TraceDescriptor, const SourceLocation&) final;
void VisitWeakRoot(const void*, TraceDescriptor, WeakCallback, const void*,
const SourceLocation&) final;
};
class V8_EXPORT_PRIVATE ConcurrentMarkingVisitor final
: public MarkingVisitorBase {
public:
ConcurrentMarkingVisitor(HeapBase&, ConcurrentMarkingState&);
~ConcurrentMarkingVisitor() override = default;
protected:
void VisitRoot(const void*, TraceDescriptor, const SourceLocation&) final {
UNREACHABLE();
}
void VisitWeakRoot(const void*, TraceDescriptor, WeakCallback, const void*,
const SourceLocation&) final {
UNREACHABLE();
}
bool DeferTraceToMutatorThreadIfConcurrent(const void*, TraceCallback,
size_t) final;
};
class ConservativeMarkingVisitor : public ConservativeTracingVisitor,
public heap::base::StackVisitor {
public:
ConservativeMarkingVisitor(HeapBase&, MutatorMarkingState&, cppgc::Visitor&);
~ConservativeMarkingVisitor() override = default;
private:
void VisitFullyConstructedConservatively(HeapObjectHeader&) final;
void VisitInConstructionConservatively(HeapObjectHeader&,
TraceConservativelyCallback) final;
void VisitPointer(const void*) final;
MutatorMarkingState& marking_state_;
};
} // namespace internal
} // namespace cppgc
#endif // V8_HEAP_CPPGC_MARKING_VISITOR_H_