Chromium Code Reviews| Index: src/profile-generator.cc |
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
| index db9f8928de7f6c508f7cdb690f0b8df04d62effa..7383ff71920482affec2e007eb9b9447e54fdcbb 100644 |
| --- a/src/profile-generator.cc |
| +++ b/src/profile-generator.cc |
| @@ -1195,12 +1195,9 @@ void HeapSnapshot::AllocateEntries(int entries_count, |
| int children_count, |
| int retainers_count) { |
| ASSERT(raw_entries_ == NULL); |
| - raw_entries_ = NewArray<char>( |
| - HeapEntry::EntriesSize(entries_count, children_count, retainers_count)); |
| -#ifdef DEBUG |
| raw_entries_size_ = |
| HeapEntry::EntriesSize(entries_count, children_count, retainers_count); |
| -#endif |
| + raw_entries_ = NewArray<char>(raw_entries_size_); |
| } |
| @@ -2984,10 +2981,19 @@ class OutputStreamWriter { |
| bool aborted_; |
| }; |
| +const int HeapSnapshotJSONSerializer::kMaxSerializableSnapshotRawSize = |
| + 384 * 1024; |
|
William Hesse
2011/09/05 07:31:00
We have constants KB, MB, and GB defined in global
mnaganov (inactive)
2011/09/05 07:33:10
Thanks! I forgot about that, will fix before landi
|
| + |
| void HeapSnapshotJSONSerializer::Serialize(v8::OutputStream* stream) { |
| ASSERT(writer_ == NULL); |
| writer_ = new OutputStreamWriter(stream); |
| + HeapSnapshot* original_snapshot = NULL; |
| + if (snapshot_->raw_entries_size() >= kMaxSerializableSnapshotRawSize) { |
| + // The snapshot is too big. Serialize a fake snapshot. |
| + original_snapshot = snapshot_; |
| + snapshot_ = CreateFakeSnapshot(); |
| + } |
| // Since nodes graph is cyclic, we need the first pass to enumerate |
| // them. Strings can be serialized in one pass. |
| EnumerateNodes(); |
| @@ -2995,6 +3001,26 @@ void HeapSnapshotJSONSerializer::Serialize(v8::OutputStream* stream) { |
| delete writer_; |
| writer_ = NULL; |
| + |
| + if (original_snapshot != NULL) { |
| + delete snapshot_; |
| + snapshot_ = original_snapshot; |
| + } |
| +} |
| + |
| + |
| +HeapSnapshot* HeapSnapshotJSONSerializer::CreateFakeSnapshot() { |
| + HeapSnapshot* result = new HeapSnapshot(snapshot_->collection(), |
| + HeapSnapshot::kFull, |
| + snapshot_->title(), |
| + snapshot_->uid()); |
| + result->AllocateEntries(2, 1, 0); |
| + HeapEntry* root = result->AddRootEntry(1); |
| + HeapEntry* message = result->AddEntry( |
| + HeapEntry::kString, "The snapshot is too big", 0, 4, 0, 0); |
| + root->SetUnidirElementReference(0, 1, message); |
| + result->SetDominatorsToSelf(); |
| + return result; |
| } |