// Copyright 2019 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/basic-memory-chunk.h"

#include <cstdlib>

#include "src/heap/heap-write-barrier-inl.h"
#include "src/objects/heap-object.h"
#include "src/objects/slots-inl.h"

#if defined(V8_OS_STARBOARD)
#include "src/poems.h"
#endif

namespace v8 {
namespace internal {

// Verify write barrier offsets match the the real offsets.
STATIC_ASSERT(BasicMemoryChunk::Flag::INCREMENTAL_MARKING ==
              heap_internals::MemoryChunk::kMarkingBit);
STATIC_ASSERT(BasicMemoryChunk::Flag::FROM_PAGE ==
              heap_internals::MemoryChunk::kFromPageBit);
STATIC_ASSERT(BasicMemoryChunk::Flag::TO_PAGE ==
              heap_internals::MemoryChunk::kToPageBit);
STATIC_ASSERT(BasicMemoryChunk::kFlagsOffset ==
              heap_internals::MemoryChunk::kFlagsOffset);
STATIC_ASSERT(BasicMemoryChunk::kHeapOffset ==
              heap_internals::MemoryChunk::kHeapOffset);

BasicMemoryChunk::BasicMemoryChunk(size_t size, Address area_start,
                                   Address area_end) {
  const Address base = reinterpret_cast<Address>(this);
  size_ = size;
  marking_bitmap_ = static_cast<Bitmap*>(calloc(1, Bitmap::kSize));
  header_sentinel_ = HeapObject::FromAddress(base).ptr();
  DCHECK(HasHeaderSentinel(area_start));
  area_start_ = area_start;
  area_end_ = area_end;
}

// static
bool BasicMemoryChunk::HasHeaderSentinel(Address slot_addr) {
  Address base = BaseAddress(slot_addr);
  if (slot_addr < base + kHeaderSize) return false;
  return HeapObject::FromAddress(base) ==
         ObjectSlot(base + kHeaderSentinelOffset).Relaxed_Load();
}

void BasicMemoryChunk::ReleaseMarkingBitmap() {
  DCHECK_NOT_NULL(marking_bitmap_);
  free(marking_bitmap_);
  marking_bitmap_ = nullptr;
}

}  // namespace internal
}  // namespace v8
