Index: src/heap-profiler.cc |
diff --git a/src/heap-profiler.cc b/src/heap-profiler.cc |
index 732d2f4102dd47d4728dbbc72dc568d4e429aa59..060597b4c1a280daf7924f12c157315eb7797f55 100644 |
--- a/src/heap-profiler.cc |
+++ b/src/heap-profiler.cc |
@@ -911,22 +911,27 @@ static JSObjectsCluster HeapObjectAsCluster(HeapObject* object) { |
class CountingRetainersIterator { |
public: |
CountingRetainersIterator(const JSObjectsCluster& child_cluster, |
+ HeapEntriesAllocator* allocator, |
HeapEntriesMap* map) |
- : child_(ClusterAsHeapObject(child_cluster)), map_(map) { |
+ : child_(ClusterAsHeapObject(child_cluster)), |
+ allocator_(allocator), |
+ map_(map) { |
if (map_->Map(child_) == NULL) |
- map_->Pair(child_, HeapEntriesMap::kHeapEntryPlaceholder); |
+ map_->Pair(child_, allocator_, HeapEntriesMap::kHeapEntryPlaceholder); |
} |
void Call(const JSObjectsCluster& cluster, |
const NumberAndSizeInfo& number_and_size) { |
if (map_->Map(ClusterAsHeapObject(cluster)) == NULL) |
map_->Pair(ClusterAsHeapObject(cluster), |
+ allocator_, |
HeapEntriesMap::kHeapEntryPlaceholder); |
map_->CountReference(ClusterAsHeapObject(cluster), child_); |
} |
private: |
HeapObject* child_; |
+ HeapEntriesAllocator* allocator_; |
HeapEntriesMap* map_; |
}; |
@@ -934,6 +939,7 @@ class CountingRetainersIterator { |
class AllocatingRetainersIterator { |
public: |
AllocatingRetainersIterator(const JSObjectsCluster& child_cluster, |
+ HeapEntriesAllocator*, |
HeapEntriesMap* map) |
: child_(ClusterAsHeapObject(child_cluster)), map_(map) { |
child_entry_ = map_->Map(child_); |
@@ -966,8 +972,9 @@ template<class RetainersIterator> |
class AggregatingRetainerTreeIterator { |
public: |
explicit AggregatingRetainerTreeIterator(ClustersCoarser* coarser, |
+ HeapEntriesAllocator* allocator, |
HeapEntriesMap* map) |
- : coarser_(coarser), map_(map) { |
+ : coarser_(coarser), allocator_(allocator), map_(map) { |
} |
void Call(const JSObjectsCluster& cluster, JSObjectsClusterTree* tree) { |
@@ -981,25 +988,28 @@ class AggregatingRetainerTreeIterator { |
tree->ForEach(&retainers_aggregator); |
tree_to_iterate = &dest_tree_; |
} |
- RetainersIterator iterator(cluster, map_); |
+ RetainersIterator iterator(cluster, allocator_, map_); |
tree_to_iterate->ForEach(&iterator); |
} |
private: |
ClustersCoarser* coarser_; |
+ HeapEntriesAllocator* allocator_; |
HeapEntriesMap* map_; |
}; |
-class AggregatedRetainerTreeAllocator { |
+class AggregatedRetainerTreeAllocator : public HeapEntriesAllocator { |
public: |
AggregatedRetainerTreeAllocator(HeapSnapshot* snapshot, |
int* root_child_index) |
: snapshot_(snapshot), root_child_index_(root_child_index) { |
} |
+ ~AggregatedRetainerTreeAllocator() { } |
- HeapEntry* GetEntry( |
- HeapObject* obj, int children_count, int retainers_count) { |
+ HeapEntry* AllocateEntry( |
+ HeapThing ptr, int children_count, int retainers_count) { |
+ HeapObject* obj = reinterpret_cast<HeapObject*>(ptr); |
JSObjectsCluster cluster = HeapObjectAsCluster(obj); |
const char* name = cluster.GetSpecialCaseName(); |
if (name == NULL) { |
@@ -1018,12 +1028,13 @@ class AggregatedRetainerTreeAllocator { |
template<class Iterator> |
void AggregatedHeapSnapshotGenerator::IterateRetainers( |
- HeapEntriesMap* entries_map) { |
+ HeapEntriesAllocator* allocator, HeapEntriesMap* entries_map) { |
RetainerHeapProfile* p = agg_snapshot_->js_retainer_profile(); |
AggregatingRetainerTreeIterator<Iterator> agg_ret_iter_1( |
- p->coarser(), entries_map); |
+ p->coarser(), allocator, entries_map); |
p->retainers_tree()->ForEach(&agg_ret_iter_1); |
- AggregatingRetainerTreeIterator<Iterator> agg_ret_iter_2(NULL, entries_map); |
+ AggregatingRetainerTreeIterator<Iterator> agg_ret_iter_2( |
+ NULL, allocator, entries_map); |
p->aggregator()->output_tree().ForEach(&agg_ret_iter_2); |
} |
@@ -1042,7 +1053,9 @@ void AggregatedHeapSnapshotGenerator::FillHeapSnapshot(HeapSnapshot* snapshot) { |
agg_snapshot_->js_cons_profile()->ForEach(&counting_cons_iter); |
histogram_entities_count += counting_cons_iter.entities_count(); |
HeapEntriesMap entries_map; |
- IterateRetainers<CountingRetainersIterator>(&entries_map); |
+ int root_child_index = 0; |
+ AggregatedRetainerTreeAllocator allocator(snapshot, &root_child_index); |
+ IterateRetainers<CountingRetainersIterator>(&allocator, &entries_map); |
histogram_entities_count += entries_map.entries_count(); |
histogram_children_count += entries_map.total_children_count(); |
histogram_retainers_count += entries_map.total_retainers_count(); |
@@ -1056,10 +1069,7 @@ void AggregatedHeapSnapshotGenerator::FillHeapSnapshot(HeapSnapshot* snapshot) { |
snapshot->AllocateEntries(histogram_entities_count, |
histogram_children_count, |
histogram_retainers_count); |
- snapshot->AddEntry(HeapSnapshot::kInternalRootObject, |
- root_children_count, |
- 0); |
- int root_child_index = 0; |
+ snapshot->AddRootEntry(root_children_count); |
for (int i = FIRST_NONSTRING_TYPE; i <= kAllStringsType; ++i) { |
if (agg_snapshot_->info()[i].bytes() > 0) { |
AddEntryFromAggregatedSnapshot(snapshot, |
@@ -1075,11 +1085,10 @@ void AggregatedHeapSnapshotGenerator::FillHeapSnapshot(HeapSnapshot* snapshot) { |
AllocatingConstructorHeapProfileIterator alloc_cons_iter( |
snapshot, &root_child_index); |
agg_snapshot_->js_cons_profile()->ForEach(&alloc_cons_iter); |
- AggregatedRetainerTreeAllocator allocator(snapshot, &root_child_index); |
- entries_map.UpdateEntries(&allocator); |
+ entries_map.UpdateEntries(); |
// Fill up references. |
- IterateRetainers<AllocatingRetainersIterator>(&entries_map); |
+ IterateRetainers<AllocatingRetainersIterator>(&allocator, &entries_map); |
snapshot->SetDominatorsToSelf(); |
} |