Index: src/heap/spaces.cc |
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc |
index 05eb239f048cad98093781f36a39cfa1cf5fd97c..ae16bf0637bae0110efaa109202652500673893a 100644 |
--- a/src/heap/spaces.cc |
+++ b/src/heap/spaces.cc |
@@ -466,6 +466,7 @@ MemoryChunk* MemoryChunk::Initialize(Heap* heap, Address base, size_t size, |
chunk->InitializeReservedMemory(); |
chunk->slots_buffer_ = nullptr; |
chunk->old_to_new_slots_ = nullptr; |
+ chunk->old_to_old_slots_ = nullptr; |
chunk->skip_list_ = nullptr; |
chunk->write_barrier_counter_ = kWriteBarrierCounterGranularity; |
chunk->progress_bar_ = 0; |
@@ -930,17 +931,22 @@ void MemoryChunk::ReleaseAllocatedMemory() { |
delete mutex_; |
mutex_ = nullptr; |
ReleaseOldToNewSlots(); |
+ ReleaseOldToOldSlots(); |
} |
-void MemoryChunk::AllocateOldToNewSlots() { |
- size_t pages = (size_ + Page::kPageSize - 1) / Page::kPageSize; |
- DCHECK(owner() == heap_->lo_space() || pages == 1); |
+static SlotSet* AllocateSlotSet(size_t size, Address page_start) { |
+ size_t pages = (size + Page::kPageSize - 1) / Page::kPageSize; |
DCHECK(pages > 0); |
- DCHECK(nullptr == old_to_new_slots_); |
- old_to_new_slots_ = new SlotSet[pages]; |
+ SlotSet* slot_set = new SlotSet[pages]; |
for (size_t i = 0; i < pages; i++) { |
- old_to_new_slots_[i].SetPageStart(address() + i * Page::kPageSize); |
+ slot_set[i].SetPageStart(page_start + i * Page::kPageSize); |
} |
+ return slot_set; |
+} |
+ |
+void MemoryChunk::AllocateOldToNewSlots() { |
+ DCHECK(nullptr == old_to_new_slots_); |
+ old_to_new_slots_ = AllocateSlotSet(size_, address()); |
} |
void MemoryChunk::ReleaseOldToNewSlots() { |
@@ -948,6 +954,15 @@ void MemoryChunk::ReleaseOldToNewSlots() { |
old_to_new_slots_ = nullptr; |
} |
+void MemoryChunk::AllocateOldToOldSlots() { |
+ DCHECK(nullptr == old_to_old_slots_); |
+ old_to_old_slots_ = AllocateSlotSet(size_, address()); |
+} |
+ |
+void MemoryChunk::ReleaseOldToOldSlots() { |
+ delete[] old_to_old_slots_; |
+ old_to_old_slots_ = nullptr; |
+} |
// ----------------------------------------------------------------------------- |
// PagedSpace implementation |