Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 1ba68a166719c86b403e14546a0af6e265d6b784..b936e79a5c4a50953d67620bd267c835d391afd7 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -3293,29 +3293,26 @@ bool HeapSnapshotGenerator::BuildDominatorTree( |
for (int i = 0; i < root_index; ++i) (*dominators)[i] = kNoDominator; |
(*dominators)[root_index] = root_index; |
- // We use time_stamps array to stamp entries with the iteration number |
- // when the dominance for the entry has been updated. |
- ScopedVector<int> time_stamps(entries_length); |
- for (int i = 0; i < entries_length; ++i) time_stamps[i] = -1; |
+ // The affected array is used to mark those entries that may |
+ // be affected because of dominators change among their retainers. |
+ ScopedVector<bool> affected(entries_length); |
+ for (int i = 0; i < entries_length; ++i) affected[i] = false; |
Vector<HeapGraphEdge> children = entries[root_index]->children(); |
for (int i = 0; i < children.length(); ++i) { |
- // Mark the root direct children as affected on iteration zero. |
- time_stamps[children[i].to()->ordered_index()] = 0; |
+ // Mark the root direct children as affected. |
+ affected[children[i].to()->ordered_index()] = true; |
} |
int changed = 1; |
- int iteration = 0; |
const int base_progress_counter = progress_counter_; |
while (changed != 0) { |
- ++iteration; |
changed = 0; |
for (int i = root_index - 1; i >= 0; --i) { |
// If dominator of the entry has already been set to root, |
// then it can't propagate any further. |
if ((*dominators)[i] == root_index) continue; |
- // If no retainers of the entry had been updated on current |
- // or previous iteration, then this entry is not affected. |
- if (time_stamps[i] < iteration - 1) continue; |
+ if (!affected[i]) continue; |
+ affected[i] = false; |
int new_idom_index = kNoDominator; |
Vector<HeapGraphEdge*> rets = entries[i]->retainers(); |
for (int j = 0; j < rets.length(); ++j) { |
@@ -3336,7 +3333,7 @@ bool HeapSnapshotGenerator::BuildDominatorTree( |
++changed; |
Vector<HeapGraphEdge> children = entries[i]->children(); |
for (int j = 0; j < children.length(); ++j) { |
- time_stamps[children[j].to()->ordered_index()] = iteration; |
+ affected[children[j].to()->ordered_index()] = true; |
} |
} |
} |