Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index 6250e5439f17e52f129457dcd13b65ef45ece1a2..9fa79ca74629a406ea6a27181bfa296c23f47cee 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -847,10 +847,14 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
heap->mark_compact_collector()->MarkObject(cell, mark); |
} |
- static inline void VisitEmbeddedPointer(Heap* heap, Code* host, Object** p) { |
- MarkObjectByPointer(heap->mark_compact_collector(), |
- reinterpret_cast<Object**>(host), |
- p); |
+ static inline void VisitEmbeddedPointer(Heap* heap, RelocInfo* rinfo) { |
+ ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
+ // TODO(mstarzinger): We do not short-circuit cons strings here, verify |
+ // that there can be no such embedded pointers and add assertion here. |
+ HeapObject* object = HeapObject::cast(rinfo->target_object()); |
+ heap->mark_compact_collector()->RecordRelocSlot(rinfo, object); |
+ MarkBit mark = Marking::MarkBitFrom(object); |
+ heap->mark_compact_collector()->MarkObject(object, mark); |
} |
static inline void VisitCodeTarget(Heap* heap, RelocInfo* rinfo) { |
@@ -2458,8 +2462,11 @@ class PointersUpdatingVisitor: public ObjectVisitor { |
for (Object** p = start; p < end; p++) UpdatePointer(p); |
} |
- void VisitEmbeddedPointer(Code* host, Object** p) { |
- UpdatePointer(p); |
+ void VisitEmbeddedPointer(RelocInfo* rinfo) { |
+ ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
+ Object* target = rinfo->target_object(); |
+ VisitPointer(&target); |
+ rinfo->set_target_object(target); |
} |
void VisitCodeTarget(RelocInfo* rinfo) { |
@@ -2773,6 +2780,11 @@ static inline void UpdateSlot(ObjectVisitor* v, |
if (rinfo.IsPatchedReturnSequence()) rinfo.Visit(v); |
break; |
} |
+ case SlotsBuffer::EMBEDDED_OBJECT_SLOT: { |
+ RelocInfo rinfo(addr, RelocInfo::EMBEDDED_OBJECT, 0, NULL); |
+ rinfo.Visit(v); |
+ break; |
+ } |
default: |
UNREACHABLE(); |
break; |
@@ -3706,6 +3718,8 @@ bool SlotsBuffer::AddTo(SlotsBufferAllocator* allocator, |
static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { |
if (RelocInfo::IsCodeTarget(rmode)) { |
return SlotsBuffer::CODE_TARGET_SLOT; |
+ } else if (RelocInfo::IsEmbeddedObject(rmode)) { |
+ return SlotsBuffer::EMBEDDED_OBJECT_SLOT; |
} else if (RelocInfo::IsDebugBreakSlot(rmode)) { |
return SlotsBuffer::DEBUG_TARGET_SLOT; |
} else if (RelocInfo::IsJSReturn(rmode)) { |
@@ -3716,9 +3730,8 @@ static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { |
} |
-void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Code* target) { |
- Page* target_page = Page::FromAddress( |
- reinterpret_cast<Address>(target)); |
+void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Object* target) { |
+ Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); |
if (target_page->IsEvacuationCandidate() && |
(rinfo->host() == NULL || |
!ShouldSkipEvacuationSlotRecording(rinfo->host()))) { |
@@ -3734,8 +3747,7 @@ void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Code* target) { |
void MarkCompactCollector::RecordCodeEntrySlot(Address slot, Code* target) { |
- Page* target_page = Page::FromAddress( |
- reinterpret_cast<Address>(target)); |
+ Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); |
if (target_page->IsEvacuationCandidate() && |
!ShouldSkipEvacuationSlotRecording(reinterpret_cast<Object**>(slot))) { |
if (!SlotsBuffer::AddTo(&slots_buffer_allocator_, |