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()13 Address StoreBuffer::TopAddress() {
14   return reinterpret_cast<Address>(heap_->store_buffer_top_address());
15 }
16 
17 
Mark(Address addr)18 void 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)34 void 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)54 void 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