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