Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/profile-generator.cc

Issue 10356143: Serialize heap snapshot data as an array of unsigned values. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3481 matching lines...) Expand 10 before | Expand all | Expand 10 after
3492 int HeapSnapshotJSONSerializer::GetStringId(const char* s) { 3492 int HeapSnapshotJSONSerializer::GetStringId(const char* s) {
3493 HashMap::Entry* cache_entry = strings_.Lookup( 3493 HashMap::Entry* cache_entry = strings_.Lookup(
3494 const_cast<char*>(s), ObjectHash(s), true); 3494 const_cast<char*>(s), ObjectHash(s), true);
3495 if (cache_entry->value == NULL) { 3495 if (cache_entry->value == NULL) {
3496 cache_entry->value = reinterpret_cast<void*>(next_string_id_++); 3496 cache_entry->value = reinterpret_cast<void*>(next_string_id_++);
3497 } 3497 }
3498 return static_cast<int>(reinterpret_cast<intptr_t>(cache_entry->value)); 3498 return static_cast<int>(reinterpret_cast<intptr_t>(cache_entry->value));
3499 } 3499 }
3500 3500
3501 3501
3502 // This function won't work correctly for MIN_INT but this is not 3502 static int utoa(unsigned value, const Vector<char>& buffer, int buffer_pos) {
yurys 2012/05/12 16:26:33 Not directly related to this change but we need to
3503 // a problem in case of heap snapshots serialization.
3504 static int itoa(int value, const Vector<char>& buffer, int buffer_pos) {
3505 if (value < 0) {
3506 buffer[buffer_pos++] = '-';
3507 value = -value;
3508 }
3509
3510 int number_of_digits = 0; 3503 int number_of_digits = 0;
3511 int t = value; 3504 unsigned t = value;
3512 do { 3505 do {
3513 ++number_of_digits; 3506 ++number_of_digits;
3514 } while (t /= 10); 3507 } while (t /= 10);
3515 3508
3516 buffer_pos += number_of_digits; 3509 buffer_pos += number_of_digits;
3517 int result = buffer_pos; 3510 int result = buffer_pos;
3518 do { 3511 do {
3519 int last_digit = value % 10; 3512 int last_digit = value % 10;
3520 buffer[--buffer_pos] = '0' + last_digit; 3513 buffer[--buffer_pos] = '0' + last_digit;
3521 value /= 10; 3514 value /= 10;
3522 } while (value); 3515 } while (value);
3523 return result; 3516 return result;
3524 } 3517 }
3525 3518
3526 3519
3527 void HeapSnapshotJSONSerializer::SerializeEdge(HeapGraphEdge* edge, 3520 void HeapSnapshotJSONSerializer::SerializeEdge(HeapGraphEdge* edge,
3528 bool first_edge) { 3521 bool first_edge) {
3529 // The buffer needs space for 3 ints, 3 commas and \0 3522 // The buffer needs space for 3 ints, 3 commas and \0
3530 static const int kBufferSize = 3523 static const int kBufferSize =
3531 MaxDecimalDigitsIn<sizeof(int)>::kSigned * 3 + 3 + 1; // NOLINT 3524 MaxDecimalDigitsIn<sizeof(int)>::kSigned * 3 + 3 + 1; // NOLINT
3532 EmbeddedVector<char, kBufferSize> buffer; 3525 EmbeddedVector<char, kBufferSize> buffer;
3533 int edge_name_or_index = edge->type() == HeapGraphEdge::kElement 3526 int edge_name_or_index = edge->type() == HeapGraphEdge::kElement
3534 || edge->type() == HeapGraphEdge::kHidden 3527 || edge->type() == HeapGraphEdge::kHidden
3535 || edge->type() == HeapGraphEdge::kWeak 3528 || edge->type() == HeapGraphEdge::kWeak
3536 ? edge->index() : GetStringId(edge->name()); 3529 ? edge->index() : GetStringId(edge->name());
3537 int buffer_pos = 0; 3530 int buffer_pos = 0;
3538 if (!first_edge) { 3531 if (!first_edge) {
3539 buffer[buffer_pos++] = ','; 3532 buffer[buffer_pos++] = ',';
3540 } 3533 }
3541 buffer_pos = itoa(edge->type(), buffer, buffer_pos); 3534 buffer_pos = utoa(edge->type(), buffer, buffer_pos);
3542 buffer[buffer_pos++] = ','; 3535 buffer[buffer_pos++] = ',';
3543 buffer_pos = itoa(edge_name_or_index, buffer, buffer_pos); 3536 buffer_pos = utoa(edge_name_or_index, buffer, buffer_pos);
3544 buffer[buffer_pos++] = ','; 3537 buffer[buffer_pos++] = ',';
3545 buffer_pos = itoa(entry_index(edge->to()), buffer, buffer_pos); 3538 buffer_pos = utoa(entry_index(edge->to()), buffer, buffer_pos);
3546 buffer[buffer_pos++] = '\0'; 3539 buffer[buffer_pos++] = '\0';
3547 writer_->AddString(buffer.start()); 3540 writer_->AddString(buffer.start());
3548 } 3541 }
3549 3542
3550 3543
3551 void HeapSnapshotJSONSerializer::SerializeEdges(const List<HeapEntry>& nodes) { 3544 void HeapSnapshotJSONSerializer::SerializeEdges(const List<HeapEntry>& nodes) {
3552 bool first_edge = true; 3545 bool first_edge = true;
3553 for (int i = 0; i < nodes.length(); ++i) { 3546 for (int i = 0; i < nodes.length(); ++i) {
3554 HeapEntry* entry = &nodes[i]; 3547 HeapEntry* entry = &nodes[i];
3555 Vector<HeapGraphEdge*> children = entry->children(); 3548 Vector<HeapGraphEdge*> children = entry->children();
3556 for (int j = 0; j < children.length(); ++j) { 3549 for (int j = 0; j < children.length(); ++j) {
3557 SerializeEdge(children[j], first_edge); 3550 SerializeEdge(children[j], first_edge);
3558 first_edge = false; 3551 first_edge = false;
3559 if (writer_->aborted()) return; 3552 if (writer_->aborted()) return;
3560 } 3553 }
3561 } 3554 }
3562 } 3555 }
3563 3556
3564 3557
3565 void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry, 3558 void HeapSnapshotJSONSerializer::SerializeNode(HeapEntry* entry,
3566 int edges_index) { 3559 int edges_index) {
3567 // The buffer needs space for 6 ints, 1 uint32_t, 7 commas, \n and \0 3560 // The buffer needs space for 6 ints, 1 uint32_t, 7 commas, \n and \0
3568 static const int kBufferSize = 3561 static const int kBufferSize =
3569 6 * MaxDecimalDigitsIn<sizeof(int)>::kSigned // NOLINT 3562 6 * MaxDecimalDigitsIn<sizeof(int)>::kSigned // NOLINT
3570 + MaxDecimalDigitsIn<sizeof(uint32_t)>::kUnsigned // NOLINT 3563 + MaxDecimalDigitsIn<sizeof(uint32_t)>::kUnsigned // NOLINT
3571 + 7 + 1 + 1; 3564 + 7 + 1 + 1;
3572 EmbeddedVector<char, kBufferSize> buffer; 3565 EmbeddedVector<char, kBufferSize> buffer;
3573 int buffer_pos = 0; 3566 int buffer_pos = 0;
3574 buffer[buffer_pos++] = '\n';
3575 if (entry_index(entry) != 0) { 3567 if (entry_index(entry) != 0) {
3576 buffer[buffer_pos++] = ','; 3568 buffer[buffer_pos++] = ',';
3577 } 3569 }
3578 buffer_pos = itoa(entry->type(), buffer, buffer_pos); 3570 buffer_pos = utoa(entry->type(), buffer, buffer_pos);
3579 buffer[buffer_pos++] = ','; 3571 buffer[buffer_pos++] = ',';
3580 buffer_pos = itoa(GetStringId(entry->name()), buffer, buffer_pos); 3572 buffer_pos = utoa(GetStringId(entry->name()), buffer, buffer_pos);
3581 buffer[buffer_pos++] = ','; 3573 buffer[buffer_pos++] = ',';
3582 buffer_pos = itoa(entry->id(), buffer, buffer_pos); 3574 buffer_pos = utoa(entry->id(), buffer, buffer_pos);
3583 buffer[buffer_pos++] = ','; 3575 buffer[buffer_pos++] = ',';
3584 buffer_pos = itoa(entry->self_size(), buffer, buffer_pos); 3576 buffer_pos = utoa(entry->self_size(), buffer, buffer_pos);
3585 buffer[buffer_pos++] = ','; 3577 buffer[buffer_pos++] = ',';
3586 buffer_pos = itoa(entry->retained_size(), buffer, buffer_pos); 3578 buffer_pos = utoa(entry->retained_size(), buffer, buffer_pos);
3587 buffer[buffer_pos++] = ','; 3579 buffer[buffer_pos++] = ',';
3588 buffer_pos = itoa(entry_index(entry->dominator()), buffer, buffer_pos); 3580 buffer_pos = utoa(entry_index(entry->dominator()), buffer, buffer_pos);
3589 buffer[buffer_pos++] = ','; 3581 buffer[buffer_pos++] = ',';
3590 buffer_pos = itoa(edges_index, buffer, buffer_pos); 3582 buffer_pos = utoa(edges_index, buffer, buffer_pos);
3583 buffer[buffer_pos++] = '\n';
3591 buffer[buffer_pos++] = '\0'; 3584 buffer[buffer_pos++] = '\0';
3592 writer_->AddString(buffer.start()); 3585 writer_->AddString(buffer.start());
3593 } 3586 }
3594 3587
3595 3588
3596 void HeapSnapshotJSONSerializer::SerializeNodes(const List<HeapEntry>& nodes) { 3589 void HeapSnapshotJSONSerializer::SerializeNodes(const List<HeapEntry>& nodes) {
3597 int edges_index = 0; 3590 int edges_index = 0;
3598 for (int i = 0; i < nodes.length(); ++i) { 3591 for (int i = 0; i < nodes.length(); ++i) {
3599 HeapEntry* entry = &nodes[i]; 3592 HeapEntry* entry = &nodes[i];
3600 SerializeNode(entry, edges_index); 3593 SerializeNode(entry, edges_index);
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
3755 3748
3756 3749
3757 void HeapSnapshotJSONSerializer::SortHashMap( 3750 void HeapSnapshotJSONSerializer::SortHashMap(
3758 HashMap* map, List<HashMap::Entry*>* sorted_entries) { 3751 HashMap* map, List<HashMap::Entry*>* sorted_entries) {
3759 for (HashMap::Entry* p = map->Start(); p != NULL; p = map->Next(p)) 3752 for (HashMap::Entry* p = map->Start(); p != NULL; p = map->Next(p))
3760 sorted_entries->Add(p); 3753 sorted_entries->Add(p);
3761 sorted_entries->Sort(SortUsingEntryValue); 3754 sorted_entries->Sort(SortUsingEntryValue);
3762 } 3755 }
3763 3756
3764 } } // namespace v8::internal 3757 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698