// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_HEAP_MARK_COMPACT_INL_H_ #define V8_HEAP_MARK_COMPACT_INL_H_ #include "src/heap/mark-compact.h" #include "src/isolate.h" namespace v8 { namespace internal { MarkBit Marking::MarkBitFrom(Address addr) { MemoryChunk* p = MemoryChunk::FromAddress(addr); return p->markbits()->MarkBitFromIndex(p->AddressToMarkbitIndex(addr), p->ContainsOnlyData()); } void MarkCompactCollector::SetFlags(int flags) { reduce_memory_footprint_ = ((flags & Heap::kReduceMemoryFootprintMask) != 0); abort_incremental_marking_ = ((flags & Heap::kAbortIncrementalMarkingMask) != 0); } void MarkCompactCollector::MarkObject(HeapObject* obj, MarkBit mark_bit) { DCHECK(Marking::MarkBitFrom(obj) == mark_bit); if (!mark_bit.Get()) { mark_bit.Set(); MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size()); DCHECK(IsMarked(obj)); DCHECK(obj->GetIsolate()->heap()->Contains(obj)); marking_deque_.PushBlack(obj); } } void MarkCompactCollector::SetMark(HeapObject* obj, MarkBit mark_bit) { DCHECK(!mark_bit.Get()); DCHECK(Marking::MarkBitFrom(obj) == mark_bit); mark_bit.Set(); MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size()); } bool MarkCompactCollector::IsMarked(Object* obj) { DCHECK(obj->IsHeapObject()); HeapObject* heap_object = HeapObject::cast(obj); return Marking::MarkBitFrom(heap_object).Get(); } void MarkCompactCollector::RecordSlot(Object** anchor_slot, Object** slot, Object* object, SlotsBuffer::AdditionMode mode) { Page* object_page = Page::FromAddress(reinterpret_cast<Address>(object)); if (object_page->IsEvacuationCandidate() && !ShouldSkipEvacuationSlotRecording(anchor_slot)) { if (!SlotsBuffer::AddTo(&slots_buffer_allocator_, object_page->slots_buffer_address(), slot, mode)) { EvictEvacuationCandidate(object_page); } } } } } // namespace v8::internal #endif // V8_HEAP_MARK_COMPACT_INL_H_