| 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) | 
|  |