Chromium Code Reviews| Index: src/mark-compact.cc |
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
| index 6250e5439f17e52f129457dcd13b65ef45ece1a2..7fc0324065861802860047f425ebc0a8395896ca 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()->RecordEmbeddedSlot(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; |
| @@ -3717,8 +3729,7 @@ static inline SlotsBuffer::SlotType SlotTypeForRMode(RelocInfo::Mode rmode) { |
| void MarkCompactCollector::RecordRelocSlot(RelocInfo* rinfo, Code* target) { |
| - Page* target_page = Page::FromAddress( |
| - reinterpret_cast<Address>(target)); |
| + Page* target_page = Page::FromAddress(reinterpret_cast<Address>(target)); |
| if (target_page->IsEvacuationCandidate() && |
| (rinfo->host() == NULL || |
| !ShouldSkipEvacuationSlotRecording(rinfo->host()))) { |
| @@ -3734,8 +3745,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_, |
| @@ -3749,6 +3759,22 @@ void MarkCompactCollector::RecordCodeEntrySlot(Address slot, Code* target) { |
| } |
| +void MarkCompactCollector::RecordEmbeddedSlot(RelocInfo* rinfo, |
|
Vyacheslav Egorov (Chromium)
2011/10/12 14:21:53
Why not unify with RecordRelocSlot? seems almost i
Michael Starzinger
2011/10/12 15:38:36
Done.
|
| + Object* target) { |
| + Page* object_page = Page::FromAddress(reinterpret_cast<Address>(target)); |
| + if (object_page->IsEvacuationCandidate() && |
| + !ShouldSkipEvacuationSlotRecording(rinfo->host())) { |
| + if (!SlotsBuffer::AddTo(&slots_buffer_allocator_, |
| + object_page->slots_buffer_address(), |
| + SlotsBuffer::EMBEDDED_OBJECT_SLOT, |
| + rinfo->pc(), |
| + SlotsBuffer::FAIL_ON_OVERFLOW)) { |
| + EvictEvacuationCandidate(object_page); |
| + } |
| + } |
| +} |
| + |
| + |
| static inline SlotsBuffer::SlotType DecodeSlotType( |
| SlotsBuffer::ObjectSlot slot) { |
| return static_cast<SlotsBuffer::SlotType>(reinterpret_cast<intptr_t>(slot)); |