Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 39b1a8dd90dfba2238e889228cbc5b1a93ba7bb6..c9db94f7b1a4b6ec9a6a237f12cd39056b20d05a 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -984,11 +984,6 @@ int HeapEntry::RetainedSize(bool exact) { |
} |
-List<HeapGraphPath*>* HeapEntry::GetRetainingPaths() { |
- return snapshot_->GetRetainingPaths(this); |
-} |
- |
- |
template<class Visitor> |
void HeapEntry::ApplyAndPaintAllReachable(Visitor* visitor) { |
List<HeapEntry*> list(10); |
@@ -1147,107 +1142,6 @@ void HeapEntry::CalculateExactRetainedSize() { |
} |
-class CachedHeapGraphPath { |
- public: |
- CachedHeapGraphPath() |
- : nodes_(NodesMatch) { } |
- CachedHeapGraphPath(const CachedHeapGraphPath& src) |
- : nodes_(NodesMatch, &HashMap::DefaultAllocator, src.nodes_.capacity()), |
- path_(src.path_.length() + 1) { |
- for (HashMap::Entry* p = src.nodes_.Start(); |
- p != NULL; |
- p = src.nodes_.Next(p)) { |
- nodes_.Lookup(p->key, p->hash, true); |
- } |
- path_.AddAll(src.path_); |
- } |
- void Add(HeapGraphEdge* edge) { |
- nodes_.Lookup(edge->to(), Hash(edge->to()), true); |
- path_.Add(edge); |
- } |
- bool ContainsNode(HeapEntry* node) { |
- return nodes_.Lookup(node, Hash(node), false) != NULL; |
- } |
- const List<HeapGraphEdge*>* path() const { return &path_; } |
- |
- private: |
- static uint32_t Hash(HeapEntry* entry) { |
- return static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry)); |
- } |
- static bool NodesMatch(void* key1, void* key2) { return key1 == key2; } |
- |
- HashMap nodes_; |
- List<HeapGraphEdge*> path_; |
-}; |
- |
- |
-List<HeapGraphPath*>* HeapEntry::CalculateRetainingPaths() { |
- List<HeapGraphPath*>* retaining_paths = new List<HeapGraphPath*>(4); |
- CachedHeapGraphPath path; |
- FindRetainingPaths(&path, retaining_paths); |
- return retaining_paths; |
-} |
- |
- |
-void HeapEntry::FindRetainingPaths(CachedHeapGraphPath* prev_path, |
- List<HeapGraphPath*>* retaining_paths) { |
- Vector<HeapGraphEdge*> rets = retainers(); |
- for (int i = 0; i < rets.length(); ++i) { |
- HeapGraphEdge* ret_edge = rets[i]; |
- if (prev_path->ContainsNode(ret_edge->From())) continue; |
- if (ret_edge->From() != snapshot()->root()) { |
- CachedHeapGraphPath path(*prev_path); |
- path.Add(ret_edge); |
- ret_edge->From()->FindRetainingPaths(&path, retaining_paths); |
- } else { |
- HeapGraphPath* ret_path = new HeapGraphPath(*prev_path->path()); |
- ret_path->Set(0, ret_edge); |
- retaining_paths->Add(ret_path); |
- } |
- } |
-} |
- |
- |
-HeapGraphPath::HeapGraphPath(const List<HeapGraphEdge*>& path) |
- : path_(path.length() + 1) { |
- Add(NULL); |
- for (int i = path.length() - 1; i >= 0; --i) { |
- Add(path[i]); |
- } |
-} |
- |
- |
-void HeapGraphPath::Print() { |
- path_[0]->From()->Print(1, 0); |
- for (int i = 0; i < path_.length(); ++i) { |
- OS::Print(" -> "); |
- HeapGraphEdge* edge = path_[i]; |
- switch (edge->type()) { |
- case HeapGraphEdge::kContextVariable: |
- OS::Print("[#%s] ", edge->name()); |
- break; |
- case HeapGraphEdge::kElement: |
- case HeapGraphEdge::kHidden: |
- OS::Print("[%d] ", edge->index()); |
- break; |
- case HeapGraphEdge::kInternal: |
- OS::Print("[$%s] ", edge->name()); |
- break; |
- case HeapGraphEdge::kProperty: |
- OS::Print("[%s] ", edge->name()); |
- break; |
- case HeapGraphEdge::kShortcut: |
- OS::Print("[^%s] ", edge->name()); |
- break; |
- default: |
- OS::Print("!!! unknown edge type: %d ", edge->type()); |
- } |
- edge->to()->Print(1, 0); |
- } |
- OS::Print("\n"); |
-} |
- |
- |
// It is very important to keep objects that form a heap snapshot |
// as small as possible. |
namespace { // Avoid littering the global namespace. |
@@ -1278,8 +1172,7 @@ HeapSnapshot::HeapSnapshot(HeapSnapshotsCollection* collection, |
gc_roots_entry_(NULL), |
natives_root_entry_(NULL), |
raw_entries_(NULL), |
- entries_sorted_(false), |
- retaining_paths_(HeapEntry::Match) { |
+ entries_sorted_(false) { |
STATIC_ASSERT( |
sizeof(HeapGraphEdge) == |
SnapshotSizeConstants<sizeof(void*)>::kExpectedHeapGraphEdgeSize); // NOLINT |
@@ -1288,21 +1181,8 @@ HeapSnapshot::HeapSnapshot(HeapSnapshotsCollection* collection, |
SnapshotSizeConstants<sizeof(void*)>::kExpectedHeapEntrySize); // NOLINT |
} |
- |
-static void DeleteHeapGraphPath(HeapGraphPath** path_ptr) { |
- delete *path_ptr; |
-} |
- |
HeapSnapshot::~HeapSnapshot() { |
DeleteArray(raw_entries_); |
- for (HashMap::Entry* p = retaining_paths_.Start(); |
- p != NULL; |
- p = retaining_paths_.Next(p)) { |
- List<HeapGraphPath*>* list = |
- reinterpret_cast<List<HeapGraphPath*>*>(p->value); |
- list->Iterate(DeleteHeapGraphPath); |
- delete list; |
- } |
} |
@@ -1404,14 +1284,7 @@ HeapEntry* HeapSnapshot::GetNextEntryToInit() { |
} |
-HeapSnapshotsDiff* HeapSnapshot::CompareWith(HeapSnapshot* snapshot) { |
- return collection_->CompareSnapshots(this, snapshot); |
-} |
- |
- |
HeapEntry* HeapSnapshot::GetEntryById(uint64_t id) { |
- // GetSortedEntriesList is used in diff algorithm and sorts |
- // entries by their id. |
List<HeapEntry*>* entries_by_id = GetSortedEntriesList(); |
// Perform a binary search by id. |
@@ -1432,16 +1305,6 @@ HeapEntry* HeapSnapshot::GetEntryById(uint64_t id) { |
} |
-List<HeapGraphPath*>* HeapSnapshot::GetRetainingPaths(HeapEntry* entry) { |
- HashMap::Entry* p = |
- retaining_paths_.Lookup(entry, HeapEntry::Hash(entry), true); |
- if (p->value == NULL) { |
- p->value = entry->CalculateRetainingPaths(); |
- } |
- return reinterpret_cast<List<HeapGraphPath*>*>(p->value); |
-} |
- |
- |
template<class T> |
static int SortByIds(const T* entry1_ptr, |
const T* entry2_ptr) { |
@@ -1631,13 +1494,6 @@ void HeapSnapshotsCollection::RemoveSnapshot(HeapSnapshot* snapshot) { |
} |
-HeapSnapshotsDiff* HeapSnapshotsCollection::CompareSnapshots( |
- HeapSnapshot* snapshot1, |
- HeapSnapshot* snapshot2) { |
- return comparator_.Compare(snapshot1, snapshot2); |
-} |
- |
- |
HeapEntry *const HeapEntriesMap::kHeapEntryPlaceholder = |
reinterpret_cast<HeapEntry*>(1); |
@@ -2804,83 +2660,6 @@ bool HeapSnapshotGenerator::ApproximateRetainedSizes() { |
} |
-void HeapSnapshotsDiff::CreateRoots(int additions_count, int deletions_count) { |
- raw_additions_root_ = |
- NewArray<char>(HeapEntry::EntriesSize(1, additions_count, 0)); |
- additions_root()->Init( |
- snapshot2_, HeapEntry::kHidden, "", 0, 0, additions_count, 0); |
- raw_deletions_root_ = |
- NewArray<char>(HeapEntry::EntriesSize(1, deletions_count, 0)); |
- deletions_root()->Init( |
- snapshot1_, HeapEntry::kHidden, "", 0, 0, deletions_count, 0); |
-} |
- |
- |
-static void DeleteHeapSnapshotsDiff(HeapSnapshotsDiff** diff_ptr) { |
- delete *diff_ptr; |
-} |
- |
-HeapSnapshotsComparator::~HeapSnapshotsComparator() { |
- diffs_.Iterate(DeleteHeapSnapshotsDiff); |
-} |
- |
- |
-HeapSnapshotsDiff* HeapSnapshotsComparator::Compare(HeapSnapshot* snapshot1, |
- HeapSnapshot* snapshot2) { |
- snapshot1->ClearPaint(); |
- snapshot1->root()->PaintAllReachable(); |
- snapshot2->ClearPaint(); |
- snapshot2->root()->PaintAllReachable(); |
- |
- List<HeapEntry*>* entries1 = snapshot1->GetSortedEntriesList(); |
- List<HeapEntry*>* entries2 = snapshot2->GetSortedEntriesList(); |
- int i = 0, j = 0; |
- List<HeapEntry*> added_entries, deleted_entries; |
- while (i < entries1->length() && j < entries2->length()) { |
- uint64_t id1 = entries1->at(i)->id(); |
- uint64_t id2 = entries2->at(j)->id(); |
- if (id1 == id2) { |
- HeapEntry* entry1 = entries1->at(i++); |
- HeapEntry* entry2 = entries2->at(j++); |
- if (entry1->painted_reachable() != entry2->painted_reachable()) { |
- if (entry1->painted_reachable()) |
- deleted_entries.Add(entry1); |
- else |
- added_entries.Add(entry2); |
- } |
- } else if (id1 < id2) { |
- HeapEntry* entry = entries1->at(i++); |
- deleted_entries.Add(entry); |
- } else { |
- HeapEntry* entry = entries2->at(j++); |
- added_entries.Add(entry); |
- } |
- } |
- while (i < entries1->length()) { |
- HeapEntry* entry = entries1->at(i++); |
- deleted_entries.Add(entry); |
- } |
- while (j < entries2->length()) { |
- HeapEntry* entry = entries2->at(j++); |
- added_entries.Add(entry); |
- } |
- |
- HeapSnapshotsDiff* diff = new HeapSnapshotsDiff(snapshot1, snapshot2); |
- diffs_.Add(diff); |
- diff->CreateRoots(added_entries.length(), deleted_entries.length()); |
- |
- for (int i = 0; i < deleted_entries.length(); ++i) { |
- HeapEntry* entry = deleted_entries[i]; |
- diff->AddDeletedEntry(i, i + 1, entry); |
- } |
- for (int i = 0; i < added_entries.length(); ++i) { |
- HeapEntry* entry = added_entries[i]; |
- diff->AddAddedEntry(i, i + 1, entry); |
- } |
- return diff; |
-} |
- |
- |
class OutputStreamWriter { |
public: |
explicit OutputStreamWriter(v8::OutputStream* stream) |