Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index 73bf2f260bcfa0014cf3fa1f9a80a778a61c5213..bd36459d12b18d63a63a79b638bd1cd12412bc74 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -1217,13 +1217,14 @@ void MarkCompactCollector::MarkObjectGroups() { |
List<ObjectGroup*>* object_groups = |
heap()->isolate()->global_handles()->object_groups(); |
+ int last = 0; |
for (int i = 0; i < object_groups->length(); i++) { |
ObjectGroup* entry = object_groups->at(i); |
- if (entry == NULL) continue; |
+ ASSERT(entry != NULL); |
- List<Object**>& objects = entry->objects_; |
+ Object*** objects = entry->objects_; |
bool group_marked = false; |
- for (int j = 0; j < objects.length(); j++) { |
+ for (size_t j = 0; j < entry->length_; j++) { |
Object* object = *objects[j]; |
if (object->IsHeapObject() && HeapObject::cast(object)->IsMarked()) { |
group_marked = true; |
@@ -1231,21 +1232,24 @@ void MarkCompactCollector::MarkObjectGroups() { |
} |
} |
- if (!group_marked) continue; |
+ if (!group_marked) { |
+ (*object_groups)[last++] = entry; |
+ continue; |
+ } |
- // An object in the group is marked, so mark as gray all white heap |
- // objects in the group. |
- for (int j = 0; j < objects.length(); ++j) { |
+ // An object in the group is marked, so mark all heap objects in |
+ // the group. |
+ for (size_t j = 0; j < entry->length_; ++j) { |
if ((*objects[j])->IsHeapObject()) { |
MarkObject(HeapObject::cast(*objects[j])); |
} |
} |
- // Once the entire group has been colored gray, set the object group |
- // to NULL so it won't be processed again. |
- delete entry; |
- object_groups->at(i) = NULL; |
+ // Once the entire group has been marked, dispose it because it's |
+ // not needed anymore. |
+ entry->Dispose(); |
} |
+ object_groups->Rewind(last); |
} |
@@ -1253,26 +1257,29 @@ void MarkCompactCollector::MarkImplicitRefGroups() { |
List<ImplicitRefGroup*>* ref_groups = |
heap()->isolate()->global_handles()->implicit_ref_groups(); |
+ int last = 0; |
for (int i = 0; i < ref_groups->length(); i++) { |
ImplicitRefGroup* entry = ref_groups->at(i); |
- if (entry == NULL) continue; |
+ ASSERT(entry != NULL); |
- if (!entry->parent_->IsMarked()) continue; |
+ if (!(*entry->parent_)->IsMarked()) { |
+ (*ref_groups)[last++] = entry; |
+ continue; |
+ } |
- List<Object**>& children = entry->children_; |
- // A parent object is marked, so mark as gray all child white heap |
- // objects. |
- for (int j = 0; j < children.length(); ++j) { |
+ Object*** children = entry->children_; |
+ // A parent object is marked, so mark all child heap objects. |
+ for (size_t j = 0; j < entry->length_; ++j) { |
if ((*children[j])->IsHeapObject()) { |
MarkObject(HeapObject::cast(*children[j])); |
} |
} |
- // Once the entire group has been colored gray, set the group |
- // to NULL so it won't be processed again. |
- delete entry; |
- ref_groups->at(i) = NULL; |
+ // Once the entire group has been marked, dispose it because it's |
+ // not needed anymore. |
+ entry->Dispose(); |
} |
+ ref_groups->Rewind(last); |
} |