Home | History | Annotate | Download | only in heap
      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 
     13 Address StoreBuffer::TopAddress() {
     14   return reinterpret_cast<Address>(heap_->store_buffer_top_address());
     15 }
     16 
     17 
     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 
     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 
     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