| Index: src/heap-snapshot-generator.cc
|
| diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc
|
| index 6e03b0c6a2fe897fbef4af6a0cbe801e6124c8c5..d22239f381353af4bbc74ea78aeb123280dfe48b 100644
|
| --- a/src/heap-snapshot-generator.cc
|
| +++ b/src/heap-snapshot-generator.cc
|
| @@ -1940,43 +1940,17 @@ void NativeObjectsExplorer::FillRetainedObjects() {
|
| const GCType major_gc_type = kGCTypeMarkSweepCompact;
|
| // Record objects that are joined into ObjectGroups.
|
| isolate->heap()->CallGCPrologueCallbacks(major_gc_type);
|
| -
|
| - List<ObjectGroupConnection>* groups =
|
| - isolate->global_handles()->object_groups();
|
| - List<ObjectGroupRetainerInfo>* infos =
|
| - isolate->global_handles()->retainer_infos();
|
| - groups->Sort();
|
| - infos->Sort();
|
| -
|
| - int info_index = 0;
|
| - UniqueId current_group_id(0);
|
| - int current_group_start = 0;
|
| -
|
| - if (groups->length() > 0) {
|
| - for (int i = 0; i <= groups->length(); ++i) {
|
| - if (i == 0)
|
| - current_group_id = groups->at(i).id;
|
| - if (i == groups->length() ||
|
| - current_group_id != groups->at(i).id) {
|
| - // Group detected: objects in indices [current_group_start, i[.
|
| - if (info_index < infos->length() &&
|
| - infos->at(info_index).id == groups->at(current_group_start).id) {
|
| - // Transfer the ownership of info.
|
| - List<HeapObject*>* list =
|
| - GetListMaybeDisposeInfo(infos->at(info_index).info);
|
| - infos->at(info_index).info = NULL;
|
| - for (int j = current_group_start; j < i; ++j) {
|
| - HeapObject* obj = HeapObject::cast(*(groups->at(j).object));
|
| - list->Add(obj);
|
| - in_groups_.Insert(obj);
|
| - }
|
| - }
|
| - if (i < groups->length()) {
|
| - current_group_id = groups->at(i).id;
|
| - current_group_start = i;
|
| - }
|
| - }
|
| + List<ObjectGroup*>* groups = isolate->global_handles()->object_groups();
|
| + for (int i = 0; i < groups->length(); ++i) {
|
| + ObjectGroup* group = groups->at(i);
|
| + if (group->info_ == NULL) continue;
|
| + List<HeapObject*>* list = GetListMaybeDisposeInfo(group->info_);
|
| + for (size_t j = 0; j < group->length_; ++j) {
|
| + HeapObject* obj = HeapObject::cast(*group->objects_[j]);
|
| + list->Add(obj);
|
| + in_groups_.Insert(obj);
|
| }
|
| + group->info_ = NULL; // Acquire info object ownership.
|
| }
|
| isolate->global_handles()->RemoveObjectGroups();
|
| isolate->heap()->CallGCEpilogueCallbacks(major_gc_type);
|
| @@ -1988,61 +1962,24 @@ void NativeObjectsExplorer::FillRetainedObjects() {
|
|
|
| void NativeObjectsExplorer::FillImplicitReferences() {
|
| Isolate* isolate = Isolate::Current();
|
| - List<ObjectGroupConnection>* ref_groups =
|
| + List<ImplicitRefGroup*>* 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 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);
|
| -
|
| - int parent_entry =
|
| - filler_->FindOrAddEntry(parent, native_entries_allocator_)->index();
|
| - ASSERT(parent_entry != HeapEntry::kNoEntry);
|
| -
|
| - for (int j = current_group_start; j < i; ++j) {
|
| - Object* child = *(ref_groups->at(j).object);
|
| - HeapEntry* child_entry =
|
| - filler_->FindOrAddEntry(child, native_entries_allocator_);
|
| - filler_->SetNamedReference(
|
| - HeapGraphEdge::kInternal,
|
| - parent_entry,
|
| - "native",
|
| - child_entry);
|
| - }
|
| - } 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;
|
| - }
|
| + for (int i = 0; i < groups->length(); ++i) {
|
| + ImplicitRefGroup* group = groups->at(i);
|
| + HeapObject* parent = *group->parent_;
|
| + int parent_entry =
|
| + filler_->FindOrAddEntry(parent, native_entries_allocator_)->index();
|
| + ASSERT(parent_entry != HeapEntry::kNoEntry);
|
| + Object*** children = group->children_;
|
| + for (size_t j = 0; j < group->length_; ++j) {
|
| + Object* child = *children[j];
|
| + HeapEntry* child_entry =
|
| + filler_->FindOrAddEntry(child, native_entries_allocator_);
|
| + filler_->SetNamedReference(
|
| + HeapGraphEdge::kInternal,
|
| + parent_entry,
|
| + "native",
|
| + child_entry);
|
| }
|
| }
|
| isolate->global_handles()->RemoveImplicitRefGroups();
|
|
|