Index: src/heap-snapshot-generator.cc |
diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc |
index 6714c42ca982d27dc1c29afbf859402e7e0e5133..aa28d07b98c75ec4bc2436466f22f6e5a7d67a68 100644 |
--- a/src/heap-snapshot-generator.cc |
+++ b/src/heap-snapshot-generator.cc |
@@ -73,14 +73,16 @@ HeapEntry::HeapEntry(HeapSnapshot* snapshot, |
Type type, |
const char* name, |
SnapshotObjectId id, |
- size_t self_size) |
+ size_t self_size, |
+ unsigned trace_node_id) |
: type_(type), |
children_count_(0), |
children_index_(-1), |
self_size_(self_size), |
- id_(id), |
snapshot_(snapshot), |
- name_(name) { } |
+ name_(name), |
+ id_(id), |
+ trace_node_id_(trace_node_id) { } |
void HeapEntry::SetNamedReference(HeapGraphEdge::Type type, |
@@ -189,7 +191,7 @@ template <size_t ptr_size> struct SnapshotSizeConstants; |
template <> struct SnapshotSizeConstants<4> { |
static const int kExpectedHeapGraphEdgeSize = 12; |
- static const int kExpectedHeapEntrySize = 24; |
+ static const int kExpectedHeapEntrySize = 28; |
}; |
template <> struct SnapshotSizeConstants<8> { |
@@ -243,6 +245,7 @@ HeapEntry* HeapSnapshot::AddRootEntry() { |
HeapEntry* entry = AddEntry(HeapEntry::kSynthetic, |
"", |
HeapObjectsMap::kInternalRootObjectId, |
+ 0, |
0); |
root_index_ = entry->index(); |
ASSERT(root_index_ == 0); |
@@ -255,6 +258,7 @@ HeapEntry* HeapSnapshot::AddGcRootsEntry() { |
HeapEntry* entry = AddEntry(HeapEntry::kSynthetic, |
"(GC roots)", |
HeapObjectsMap::kGcRootsObjectId, |
+ 0, |
0); |
gc_roots_index_ = entry->index(); |
return entry; |
@@ -268,6 +272,7 @@ HeapEntry* HeapSnapshot::AddGcSubrootEntry(int tag) { |
HeapEntry::kSynthetic, |
VisitorSynchronization::kTagNames[tag], |
HeapObjectsMap::GetNthGcSubrootId(tag), |
+ 0, |
0); |
gc_subroot_indexes_[tag] = entry->index(); |
return entry; |
@@ -277,8 +282,9 @@ HeapEntry* HeapSnapshot::AddGcSubrootEntry(int tag) { |
HeapEntry* HeapSnapshot::AddEntry(HeapEntry::Type type, |
const char* name, |
SnapshotObjectId id, |
- size_t size) { |
- HeapEntry entry(this, type, name, id, size); |
+ size_t size, |
+ unsigned trace_node_id) { |
+ HeapEntry entry(this, type, name, id, size, trace_node_id); |
entries_.Add(entry); |
return &entries_.last(); |
} |
@@ -390,10 +396,10 @@ HeapObjectsMap::HeapObjectsMap(Heap* heap) |
} |
-void HeapObjectsMap::MoveObject(Address from, Address to, int object_size) { |
+bool HeapObjectsMap::MoveObject(Address from, Address to, int object_size) { |
ASSERT(to != NULL); |
ASSERT(from != NULL); |
- if (from == to) return; |
+ if (from == to) return false; |
void* from_value = entries_map_.Remove(from, ComputePointerHash(from)); |
if (from_value == NULL) { |
// It may occur that some untracked object moves to an address X and there |
@@ -434,6 +440,7 @@ void HeapObjectsMap::MoveObject(Address from, Address to, int object_size) { |
entries_.at(from_entry_info_index).size = object_size; |
to_entry->value = from_value; |
} |
+ return from_value != NULL; |
} |
@@ -910,7 +917,13 @@ HeapEntry* V8HeapExplorer::AddEntry(Address address, |
size_t size) { |
SnapshotObjectId object_id = heap_object_map_->FindOrAddEntry( |
address, static_cast<unsigned int>(size)); |
- return snapshot_->AddEntry(type, name, object_id, size); |
+ unsigned trace_node_id = 0; |
+ if (AllocationTracker* allocation_tracker = |
+ snapshot_->profiler()->allocation_tracker()) { |
+ trace_node_id = |
+ allocation_tracker->address_to_trace()->GetTraceNodeId(address); |
+ } |
+ return snapshot_->AddEntry(type, name, object_id, size, trace_node_id); |
} |
@@ -2143,7 +2156,8 @@ HeapEntry* BasicHeapEntriesAllocator::AllocateEntry(HeapThing ptr) { |
entries_type_, |
name, |
heap_object_map_->GenerateId(info), |
- size != -1 ? static_cast<int>(size) : 0); |
+ size != -1 ? static_cast<int>(size) : 0, |
+ 0); |
} |
@@ -2642,8 +2656,8 @@ class OutputStreamWriter { |
// type, name|index, to_node. |
const int HeapSnapshotJSONSerializer::kEdgeFieldsCount = 3; |
-// type, name, id, self_size, children_index. |
-const int HeapSnapshotJSONSerializer::kNodeFieldsCount = 5; |
+// type, name, id, self_size, edge_count, trace_node_id. |
+const int HeapSnapshotJSONSerializer::kNodeFieldsCount = 6; |
void HeapSnapshotJSONSerializer::Serialize(v8::OutputStream* stream) { |
if (AllocationTracker* allocation_tracker = |
@@ -2783,9 +2797,9 @@ void HeapSnapshotJSONSerializer::SerializeEdges() { |
void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry) { |
// The buffer needs space for 4 unsigned ints, 1 size_t, 5 commas, \n and \0 |
static const int kBufferSize = |
- 4 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT |
+ 5 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT |
+ MaxDecimalDigitsIn<sizeof(size_t)>::kUnsigned // NOLINT |
- + 5 + 1 + 1; |
+ + 6 + 1 + 1; |
EmbeddedVector<char, kBufferSize> buffer; |
int buffer_pos = 0; |
if (entry_index(entry) != 0) { |
@@ -2800,6 +2814,8 @@ void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry) { |
buffer_pos = utoa(entry->self_size(), buffer, buffer_pos); |
buffer[buffer_pos++] = ','; |
buffer_pos = utoa(entry->children_count(), buffer, buffer_pos); |
+ buffer[buffer_pos++] = ','; |
+ buffer_pos = utoa(entry->trace_node_id(), buffer, buffer_pos); |
buffer[buffer_pos++] = '\n'; |
buffer[buffer_pos++] = '\0'; |
writer_->AddString(buffer.start()); |
@@ -2833,7 +2849,8 @@ void HeapSnapshotJSONSerializer::SerializeSnapshot() { |
JSON_S("name") "," |
JSON_S("id") "," |
JSON_S("self_size") "," |
- JSON_S("edge_count")) "," |
+ JSON_S("edge_count") "," |
+ JSON_S("trace_node_id")) "," |
JSON_S("node_types") ":" JSON_A( |
JSON_A( |
JSON_S("hidden") "," |