Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index e7ffc19fd950c89eaa516afc61938201886f67da..29cf00e9757922789a908ccf24080fd296db8636 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -721,6 +721,7 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { |
int count = 0; |
int fragmentation = 0; |
+ int page_number = 0; |
Candidate* least = NULL; |
PageIterator it(space); |
@@ -735,9 +736,16 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { |
CHECK(p->slots_buffer() == NULL); |
if (FLAG_stress_compaction) { |
- unsigned int counter = space->heap()->ms_count(); |
- uintptr_t page_number = reinterpret_cast<uintptr_t>(p) >> kPageSizeBits; |
- if ((counter & 1) == (page_number & 1)) fragmentation = 1; |
+ if (FLAG_manual_evacuation_candidates_selection) { |
+ if (p->IsFlagSet(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING)) { |
+ p->ClearFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); |
+ fragmentation = 1; |
+ } |
+ } else { |
+ unsigned int counter = space->heap()->ms_count(); |
+ if ((counter & 1) == (page_number & 1)) fragmentation = 1; |
+ page_number++; |
+ } |
} else if (mode == REDUCE_MEMORY_FOOTPRINT) { |
// Don't try to release too many pages. |
if (estimated_release >= over_reserved) { |
@@ -4499,6 +4507,21 @@ bool SlotsBuffer::AddTo(SlotsBufferAllocator* allocator, |
} |
+static Object* g_smi_slot = NULL; |
+ |
+ |
+void SlotsBuffer::RemoveSlot(SlotsBuffer* buffer, ObjectSlot slot_to_remove) { |
+ DCHECK_EQ(Smi::FromInt(0), g_smi_slot); |
+ DCHECK(!IsTypedSlot(slot_to_remove)); |
+ while (buffer != NULL) { |
+ ObjectSlot* slots = buffer->slots_; |
+ // Remove entries by replacing them with a dummy slot containing a smi. |
+ std::replace(&slots[0], &slots[buffer->idx_], slot_to_remove, &g_smi_slot); |
+ buffer = buffer->next_; |
+ } |
+} |
+ |
+ |
static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { |
if (RelocInfo::IsCodeTarget(rmode)) { |
return SlotsBuffer::CODE_TARGET_SLOT; |