Index: src/mark-compact.cc |
=================================================================== |
--- src/mark-compact.cc (revision 1853) |
+++ src/mark-compact.cc (working copy) |
@@ -555,10 +555,8 @@ |
} |
-bool MarkCompactCollector::MustBeMarked(Object** p) { |
- // Check whether *p is a HeapObject pointer. |
- if (!(*p)->IsHeapObject()) return false; |
- return !HeapObject::cast(*p)->IsMarked(); |
+bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) { |
+ return (*p)->IsHeapObject() && !HeapObject::cast(*p)->IsMarked(); |
} |
@@ -756,19 +754,20 @@ |
RootMarkingVisitor root_visitor; |
MarkRoots(&root_visitor); |
- // The objects reachable from the roots are marked black, unreachable |
- // objects are white. Mark objects reachable from object groups with at |
- // least one marked object, and continue until no new objects are |
- // reachable from the object groups. |
+ // The objects reachable from the roots are marked, yet unreachable |
+ // objects are unmarked. Mark objects reachable from object groups |
+ // containing at least one marked object, and continue until no new |
+ // objects are reachable from the object groups. |
ProcessObjectGroups(root_visitor.stack_visitor()); |
- // The objects reachable from the roots or object groups are marked black, |
- // unreachable objects are white. Process objects reachable only from |
- // weak global handles. |
+ // The objects reachable from the roots or object groups are marked, |
+ // yet unreachable objects are unmarked. Mark objects reachable |
+ // only from weak global handles. |
// |
- // First we mark weak pointers not yet reachable. |
- GlobalHandles::MarkWeakRoots(&MustBeMarked); |
- // Then we process weak pointers and process the transitive closure. |
+ // First we identify nonlive weak handles and mark them as pending |
+ // destruction. |
+ GlobalHandles::IdentifyWeakHandles(&IsUnmarkedHeapObject); |
+ // Then we mark the objects and process the transitive closure. |
GlobalHandles::IterateWeakRoots(&root_visitor); |
while (marking_stack.overflowed()) { |
RefillMarkingStack(); |
@@ -801,22 +800,21 @@ |
#ifdef DEBUG |
-void MarkCompactCollector::UpdateLiveObjectCount(HeapObject* obj, int scale) { |
- ASSERT(scale == -1 || scale == 1); |
- live_bytes_ += obj->Size() * scale; |
+void MarkCompactCollector::UpdateLiveObjectCount(HeapObject* obj) { |
+ live_bytes_ += obj->Size(); |
if (Heap::new_space()->Contains(obj)) { |
- live_young_objects_ += scale; |
+ live_young_objects_++; |
} else if (Heap::map_space()->Contains(obj)) { |
ASSERT(obj->IsMap()); |
- live_map_objects_ += scale; |
+ live_map_objects_ ++; |
} else if (Heap::old_pointer_space()->Contains(obj)) { |
- live_old_pointer_objects_ += scale; |
+ live_old_pointer_objects_++; |
} else if (Heap::old_data_space()->Contains(obj)) { |
- live_old_data_objects_ += scale; |
+ live_old_data_objects_++; |
} else if (Heap::code_space()->Contains(obj)) { |
- live_code_objects_ += scale; |
+ live_code_objects_++; |
} else if (Heap::lo_space()->Contains(obj)) { |
- live_lo_objects_ +=scale; |
+ live_lo_objects_++; |
} else { |
UNREACHABLE(); |
} |