%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/reference-summarizer.cc |
// Copyright 2022 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. #include "src/heap/reference-summarizer.h" #include "src/heap/mark-compact-inl.h" #include "src/heap/marking-visitor-inl.h" #include "src/objects/embedder-data-array-inl.h" #include "src/objects/js-array-buffer-inl.h" namespace v8 { namespace internal { namespace { // A class which acts as a MarkingState but does not actually update any marking // bits. It reports all objects as white and all transitions as successful. It // also tracks which objects are retained by the primary object according to the // marking visitor. class ReferenceSummarizerMarkingState final { public: explicit ReferenceSummarizerMarkingState(Tagged<HeapObject> object) : primary_object_(object), local_marking_worklists_(&marking_worklists_), local_weak_objects_(&weak_objects_) {} ~ReferenceSummarizerMarkingState() { // Clean up temporary state. local_weak_objects_.Publish(); weak_objects_.Clear(); local_marking_worklists_.Publish(); marking_worklists_.Clear(); } // Retrieves the references that were collected by this marker. This operation // transfers ownership of the set, so calling it again would yield an empty // result. ReferenceSummary DestructivelyRetrieveReferences() { ReferenceSummary tmp = std::move(references_); references_.Clear(); return tmp; } // Standard marking visitor functions: bool TryMark(Tagged<HeapObject> obj) { return true; } bool IsUnmarked(Tagged<HeapObject> obj) const { return true; } bool IsMarked(Tagged<HeapObject> obj) const { return false; } // Adds a retaining relationship found by the marking visitor. void AddStrongReferenceForReferenceSummarizer(Tagged<HeapObject> host, Tagged<HeapObject> obj) { AddReference(host, obj, references_.strong_references()); } // Adds a non-retaining weak reference found by the marking visitor. The value // in an ephemeron hash table entry is also included here, since it is not // known to be strong without further information about the key. void AddWeakReferenceForReferenceSummarizer(Tagged<HeapObject> host, Tagged<HeapObject> obj) { AddReference(host, obj, references_.weak_references()); } // Other member functions, not part of the marking visitor contract: MarkingWorklists::Local* local_marking_worklists() { return &local_marking_worklists_; } WeakObjects::Local* local_weak_objects() { return &local_weak_objects_; } private: void AddReference(Tagged<HeapObject> host, Tagged<HeapObject> obj, ReferenceSummary::UnorderedHeapObjectSet& references) { // It's possible that the marking visitor handles multiple objects at once, // such as a Map and its DescriptorArray, but we're only interested in // references from the primary object. if (host == primary_object_) { references.insert(obj); } } ReferenceSummary references_; Tagged<HeapObject> primary_object_; MarkingWorklists marking_worklists_; MarkingWorklists::Local local_marking_worklists_; WeakObjects weak_objects_; WeakObjects::Local local_weak_objects_; }; class ReferenceSummarizerMarkingVisitor : public MarkingVisitorBase<ReferenceSummarizerMarkingVisitor> { public: ReferenceSummarizerMarkingVisitor( Heap* heap, ReferenceSummarizerMarkingState* marking_state) : MarkingVisitorBase( marking_state->local_marking_worklists(), marking_state->local_weak_objects(), heap, 0 /*mark_compact_epoch*/, {} /*code_flush_mode*/, false /*embedder_tracing_enabled*/, true /*should_keep_ages_unchanged*/, 0 /*code_flushing_increase*/), marking_state_(marking_state) {} template <typename TSlot> void RecordSlot(Tagged<HeapObject> object, TSlot slot, Tagged<HeapObject> target) {} void RecordRelocSlot(Tagged<InstructionStream> host, RelocInfo* rinfo, Tagged<HeapObject> target) {} V8_INLINE void AddStrongReferenceForReferenceSummarizer( Tagged<HeapObject> host, Tagged<HeapObject> obj) { marking_state_->AddStrongReferenceForReferenceSummarizer(host, obj); } V8_INLINE void AddWeakReferenceForReferenceSummarizer( Tagged<HeapObject> host, Tagged<HeapObject> obj) { marking_state_->AddWeakReferenceForReferenceSummarizer(host, obj); } TraceRetainingPathMode retaining_path_mode() { return TraceRetainingPathMode::kDisabled; } constexpr bool CanUpdateValuesInHeap() { return false; } // Standard marking visitor functions: bool TryMark(Tagged<HeapObject> obj) { return true; } bool IsMarked(Tagged<HeapObject> obj) const { return false; } private: ReferenceSummarizerMarkingState* marking_state_; }; } // namespace ReferenceSummary ReferenceSummary::SummarizeReferencesFrom( Heap* heap, Tagged<HeapObject> obj) { ReferenceSummarizerMarkingState marking_state(obj); ReferenceSummarizerMarkingVisitor visitor(heap, &marking_state); visitor.Visit(obj->map(heap->isolate()), obj); return marking_state.DestructivelyRetrieveReferences(); } } // namespace internal } // namespace v8