| Index: src/heap-snapshot-generator.cc
|
| diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc
|
| index 2d31ca49d1f88118982e487038f470f24bd1f89e..47294e62fa29d5c0fd1e6674b1957be24944a0f2 100644
|
| --- a/src/heap-snapshot-generator.cc
|
| +++ b/src/heap-snapshot-generator.cc
|
| @@ -397,7 +397,7 @@ void HeapObjectsMap::SnapshotGenerationFinished() {
|
| }
|
|
|
|
|
| -void HeapObjectsMap::MoveObject(Address from, Address to) {
|
| +void HeapObjectsMap::MoveObject(Address from, Address to, int object_size) {
|
| ASSERT(to != NULL);
|
| ASSERT(from != NULL);
|
| if (from == to) return;
|
| @@ -428,11 +428,27 @@ void HeapObjectsMap::MoveObject(Address from, Address to) {
|
| int from_entry_info_index =
|
| static_cast<int>(reinterpret_cast<intptr_t>(from_value));
|
| entries_.at(from_entry_info_index).addr = to;
|
| + // Size of an object can change during its life, so to keep information
|
| + // about the object in entries_ consistent, we have to adjust size when the
|
| + // object is migrated.
|
| + printf("Adjust\n");
|
| + entries_.at(from_entry_info_index).size = object_size;
|
| to_entry->value = from_value;
|
| }
|
| }
|
|
|
|
|
| +void HeapObjectsMap::NewObject(Address addr, int size) {
|
| + ASSERT(addr != NULL);
|
| + FindOrAddEntry(addr, size, false);
|
| +}
|
| +
|
| +
|
| +void HeapObjectsMap::UpdateObjectSize(Address addr, int size) {
|
| + FindOrAddEntry(addr, size, false);
|
| +}
|
| +
|
| +
|
| SnapshotObjectId HeapObjectsMap::FindEntry(Address addr) {
|
| HashMap::Entry* entry = entries_map_.Lookup(addr, ComputePointerHash(addr),
|
| false);
|
| @@ -445,7 +461,8 @@ SnapshotObjectId HeapObjectsMap::FindEntry(Address addr) {
|
|
|
|
|
| SnapshotObjectId HeapObjectsMap::FindOrAddEntry(Address addr,
|
| - unsigned int size) {
|
| + unsigned int size,
|
| + bool accessed) {
|
| ASSERT(static_cast<uint32_t>(entries_.length()) > entries_map_.occupancy());
|
| HashMap::Entry* entry = entries_map_.Lookup(addr, ComputePointerHash(addr),
|
| true);
|
| @@ -453,14 +470,14 @@ SnapshotObjectId HeapObjectsMap::FindOrAddEntry(Address addr,
|
| int entry_index =
|
| static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
|
| EntryInfo& entry_info = entries_.at(entry_index);
|
| - entry_info.accessed = true;
|
| + entry_info.accessed = accessed;
|
| entry_info.size = size;
|
| return entry_info.id;
|
| }
|
| entry->value = reinterpret_cast<void*>(entries_.length());
|
| SnapshotObjectId id = next_id_;
|
| next_id_ += kObjectIdStep;
|
| - entries_.Add(EntryInfo(id, addr, size));
|
| + entries_.Add(EntryInfo(id, addr, size, accessed));
|
| ASSERT(static_cast<uint32_t>(entries_.length()) > entries_map_.occupancy());
|
| return id;
|
| }
|
| @@ -484,6 +501,37 @@ void HeapObjectsMap::UpdateHeapObjectsMap() {
|
| }
|
|
|
|
|
| +void HeapObjectsMap::UpdateMap() {
|
| + HeapIterator iterator(heap_);
|
| + for (HeapObject* obj = iterator.next();
|
| + obj != NULL;
|
| + obj = iterator.next()) {
|
| + FindOrAddEntry(obj->address(), obj->Size());
|
| + }
|
| +}
|
| +
|
| +
|
| +int HeapObjectsMap::FindUntrackedObjects() {
|
| + HeapIterator iterator(heap_);
|
| + int untracked = 0;
|
| + for (HeapObject* obj = iterator.next();
|
| + obj != NULL;
|
| + obj = iterator.next()) {
|
| + HashMap::Entry* entry = entries_map_.Lookup(
|
| + obj->address(), ComputePointerHash(obj->address()), false);
|
| + if (entry == NULL) {
|
| + untracked++;
|
| + } else {
|
| + int entry_index = static_cast<int>(
|
| + reinterpret_cast<intptr_t>(entry->value));
|
| + EntryInfo& entry_info = entries_.at(entry_index);
|
| + CHECK_EQ(obj->Size(), static_cast<int>(entry_info.size));
|
| + }
|
| + }
|
| + return untracked;
|
| +}
|
| +
|
| +
|
| SnapshotObjectId HeapObjectsMap::PushHeapObjectsStats(OutputStream* stream) {
|
| UpdateHeapObjectsMap();
|
| time_intervals_.Add(TimeInterval(next_id_));
|
|
|