OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/profiler/heap-snapshot-generator.h" | 5 #include "src/profiler/heap-snapshot-generator.h" |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
10 #include "src/objects-body-descriptors.h" | 10 #include "src/objects-body-descriptors.h" |
(...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 parent_end_(HeapObject::RawField(parent_obj_, parent_obj_->Size())), | 979 parent_end_(HeapObject::RawField(parent_obj_, parent_obj_->Size())), |
980 parent_(parent), | 980 parent_(parent), |
981 next_index_(0) {} | 981 next_index_(0) {} |
982 void VisitCodeEntry(Address entry_address) override { | 982 void VisitCodeEntry(Address entry_address) override { |
983 Code* code = Code::cast(Code::GetObjectFromEntryAddress(entry_address)); | 983 Code* code = Code::cast(Code::GetObjectFromEntryAddress(entry_address)); |
984 generator_->SetInternalReference(parent_obj_, parent_, "code", code); | 984 generator_->SetInternalReference(parent_obj_, parent_, "code", code); |
985 generator_->TagCodeObject(code); | 985 generator_->TagCodeObject(code); |
986 } | 986 } |
987 void VisitPointers(Object** start, Object** end) override { | 987 void VisitPointers(Object** start, Object** end) override { |
988 for (Object** p = start; p < end; p++) { | 988 for (Object** p = start; p < end; p++) { |
989 intptr_t index = | 989 int index = static_cast<int>(p - HeapObject::RawField(parent_obj_, 0)); |
990 static_cast<intptr_t>(p - HeapObject::RawField(parent_obj_, 0)); | |
991 ++next_index_; | 990 ++next_index_; |
992 // |p| could be outside of the object, e.g., while visiting RelocInfo of | 991 // |p| could be outside of the object, e.g., while visiting RelocInfo of |
993 // code objects. | 992 // code objects. |
994 if (p >= parent_start_ && p < parent_end_ && generator_->marks_[index]) { | 993 if (p >= parent_start_ && p < parent_end_ && generator_->marks_[index]) { |
995 generator_->marks_[index] = false; | 994 generator_->marks_[index] = false; |
996 continue; | 995 continue; |
997 } | 996 } |
998 generator_->SetHiddenReference(parent_obj_, parent_, next_index_, *p); | 997 generator_->SetHiddenReference(parent_obj_, parent_, next_index_, *p, |
| 998 index * kPointerSize); |
999 } | 999 } |
1000 } | 1000 } |
1001 | 1001 |
1002 private: | 1002 private: |
1003 V8HeapExplorer* generator_; | 1003 V8HeapExplorer* generator_; |
1004 HeapObject* parent_obj_; | 1004 HeapObject* parent_obj_; |
1005 Object** parent_start_; | 1005 Object** parent_start_; |
1006 Object** parent_end_; | 1006 Object** parent_end_; |
1007 int parent_; | 1007 int parent_; |
1008 int next_index_; | 1008 int next_index_; |
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1828 object != heap_->empty_fixed_array() && | 1828 object != heap_->empty_fixed_array() && |
1829 object != heap_->empty_descriptor_array() && | 1829 object != heap_->empty_descriptor_array() && |
1830 object != heap_->fixed_array_map() && object != heap_->cell_map() && | 1830 object != heap_->fixed_array_map() && object != heap_->cell_map() && |
1831 object != heap_->global_property_cell_map() && | 1831 object != heap_->global_property_cell_map() && |
1832 object != heap_->shared_function_info_map() && | 1832 object != heap_->shared_function_info_map() && |
1833 object != heap_->free_space_map() && | 1833 object != heap_->free_space_map() && |
1834 object != heap_->one_pointer_filler_map() && | 1834 object != heap_->one_pointer_filler_map() && |
1835 object != heap_->two_pointer_filler_map(); | 1835 object != heap_->two_pointer_filler_map(); |
1836 } | 1836 } |
1837 | 1837 |
| 1838 bool V8HeapExplorer::IsEssentialHiddenReference(Object* parent, |
| 1839 int field_offset) { |
| 1840 if (parent->IsAllocationSite() && |
| 1841 field_offset == AllocationSite::kWeakNextOffset) |
| 1842 return false; |
| 1843 // TODO(ulan): JSFunction, Code, and Context also have next weak link, which |
| 1844 // is non-essential. Currently they are handled as normal weak links. |
| 1845 // Move them here. |
| 1846 return true; |
| 1847 } |
1838 | 1848 |
1839 void V8HeapExplorer::SetContextReference(HeapObject* parent_obj, | 1849 void V8HeapExplorer::SetContextReference(HeapObject* parent_obj, |
1840 int parent_entry, | 1850 int parent_entry, |
1841 String* reference_name, | 1851 String* reference_name, |
1842 Object* child_obj, | 1852 Object* child_obj, |
1843 int field_offset) { | 1853 int field_offset) { |
1844 DCHECK(parent_entry == GetEntry(parent_obj)->index()); | 1854 DCHECK(parent_entry == GetEntry(parent_obj)->index()); |
1845 HeapEntry* child_entry = GetEntry(child_obj); | 1855 HeapEntry* child_entry = GetEntry(child_obj); |
1846 if (child_entry != NULL) { | 1856 if (child_entry != NULL) { |
1847 filler_->SetNamedReference(HeapGraphEdge::kContextVariable, | 1857 filler_->SetNamedReference(HeapGraphEdge::kContextVariable, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1919 if (child_entry == NULL) return; | 1929 if (child_entry == NULL) return; |
1920 if (IsEssentialObject(child_obj)) { | 1930 if (IsEssentialObject(child_obj)) { |
1921 filler_->SetNamedReference(HeapGraphEdge::kInternal, | 1931 filler_->SetNamedReference(HeapGraphEdge::kInternal, |
1922 parent_entry, | 1932 parent_entry, |
1923 names_->GetName(index), | 1933 names_->GetName(index), |
1924 child_entry); | 1934 child_entry); |
1925 } | 1935 } |
1926 MarkVisitedField(parent_obj, field_offset); | 1936 MarkVisitedField(parent_obj, field_offset); |
1927 } | 1937 } |
1928 | 1938 |
1929 | |
1930 void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj, | 1939 void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj, |
1931 int parent_entry, | 1940 int parent_entry, int index, |
1932 int index, | 1941 Object* child_obj, int field_offset) { |
1933 Object* child_obj) { | |
1934 DCHECK(parent_entry == GetEntry(parent_obj)->index()); | 1942 DCHECK(parent_entry == GetEntry(parent_obj)->index()); |
1935 HeapEntry* child_entry = GetEntry(child_obj); | 1943 HeapEntry* child_entry = GetEntry(child_obj); |
1936 if (child_entry != NULL && IsEssentialObject(child_obj)) { | 1944 if (child_entry != NULL && IsEssentialObject(child_obj) && |
| 1945 IsEssentialHiddenReference(parent_obj, field_offset)) { |
1937 filler_->SetIndexedReference(HeapGraphEdge::kHidden, | 1946 filler_->SetIndexedReference(HeapGraphEdge::kHidden, |
1938 parent_entry, | 1947 parent_entry, |
1939 index, | 1948 index, |
1940 child_entry); | 1949 child_entry); |
1941 } | 1950 } |
1942 } | 1951 } |
1943 | 1952 |
1944 | 1953 |
1945 void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, | 1954 void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, |
1946 int parent_entry, | 1955 int parent_entry, |
(...skipping 1161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3108 for (int i = 1; i < sorted_strings.length(); ++i) { | 3117 for (int i = 1; i < sorted_strings.length(); ++i) { |
3109 writer_->AddCharacter(','); | 3118 writer_->AddCharacter(','); |
3110 SerializeString(sorted_strings[i]); | 3119 SerializeString(sorted_strings[i]); |
3111 if (writer_->aborted()) return; | 3120 if (writer_->aborted()) return; |
3112 } | 3121 } |
3113 } | 3122 } |
3114 | 3123 |
3115 | 3124 |
3116 } // namespace internal | 3125 } // namespace internal |
3117 } // namespace v8 | 3126 } // namespace v8 |
OLD | NEW |