| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index 521be78e2eff9976cd0db5d49e27ca5888c958db..31af80553f217730c057c32e1589aebe7387ae57 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -2736,30 +2736,6 @@ void MarkCompactCollector::MigrateObject(HeapObject* dst, HeapObject* src,
|
| SlotsBuffer::CODE_ENTRY_SLOT, code_entry_slot,
|
| SlotsBuffer::IGNORE_OVERFLOW);
|
| }
|
| - } else if (dst->IsConstantPoolArray()) {
|
| - // We special case ConstantPoolArrays since they could contain integers
|
| - // value entries which look like tagged pointers.
|
| - // TODO(mstarzinger): restructure this code to avoid this special-casing.
|
| - ConstantPoolArray* array = ConstantPoolArray::cast(dst);
|
| - ConstantPoolArray::Iterator code_iter(array, ConstantPoolArray::CODE_PTR);
|
| - while (!code_iter.is_finished()) {
|
| - Address code_entry_slot =
|
| - dst_addr + array->OffsetOfElementAt(code_iter.next_index());
|
| - Address code_entry = Memory::Address_at(code_entry_slot);
|
| -
|
| - if (Page::FromAddress(code_entry)->IsEvacuationCandidate()) {
|
| - SlotsBuffer::AddTo(&slots_buffer_allocator_, &migration_slots_buffer_,
|
| - SlotsBuffer::CODE_ENTRY_SLOT, code_entry_slot,
|
| - 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));
|
| @@ -3150,15 +3126,6 @@ bool MarkCompactCollector::IsSlotInLiveObject(Address slot) {
|
| InstanceType type = object->map()->instance_type();
|
| // Slots in maps and code can't be invalid because they are never shrunk.
|
| if (type == MAP_TYPE || type == CODE_TYPE) return true;
|
| - if (type == CONSTANT_POOL_ARRAY_TYPE) {
|
| - if (FLAG_enable_ool_constant_pool) {
|
| - // TODO(ishell): implement constant pool support if we ever enable it.
|
| - UNIMPLEMENTED();
|
| - } else {
|
| - // This is left here just to make constant pool unit tests work.
|
| - return true;
|
| - }
|
| - }
|
| // Consider slots in objects that contain ONLY raw data as invalid.
|
| if (object->MayContainRawValues()) return false;
|
| if (FLAG_unbox_double_fields) {
|
| @@ -3384,6 +3351,10 @@ static inline void UpdateSlot(Isolate* isolate, ObjectVisitor* v,
|
| rinfo.Visit(isolate, v);
|
| break;
|
| }
|
| + case SlotsBuffer::OBJECT_SLOT: {
|
| + v->VisitPointer(reinterpret_cast<Object**>(addr));
|
| + break;
|
| + }
|
| default:
|
| UNREACHABLE();
|
| break;
|
| @@ -4553,9 +4524,20 @@ void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Object* target) {
|
| if (target_page->IsEvacuationCandidate() &&
|
| (rinfo->host() == NULL ||
|
| !ShouldSkipEvacuationSlotRecording(rinfo->host()))) {
|
| + Address addr = rinfo->pc();
|
| + SlotsBuffer::SlotType slot_type = SlotTypeForRMode(rmode);
|
| + if (rinfo->IsInConstantPool()) {
|
| + addr = rinfo->constant_pool_entry_address();
|
| + if (RelocInfo::IsCodeTarget(rmode)) {
|
| + slot_type = SlotsBuffer::CODE_ENTRY_SLOT;
|
| + } else {
|
| + DCHECK(RelocInfo::IsEmbeddedObject(rmode));
|
| + slot_type = SlotsBuffer::OBJECT_SLOT;
|
| + }
|
| + }
|
| bool success = SlotsBuffer::AddTo(
|
| &slots_buffer_allocator_, target_page->slots_buffer_address(),
|
| - SlotTypeForRMode(rmode), rinfo->pc(), SlotsBuffer::FAIL_ON_OVERFLOW);
|
| + slot_type, addr, SlotsBuffer::FAIL_ON_OVERFLOW);
|
| if (!success) {
|
| EvictPopularEvacuationCandidate(target_page);
|
| }
|
|
|