Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index 38f9239b781984780c1f67e8141411fb2e2f41f9..96ec71fe6b6b4408f3238915814a2fcd8488f447 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -464,7 +464,7 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
// Please note targets for cleared inline cached do not have to be |
// marked since they are contained in HEAP->non_monomorphic_cache(). |
} else { |
- HEAP->mark_compact_collector()->MarkObject(code); |
+ code->heap()->mark_compact_collector()->MarkObject(code); |
} |
} |
@@ -472,7 +472,7 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
ASSERT(rinfo->rmode() == RelocInfo::GLOBAL_PROPERTY_CELL); |
Object* cell = rinfo->target_cell(); |
Object* old_cell = cell; |
- VisitPointer(HEAP, &cell); |
+ VisitPointer(reinterpret_cast<JSGlobalPropertyCell*>(cell)->heap(), &cell); |
if (cell != old_cell) { |
rinfo->set_target_cell(reinterpret_cast<JSGlobalPropertyCell*>(cell)); |
} |
@@ -484,28 +484,31 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
(RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && |
rinfo->IsPatchedDebugBreakSlotSequence())); |
HeapObject* code = Code::GetCodeFromTargetAddress(rinfo->call_address()); |
- HEAP->mark_compact_collector()->MarkObject(code); |
+ reinterpret_cast<Code*>(code)->heap()->mark_compact_collector()-> |
+ MarkObject(code); |
} |
// Mark object pointed to by p. |
INLINE(static void MarkObjectByPointer(Heap* heap, Object** p)) { |
if (!(*p)->IsHeapObject()) return; |
HeapObject* object = ShortCircuitConsString(p); |
- heap->mark_compact_collector()->MarkObject(object); |
+ if (!object->IsMarked()) { |
+ heap->mark_compact_collector()->MarkUnmarkedObject(object); |
+ } |
} |
// Visit an unmarked object. |
- static inline void VisitUnmarkedObject(HeapObject* obj) { |
+ INLINE(static void VisitUnmarkedObject(MarkCompactCollector* collector, |
+ HeapObject* obj)) { |
#ifdef DEBUG |
- ASSERT(HEAP->Contains(obj)); |
+ ASSERT(obj->map()->heap()->Contains(obj)); |
Vitaly Repeshko
2011/03/31 19:23:16
It's safer to have Isolate::Current() in asserts l
|
ASSERT(!obj->IsMarked()); |
#endif |
Map* map = obj->map(); |
- MarkCompactCollector* collector = map->heap()->mark_compact_collector(); |
collector->SetMark(obj); |
// Mark the map pointer and the body. |
- collector->MarkObject(map); |
+ if (!map->IsMarked()) collector->MarkUnmarkedObject(map); |
IterateBody(map, obj); |
} |
@@ -518,12 +521,13 @@ class StaticMarkingVisitor : public StaticVisitorBase { |
StackLimitCheck check(heap->isolate()); |
if (check.HasOverflowed()) return false; |
+ MarkCompactCollector* collector = heap->mark_compact_collector(); |
// Visit the unmarked objects. |
for (Object** p = start; p < end; p++) { |
if (!(*p)->IsHeapObject()) continue; |
HeapObject* obj = HeapObject::cast(*p); |
if (obj->IsMarked()) continue; |
- VisitUnmarkedObject(obj); |
+ VisitUnmarkedObject(collector, obj); |
} |
return true; |
} |