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

Unified Diff: src/heap/heap.cc

Issue 2377513007: [heap] Decouple SpaceIterator from ObjectIterator. (Closed)
Patch Set: Created 4 years, 3 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
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index 2472d45b7faf8eced8091f8205348530c80902b7..7a57f16651df9850767e9b63e0f504d193cfa361 100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -5423,7 +5423,11 @@ bool Heap::SetUp() {
// Initialize incremental marking.
incremental_marking_ = new IncrementalMarking(this);
- new_space_ = new NewSpace(this);
+ for (int i = 0; i <= LAST_SPACE; i++) {
+ space_[i] = nullptr;
+ }
+
+ space_[NEW_SPACE] = new_space_ = new NewSpace(this);
if (new_space_ == nullptr) return false;
// Set up new space.
@@ -5433,25 +5437,26 @@ bool Heap::SetUp() {
new_space_top_after_last_gc_ = new_space()->top();
// Initialize old space.
- old_space_ = new OldSpace(this, OLD_SPACE, NOT_EXECUTABLE);
+ space_[OLD_SPACE] = old_space_ =
+ new OldSpace(this, OLD_SPACE, NOT_EXECUTABLE);
if (old_space_ == NULL) return false;
if (!old_space_->SetUp()) return false;
// Initialize the code space, set its maximum capacity to the old
// generation size. It needs executable memory.
- code_space_ = new OldSpace(this, CODE_SPACE, EXECUTABLE);
+ space_[CODE_SPACE] = code_space_ = new OldSpace(this, CODE_SPACE, EXECUTABLE);
if (code_space_ == NULL) return false;
if (!code_space_->SetUp()) return false;
// Initialize map space.
- map_space_ = new MapSpace(this, MAP_SPACE);
+ space_[MAP_SPACE] = map_space_ = new MapSpace(this, MAP_SPACE);
if (map_space_ == NULL) return false;
if (!map_space_->SetUp()) return false;
// The large object code space may contain code or data. We set the memory
// to be non-executable here for safety, but this means we need to enable it
// explicitly when allocating large code objects.
- lo_space_ = new LargeObjectSpace(this, LO_SPACE);
+ space_[LO_SPACE] = lo_space_ = new LargeObjectSpace(this, LO_SPACE);
if (lo_space_ == NULL) return false;
if (!lo_space_->SetUp()) return false;
@@ -5994,14 +5999,10 @@ OldSpace* OldSpaces::next() {
}
}
-
SpaceIterator::SpaceIterator(Heap* heap)
- : heap_(heap), current_space_(FIRST_SPACE), iterator_(NULL) {}
-
+ : heap_(heap), current_space_(FIRST_SPACE - 1) {}
SpaceIterator::~SpaceIterator() {
- // Delete active iterator if any.
- delete iterator_;
}
@@ -6010,48 +6011,9 @@ bool SpaceIterator::has_next() {
return current_space_ != LAST_SPACE;
}
-
-ObjectIterator* SpaceIterator::next() {
- if (iterator_ != NULL) {
- delete iterator_;
- iterator_ = NULL;
- // Move to the next space
- current_space_++;
- if (current_space_ > LAST_SPACE) {
- return NULL;
- }
- }
-
- // Return iterator for the new current space.
- return CreateIterator();
-}
-
-
-// Create an iterator for the space to iterate.
-ObjectIterator* SpaceIterator::CreateIterator() {
- DCHECK(iterator_ == NULL);
-
- switch (current_space_) {
- case NEW_SPACE:
- iterator_ = new SemiSpaceIterator(heap_->new_space());
- break;
- case OLD_SPACE:
- iterator_ = new HeapObjectIterator(heap_->old_space());
- break;
- case CODE_SPACE:
- iterator_ = new HeapObjectIterator(heap_->code_space());
- break;
- case MAP_SPACE:
- iterator_ = new HeapObjectIterator(heap_->map_space());
- break;
- case LO_SPACE:
- iterator_ = new LargeObjectIterator(heap_->lo_space());
- break;
- }
-
- // Return the newly allocated iterator;
- DCHECK(iterator_ != NULL);
- return iterator_;
+Space* SpaceIterator::next() {
+ DCHECK(has_next());
+ return heap_->space(++current_space_);
}
@@ -6136,7 +6098,7 @@ HeapIterator::HeapIterator(Heap* heap,
default:
break;
}
- object_iterator_ = space_iterator_->next();
+ object_iterator_ = space_iterator_->next()->GetObjectIterator();
}
@@ -6149,8 +6111,6 @@ HeapIterator::~HeapIterator() {
DCHECK(object_iterator_ == nullptr);
}
#endif
- // Make sure the last iterator is deallocated.
- delete object_iterator_;
delete space_iterator_;
delete filter_;
}
@@ -6167,22 +6127,22 @@ HeapObject* HeapIterator::next() {
HeapObject* HeapIterator::NextObject() {
// No iterator means we are done.
- if (object_iterator_ == nullptr) return nullptr;
+ if (object_iterator_.get() == nullptr) return nullptr;
- if (HeapObject* obj = object_iterator_->Next()) {
+ if (HeapObject* obj = object_iterator_.get()->Next()) {
// If the current iterator has more objects we are fine.
return obj;
} else {
// Go though the spaces looking for one that has objects.
while (space_iterator_->has_next()) {
- object_iterator_ = space_iterator_->next();
- if (HeapObject* obj = object_iterator_->Next()) {
+ object_iterator_ = space_iterator_->next()->GetObjectIterator();
+ if (HeapObject* obj = object_iterator_.get()->Next()) {
return obj;
}
}
}
// Done with the last space.
- object_iterator_ = nullptr;
+ object_iterator_.reset(nullptr);
return nullptr;
}

Powered by Google App Engine
This is Rietveld 408576698