From a818a3e7fae825b55d444597f17ddb11336ce409 Mon Sep 17 00:00:00 2001 From: "rmcilroy@chromium.org" Date: Mon, 23 Jun 2014 12:18:13 +0000 Subject: [PATCH] Special case ConstantPoolArray in MarkCompactCollector::MigrateObject. Special case the ConstantPoolArray in MarkCompactCollector::MigrateObject since it could contain integer value entires which look like tagged pointers. R=hpayer@chromium.org, mstarzinger@chromium.org Review URL: https://codereview.chromium.org/304223002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21934 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mark-compact.cc | 34 ++++++++++++++++++++++++++-------- src/mark-compact.h | 3 +++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/mark-compact.cc b/src/mark-compact.cc index 047e772..b31d6ae 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -2788,6 +2788,19 @@ void MarkCompactCollector::ClearWeakCollections() { } +void MarkCompactCollector::RecordMigratedSlot(Object* value, Address slot) { + if (heap_->InNewSpace(value)) { + heap_->store_buffer()->Mark(slot); + } else if (value->IsHeapObject() && IsOnEvacuationCandidate(value)) { + SlotsBuffer::AddTo(&slots_buffer_allocator_, + &migration_slots_buffer_, + reinterpret_cast(slot), + SlotsBuffer::IGNORE_OVERFLOW); + } +} + + + // We scavange new space simultaneously with sweeping. This is done in two // passes. // @@ -2820,13 +2833,11 @@ void MarkCompactCollector::MigrateObject(HeapObject* dst, Memory::Object_at(dst_slot) = value; - if (heap_->InNewSpace(value)) { - heap_->store_buffer()->Mark(dst_slot); - } else if (value->IsHeapObject() && IsOnEvacuationCandidate(value)) { - SlotsBuffer::AddTo(&slots_buffer_allocator_, - &migration_slots_buffer_, - reinterpret_cast(dst_slot), - SlotsBuffer::IGNORE_OVERFLOW); + // We special case ConstantPoolArrays below since they could contain + // integers value entries which look like tagged pointers. + // TODO(mstarzinger): restructure this code to avoid this special-casing. + if (!src->IsConstantPoolArray()) { + RecordMigratedSlot(value, dst_slot); } src_slot += kPointerSize; @@ -2844,7 +2855,7 @@ void MarkCompactCollector::MigrateObject(HeapObject* dst, code_entry_slot, SlotsBuffer::IGNORE_OVERFLOW); } - } else if (compacting_ && dst->IsConstantPoolArray()) { + } else if (dst->IsConstantPoolArray()) { ConstantPoolArray* array = ConstantPoolArray::cast(dst); ConstantPoolArray::Iterator code_iter(array, ConstantPoolArray::CODE_PTR); while (!code_iter.is_finished()) { @@ -2860,6 +2871,13 @@ void MarkCompactCollector::MigrateObject(HeapObject* dst, SlotsBuffer::IGNORE_OVERFLOW); } } + ConstantPoolArray::Iterator heap_iter(array, ConstantPoolArray::HEAP_PTR); + while (!heap_iter.is_finished()) { + Address heap_slot = + dst_addr + array->OffsetOfElementAt(heap_iter.next_index()); + Object* value = Memory::Object_at(heap_slot); + RecordMigratedSlot(value, heap_slot); + } } } else if (dest == CODE_SPACE) { PROFILE(isolate(), CodeMoveEvent(src_addr, dst_addr)); diff --git a/src/mark-compact.h b/src/mark-compact.h index 4e85978..5cd6749 100644 --- a/src/mark-compact.h +++ b/src/mark-compact.h @@ -895,6 +895,9 @@ class MarkCompactCollector { void ParallelSweepSpaceComplete(PagedSpace* space); + // Updates store buffer and slot buffer for a pointer in a migrating object. + void RecordMigratedSlot(Object* value, Address slot); + #ifdef DEBUG friend class MarkObjectVisitor; static void VisitObject(HeapObject* obj); -- 2.7.4