Chromium Code Reviews| Index: src/mark-compact.cc | 
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc | 
| index 89ce89ef77ebf66a98189d70a1f0599ed5371301..f155ceb25cf2ece4a0e5af76f65f194bbf8f74f0 100644 | 
| --- a/src/mark-compact.cc | 
| +++ b/src/mark-compact.cc | 
| @@ -2916,6 +2916,14 @@ class PointersUpdatingVisitor: public ObjectVisitor { | 
| } | 
| } | 
| + void VisitCodeTarget(Address target_address_pointer) { | 
| + Object* target = Code::GetCodeFromTargetAddress( | 
| + Memory::Address_at(target_address_pointer)); | 
| + VisitPointer(&target); | 
| + *reinterpret_cast<Address*>(target_address_pointer) = | 
| 
 
Michael Starzinger
2014/03/07 14:36:59
Instead of the reinterpret case, case we use ...
 
rmcilroy
2014/03/10 12:25:23
Removed VisitCodeTarget(Address) as discussed, so
 
 | 
| + Code::cast(target)->instruction_start(); | 
| + } | 
| + | 
| void VisitCodeAgeSequence(RelocInfo* rinfo) { | 
| ASSERT(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); | 
| Object* stub = rinfo->code_age_stub(); | 
| @@ -3156,11 +3164,15 @@ static inline void UpdateSlot(Isolate* isolate, | 
| SlotsBuffer::SlotType slot_type, | 
| Address addr) { | 
| switch (slot_type) { | 
| - case SlotsBuffer::CODE_TARGET_SLOT: { | 
| + case SlotsBuffer::CODE_TARGET_RELOC_INFO_SLOT: { | 
| RelocInfo rinfo(addr, RelocInfo::CODE_TARGET, 0, NULL); | 
| rinfo.Visit(isolate, v); | 
| break; | 
| } | 
| + case SlotsBuffer::CODE_TARGET_CONSTANT_POOL_SLOT: { | 
| + v->VisitCodeTarget(addr); | 
| + break; | 
| + } | 
| case SlotsBuffer::CODE_ENTRY_SLOT: { | 
| v->VisitCodeEntry(addr); | 
| break; | 
| @@ -4324,7 +4336,7 @@ bool SlotsBuffer::AddTo(SlotsBufferAllocator* allocator, | 
| static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { | 
| if (RelocInfo::IsCodeTarget(rmode)) { | 
| - return SlotsBuffer::CODE_TARGET_SLOT; | 
| + return SlotsBuffer::CODE_TARGET_RELOC_INFO_SLOT; | 
| } else if (RelocInfo::IsEmbeddedObject(rmode)) { | 
| return SlotsBuffer::EMBEDDED_OBJECT_SLOT; | 
| } else if (RelocInfo::IsDebugBreakSlot(rmode)) { | 
| @@ -4339,14 +4351,33 @@ static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { | 
| void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Object* target) { | 
| Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); | 
| + RelocInfo::Mode rmode = rinfo->rmode(); | 
| if (target_page->IsEvacuationCandidate() && | 
| (rinfo->host() == NULL || | 
| !ShouldSkipEvacuationSlotRecording(rinfo->host()))) { | 
| - if (!SlotsBuffer::AddTo(&slots_buffer_allocator_, | 
| - target_page->slots_buffer_address(), | 
| - SlotTypeForRMode(rinfo->rmode()), | 
| - rinfo->pc(), | 
| - SlotsBuffer::FAIL_ON_OVERFLOW)) { | 
| + bool success; | 
| + if (RelocInfo::IsEmbeddedObject(rmode) && rinfo->IsInConstantPool()) { | 
| + // This doesn't need to be typed since it is just a normal heap pointer. | 
| + Object** target_pointer = | 
| + reinterpret_cast<Object**>(rinfo->constant_pool_entry_address()); | 
| + success = SlotsBuffer::AddTo(&slots_buffer_allocator_, | 
| + target_page->slots_buffer_address(), | 
| + target_pointer, | 
| + SlotsBuffer::FAIL_ON_OVERFLOW); | 
| + } else if (RelocInfo::IsCodeTarget(rmode) && rinfo->IsInConstantPool()) { | 
| + success = SlotsBuffer::AddTo(&slots_buffer_allocator_, | 
| + target_page->slots_buffer_address(), | 
| + SlotsBuffer::CODE_TARGET_CONSTANT_POOL_SLOT, | 
| + rinfo->constant_pool_entry_address(), | 
| + SlotsBuffer::FAIL_ON_OVERFLOW); | 
| + } else { | 
| + success = SlotsBuffer::AddTo(&slots_buffer_allocator_, | 
| + target_page->slots_buffer_address(), | 
| + SlotTypeForRMode(rmode), | 
| + rinfo->pc(), | 
| + SlotsBuffer::FAIL_ON_OVERFLOW); | 
| + } | 
| + if (!success) { | 
| EvictEvacuationCandidate(target_page); | 
| } | 
| } |