// Copyright 2011 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.

#ifndef V8_STORE_BUFFER_INL_H_
#define V8_STORE_BUFFER_INL_H_

#include "src/store-buffer.h"

namespace v8 {
namespace internal {

Address StoreBuffer::TopAddress() {
  return reinterpret_cast<Address>(heap_->store_buffer_top_address());
}


void StoreBuffer::Mark(Address addr) {
  ASSERT(!heap_->cell_space()->Contains(addr));
  ASSERT(!heap_->code_space()->Contains(addr));
  ASSERT(!heap_->old_data_space()->Contains(addr));
  Address* top = reinterpret_cast<Address*>(heap_->store_buffer_top());
  *top++ = addr;
  heap_->public_set_store_buffer_top(top);
  if ((reinterpret_cast<uintptr_t>(top) & kStoreBufferOverflowBit) != 0) {
    ASSERT(top == limit_);
    Compact();
  } else {
    ASSERT(top < limit_);
  }
}


void StoreBuffer::EnterDirectlyIntoStoreBuffer(Address addr) {
  if (store_buffer_rebuilding_enabled_) {
    SLOW_ASSERT(!heap_->cell_space()->Contains(addr) &&
                !heap_->code_space()->Contains(addr) &&
                !heap_->old_data_space()->Contains(addr) &&
                !heap_->new_space()->Contains(addr));
    Address* top = old_top_;
    *top++ = addr;
    old_top_ = top;
    old_buffer_is_sorted_ = false;
    old_buffer_is_filtered_ = false;
    if (top >= old_limit_) {
      ASSERT(callback_ != NULL);
      (*callback_)(heap_,
                   MemoryChunk::FromAnyPointerAddress(heap_, addr),
                   kStoreBufferFullEvent);
    }
  }
}


void StoreBuffer::ClearDeadObject(HeapObject* object) {
  Address& map_field = Memory::Address_at(object->address());
  if (heap_->map_space()->Contains(map_field)) {
    map_field = NULL;
  }
}


} }  // namespace v8::internal

#endif  // V8_STORE_BUFFER_INL_H_
