blob: 66b0a59cec6c0b32ba3cf2147e0af2e55bd81f98 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
12namespace v8 {
13namespace internal {
14
15
16MarkBit Marking::MarkBitFrom(Address addr) {
17 MemoryChunk* p = MemoryChunk::FromAddress(addr);
18 return p->markbits()->MarkBitFromIndex(p->AddressToMarkbitIndex(addr),
19 p->ContainsOnlyData());
20}
21
22
23void MarkCompactCollector::SetFlags(int flags) {
24 reduce_memory_footprint_ = ((flags & Heap::kReduceMemoryFootprintMask) != 0);
25 abort_incremental_marking_ =
26 ((flags & Heap::kAbortIncrementalMarkingMask) != 0);
27}
28
29
30void 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
42void 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
50bool 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
57void 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_