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
MarkBitFrom(Address addr)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
SetFlags(int flags)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
MarkObject(HeapObject * obj,MarkBit mark_bit)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
SetMark(HeapObject * obj,MarkBit mark_bit)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
IsMarked(Object * obj)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
RecordSlot(Object ** anchor_slot,Object ** slot,Object * object,SlotsBuffer::AdditionMode mode)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