Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 69ef082dce09da266bc4300b4781a387f25e854a..02c67f4ea6656d057610a1b549edf01e174fd672 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -3248,7 +3248,6 @@ HeapSnapshot* HeapSnapshotJSONSerializer::CreateFakeSnapshot() { |
void HeapSnapshotJSONSerializer::SerializeImpl() { |
- List<HeapEntry>& nodes = snapshot_->entries(); |
ASSERT(0 == snapshot_->root()->index()); |
writer_->AddCharacter('{'); |
writer_->AddString("\"snapshot\":{"); |
@@ -3256,11 +3255,11 @@ void HeapSnapshotJSONSerializer::SerializeImpl() { |
if (writer_->aborted()) return; |
writer_->AddString("},\n"); |
writer_->AddString("\"nodes\":["); |
- SerializeNodes(nodes); |
+ SerializeNodes(); |
if (writer_->aborted()) return; |
writer_->AddString("],\n"); |
writer_->AddString("\"edges\":["); |
- SerializeEdges(nodes); |
+ SerializeEdges(); |
if (writer_->aborted()) return; |
writer_->AddString("],\n"); |
writer_->AddString("\"strings\":["); |
@@ -3302,9 +3301,9 @@ static int utoa(unsigned value, const Vector<char>& buffer, int buffer_pos) { |
void HeapSnapshotJSONSerializer::SerializeEdge(HeapGraphEdge* edge, |
bool first_edge) { |
- // The buffer needs space for 3 ints, 3 commas and \0 |
+ // The buffer needs space for 3 unsigned ints, 3 commas and \0 |
static const int kBufferSize = |
- MaxDecimalDigitsIn<sizeof(int)>::kSigned * 3 + 3 + 1; // NOLINT |
+ MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned * 3 + 3 + 1; // NOLINT |
EmbeddedVector<char, kBufferSize> buffer; |
int edge_name_or_index = edge->type() == HeapGraphEdge::kElement |
|| edge->type() == HeapGraphEdge::kHidden |
@@ -3324,25 +3323,21 @@ void HeapSnapshotJSONSerializer::SerializeEdge(HeapGraphEdge* edge, |
} |
-void HeapSnapshotJSONSerializer::SerializeEdges(const List<HeapEntry>& nodes) { |
- bool first_edge = true; |
- for (int i = 0; i < nodes.length(); ++i) { |
- HeapEntry* entry = &nodes[i]; |
- Vector<HeapGraphEdge*> children = entry->children(); |
- for (int j = 0; j < children.length(); ++j) { |
- SerializeEdge(children[j], first_edge); |
- first_edge = false; |
- if (writer_->aborted()) return; |
- } |
+void HeapSnapshotJSONSerializer::SerializeEdges() { |
+ List<HeapGraphEdge*>& edges = snapshot_->children(); |
+ for (int i = 0; i < edges.length(); ++i) { |
+ ASSERT(i == 0 || |
+ edges[i - 1]->from()->index() <= edges[i]->from()->index()); |
+ SerializeEdge(edges[i], i == 0); |
+ if (writer_->aborted()) return; |
} |
} |
-void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry, |
- int edges_index) { |
- // The buffer needs space for 5 uint32_t, 5 commas, \n and \0 |
+void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry) { |
+ // The buffer needs space for 5 unsigned ints, 5 commas, \n and \0 |
static const int kBufferSize = |
- 5 * MaxDecimalDigitsIn<sizeof(uint32_t)>::kUnsigned // NOLINT |
+ 5 * MaxDecimalDigitsIn<sizeof(unsigned)>::kUnsigned // NOLINT |
+ 5 + 1 + 1; |
EmbeddedVector<char, kBufferSize> buffer; |
int buffer_pos = 0; |
@@ -3357,19 +3352,17 @@ void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry, |
buffer[buffer_pos++] = ','; |
buffer_pos = utoa(entry->self_size(), buffer, buffer_pos); |
buffer[buffer_pos++] = ','; |
- buffer_pos = utoa(edges_index, buffer, buffer_pos); |
+ buffer_pos = utoa(entry->children_count(), buffer, buffer_pos); |
buffer[buffer_pos++] = '\n'; |
buffer[buffer_pos++] = '\0'; |
writer_->AddString(buffer.start()); |
} |
-void HeapSnapshotJSONSerializer::SerializeNodes(const List<HeapEntry>& nodes) { |
- int edges_index = 0; |
- for (int i = 0; i < nodes.length(); ++i) { |
- HeapEntry* entry = &nodes[i]; |
- SerializeNode(entry, edges_index); |
- edges_index += entry->children().length() * kEdgeFieldsCount; |
+void HeapSnapshotJSONSerializer::SerializeNodes() { |
+ List<HeapEntry>& entries = snapshot_->entries(); |
+ for (int i = 0; i < entries.length(); ++i) { |
+ SerializeNode(&entries[i]); |
if (writer_->aborted()) return; |
} |
} |
@@ -3393,7 +3386,7 @@ void HeapSnapshotJSONSerializer::SerializeSnapshot() { |
JSON_S("name") "," |
JSON_S("id") "," |
JSON_S("self_size") "," |
- JSON_S("edges_index")) "," |
+ JSON_S("edge_count")) "," |
JSON_S("node_types") ":" JSON_A( |
JSON_A( |
JSON_S("hidden") "," |