// 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
