1 // Copyright 2011 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_STORE_BUFFER_INL_H_ 6 #define V8_STORE_BUFFER_INL_H_ 7 8 #include "src/heap/store-buffer.h" 9 10 namespace v8 { 11 namespace internal { 12 TopAddress()13Address StoreBuffer::TopAddress() { 14 return reinterpret_cast<Address>(heap_->store_buffer_top_address()); 15 } 16 17 Mark(Address addr)18void StoreBuffer::Mark(Address addr) { 19 DCHECK(!heap_->cell_space()->Contains(addr)); 20 DCHECK(!heap_->code_space()->Contains(addr)); 21 DCHECK(!heap_->old_data_space()->Contains(addr)); 22 Address* top = reinterpret_cast<Address*>(heap_->store_buffer_top()); 23 *top++ = addr; 24 heap_->public_set_store_buffer_top(top); 25 if ((reinterpret_cast<uintptr_t>(top) & kStoreBufferOverflowBit) != 0) { 26 DCHECK(top == limit_); 27 Compact(); 28 } else { 29 DCHECK(top < limit_); 30 } 31 } 32 33 EnterDirectlyIntoStoreBuffer(Address addr)34void StoreBuffer::EnterDirectlyIntoStoreBuffer(Address addr) { 35 if (store_buffer_rebuilding_enabled_) { 36 SLOW_DCHECK(!heap_->cell_space()->Contains(addr) && 37 !heap_->code_space()->Contains(addr) && 38 !heap_->old_data_space()->Contains(addr) && 39 !heap_->new_space()->Contains(addr)); 40 Address* top = old_top_; 41 *top++ = addr; 42 old_top_ = top; 43 old_buffer_is_sorted_ = false; 44 old_buffer_is_filtered_ = false; 45 if (top >= old_limit_) { 46 DCHECK(callback_ != NULL); 47 (*callback_)(heap_, MemoryChunk::FromAnyPointerAddress(heap_, addr), 48 kStoreBufferFullEvent); 49 } 50 } 51 } 52 53 ClearDeadObject(HeapObject * object)54void StoreBuffer::ClearDeadObject(HeapObject* object) { 55 Address& map_field = Memory::Address_at(object->address()); 56 if (heap_->map_space()->Contains(map_field)) { 57 map_field = NULL; 58 } 59 } 60 } 61 } // namespace v8::internal 62 63 #endif // V8_STORE_BUFFER_INL_H_ 64