| Index: src/mark-compact.cc
|
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc
|
| index 165c03f25f2fc580d54790b226ee98951492b4f1..f49179f67e101ad5966d8e7d614d5dc19706a41d 100644
|
| --- a/src/mark-compact.cc
|
| +++ b/src/mark-compact.cc
|
| @@ -1931,72 +1931,34 @@ void MarkCompactCollector::MarkRoots(RootMarkingVisitor* visitor) {
|
|
|
|
|
| void MarkCompactCollector::MarkImplicitRefGroups() {
|
| - Isolate* isolate = Isolate::Current();
|
| - List<ObjectGroupConnection>* ref_groups =
|
| - isolate->global_handles()->implicit_ref_groups();
|
| - List<ObjectGroupRepresentative>* representative_objects =
|
| - isolate->global_handles()->representative_objects();
|
| -
|
| - if (ref_groups->length() == 0)
|
| - return;
|
| -
|
| - ref_groups->Sort();
|
| - representative_objects->Sort();
|
| -
|
| - int surviving_ref_group_index = 0;
|
| - int surviving_representative_object_index = 0;
|
| -
|
| - int representative_objects_index = 0;
|
| - UniqueId current_group_id(0);
|
| - int current_group_start = 0;
|
| - for (int i = 0; i <= ref_groups->length(); ++i) {
|
| - if (i == 0)
|
| - current_group_id = ref_groups->at(i).id;
|
| - if (i == ref_groups->length() || current_group_id != ref_groups->at(i).id) {
|
| - // Group detected: objects in indices [current_group_start, i[.
|
| -
|
| - // Find the representative object for this group.
|
| - while (representative_objects_index < representative_objects->length() &&
|
| - representative_objects->at(representative_objects_index).id <
|
| - current_group_id)
|
| - ++representative_objects_index;
|
| -
|
| - if (representative_objects_index < representative_objects->length() &&
|
| - representative_objects->at(representative_objects_index).id ==
|
| - current_group_id) {
|
| - HeapObject* parent =
|
| - *(representative_objects->at(representative_objects_index).object);
|
| -
|
| - if (!IsMarked(parent)) {
|
| - // Nothing tbd, copy the reference group so that it can be iterated
|
| - // during the next call.
|
| - for (int j = current_group_start; j < i; ++j)
|
| - ref_groups->at(surviving_ref_group_index++) = ref_groups->at(j);
|
| - representative_objects->at(surviving_representative_object_index++) =
|
| - representative_objects->at(representative_objects_index);
|
| - } else {
|
| - // A parent object is marked, so mark all child heap objects.
|
| - for (int j = current_group_start; j < i; ++j) {
|
| - if ((*ref_groups->at(j).object)->IsHeapObject()) {
|
| - HeapObject* child = HeapObject::cast(*ref_groups->at(j).object);
|
| - MarkBit mark = Marking::MarkBitFrom(child);
|
| - MarkObject(child, mark);
|
| - }
|
| - }
|
| - }
|
| - } else {
|
| - // This should not happen: representative object for a group was not
|
| - // set!
|
| - UNREACHABLE();
|
| - }
|
| - if (i < ref_groups->length()) {
|
| - current_group_id = ref_groups->at(i).id;
|
| - current_group_start = i;
|
| + List<ImplicitRefGroup*>* ref_groups =
|
| + isolate()->global_handles()->implicit_ref_groups();
|
| +
|
| + int last = 0;
|
| + for (int i = 0; i < ref_groups->length(); i++) {
|
| + ImplicitRefGroup* entry = ref_groups->at(i);
|
| + ASSERT(entry != NULL);
|
| +
|
| + if (!IsMarked(*entry->parent_)) {
|
| + (*ref_groups)[last++] = entry;
|
| + continue;
|
| + }
|
| +
|
| + 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()) {
|
| + HeapObject* child = HeapObject::cast(*children[j]);
|
| + MarkBit mark = Marking::MarkBitFrom(child);
|
| + MarkObject(child, mark);
|
| }
|
| }
|
| +
|
| + // Once the entire group has been marked, dispose it because it's
|
| + // not needed anymore.
|
| + entry->Dispose();
|
| }
|
| - ref_groups->Rewind(surviving_ref_group_index);
|
| - representative_objects->Rewind(surviving_representative_object_index);
|
| + ref_groups->Rewind(last);
|
| }
|
|
|
|
|
|
|