Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(417)

Unified Diff: src/heap/heap.cc

Issue 2801073006: Decouple root visitors from object visitors. (Closed)
Patch Set: rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index eba313d283cdd21e08f7214e1cafd35079b35562..0a65f711849e90c0546cc618f56b2c7e04aa81cc 100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -1715,7 +1715,7 @@ void Heap::Scavenge() {
Address new_space_front = new_space_->ToSpaceStart();
promotion_queue_.Initialize();
- ScavengeVisitor scavenge_visitor(this);
+ RootScavengeVisitor root_scavenge_visitor(this);
isolate()->global_handles()->IdentifyWeakUnmodifiedObjects(
&IsUnmodifiedHeapObject);
@@ -1723,7 +1723,7 @@ void Heap::Scavenge() {
{
// Copy roots.
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_ROOTS);
- IterateRoots(&scavenge_visitor, VISIT_ALL_IN_SCAVENGE);
+ IterateRoots(&root_scavenge_visitor, VISIT_ALL_IN_SCAVENGE);
}
{
@@ -1750,8 +1750,7 @@ void Heap::Scavenge() {
{
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_WEAK);
- // Copy objects reachable from the encountered weak collections list.
- scavenge_visitor.VisitPointer(&encountered_weak_collections_);
+ IterateEncounteredWeakCollections(&root_scavenge_visitor);
}
{
@@ -1759,13 +1758,14 @@ void Heap::Scavenge() {
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_CODE_FLUSH_CANDIDATES);
MarkCompactCollector* collector = mark_compact_collector();
if (collector->is_code_flushing_enabled()) {
- collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor);
+ collector->code_flusher()->IteratePointersToFromSpace(
+ &root_scavenge_visitor);
}
}
{
TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE);
- new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
+ new_space_front = DoScavenge(new_space_front);
}
isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending(
@@ -1774,8 +1774,9 @@ void Heap::Scavenge() {
isolate()
->global_handles()
->IterateNewSpaceWeakUnmodifiedRoots<
- GlobalHandles::HANDLE_PHANTOM_NODES_VISIT_OTHERS>(&scavenge_visitor);
- new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
+ GlobalHandles::HANDLE_PHANTOM_NODES_VISIT_OTHERS>(
+ &root_scavenge_visitor);
+ new_space_front = DoScavenge(new_space_front);
UpdateNewSpaceReferencesInExternalStringTable(
&UpdateNewSpaceReferenceInExternalStringTableEntry);
@@ -1963,12 +1964,12 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
DisallowHeapAllocation no_allocation;
// All external strings are listed in the external string table.
- class ExternalStringTableVisitorAdapter : public ObjectVisitor {
+ class ExternalStringTableVisitorAdapter : public RootVisitor {
public:
explicit ExternalStringTableVisitorAdapter(
v8::ExternalResourceVisitor* visitor)
: visitor_(visitor) {}
- virtual void VisitPointers(Object** start, Object** end) {
+ virtual void VisitRootPointers(Root root, Object** start, Object** end) {
for (Object** p = start; p < end; p++) {
DCHECK((*p)->IsExternalString());
visitor_->VisitExternalString(
@@ -1983,8 +1984,7 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
external_string_table_.IterateAll(&external_string_table_visitor);
}
-Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor,
- Address new_space_front) {
+Address Heap::DoScavenge(Address new_space_front) {
do {
SemiSpace::AssertValidRange(new_space_front, new_space_->top());
// The addresses new_space_front and new_space_.top() define a
@@ -4767,7 +4767,6 @@ bool Heap::RootIsImmortalImmovable(int root_index) {
}
}
-
#ifdef VERIFY_HEAP
void Heap::Verify() {
CHECK(HasBeenSetUp());
@@ -4899,15 +4898,14 @@ void Heap::IterateAndScavengePromotedObject(HeapObject* target, int size,
}
}
-
-void Heap::IterateRoots(ObjectVisitor* v, VisitMode mode) {
+void Heap::IterateRoots(RootVisitor* v, VisitMode mode) {
IterateStrongRoots(v, mode);
IterateWeakRoots(v, mode);
}
-
-void Heap::IterateWeakRoots(ObjectVisitor* v, VisitMode mode) {
- v->VisitPointer(reinterpret_cast<Object**>(&roots_[kStringTableRootIndex]));
+void Heap::IterateWeakRoots(RootVisitor* v, VisitMode mode) {
+ v->VisitRootPointer(Root::kStringTable, reinterpret_cast<Object**>(
+ &roots_[kStringTableRootIndex]));
v->Synchronize(VisitorSynchronization::kStringTable);
if (mode != VISIT_ALL_IN_SCAVENGE && mode != VISIT_ALL_IN_SWEEP_NEWSPACE) {
// Scavenge collections have special processing for this.
@@ -4916,27 +4914,32 @@ void Heap::IterateWeakRoots(ObjectVisitor* v, VisitMode mode) {
v->Synchronize(VisitorSynchronization::kExternalStringsTable);
}
-
-void Heap::IterateSmiRoots(ObjectVisitor* v) {
+void Heap::IterateSmiRoots(RootVisitor* v) {
// Acquire execution access since we are going to read stack limit values.
ExecutionAccess access(isolate());
- v->VisitPointers(&roots_[kSmiRootsStart], &roots_[kRootListLength]);
+ v->VisitRootPointers(Root::kSmiRootList, &roots_[kSmiRootsStart],
+ &roots_[kRootListLength]);
v->Synchronize(VisitorSynchronization::kSmiRootList);
}
+void Heap::IterateEncounteredWeakCollections(RootVisitor* visitor) {
+ visitor->VisitRootPointer(Root::kWeakCollections,
+ &encountered_weak_collections_);
+}
+
// We cannot avoid stale handles to left-trimmed objects, but can only make
// sure all handles still needed are updated. Filter out a stale pointer
// and clear the slot to allow post processing of handles (needed because
// the sweeper might actually free the underlying page).
-class FixStaleLeftTrimmedHandlesVisitor : public ObjectVisitor {
+class FixStaleLeftTrimmedHandlesVisitor : public RootVisitor {
public:
explicit FixStaleLeftTrimmedHandlesVisitor(Heap* heap) : heap_(heap) {
USE(heap_);
}
- void VisitPointer(Object** p) override { FixHandle(p); }
+ void VisitRootPointer(Root root, Object** p) override { FixHandle(p); }
- void VisitPointers(Object** start, Object** end) override {
+ void VisitRootPointers(Root root, Object** start, Object** end) override {
for (Object** p = start; p < end; p++) FixHandle(p);
}
@@ -4968,8 +4971,9 @@ class FixStaleLeftTrimmedHandlesVisitor : public ObjectVisitor {
Heap* heap_;
};
-void Heap::IterateStrongRoots(ObjectVisitor* v, VisitMode mode) {
- v->VisitPointers(&roots_[0], &roots_[kStrongRootListLength]);
+void Heap::IterateStrongRoots(RootVisitor* v, VisitMode mode) {
+ v->VisitRootPointers(Root::kStrongRootList, &roots_[0],
+ &roots_[kStrongRootListLength]);
v->Synchronize(VisitorSynchronization::kStrongRootList);
// The serializer/deserializer iterates the root list twice, first to pick
// off immortal immovable roots to make sure they end up on the first page,
@@ -5039,7 +5043,7 @@ void Heap::IterateStrongRoots(ObjectVisitor* v, VisitMode mode) {
// Iterate over other strong roots (currently only identity maps).
for (StrongRootsList* list = strong_roots_list_; list; list = list->next) {
- v->VisitPointers(list->start, list->end);
+ v->VisitRootPointers(Root::kStrongRoots, list->start, list->end);
}
v->Synchronize(VisitorSynchronization::kStrongRoots);
@@ -5932,9 +5936,9 @@ void Heap::FatalProcessOutOfMemory(const char* location, bool is_heap_oom) {
#ifdef DEBUG
-class PrintHandleVisitor : public ObjectVisitor {
+class PrintHandleVisitor : public RootVisitor {
public:
- void VisitPointers(Object** start, Object** end) override {
+ void VisitRootPointers(Root root, Object** start, Object** end) override {
for (Object** p = start; p < end; p++)
PrintF(" handle %p to %p\n", reinterpret_cast<void*>(p),
reinterpret_cast<void*>(*p));
@@ -5950,13 +5954,13 @@ void Heap::PrintHandles() {
#endif
-class CheckHandleCountVisitor : public ObjectVisitor {
+class CheckHandleCountVisitor : public RootVisitor {
public:
CheckHandleCountVisitor() : handle_count_(0) {}
~CheckHandleCountVisitor() override {
CHECK(handle_count_ < HandleScope::kCheckHandleThreshold);
}
- void VisitPointers(Object** start, Object** end) override {
+ void VisitRootPointers(Root root, Object** start, Object** end) override {
handle_count_ += end - start;
}
@@ -6112,11 +6116,27 @@ class UnreachableObjectsFilter : public HeapObjectsFilter {
}
private:
- class MarkingVisitor : public ObjectVisitor {
+ class MarkingVisitor : public ObjectVisitor, public RootVisitor {
public:
MarkingVisitor() : marking_stack_(10) {}
void VisitPointers(Object** start, Object** end) override {
+ MarkPointers(start, end);
+ }
+
+ void VisitRootPointers(Root root, Object** start, Object** end) override {
+ MarkPointers(start, end);
+ }
+
+ void TransitiveClosure() {
+ while (!marking_stack_.is_empty()) {
+ HeapObject* obj = marking_stack_.RemoveLast();
+ obj->Iterate(this);
+ }
+ }
+
+ private:
+ void MarkPointers(Object** start, Object** end) {
for (Object** p = start; p < end; p++) {
if (!(*p)->IsHeapObject()) continue;
HeapObject* obj = HeapObject::cast(*p);
@@ -6130,15 +6150,6 @@ class UnreachableObjectsFilter : public HeapObjectsFilter {
}
}
}
-
- void TransitiveClosure() {
- while (!marking_stack_.is_empty()) {
- HeapObject* obj = marking_stack_.RemoveLast();
- obj->Iterate(this);
- }
- }
-
- private:
List<HeapObject*> marking_stack_;
};
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698