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