OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1933 return objects_by_info_.occupancy(); | 1933 return objects_by_info_.occupancy(); |
1934 } | 1934 } |
1935 | 1935 |
1936 | 1936 |
1937 void NativeObjectsExplorer::FillRetainedObjects() { | 1937 void NativeObjectsExplorer::FillRetainedObjects() { |
1938 if (embedder_queried_) return; | 1938 if (embedder_queried_) return; |
1939 Isolate* isolate = Isolate::Current(); | 1939 Isolate* isolate = Isolate::Current(); |
1940 const GCType major_gc_type = kGCTypeMarkSweepCompact; | 1940 const GCType major_gc_type = kGCTypeMarkSweepCompact; |
1941 // Record objects that are joined into ObjectGroups. | 1941 // Record objects that are joined into ObjectGroups. |
1942 isolate->heap()->CallGCPrologueCallbacks(major_gc_type); | 1942 isolate->heap()->CallGCPrologueCallbacks(major_gc_type); |
1943 | 1943 List<ObjectGroup*>* groups = isolate->global_handles()->object_groups(); |
1944 List<ObjectGroupConnection>* groups = | 1944 for (int i = 0; i < groups->length(); ++i) { |
1945 isolate->global_handles()->object_groups(); | 1945 ObjectGroup* group = groups->at(i); |
1946 List<ObjectGroupRetainerInfo>* infos = | 1946 if (group->info_ == NULL) continue; |
1947 isolate->global_handles()->retainer_infos(); | 1947 List<HeapObject*>* list = GetListMaybeDisposeInfo(group->info_); |
1948 groups->Sort(); | 1948 for (size_t j = 0; j < group->length_; ++j) { |
1949 infos->Sort(); | 1949 HeapObject* obj = HeapObject::cast(*group->objects_[j]); |
1950 | 1950 list->Add(obj); |
1951 int info_index = 0; | 1951 in_groups_.Insert(obj); |
1952 UniqueId current_group_id(0); | |
1953 int current_group_start = 0; | |
1954 | |
1955 if (groups->length() > 0) { | |
1956 for (int i = 0; i <= groups->length(); ++i) { | |
1957 if (i == 0) | |
1958 current_group_id = groups->at(i).id; | |
1959 if (i == groups->length() || | |
1960 current_group_id != groups->at(i).id) { | |
1961 // Group detected: objects in indices [current_group_start, i[. | |
1962 if (info_index < infos->length() && | |
1963 infos->at(info_index).id == groups->at(current_group_start).id) { | |
1964 // Transfer the ownership of info. | |
1965 List<HeapObject*>* list = | |
1966 GetListMaybeDisposeInfo(infos->at(info_index).info); | |
1967 infos->at(info_index).info = NULL; | |
1968 for (int j = current_group_start; j < i; ++j) { | |
1969 HeapObject* obj = HeapObject::cast(*(groups->at(j).object)); | |
1970 list->Add(obj); | |
1971 in_groups_.Insert(obj); | |
1972 } | |
1973 } | |
1974 if (i < groups->length()) { | |
1975 current_group_id = groups->at(i).id; | |
1976 current_group_start = i; | |
1977 } | |
1978 } | |
1979 } | 1952 } |
| 1953 group->info_ = NULL; // Acquire info object ownership. |
1980 } | 1954 } |
1981 isolate->global_handles()->RemoveObjectGroups(); | 1955 isolate->global_handles()->RemoveObjectGroups(); |
1982 isolate->heap()->CallGCEpilogueCallbacks(major_gc_type); | 1956 isolate->heap()->CallGCEpilogueCallbacks(major_gc_type); |
1983 // Record objects that are not in ObjectGroups, but have class ID. | 1957 // Record objects that are not in ObjectGroups, but have class ID. |
1984 GlobalHandlesExtractor extractor(this); | 1958 GlobalHandlesExtractor extractor(this); |
1985 isolate->global_handles()->IterateAllRootsWithClassIds(&extractor); | 1959 isolate->global_handles()->IterateAllRootsWithClassIds(&extractor); |
1986 embedder_queried_ = true; | 1960 embedder_queried_ = true; |
1987 } | 1961 } |
1988 | 1962 |
1989 void NativeObjectsExplorer::FillImplicitReferences() { | 1963 void NativeObjectsExplorer::FillImplicitReferences() { |
1990 Isolate* isolate = Isolate::Current(); | 1964 Isolate* isolate = Isolate::Current(); |
1991 List<ObjectGroupConnection>* ref_groups = | 1965 List<ImplicitRefGroup*>* groups = |
1992 isolate->global_handles()->implicit_ref_groups(); | 1966 isolate->global_handles()->implicit_ref_groups(); |
1993 List<ObjectGroupRepresentative>* representative_objects = | 1967 for (int i = 0; i < groups->length(); ++i) { |
1994 isolate->global_handles()->representative_objects(); | 1968 ImplicitRefGroup* group = groups->at(i); |
1995 | 1969 HeapObject* parent = *group->parent_; |
1996 if (ref_groups->length() == 0) | 1970 int parent_entry = |
1997 return; | 1971 filler_->FindOrAddEntry(parent, native_entries_allocator_)->index(); |
1998 | 1972 ASSERT(parent_entry != HeapEntry::kNoEntry); |
1999 ref_groups->Sort(); | 1973 Object*** children = group->children_; |
2000 representative_objects->Sort(); | 1974 for (size_t j = 0; j < group->length_; ++j) { |
2001 | 1975 Object* child = *children[j]; |
2002 int representative_objects_index = 0; | 1976 HeapEntry* child_entry = |
2003 UniqueId current_group_id(0); | 1977 filler_->FindOrAddEntry(child, native_entries_allocator_); |
2004 int current_group_start = 0; | 1978 filler_->SetNamedReference( |
2005 for (int i = 0; i <= ref_groups->length(); ++i) { | 1979 HeapGraphEdge::kInternal, |
2006 if (i == 0) | 1980 parent_entry, |
2007 current_group_id = ref_groups->at(i).id; | 1981 "native", |
2008 if (i == ref_groups->length() || current_group_id != ref_groups->at(i).id) { | 1982 child_entry); |
2009 // Group detected: objects in indices [current_group_start, i[. | |
2010 | |
2011 // Find the representative object for this group. | |
2012 while (representative_objects_index < representative_objects->length() && | |
2013 representative_objects->at(representative_objects_index).id < | |
2014 current_group_id) | |
2015 ++representative_objects_index; | |
2016 | |
2017 if (representative_objects_index < representative_objects->length() && | |
2018 representative_objects->at(representative_objects_index).id == | |
2019 current_group_id) { | |
2020 HeapObject* parent = | |
2021 *(representative_objects->at(representative_objects_index).object); | |
2022 | |
2023 int parent_entry = | |
2024 filler_->FindOrAddEntry(parent, native_entries_allocator_)->index(); | |
2025 ASSERT(parent_entry != HeapEntry::kNoEntry); | |
2026 | |
2027 for (int j = current_group_start; j < i; ++j) { | |
2028 Object* child = *(ref_groups->at(j).object); | |
2029 HeapEntry* child_entry = | |
2030 filler_->FindOrAddEntry(child, native_entries_allocator_); | |
2031 filler_->SetNamedReference( | |
2032 HeapGraphEdge::kInternal, | |
2033 parent_entry, | |
2034 "native", | |
2035 child_entry); | |
2036 } | |
2037 } else { | |
2038 // This should not happen: representative object for a group was not | |
2039 // set! | |
2040 UNREACHABLE(); | |
2041 } | |
2042 if (i < ref_groups->length()) { | |
2043 current_group_id = ref_groups->at(i).id; | |
2044 current_group_start = i; | |
2045 } | |
2046 } | 1983 } |
2047 } | 1984 } |
2048 isolate->global_handles()->RemoveImplicitRefGroups(); | 1985 isolate->global_handles()->RemoveImplicitRefGroups(); |
2049 } | 1986 } |
2050 | 1987 |
2051 List<HeapObject*>* NativeObjectsExplorer::GetListMaybeDisposeInfo( | 1988 List<HeapObject*>* NativeObjectsExplorer::GetListMaybeDisposeInfo( |
2052 v8::RetainedObjectInfo* info) { | 1989 v8::RetainedObjectInfo* info) { |
2053 HashMap::Entry* entry = | 1990 HashMap::Entry* entry = |
2054 objects_by_info_.Lookup(info, InfoHash(info), true); | 1991 objects_by_info_.Lookup(info, InfoHash(info), true); |
2055 if (entry->value != NULL) { | 1992 if (entry->value != NULL) { |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2757 | 2694 |
2758 | 2695 |
2759 void HeapSnapshotJSONSerializer::SortHashMap( | 2696 void HeapSnapshotJSONSerializer::SortHashMap( |
2760 HashMap* map, List<HashMap::Entry*>* sorted_entries) { | 2697 HashMap* map, List<HashMap::Entry*>* sorted_entries) { |
2761 for (HashMap::Entry* p = map->Start(); p != NULL; p = map->Next(p)) | 2698 for (HashMap::Entry* p = map->Start(); p != NULL; p = map->Next(p)) |
2762 sorted_entries->Add(p); | 2699 sorted_entries->Add(p); |
2763 sorted_entries->Sort(SortUsingEntryValue); | 2700 sorted_entries->Sort(SortUsingEntryValue); |
2764 } | 2701 } |
2765 | 2702 |
2766 } } // namespace v8::internal | 2703 } } // namespace v8::internal |
OLD | NEW |