Index: src/heap/spaces.cc |
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc |
index ea2adc5e27cfbc2cd46e098ac7b8a46b00a62411..f7bd3b7770586e0ff5df6211195ba0fe4cd0237b 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; |
@@ -934,17 +935,22 @@ void MemoryChunk::ReleaseAllocatedMemory() { |
delete skip_list_; |
delete mutex_; |
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() { |
@@ -952,6 +958,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 |