15f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
53e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#ifndef V8_HEAP_MARK_COMPACT_INL_H_
63e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define V8_HEAP_MARK_COMPACT_INL_H_
7c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
83e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/mark-compact.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate.h"
10c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
11c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
12c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comnamespace v8 {
13c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comnamespace internal {
14c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
15c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
16c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comMarkBit Marking::MarkBitFrom(Address addr) {
17394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  MemoryChunk* p = MemoryChunk::FromAddress(addr);
18c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return p->markbits()->MarkBitFromIndex(p->AddressToMarkbitIndex(addr),
19c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                         p->ContainsOnlyData());
20c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
21c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
22c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
23c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid MarkCompactCollector::SetFlags(int flags) {
24994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  reduce_memory_footprint_ = ((flags & Heap::kReduceMemoryFootprintMask) != 0);
25bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  abort_incremental_marking_ =
26bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com      ((flags & Heap::kAbortIncrementalMarkingMask) != 0);
27c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
28c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
29c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
30c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid MarkCompactCollector::MarkObject(HeapObject* obj, MarkBit mark_bit) {
31e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(Marking::MarkBitFrom(obj) == mark_bit);
32c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (!mark_bit.Get()) {
33c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    mark_bit.Set();
342efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org    MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
35e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsMarked(obj));
36e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(obj->GetIsolate()->heap()->Contains(obj));
3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    marking_deque_.PushBlack(obj);
382ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org  }
392ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org}
402ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org
412ab0c3bc2d6dc2b2f91f02efe38d1a3e5a0e3f4cdanno@chromium.org
42c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid MarkCompactCollector::SetMark(HeapObject* obj, MarkBit mark_bit) {
43e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!mark_bit.Get());
44e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(Marking::MarkBitFrom(obj) == mark_bit);
45c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  mark_bit.Set();
462efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
47c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
48c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
49c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
50c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool MarkCompactCollector::IsMarked(Object* obj) {
51e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(obj->IsHeapObject());
52c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  HeapObject* heap_object = HeapObject::cast(obj);
53c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return Marking::MarkBitFrom(heap_object).Get();
54c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
55c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
56c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgvoid MarkCompactCollector::RecordSlot(Object** anchor_slot, Object** slot,
58bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org                                      Object* object,
59bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org                                      SlotsBuffer::AdditionMode mode) {
60c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Page* object_page = Page::FromAddress(reinterpret_cast<Address>(object));
61c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (object_page->IsEvacuationCandidate() &&
62c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      !ShouldSkipEvacuationSlotRecording(anchor_slot)) {
63c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (!SlotsBuffer::AddTo(&slots_buffer_allocator_,
643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                            object_page->slots_buffer_address(), slot, mode)) {
65c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      EvictEvacuationCandidate(object_page);
66c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
67c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
68c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
693e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org}
703e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org}  // namespace v8::internal
71c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#endif  // V8_HEAP_MARK_COMPACT_INL_H_
73