| Index: src/profile-generator.cc
|
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc
|
| index 61d7e80cde5af585aa33872854a53209455cbad1..c6e6131a71ea0e343a53dc133f99e21195d9d8e0 100644
|
| --- a/src/profile-generator.cc
|
| +++ b/src/profile-generator.cc
|
| @@ -1131,6 +1131,7 @@ const char* HeapEntry::TypeAsString() {
|
| case kRegExp: return "/regexp/";
|
| case kHeapNumber: return "/number/";
|
| case kNative: return "/native/";
|
| + case kSynthetic: return "/synthetic/";
|
| default: return "???";
|
| }
|
| }
|
| @@ -2698,6 +2699,45 @@ class GlobalHandlesExtractor : public ObjectVisitor {
|
| NativeObjectsExplorer* explorer_;
|
| };
|
|
|
| +
|
| +class BasicHeapEntriesAllocator : public HeapEntriesAllocator {
|
| + public:
|
| + BasicHeapEntriesAllocator(
|
| + HeapSnapshot* snapshot,
|
| + HeapEntry::Type entries_type)
|
| + : snapshot_(snapshot),
|
| + collection_(snapshot_->collection()),
|
| + entries_type_(entries_type) {
|
| + }
|
| + virtual HeapEntry* AllocateEntry(
|
| + HeapThing ptr, int children_count, int retainers_count);
|
| + private:
|
| + HeapSnapshot* snapshot_;
|
| + HeapSnapshotsCollection* collection_;
|
| + HeapEntry::Type entries_type_;
|
| +};
|
| +
|
| +
|
| +HeapEntry* BasicHeapEntriesAllocator::AllocateEntry(
|
| + HeapThing ptr, int children_count, int retainers_count) {
|
| + v8::RetainedObjectInfo* info = reinterpret_cast<v8::RetainedObjectInfo*>(ptr);
|
| + intptr_t elements = info->GetElementCount();
|
| + intptr_t size = info->GetSizeInBytes();
|
| + return snapshot_->AddEntry(
|
| + entries_type_,
|
| + elements != -1 ?
|
| + collection_->names()->GetFormatted(
|
| + "%s / %" V8_PTR_PREFIX "d entries",
|
| + info->GetLabel(),
|
| + info->GetElementCount()) :
|
| + collection_->names()->GetCopy(info->GetLabel()),
|
| + HeapObjectsMap::GenerateId(info),
|
| + size != -1 ? static_cast<int>(size) : 0,
|
| + children_count,
|
| + retainers_count);
|
| +}
|
| +
|
| +
|
| NativeObjectsExplorer::NativeObjectsExplorer(
|
| HeapSnapshot* snapshot, SnapshottingProgressReportingInterface* progress)
|
| : snapshot_(snapshot),
|
| @@ -2707,6 +2747,10 @@ NativeObjectsExplorer::NativeObjectsExplorer(
|
| objects_by_info_(RetainedInfosMatch),
|
| native_groups_(StringsMatch),
|
| filler_(NULL) {
|
| + synthetic_entries_allocator_ =
|
| + new BasicHeapEntriesAllocator(snapshot, HeapEntry::kSynthetic);
|
| + native_entries_allocator_ =
|
| + new BasicHeapEntriesAllocator(snapshot, HeapEntry::kNative);
|
| }
|
|
|
|
|
| @@ -2728,27 +2772,8 @@ NativeObjectsExplorer::~NativeObjectsExplorer() {
|
| reinterpret_cast<v8::RetainedObjectInfo*>(p->value);
|
| info->Dispose();
|
| }
|
| -}
|
| -
|
| -
|
| -HeapEntry* NativeObjectsExplorer::AllocateEntry(
|
| - HeapThing ptr, int children_count, int retainers_count) {
|
| - v8::RetainedObjectInfo* info =
|
| - reinterpret_cast<v8::RetainedObjectInfo*>(ptr);
|
| - intptr_t elements = info->GetElementCount();
|
| - intptr_t size = info->GetSizeInBytes();
|
| - return snapshot_->AddEntry(
|
| - HeapEntry::kNative,
|
| - elements != -1 ?
|
| - collection_->names()->GetFormatted(
|
| - "%s / %" V8_PTR_PREFIX "d entries",
|
| - info->GetLabel(),
|
| - info->GetElementCount()) :
|
| - collection_->names()->GetCopy(info->GetLabel()),
|
| - HeapObjectsMap::GenerateId(info),
|
| - size != -1 ? static_cast<int>(size) : 0,
|
| - children_count,
|
| - retainers_count);
|
| + delete synthetic_entries_allocator_;
|
| + delete native_entries_allocator_;
|
| }
|
|
|
|
|
| @@ -2790,12 +2815,14 @@ void NativeObjectsExplorer::FillImplicitReferences() {
|
| for (int i = 0; i < groups->length(); ++i) {
|
| ImplicitRefGroup* group = groups->at(i);
|
| HeapObject* parent = *group->parent_;
|
| - HeapEntry* parent_entry = filler_->FindOrAddEntry(parent, this);
|
| + HeapEntry* parent_entry =
|
| + filler_->FindOrAddEntry(parent, native_entries_allocator_);
|
| ASSERT(parent_entry != NULL);
|
| Object*** children = group->children_;
|
| for (size_t j = 0; j < group->length_; ++j) {
|
| Object* child = *children[j];
|
| - HeapEntry* child_entry = filler_->FindOrAddEntry(child, this);
|
| + HeapEntry* child_entry =
|
| + filler_->FindOrAddEntry(child, native_entries_allocator_);
|
| filler_->SetNamedReference(
|
| HeapGraphEdge::kInternal,
|
| parent, parent_entry,
|
| @@ -2886,11 +2913,13 @@ NativeGroupRetainedObjectInfo* NativeObjectsExplorer::FindOrAddGroupInfo(
|
|
|
| void NativeObjectsExplorer::SetNativeRootReference(
|
| v8::RetainedObjectInfo* info) {
|
| - HeapEntry* child_entry = filler_->FindOrAddEntry(info, this);
|
| + HeapEntry* child_entry =
|
| + filler_->FindOrAddEntry(info, native_entries_allocator_);
|
| ASSERT(child_entry != NULL);
|
| NativeGroupRetainedObjectInfo* group_info =
|
| FindOrAddGroupInfo(info->GetGroupLabel());
|
| - HeapEntry* group_entry = filler_->FindOrAddEntry(group_info, this);
|
| + HeapEntry* group_entry =
|
| + filler_->FindOrAddEntry(group_info, synthetic_entries_allocator_);
|
| filler_->SetNamedAutoIndexReference(
|
| HeapGraphEdge::kInternal,
|
| group_info, group_entry,
|
| @@ -2902,7 +2931,8 @@ void NativeObjectsExplorer::SetWrapperNativeReferences(
|
| HeapObject* wrapper, v8::RetainedObjectInfo* info) {
|
| HeapEntry* wrapper_entry = filler_->FindEntry(wrapper);
|
| ASSERT(wrapper_entry != NULL);
|
| - HeapEntry* info_entry = filler_->FindOrAddEntry(info, this);
|
| + HeapEntry* info_entry =
|
| + filler_->FindOrAddEntry(info, native_entries_allocator_);
|
| ASSERT(info_entry != NULL);
|
| filler_->SetNamedReference(HeapGraphEdge::kInternal,
|
| wrapper, wrapper_entry,
|
| @@ -2920,7 +2950,8 @@ void NativeObjectsExplorer::SetRootNativeRootsReference() {
|
| entry = native_groups_.Next(entry)) {
|
| NativeGroupRetainedObjectInfo* group_info =
|
| static_cast<NativeGroupRetainedObjectInfo*>(entry->value);
|
| - HeapEntry* group_entry = filler_->FindOrAddEntry(group_info, this);
|
| + HeapEntry* group_entry =
|
| + filler_->FindOrAddEntry(group_info, native_entries_allocator_);
|
| ASSERT(group_entry != NULL);
|
| filler_->SetIndexedAutoIndexReference(
|
| HeapGraphEdge::kElement,
|
| @@ -3547,7 +3578,8 @@ void HeapSnapshotJSONSerializer::SerializeNodes() {
|
| "," JSON_S("closure")
|
| "," JSON_S("regexp")
|
| "," JSON_S("number")
|
| - "," JSON_S("native"))
|
| + "," JSON_S("native")
|
| + "," JSON_S("synthetic"))
|
| "," JSON_S("string")
|
| "," JSON_S("number")
|
| "," JSON_S("number")
|
|
|