| Index: src/heap-profiler.cc
|
| diff --git a/src/heap-profiler.cc b/src/heap-profiler.cc
|
| index 1703af8c6ae2a70d104c88ca83230d910de8e20b..ecb6919874a6334cfda3d81c6a13a1252e953713 100644
|
| --- a/src/heap-profiler.cc
|
| +++ b/src/heap-profiler.cc
|
| @@ -333,6 +333,8 @@ void JSObjectsCluster::Print(StringStream* accumulator) const {
|
| accumulator->Add("(roots)");
|
| } else if (constructor_ == FromSpecialCase(GLOBAL_PROPERTY)) {
|
| accumulator->Add("(global property)");
|
| + } else if (constructor_ == FromSpecialCase(SELF)) {
|
| + accumulator->Add("(self)");
|
| } else {
|
| SmartPointer<char> s_name(
|
| constructor_->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL));
|
| @@ -393,9 +395,11 @@ inline int ClustersCoarser::ClusterBackRefs::Compare(
|
|
|
|
|
| ClustersCoarser::ClustersCoarser()
|
| - : zscope_(DELETE_ON_EXIT),
|
| - sim_list_(ClustersCoarser::kInitialSimilarityListCapacity),
|
| - current_pair_(NULL) {
|
| + : zscope_(DELETE_ON_EXIT),
|
| + sim_list_(ClustersCoarser::kInitialSimilarityListCapacity),
|
| + current_pair_(NULL),
|
| + current_set_(NULL),
|
| + self_(NULL) {
|
| }
|
|
|
|
|
| @@ -406,10 +410,12 @@ void ClustersCoarser::Call(const JSObjectsCluster& cluster,
|
| ASSERT(current_pair_ == NULL);
|
| current_pair_ = &pair;
|
| current_set_ = new JSObjectsRetainerTree();
|
| + self_ = &cluster;
|
| tree->ForEach(this);
|
| sim_list_.Add(pair);
|
| current_pair_ = NULL;
|
| current_set_ = NULL;
|
| + self_ = NULL;
|
| }
|
|
|
|
|
| @@ -417,8 +423,13 @@ void ClustersCoarser::Call(const JSObjectsCluster& cluster,
|
| const NumberAndSizeInfo& number_and_size) {
|
| ASSERT(current_pair_ != NULL);
|
| ASSERT(current_set_ != NULL);
|
| - JSObjectsCluster eq = GetCoarseEquivalent(cluster);
|
| + ASSERT(self_ != NULL);
|
| JSObjectsRetainerTree::Locator loc;
|
| + if (JSObjectsCluster::Compare(*self_, cluster) == 0) {
|
| + current_pair_->refs.Add(JSObjectsCluster(JSObjectsCluster::SELF));
|
| + return;
|
| + }
|
| + JSObjectsCluster eq = GetCoarseEquivalent(cluster);
|
| if (!eq.is_null()) {
|
| if (current_set_->Find(eq, &loc)) return;
|
| current_pair_->refs.Add(eq);
|
| @@ -443,11 +454,7 @@ void ClustersCoarser::Process(JSObjectsRetainerTree* tree) {
|
|
|
| int ClustersCoarser::DoProcess(JSObjectsRetainerTree* tree) {
|
| tree->ForEach(this);
|
| - // To sort similarity list properly, references list of a cluster is
|
| - // required to be sorted, thus 'O1 <- A, B' and 'O2 <- B, A' would
|
| - // be considered equivalent. But we don't sort them explicitly
|
| - // because we know that they come from a splay tree traversal, so
|
| - // they are already sorted.
|
| + sim_list_.Iterate(ClusterBackRefs::SortRefsIterator);
|
| sim_list_.Sort(ClusterBackRefsCmp);
|
| return FillEqualityTree();
|
| }
|
|
|