Index: src/heap-snapshot-generator.cc |
diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc |
index cb9edaf2b458a048612be9ec014a70005e8278dd..4a4c914e4ee0ddde726c857dd117f17dfee21505 100644 |
--- a/src/heap-snapshot-generator.cc |
+++ b/src/heap-snapshot-generator.cc |
@@ -188,7 +188,6 @@ HeapSnapshot::HeapSnapshot(HeapProfiler* profiler, |
uid_(uid), |
root_index_(HeapEntry::kNoEntry), |
gc_roots_index_(HeapEntry::kNoEntry), |
- natives_root_index_(HeapEntry::kNoEntry), |
max_snapshot_js_object_id_(0) { |
STATIC_ASSERT( |
sizeof(HeapGraphEdge) == |
@@ -217,6 +216,18 @@ void HeapSnapshot::RememberLastJSObjectId() { |
} |
+void HeapSnapshot::AddSyntheticRootEntries() { |
+ AddRootEntry(); |
+ AddGcRootsEntry(); |
+ SnapshotObjectId id = HeapObjectsMap::kGcRootsFirstSubrootId; |
+ for (int tag = 0; tag < VisitorSynchronization::kNumberOfSyncTags; tag++) { |
+ AddGcSubrootEntry(tag, id); |
+ id += HeapObjectsMap::kObjectIdStep; |
+ } |
+ DCHECK(HeapObjectsMap::kFirstAvailableObjectId == id); |
+} |
+ |
+ |
HeapEntry* HeapSnapshot::AddRootEntry() { |
DCHECK(root_index_ == HeapEntry::kNoEntry); |
DCHECK(entries_.is_empty()); // Root entry must be the first one. |
@@ -243,15 +254,11 @@ HeapEntry* HeapSnapshot::AddGcRootsEntry() { |
} |
-HeapEntry* HeapSnapshot::AddGcSubrootEntry(int tag) { |
+HeapEntry* HeapSnapshot::AddGcSubrootEntry(int tag, SnapshotObjectId id) { |
DCHECK(gc_subroot_indexes_[tag] == HeapEntry::kNoEntry); |
DCHECK(0 <= tag && tag < VisitorSynchronization::kNumberOfSyncTags); |
- HeapEntry* entry = AddEntry( |
- HeapEntry::kSynthetic, |
- VisitorSynchronization::kTagNames[tag], |
- HeapObjectsMap::GetNthGcSubrootId(tag), |
- 0, |
- 0); |
+ HeapEntry* entry = AddEntry(HeapEntry::kSynthetic, |
+ VisitorSynchronization::kTagNames[tag], id, 0, 0); |
gc_subroot_indexes_[tag] = entry->index(); |
return entry; |
} |
@@ -771,20 +778,6 @@ void HeapObjectsSet::SetTag(Object* obj, const char* tag) { |
} |
-HeapObject* const V8HeapExplorer::kInternalRootObject = |
- reinterpret_cast<HeapObject*>( |
- static_cast<intptr_t>(HeapObjectsMap::kInternalRootObjectId)); |
-HeapObject* const V8HeapExplorer::kGcRootsObject = |
- reinterpret_cast<HeapObject*>( |
- static_cast<intptr_t>(HeapObjectsMap::kGcRootsObjectId)); |
-HeapObject* const V8HeapExplorer::kFirstGcSubrootObject = |
- reinterpret_cast<HeapObject*>( |
- static_cast<intptr_t>(HeapObjectsMap::kGcRootsFirstSubrootId)); |
-HeapObject* const V8HeapExplorer::kLastGcSubrootObject = |
- reinterpret_cast<HeapObject*>( |
- static_cast<intptr_t>(HeapObjectsMap::kFirstAvailableObjectId)); |
- |
- |
V8HeapExplorer::V8HeapExplorer( |
HeapSnapshot* snapshot, |
SnapshottingProgressReportingInterface* progress, |
@@ -809,16 +802,7 @@ HeapEntry* V8HeapExplorer::AllocateEntry(HeapThing ptr) { |
HeapEntry* V8HeapExplorer::AddEntry(HeapObject* object) { |
- if (object == kInternalRootObject) { |
- snapshot_->AddRootEntry(); |
- return snapshot_->root(); |
- } else if (object == kGcRootsObject) { |
- HeapEntry* entry = snapshot_->AddGcRootsEntry(); |
- return entry; |
- } else if (object >= kFirstGcSubrootObject && object < kLastGcSubrootObject) { |
- HeapEntry* entry = snapshot_->AddGcSubrootEntry(GetGcSubrootOrder(object)); |
- return entry; |
- } else if (object->IsJSFunction()) { |
+ if (object->IsJSFunction()) { |
JSFunction* func = JSFunction::cast(object); |
SharedFunctionInfo* shared = func->shared(); |
const char* name = shared->bound() ? "native_bind" : |
@@ -965,41 +949,6 @@ class SnapshotFiller { |
}; |
-class GcSubrootsEnumerator : public ObjectVisitor { |
- public: |
- GcSubrootsEnumerator( |
- SnapshotFiller* filler, V8HeapExplorer* explorer) |
- : filler_(filler), |
- explorer_(explorer), |
- previous_object_count_(0), |
- object_count_(0) { |
- } |
- void VisitPointers(Object** start, Object** end) { |
- object_count_ += end - start; |
- } |
- void Synchronize(VisitorSynchronization::SyncTag tag) { |
- // Skip empty subroots. |
- if (previous_object_count_ != object_count_) { |
- previous_object_count_ = object_count_; |
- filler_->AddEntry(V8HeapExplorer::GetNthGcSubrootObject(tag), explorer_); |
- } |
- } |
- private: |
- SnapshotFiller* filler_; |
- V8HeapExplorer* explorer_; |
- intptr_t previous_object_count_; |
- intptr_t object_count_; |
-}; |
- |
- |
-void V8HeapExplorer::AddRootEntries(SnapshotFiller* filler) { |
- filler->AddEntry(kInternalRootObject, this); |
- filler->AddEntry(kGcRootsObject, this); |
- GcSubrootsEnumerator enumerator(filler, this); |
- heap_->IterateRoots(&enumerator, VISIT_ALL); |
-} |
- |
- |
const char* V8HeapExplorer::GetSystemEntryName(HeapObject* object) { |
switch (object->map()->instance_type()) { |
case MAP_TYPE: |
@@ -1855,9 +1804,6 @@ class RootsReferencesExtractor : public ObjectVisitor { |
void FillReferences(V8HeapExplorer* explorer) { |
DCHECK(strong_references_.length() <= all_references_.length()); |
Builtins* builtins = heap_->isolate()->builtins(); |
- for (int i = 0; i < reference_tags_.length(); ++i) { |
- explorer->SetGcRootsReference(reference_tags_[i].tag); |
- } |
int strong_index = 0, all_index = 0, tags_index = 0, builtin_index = 0; |
while (all_index < all_references_.length()) { |
bool is_strong = strong_index < strong_references_.length() |
@@ -1900,10 +1846,15 @@ bool V8HeapExplorer::IterateAndExtractReferences( |
SnapshotFiller* filler) { |
filler_ = filler; |
+ // Create references to the synthetic roots. |
+ SetRootGcRootsReference(); |
+ for (int tag = 0; tag < VisitorSynchronization::kNumberOfSyncTags; tag++) { |
+ SetGcRootsReference(static_cast<VisitorSynchronization::SyncTag>(tag)); |
+ } |
+ |
// Make sure builtin code objects get their builtin tags |
// first. Otherwise a particular JSFunction object could set |
// its custom name to a generic builtin. |
- SetRootGcRootsReference(); |
RootsReferencesExtractor extractor(heap_); |
heap_->IterateRoots(&extractor, VISIT_ONLY_STRONG); |
extractor.SetCollectingAllReferences(); |
@@ -2619,6 +2570,8 @@ bool HeapSnapshotGenerator::GenerateSnapshot() { |
debug_heap->Verify(); |
#endif |
+ snapshot_->AddSyntheticRootEntries(); |
+ |
if (!FillReferences()) return false; |
snapshot_->FillChildren(); |
@@ -2659,7 +2612,6 @@ void HeapSnapshotGenerator::SetProgressTotal(int iterations_count) { |
bool HeapSnapshotGenerator::FillReferences() { |
SnapshotFiller filler(snapshot_, &entries_); |
- v8_heap_explorer_.AddRootEntries(&filler); |
return v8_heap_explorer_.IterateAndExtractReferences(&filler) |
&& dom_explorer_.IterateAndExtractReferences(&filler); |
} |