| // Copyright 2017 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/heap/invalidated-slots.h" |
| #include "src/heap/spaces.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| InvalidatedSlotsFilter::InvalidatedSlotsFilter(MemoryChunk* chunk) { |
| // Adjust slots_in_free_space_are_valid_ if more spaces are added. |
| DCHECK_IMPLIES(chunk->invalidated_slots() != nullptr, |
| chunk->InOldSpace() || chunk->InLargeObjectSpace()); |
| // The sweeper removes invalid slots and makes free space available for |
| // allocation. Slots for new objects can be recorded in the free space. |
| // Note that we cannot simply check for SweepingDone because pages in large |
| // object space are not swept but have SweepingDone() == true. |
| slots_in_free_space_are_valid_ = chunk->SweepingDone() && chunk->InOldSpace(); |
| |
| InvalidatedSlots* invalidated_slots = |
| chunk->invalidated_slots() ? chunk->invalidated_slots() : &empty_; |
| iterator_ = invalidated_slots->begin(); |
| iterator_end_ = invalidated_slots->end(); |
| sentinel_ = chunk->area_end(); |
| if (iterator_ != iterator_end_) { |
| invalidated_start_ = iterator_->first.address(); |
| invalidated_end_ = invalidated_start_ + iterator_->second; |
| } else { |
| invalidated_start_ = sentinel_; |
| invalidated_end_ = sentinel_; |
| } |
| // These values will be lazily set when needed. |
| invalidated_object_size_ = 0; |
| #ifdef DEBUG |
| last_slot_ = chunk->area_start(); |
| #endif |
| } |
| |
| } // namespace internal |
| } // namespace v8 |