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