Commit 4a2d0155 authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

[heap] Avoid map loads in LiveObjectIterator

Help the compiler a bit by moving the loads into the ctor.

Bug: 
Change-Id: I62deff0ee7252ea78dfec380e791ec958886005d
Reviewed-on: https://chromium-review.googlesource.com/533534Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#45919}
parent 5db4364f
......@@ -50,9 +50,6 @@ void MarkCompactCollector::RecordSlot(HeapObject* object, Object** slot,
template <LiveObjectIterationMode T>
HeapObject* LiveObjectIterator<T>::Next() {
Map* one_word_filler = heap()->one_pointer_filler_map();
Map* two_word_filler = heap()->two_pointer_filler_map();
Map* free_space_map = heap()->free_space_map();
while (!it_.Done()) {
HeapObject* object = nullptr;
while (current_cell_ != 0) {
......@@ -73,10 +70,7 @@ HeapObject* LiveObjectIterator<T>::Next() {
// last word is a one word filler, we are not allowed to advance. In
// that case we can return immediately.
if (!it_.Advance()) {
DCHECK(HeapObject::FromAddress(addr)->map() ==
HeapObject::FromAddress(addr)
->GetHeap()
->one_pointer_filler_map());
DCHECK(HeapObject::FromAddress(addr)->map() == one_word_filler_map_);
return nullptr;
}
cell_base_ = it_.CurrentCellBase();
......@@ -124,8 +118,8 @@ HeapObject* LiveObjectIterator<T>::Next() {
// Do not use IsFiller() here. This may cause a data race for reading
// out the instance type when a new map concurrently is written into
// this object while iterating over the object.
if (map == one_word_filler || map == two_word_filler ||
map == free_space_map) {
if (map == one_word_filler_map_ || map == two_word_filler_map_ ||
map == free_space_map_) {
// There are two reasons why we can get black or grey fillers:
// 1) Black areas together with slack tracking may result in black one
// word filler objects.
......
......@@ -192,17 +192,21 @@ class LiveObjectIterator BASE_EMBEDDED {
: chunk_(chunk),
it_(chunk_, state),
cell_base_(it_.CurrentCellBase()),
current_cell_(*it_.CurrentCell()) {}
current_cell_(*it_.CurrentCell()),
one_word_filler_map_(chunk->heap()->one_pointer_filler_map()),
two_word_filler_map_(chunk->heap()->two_pointer_filler_map()),
free_space_map_(chunk->heap()->free_space_map()) {}
HeapObject* Next();
V8_INLINE HeapObject* Next();
private:
inline Heap* heap() { return chunk_->heap(); }
MemoryChunk* chunk_;
MemoryChunk* const chunk_;
MarkBitCellIterator it_;
Address cell_base_;
MarkBit::CellType current_cell_;
Map* const one_word_filler_map_;
Map* const two_word_filler_map_;
Map* const free_space_map_;
};
class LiveObjectVisitor BASE_EMBEDDED {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment