Home | History | Annotate | Download | only in heap
      1 // Copyright 2012 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_HEAP_MARK_COMPACT_INL_H_
      6 #define V8_HEAP_MARK_COMPACT_INL_H_
      7 
      8 #include "src/heap/mark-compact.h"
      9 #include "src/isolate.h"
     10 
     11 
     12 namespace v8 {
     13 namespace internal {
     14 
     15 
     16 MarkBit Marking::MarkBitFrom(Address addr) {
     17   MemoryChunk* p = MemoryChunk::FromAddress(addr);
     18   return p->markbits()->MarkBitFromIndex(p->AddressToMarkbitIndex(addr),
     19                                          p->ContainsOnlyData());
     20 }
     21 
     22 
     23 void MarkCompactCollector::SetFlags(int flags) {
     24   reduce_memory_footprint_ = ((flags & Heap::kReduceMemoryFootprintMask) != 0);
     25   abort_incremental_marking_ =
     26       ((flags & Heap::kAbortIncrementalMarkingMask) != 0);
     27 }
     28 
     29 
     30 void MarkCompactCollector::MarkObject(HeapObject* obj, MarkBit mark_bit) {
     31   DCHECK(Marking::MarkBitFrom(obj) == mark_bit);
     32   if (!mark_bit.Get()) {
     33     mark_bit.Set();
     34     MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
     35     DCHECK(IsMarked(obj));
     36     DCHECK(obj->GetIsolate()->heap()->Contains(obj));
     37     marking_deque_.PushBlack(obj);
     38   }
     39 }
     40 
     41 
     42 void MarkCompactCollector::SetMark(HeapObject* obj, MarkBit mark_bit) {
     43   DCHECK(!mark_bit.Get());
     44   DCHECK(Marking::MarkBitFrom(obj) == mark_bit);
     45   mark_bit.Set();
     46   MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
     47 }
     48 
     49 
     50 bool MarkCompactCollector::IsMarked(Object* obj) {
     51   DCHECK(obj->IsHeapObject());
     52   HeapObject* heap_object = HeapObject::cast(obj);
     53   return Marking::MarkBitFrom(heap_object).Get();
     54 }
     55 
     56 
     57 void MarkCompactCollector::RecordSlot(Object** anchor_slot, Object** slot,
     58                                       Object* object,
     59                                       SlotsBuffer::AdditionMode mode) {
     60   Page* object_page = Page::FromAddress(reinterpret_cast<Address>(object));
     61   if (object_page->IsEvacuationCandidate() &&
     62       !ShouldSkipEvacuationSlotRecording(anchor_slot)) {
     63     if (!SlotsBuffer::AddTo(&slots_buffer_allocator_,
     64                             object_page->slots_buffer_address(), slot, mode)) {
     65       EvictEvacuationCandidate(object_page);
     66     }
     67   }
     68 }
     69 }
     70 }  // namespace v8::internal
     71 
     72 #endif  // V8_HEAP_MARK_COMPACT_INL_H_
     73