v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
marking-visitor.cc
Go to the documentation of this file.
1// Copyright 2020 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
11
12namespace cppgc {
13namespace internal {
14
15struct Dummy;
16
20
21void MarkingVisitorBase::Visit(const void* object, TraceDescriptor desc) {
22 marking_state_.MarkAndPush(object, desc);
23}
24
26 const void* start, size_t len,
27 TraceDescriptorCallback get_trace_descriptor) {
28 const char* it = static_cast<const char*>(start);
29 const char* end = it + len * cppgc::internal::kSizeOfUncompressedMember;
31 const auto* current = reinterpret_cast<const internal::RawPointer*>(it);
32 const void* object = current->LoadAtomic();
33 if (!object) continue;
34
35 marking_state_.MarkAndPush(object, get_trace_descriptor(object));
36 }
37}
38
39#if defined(CPPGC_POINTER_COMPRESSION)
40
41void MarkingVisitorBase::VisitMultipleCompressedMember(
42 const void* start, size_t len,
43 TraceDescriptorCallback get_trace_descriptor) {
44 const char* it = static_cast<const char*>(start);
45 const char* end = it + len * cppgc::internal::kSizeofCompressedMember;
46 for (; it < end; it += cppgc::internal::kSizeofCompressedMember) {
47 const auto* current =
48 reinterpret_cast<const internal::CompressedPointer*>(it);
49 const void* object = current->LoadAtomic();
50 if (!object) continue;
51
52 marking_state_.MarkAndPush(object, get_trace_descriptor(object));
53 }
54}
55
56#endif // defined(CPPGC_POINTER_COMPRESSION)
57
58void MarkingVisitorBase::VisitWeak(const void* object, TraceDescriptor desc,
59 WeakCallback weak_callback,
60 const void* weak_member) {
61 marking_state_.RegisterWeakReferenceIfNeeded(object, desc, weak_callback,
62 weak_member);
63}
64
65void MarkingVisitorBase::VisitEphemeron(const void* key, const void* value,
66 TraceDescriptor value_desc) {
67 marking_state_.ProcessEphemeron(key, value, value_desc, *this);
68}
69
71 TraceDescriptor strong_desc,
72 TraceDescriptor weak_desc,
74 const void* data) {
75 marking_state_.ProcessWeakContainer(object, weak_desc, callback, data);
76}
77
82
86
91
101
105 // In construction objects found through conservative can be marked if they
106 // hold a reference to themselves.
107 if (!marking_state_.MarkNoPush(header)) return;
109#if defined(CPPGC_YOUNG_GENERATION)
110 // An in-construction object can add a reference to a young object that may
111 // miss the write-barrier on an initializing store. Remember object in the
112 // root-set to be retraced on the next GC.
114 heap_.remembered_set().AddInConstructionObjectToBeRetraced(header);
115 }
116#endif // defined(CPPGC_YOUNG_GENERATION)
117 callback(this, header);
118}
119
123
125 : mutator_marking_state_(marking_state) {}
126
127void RootMarkingVisitor::VisitRoot(const void* object, TraceDescriptor desc,
128 const SourceLocation&) {
130}
131
133 WeakCallback weak_callback,
134 const void* weak_root,
135 const SourceLocation&) {
137 object, desc, weak_callback, weak_root);
138}
139
143
146}
147
149 const void* parameter, TraceCallback callback, size_t deferred_size) {
151 {parameter, callback, deferred_size});
153 .AccountDeferredMarkedBytes(
154 BasePage::FromPayload(const_cast<void*>(parameter)), deferred_size);
155 return true;
156}
157
158} // namespace internal
159} // namespace cppgc
static BasePage * FromPayload(void *)
Definition heap-page.h:314
void RegisterWeakCustomCallback(WeakCallback, const void *)
MarkingWorklists::ConcurrentMarkingBailoutWorklist::Local & concurrent_marking_bailout_worklist()
void RegisterWeakReferenceIfNeeded(const void *, TraceDescriptor, WeakCallback, const void *)
void RegisterMovableReference(const void **slot)
void ProcessEphemeron(const void *, const void *, TraceDescriptor, Visitor &)
void ProcessWeakContainer(const void *, TraceDescriptor, WeakCallback, const void *)
void AccountMarkedBytes(const HeapObjectHeader &)
ConcurrentMarkingVisitor(HeapBase &, ConcurrentMarkingState &)
bool DeferTraceToMutatorThreadIfConcurrent(const void *, TraceCallback, size_t) final
void VisitFullyConstructedConservatively(HeapObjectHeader &) final
void VisitInConstructionConservatively(HeapObjectHeader &, TraceConservativelyCallback) final
ConservativeMarkingVisitor(HeapBase &, MutatorMarkingState &, cppgc::Visitor &)
void(ConservativeTracingVisitor *, const HeapObjectHeader &) TraceConservativelyCallback
Definition visitor.h:63
virtual void VisitFullyConstructedConservatively(HeapObjectHeader &)
Definition visitor.cc:123
virtual void TraceConservativelyIfNeeded(const void *)
Definition visitor.cc:96
bool generational_gc_supported() const
Definition heap-base.h:218
void MarkAndPush(const void *, TraceDescriptor)
void VisitEphemeron(const void *, const void *, TraceDescriptor) final
void VisitMultipleUncompressedMember(const void *, size_t, TraceDescriptorCallback) final
void VisitWeak(const void *, TraceDescriptor, WeakCallback, const void *) final
void VisitWeakContainer(const void *object, TraceDescriptor strong_desc, TraceDescriptor weak_desc, WeakCallback callback, const void *data) final
void Visit(const void *, TraceDescriptor) final
void HandleMovableReference(const void **) final
void RegisterWeakCallback(WeakCallback, const void *) final
MarkingVisitorBase(HeapBase &, BasicMarkingState &)
void InvokeWeakRootsCallbackIfNeeded(const void *, TraceDescriptor, WeakCallback, const void *)
bool IsMarkedWeakContainer(HeapObjectHeader &)
void ReTraceMarkedWeakContainer(cppgc::Visitor &, HeapObjectHeader &)
bool MarkNoPush(HeapObjectHeader &header)
MutatorMarkingVisitor(HeapBase &, MutatorMarkingState &)
V8_INLINE const void * LoadAtomic() const
MutatorMarkingState & mutator_marking_state_
void VisitRoot(const void *, TraceDescriptor, const SourceLocation &) final
void VisitWeakRoot(const void *, TraceDescriptor, WeakCallback, const void *, const SourceLocation &) final
RootMarkingVisitor(MutatorMarkingState &)
int start
int end
TNode< Object > callback
NonAtomicMarkingState * marking_state_
static constexpr size_t kSizeOfUncompressedMember
Definition member.h:621
void(*)(const LivenessBroker &, const void *) WeakCallback
Definition visitor.h:37
TraceDescriptor(*)(const void *address) TraceDescriptorCallback
Definition trace-trait.h:62
void(*)(Visitor *visitor, const void *object) TraceCallback
Definition trace-trait.h:38
void Dummy(char *arg)
Definition d8.cc:4558
#define DCHECK(condition)
Definition logging.h:482
std::unique_ptr< ValueMirror > key