| 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") ","
|
|
|