v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
reference-summarizer.cc
Go to the documentation of this file.
1// Copyright 2022 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 v8 {
13namespace internal {
14
15namespace {
16
17// A class which acts as a MarkingState but does not actually update any marking
18// bits. It reports all objects as white and all transitions as successful. It
19// also tracks which objects are retained by the primary object according to the
20// marking visitor.
21class ReferenceSummarizerMarkingState final {
22 public:
23 explicit ReferenceSummarizerMarkingState(Tagged<HeapObject> object)
24 : primary_object_(object),
27
28 ~ReferenceSummarizerMarkingState() {
29 // Clean up temporary state.
30 local_weak_objects_.Publish();
31 weak_objects_.Clear();
33 marking_worklists_.Clear();
34 }
35
36 // Retrieves the references that were collected by this marker. This operation
37 // transfers ownership of the set, so calling it again would yield an empty
38 // result.
39 ReferenceSummary DestructivelyRetrieveReferences() {
40 ReferenceSummary tmp = std::move(references_);
41 references_.Clear();
42 return tmp;
43 }
44
45 // Standard marking visitor functions:
46 bool TryMark(Tagged<HeapObject> obj) { return true; }
47 bool IsUnmarked(Tagged<HeapObject> obj) const { return true; }
48 bool IsMarked(Tagged<HeapObject> obj) const { return false; }
49
50 // Adds a retaining relationship found by the marking visitor.
51 void AddStrongReferenceForReferenceSummarizer(Tagged<HeapObject> host,
53 AddReference(host, obj, references_.strong_references());
54 }
55
56 // Adds a non-retaining weak reference found by the marking visitor. The value
57 // in an ephemeron hash table entry is also included here, since it is not
58 // known to be strong without further information about the key.
59 void AddWeakReferenceForReferenceSummarizer(Tagged<HeapObject> host,
61 AddReference(host, obj, references_.weak_references());
62 }
63
64 // Other member functions, not part of the marking visitor contract:
65
66 MarkingWorklists::Local* local_marking_worklists() {
68 }
69 WeakObjects::Local* local_weak_objects() { return &local_weak_objects_; }
70
71 private:
72 void AddReference(Tagged<HeapObject> host, Tagged<HeapObject> obj,
74 // It's possible that the marking visitor handles multiple objects at once,
75 // such as a Map and its DescriptorArray, but we're only interested in
76 // references from the primary object.
77 if (host == primary_object_) {
78 references.insert(obj);
79 }
80 }
81
82 ReferenceSummary references_;
84 MarkingWorklists marking_worklists_;
85 MarkingWorklists::Local local_marking_worklists_;
86 WeakObjects weak_objects_;
87 WeakObjects::Local local_weak_objects_;
88};
89
90class ReferenceSummarizerMarkingVisitor
91 : public MarkingVisitorBase<ReferenceSummarizerMarkingVisitor> {
92 public:
93 ReferenceSummarizerMarkingVisitor(
94 Heap* heap, ReferenceSummarizerMarkingState* marking_state)
95 : MarkingVisitorBase(marking_state->local_marking_worklists(),
96 marking_state->local_weak_objects(), heap,
97 0 /*mark_compact_epoch*/, {} /*code_flush_mode*/,
98 true /*should_keep_ages_unchanged*/,
99 0 /*code_flushing_increase*/),
100 marking_state_(marking_state) {}
101
102 template <typename TSlot>
103 void RecordSlot(Tagged<HeapObject> object, TSlot slot,
104 Tagged<HeapObject> target) {}
105
106 void RecordRelocSlot(Tagged<InstructionStream> host, RelocInfo* rinfo,
107 Tagged<HeapObject> target) {}
108
109 V8_INLINE void AddStrongReferenceForReferenceSummarizer(
111 marking_state_->AddStrongReferenceForReferenceSummarizer(host, obj);
112 }
113
114 V8_INLINE void AddWeakReferenceForReferenceSummarizer(
116 marking_state_->AddWeakReferenceForReferenceSummarizer(host, obj);
117 }
118
119 constexpr bool CanUpdateValuesInHeap() { return false; }
120
121 ReferenceSummarizerMarkingState* marking_state() const {
122 return marking_state_;
123 }
124
125 void MarkPointerTableEntry(Tagged<HeapObject> host,
126 IndirectPointerSlot slot) {}
127
128 void VisitExternalPointer(Tagged<HeapObject> host,
129 ExternalPointerSlot slot) override {}
130 void VisitCppHeapPointer(Tagged<HeapObject> host,
131 CppHeapPointerSlot slot) override {}
132 void VisitJSDispatchTableEntry(Tagged<HeapObject> host,
133 JSDispatchHandle handle) override {}
134
135 private:
136 ReferenceSummarizerMarkingState* marking_state_;
137};
138
139} // namespace
140
143 ReferenceSummarizerMarkingState marking_state(obj);
144
145 ReferenceSummarizerMarkingVisitor visitor(heap, &marking_state);
146 visitor.Visit(obj->map(heap->isolate()), obj);
147
148 return marking_state.DestructivelyRetrieveReferences();
149}
150
151} // namespace internal
152} // namespace v8
std::unordered_set< Tagged< HeapObject >, Object::Hasher, Object::KeyEqualSafe > UnorderedHeapObjectSet
static ReferenceSummary SummarizeReferencesFrom(Heap *heap, Tagged< HeapObject > obj)
Register tmp
NonAtomicMarkingState * marking_state_
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
Definition handles-inl.h:72
Tagged(T object) -> Tagged< T >
kInterpreterTrampolineOffset Tagged< HeapObject >
base::StrongAlias< JSDispatchHandleAliasTag, uint32_t > JSDispatchHandle
Definition globals.h:557
MarkingWorklists::Local local_marking_worklists_
MarkingWorklists marking_worklists_
ReferenceSummary references_
Tagged< HeapObject > primary_object_
WeakObjects weak_objects_
WeakObjects::Local local_weak_objects_
#define V8_INLINE
Definition v8config.h:500