Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 26457e00d24656504a2681a4f03ee8636ddceb19..57ff6610e87aabe40296c71bd63163b6b443e71a 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -818,7 +818,7 @@ HeapGraphEdge::HeapGraphEdge(Type type, |
HeapEntry* from, |
HeapEntry* to) |
: type_(type), name_(name), from_(from), to_(to) { |
- ASSERT(type_ == CONTEXT_VARIABLE || type_ == PROPERTY); |
+ ASSERT(type_ == CONTEXT_VARIABLE || type_ == PROPERTY || type_ == INTERNAL); |
} |
@@ -845,26 +845,30 @@ HeapEntry::~HeapEntry() { |
} |
-void HeapEntry::SetClosureReference(const char* name, HeapEntry* entry) { |
- HeapGraphEdge* edge = |
- new HeapGraphEdge(HeapGraphEdge::CONTEXT_VARIABLE, name, this, entry); |
+void HeapEntry::AddEdge(HeapGraphEdge* edge) { |
children_.Add(edge); |
- entry->retainers_.Add(edge); |
+ edge->to()->retainers_.Add(edge); |
+} |
+ |
+ |
+void HeapEntry::SetClosureReference(const char* name, HeapEntry* entry) { |
+ AddEdge( |
+ new HeapGraphEdge(HeapGraphEdge::CONTEXT_VARIABLE, name, this, entry)); |
} |
void HeapEntry::SetElementReference(int index, HeapEntry* entry) { |
- HeapGraphEdge* edge = new HeapGraphEdge(index, this, entry); |
- children_.Add(edge); |
- entry->retainers_.Add(edge); |
+ AddEdge(new HeapGraphEdge(index, this, entry)); |
+} |
+ |
+ |
+void HeapEntry::SetInternalReference(const char* name, HeapEntry* entry) { |
+ AddEdge(new HeapGraphEdge(HeapGraphEdge::INTERNAL, name, this, entry)); |
} |
void HeapEntry::SetPropertyReference(const char* name, HeapEntry* entry) { |
- HeapGraphEdge* edge = |
- new HeapGraphEdge(HeapGraphEdge::PROPERTY, name, this, entry); |
- children_.Add(edge); |
- entry->retainers_.Add(edge); |
+ AddEdge(new HeapGraphEdge(HeapGraphEdge::PROPERTY, name, this, entry)); |
} |
@@ -1074,7 +1078,7 @@ void HeapEntry::CutEdges() { |
void HeapEntry::Print(int max_depth, int indent) { |
- OS::Print("%6d %6d %6d", self_size_, TotalSize(), NonSharedTotalSize()); |
+ OS::Print("%6d %6d %6d ", self_size_, TotalSize(), NonSharedTotalSize()); |
if (type_ != STRING) { |
OS::Print("%s %.40s\n", TypeAsString(), name_); |
} else { |
@@ -1100,6 +1104,9 @@ void HeapEntry::Print(int max_depth, int indent) { |
case HeapGraphEdge::ELEMENT: |
OS::Print(" %*c %d: ", indent, ' ', edge->index()); |
break; |
+ case HeapGraphEdge::INTERNAL: |
+ OS::Print(" %*c $%s: ", indent, ' ', edge->name()); |
+ break; |
case HeapGraphEdge::PROPERTY: |
OS::Print(" %*c %s: ", indent, ' ', edge->name()); |
break; |
@@ -1145,6 +1152,9 @@ void HeapGraphPath::Print() { |
case HeapGraphEdge::ELEMENT: |
OS::Print("[%d] ", edge->index()); |
break; |
+ case HeapGraphEdge::INTERNAL: |
+ OS::Print("[$%s] ", edge->name()); |
+ break; |
case HeapGraphEdge::PROPERTY: |
OS::Print("[%s] ", edge->name()); |
break; |
@@ -1318,6 +1328,16 @@ void HeapSnapshot::SetElementReference(HeapEntry* parent, |
} |
+void HeapSnapshot::SetInternalReference(HeapEntry* parent, |
+ const char* reference_name, |
+ Object* child) { |
+ HeapEntry* child_entry = GetEntry(child); |
+ if (child_entry != NULL) { |
+ parent->SetInternalReference(reference_name, child_entry); |
+ } |
+} |
+ |
+ |
void HeapSnapshot::SetPropertyReference(HeapEntry* parent, |
String* reference_name, |
Object* child) { |
@@ -1546,6 +1566,7 @@ void HeapSnapshotGenerator::ExtractClosureReferences(JSObject* js_obj, |
snapshot_->SetClosureReference(entry, local_name, context->get(idx)); |
} |
} |
+ snapshot_->SetInternalReference(entry, "code", func->shared()); |
} |
} |