Embed entries_ list into HeapObjectsMap by value.

Previously it was owned by pointer but now it is not necessary and we can own it by value.

BUG=none
TEST=none

Review URL: https://chromiumcodereview.appspot.com/9969197

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11351 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
loislo@chromium.org 2012-04-17 11:14:14 +00:00
parent 47d07b8a7b
commit 23602bb8b2
2 changed files with 24 additions and 31 deletions

View File

@ -1311,8 +1311,7 @@ const SnapshotObjectId HeapObjectsMap::kFirstAvailableObjectId =
HeapObjectsMap::HeapObjectsMap()
: next_id_(kFirstAvailableObjectId),
entries_map_(AddressesMatch),
entries_(new List<EntryInfo>()) {
entries_map_(AddressesMatch) {
// This dummy element solves a problem with entries_map_.
// When we do lookup in HashMap we see no difference between two cases:
// it has an entry with NULL as the value or it has created
@ -1320,12 +1319,7 @@ HeapObjectsMap::HeapObjectsMap()
// With such dummy element we have a guaranty that all entries_map_ entries
// will have the value field grater than 0.
// This fact is using in MoveObject method.
entries_->Add(EntryInfo(0, NULL, 0));
}
HeapObjectsMap::~HeapObjectsMap() {
delete entries_;
entries_.Add(EntryInfo(0, NULL, 0));
}
@ -1342,7 +1336,7 @@ void HeapObjectsMap::MoveObject(Address from, Address to) {
if (from_value == NULL) return;
int from_entry_info_index =
static_cast<int>(reinterpret_cast<intptr_t>(from_value));
entries_->at(from_entry_info_index).addr = to;
entries_.at(from_entry_info_index).addr = to;
HashMap::Entry* to_entry = entries_map_.Lookup(to, AddressHash(to), true);
if (to_entry->value != NULL) {
int to_entry_info_index =
@ -1351,7 +1345,7 @@ void HeapObjectsMap::MoveObject(Address from, Address to) {
// value in addr field. It is bad because later at RemoveDeadEntries
// one of this entry will be removed with the corresponding entries_map_
// entry.
entries_->at(to_entry_info_index).addr = NULL;
entries_.at(to_entry_info_index).addr = NULL;
}
to_entry->value = reinterpret_cast<void*>(from_entry_info_index);
}
@ -1361,29 +1355,29 @@ SnapshotObjectId HeapObjectsMap::FindEntry(Address addr) {
HashMap::Entry* entry = entries_map_.Lookup(addr, AddressHash(addr), false);
if (entry == NULL) return 0;
int entry_index = static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
EntryInfo& entry_info = entries_->at(entry_index);
ASSERT(static_cast<uint32_t>(entries_->length()) > entries_map_.occupancy());
EntryInfo& entry_info = entries_.at(entry_index);
ASSERT(static_cast<uint32_t>(entries_.length()) > entries_map_.occupancy());
return entry_info.id;
}
SnapshotObjectId HeapObjectsMap::FindOrAddEntry(Address addr,
unsigned int size) {
ASSERT(static_cast<uint32_t>(entries_->length()) > entries_map_.occupancy());
ASSERT(static_cast<uint32_t>(entries_.length()) > entries_map_.occupancy());
HashMap::Entry* entry = entries_map_.Lookup(addr, AddressHash(addr), true);
if (entry->value != NULL) {
int entry_index =
static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
EntryInfo& entry_info = entries_->at(entry_index);
EntryInfo& entry_info = entries_.at(entry_index);
entry_info.accessed = true;
entry_info.size = size;
return entry_info.id;
}
entry->value = reinterpret_cast<void*>(entries_->length());
entry->value = reinterpret_cast<void*>(entries_.length());
SnapshotObjectId id = next_id_;
next_id_ += kObjectIdStep;
entries_->Add(EntryInfo(id, addr, size));
ASSERT(static_cast<uint32_t>(entries_->length()) > entries_map_.occupancy());
entries_.Add(EntryInfo(id, addr, size));
ASSERT(static_cast<uint32_t>(entries_.length()) > entries_map_.occupancy());
return id;
}
@ -1410,9 +1404,9 @@ void HeapObjectsMap::PushHeapObjectsStats(OutputStream* stream) {
time_intervals_.Add(TimeInterval(next_id_));
int prefered_chunk_size = stream->GetChunkSize();
List<uint32_t> stats_buffer;
ASSERT(!entries_->is_empty());
EntryInfo* entry_info = &entries_->first();
EntryInfo* end_entry_info = &entries_->last() + 1;
ASSERT(!entries_.is_empty());
EntryInfo* entry_info = &entries_.first();
EntryInfo* end_entry_info = &entries_.last() + 1;
for (int time_interval_index = 0;
time_interval_index < time_intervals_.length();
++time_interval_index) {
@ -1450,17 +1444,17 @@ void HeapObjectsMap::PushHeapObjectsStats(OutputStream* stream) {
void HeapObjectsMap::RemoveDeadEntries() {
ASSERT(entries_->length() > 0 &&
entries_->at(0).id == 0 &&
entries_->at(0).addr == NULL);
ASSERT(entries_.length() > 0 &&
entries_.at(0).id == 0 &&
entries_.at(0).addr == NULL);
int first_free_entry = 1;
for (int i = 1; i < entries_->length(); ++i) {
EntryInfo& entry_info = entries_->at(i);
for (int i = 1; i < entries_.length(); ++i) {
EntryInfo& entry_info = entries_.at(i);
if (entry_info.accessed) {
if (first_free_entry != i) {
entries_->at(first_free_entry) = entry_info;
entries_.at(first_free_entry) = entry_info;
}
entries_->at(first_free_entry).accessed = false;
entries_.at(first_free_entry).accessed = false;
HashMap::Entry* entry = entries_map_.Lookup(
entry_info.addr, AddressHash(entry_info.addr), false);
ASSERT(entry);
@ -1472,8 +1466,8 @@ void HeapObjectsMap::RemoveDeadEntries() {
}
}
}
entries_->Rewind(first_free_entry);
ASSERT(static_cast<uint32_t>(entries_->length()) - 1 ==
entries_.Rewind(first_free_entry);
ASSERT(static_cast<uint32_t>(entries_.length()) - 1 ==
entries_map_.occupancy());
}

View File

@ -705,7 +705,6 @@ class HeapSnapshot {
class HeapObjectsMap {
public:
HeapObjectsMap();
~HeapObjectsMap();
void SnapshotGenerationFinished();
SnapshotObjectId FindEntry(Address addr);
@ -761,7 +760,7 @@ class HeapObjectsMap {
SnapshotObjectId next_id_;
HashMap entries_map_;
List<EntryInfo>* entries_;
List<EntryInfo> entries_;
List<TimeInterval> time_intervals_;
DISALLOW_COPY_AND_ASSIGN(HeapObjectsMap);