summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/cppgc/write-barrier.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/cppgc/write-barrier.cc')
-rw-r--r--deps/v8/src/heap/cppgc/write-barrier.cc25
1 files changed, 14 insertions, 11 deletions
diff --git a/deps/v8/src/heap/cppgc/write-barrier.cc b/deps/v8/src/heap/cppgc/write-barrier.cc
index 75ff5ef626..6980e4c893 100644
--- a/deps/v8/src/heap/cppgc/write-barrier.cc
+++ b/deps/v8/src/heap/cppgc/write-barrier.cc
@@ -25,6 +25,7 @@ AtomicEntryFlag WriteBarrier::incremental_or_concurrent_marking_flag_;
namespace {
+template <MarkerBase::WriteBarrierType type>
void ProcessMarkValue(HeapObjectHeader& header, MarkerBase* marker,
const void* value) {
#if defined(CPPGC_CAGED_HEAP)
@@ -46,7 +47,7 @@ void ProcessMarkValue(HeapObjectHeader& header, MarkerBase* marker,
return;
}
- marker->WriteBarrierForObject(header);
+ marker->WriteBarrierForObject<type>(header);
}
} // namespace
@@ -62,18 +63,19 @@ void WriteBarrier::DijkstraMarkingBarrierSlowWithSentinelCheck(
// static
void WriteBarrier::DijkstraMarkingBarrierSlow(const void* value) {
const BasePage* page = BasePage::FromPayload(value);
- const auto* heap = page->heap();
+ const auto& heap = page->heap();
// GetWriteBarrierType() checks marking state.
- DCHECK(heap->marker());
+ DCHECK(heap.marker());
// No write barriers should be executed from atomic pause marking.
- DCHECK(!heap->in_atomic_pause());
+ DCHECK(!heap.in_atomic_pause());
auto& header =
const_cast<HeapObjectHeader&>(page->ObjectHeaderFromInnerAddress(value));
if (!header.TryMarkAtomic()) return;
- ProcessMarkValue(header, heap->marker(), value);
+ ProcessMarkValue<MarkerBase::WriteBarrierType::kDijkstra>(
+ header, heap.marker(), value);
}
// static
@@ -106,18 +108,19 @@ void WriteBarrier::SteeleMarkingBarrierSlowWithSentinelCheck(
// static
void WriteBarrier::SteeleMarkingBarrierSlow(const void* value) {
const BasePage* page = BasePage::FromPayload(value);
- const auto* heap = page->heap();
+ const auto& heap = page->heap();
// GetWriteBarrierType() checks marking state.
- DCHECK(heap->marker());
+ DCHECK(heap.marker());
// No write barriers should be executed from atomic pause marking.
- DCHECK(!heap->in_atomic_pause());
+ DCHECK(!heap.in_atomic_pause());
auto& header =
const_cast<HeapObjectHeader&>(page->ObjectHeaderFromInnerAddress(value));
if (!header.IsMarked<AccessMode::kAtomic>()) return;
- ProcessMarkValue(header, heap->marker(), value);
+ ProcessMarkValue<MarkerBase::WriteBarrierType::kSteele>(header, heap.marker(),
+ value);
}
#if defined(CPPGC_YOUNG_GENERATION)
@@ -151,8 +154,8 @@ bool WriteBarrierTypeForNonCagedHeapPolicy::IsMarking(const void* object,
// Large objects cannot have mixins, so we are guaranteed to always have
// a pointer on the same page.
const auto* page = BasePage::FromPayload(object);
- *handle = page->heap();
- const MarkerBase* marker = page->heap()->marker();
+ *handle = &page->heap();
+ const MarkerBase* marker = page->heap().marker();
return marker && marker->IsMarking();
}