// 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/heap/store-buffer.h" namespace v8 { namespace internal { Address StoreBuffer::TopAddress() { return reinterpret_cast
(heap_->store_buffer_top_address()); } void StoreBuffer::Mark(Address addr) { DCHECK(!heap_->cell_space()->Contains(addr)); DCHECK(!heap_->code_space()->Contains(addr)); DCHECK(!heap_->old_data_space()->Contains(addr)); Address* top = reinterpret_cast(heap_->store_buffer_top()); *top++ = addr; heap_->public_set_store_buffer_top(top); if ((reinterpret_cast(top) & kStoreBufferOverflowBit) != 0) { DCHECK(top == limit_); Compact(); } else { DCHECK(top < limit_); } } void StoreBuffer::EnterDirectlyIntoStoreBuffer(Address addr) { if (store_buffer_rebuilding_enabled_) { SLOW_DCHECK(!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_) { DCHECK(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_