| 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());
|
| }
|
| }
|
|
|
|
|