| Index: src/mark-compact.cc
|
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc
|
| index 58ad091375534f35175a9c22cd571db62fd11255..cd6e45747b95d85ba7aa6663ea42cee920dde8b1 100644
|
| --- a/src/mark-compact.cc
|
| +++ b/src/mark-compact.cc
|
| @@ -68,28 +68,6 @@ MarkCompactCollector::MarkCompactCollector() : // NOLINT
|
| code_flusher_(NULL) { }
|
|
|
|
|
| -bool Marking::Setup() {
|
| - if (new_space_bitmap_ == NULL) {
|
| - // TODO(gc) ISOLATES
|
| - int markbits_per_newspace =
|
| - (2*HEAP->ReservedSemiSpaceSize()) >> kPointerSizeLog2;
|
| -
|
| - new_space_bitmap_ =
|
| - BitmapStorageDescriptor::Allocate(
|
| - NewSpaceMarkbitsBitmap::CellsForLength(markbits_per_newspace));
|
| - }
|
| - return new_space_bitmap_ != NULL;
|
| -}
|
| -
|
| -
|
| -void Marking::TearDown() {
|
| - if (new_space_bitmap_ != NULL) {
|
| - BitmapStorageDescriptor::Free(new_space_bitmap_);
|
| - new_space_bitmap_ = NULL;
|
| - }
|
| -}
|
| -
|
| -
|
| #ifdef DEBUG
|
| class VerifyMarkingVisitor: public ObjectVisitor {
|
| public:
|
| @@ -212,6 +190,7 @@ static void VerifyMarkbitsAreClean() {
|
| VerifyMarkbitsAreClean(HEAP->code_space());
|
| VerifyMarkbitsAreClean(HEAP->cell_space());
|
| VerifyMarkbitsAreClean(HEAP->map_space());
|
| + ASSERT(HEAP->new_space()->ActivePage()->markbits()->IsClean());
|
| }
|
| #endif
|
|
|
| @@ -233,6 +212,7 @@ static void ClearMarkbits() {
|
| ClearMarkbits(HEAP->old_pointer_space());
|
| ClearMarkbits(HEAP->old_data_space());
|
| ClearMarkbits(HEAP->cell_space());
|
| + HEAP->new_space()->ActivePage()->markbits()->Clear();
|
| }
|
|
|
|
|
| @@ -312,13 +292,6 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) {
|
| }
|
|
|
| if (!heap()->incremental_marking()->IsMarking()) {
|
| - Address new_space_bottom = heap()->new_space()->bottom();
|
| - uintptr_t new_space_size =
|
| - RoundUp(heap()->new_space()->top() - new_space_bottom,
|
| - 32 * kPointerSize);
|
| -
|
| - heap()->marking()->ClearRange(new_space_bottom, new_space_size);
|
| -
|
| ClearMarkbits();
|
| #ifdef DEBUG
|
| VerifyMarkbitsAreClean();
|
| @@ -443,7 +416,7 @@ class CodeFlusher {
|
| SharedFunctionInfo* shared = candidate->unchecked_shared();
|
|
|
| Code* code = shared->unchecked_code();
|
| - MarkBit code_mark = Marking::MarkBitFromOldSpace(code);
|
| + MarkBit code_mark = Marking::MarkBitFrom(code);
|
| if (!code_mark.Get()) {
|
| shared->set_code(lazy_compile);
|
| candidate->set_code(lazy_compile);
|
| @@ -468,7 +441,7 @@ class CodeFlusher {
|
| SetNextCandidate(candidate, NULL);
|
|
|
| Code* code = candidate->unchecked_code();
|
| - MarkBit code_mark = Marking::MarkBitFromOldSpace(code);
|
| + MarkBit code_mark = Marking::MarkBitFrom(code);
|
| if (!code_mark.Get()) {
|
| candidate->set_code(lazy_compile);
|
| }
|
| @@ -653,7 +626,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| // Please note targets for cleared inline cached do not have to be
|
| // marked since they are contained in HEAP->non_monomorphic_cache().
|
| } else {
|
| - MarkBit code_mark = Marking::MarkBitFromOldSpace(code);
|
| + MarkBit code_mark = Marking::MarkBitFrom(code);
|
| heap->mark_compact_collector()->MarkObject(code, code_mark);
|
| }
|
| }
|
| @@ -675,7 +648,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) &&
|
| rinfo->IsPatchedDebugBreakSlotSequence()));
|
| HeapObject* code = Code::GetCodeFromTargetAddress(rinfo->call_address());
|
| - MarkBit code_mark = Marking::MarkBitFromOldSpace(code);
|
| + MarkBit code_mark = Marking::MarkBitFrom(code);
|
| heap->mark_compact_collector()->MarkObject(code, code_mark);
|
| }
|
|
|
| @@ -701,7 +674,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| MarkBit mark = heap->marking()->MarkBitFrom(obj);
|
| heap->mark_compact_collector()->SetMark(obj, mark);
|
| // Mark the map pointer and the body.
|
| - MarkBit map_mark = Marking::MarkBitFromOldSpace(map);
|
| + MarkBit map_mark = Marking::MarkBitFrom(map);
|
| heap->mark_compact_collector()->MarkObject(map, map_mark);
|
| IterateBody(map, obj);
|
| }
|
| @@ -784,7 +757,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| // Code is either on stack, in compilation cache or referenced
|
| // by optimized version of function.
|
| MarkBit code_mark =
|
| - Marking::MarkBitFromOldSpace(function->unchecked_code());
|
| + Marking::MarkBitFrom(function->unchecked_code());
|
| if (code_mark.Get()) {
|
| shared_info->set_code_age(0);
|
| return false;
|
| @@ -802,7 +775,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| // Code is either on stack, in compilation cache or referenced
|
| // by optimized version of function.
|
| MarkBit code_mark =
|
| - Marking::MarkBitFromOldSpace(shared_info->unchecked_code());
|
| + Marking::MarkBitFrom(shared_info->unchecked_code());
|
| if (code_mark.Get()) {
|
| shared_info->set_code_age(0);
|
| return false;
|
| @@ -954,7 +927,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
|
|
| if (!flush_code_candidate) {
|
| Code* code = jsfunction->unchecked_shared()->unchecked_code();
|
| - MarkBit code_mark = Marking::MarkBitFromOldSpace(code);
|
| + MarkBit code_mark = Marking::MarkBitFrom(code);
|
| HEAP->mark_compact_collector()->MarkObject(code, code_mark);
|
|
|
| if (jsfunction->unchecked_code()->kind() == Code::OPTIMIZED_FUNCTION) {
|
| @@ -973,7 +946,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| JSFunction* inlined = reinterpret_cast<JSFunction*>(literals->get(i));
|
| Code* inlined_code = inlined->unchecked_shared()->unchecked_code();
|
| MarkBit inlined_code_mark =
|
| - Marking::MarkBitFromOldSpace(inlined_code);
|
| + Marking::MarkBitFrom(inlined_code);
|
| HEAP->mark_compact_collector()->MarkObject(
|
| inlined_code, inlined_code_mark);
|
| }
|
| @@ -1018,7 +991,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
| if (!shared_info_mark.Get()) {
|
| Map* shared_info_map = shared_info->map();
|
| MarkBit shared_info_map_mark =
|
| - Marking::MarkBitFromOldSpace(shared_info_map);
|
| + Marking::MarkBitFrom(shared_info_map);
|
| HEAP->mark_compact_collector()->SetMark(shared_info, shared_info_mark);
|
| HEAP->mark_compact_collector()->MarkObject(shared_info_map,
|
| shared_info_map_mark);
|
| @@ -1100,7 +1073,7 @@ class CodeMarkingVisitor : public ThreadVisitor {
|
| void VisitThread(Isolate* isolate, ThreadLocalTop* top) {
|
| for (StackFrameIterator it(isolate, top); !it.done(); it.Advance()) {
|
| Code* code = it.frame()->unchecked_code();
|
| - MarkBit code_bit = Marking::MarkBitFromOldSpace(code);
|
| + MarkBit code_bit = Marking::MarkBitFrom(code);
|
| HEAP->mark_compact_collector()->MarkObject(
|
| it.frame()->unchecked_code(), code_bit);
|
| }
|
| @@ -1127,7 +1100,7 @@ class SharedFunctionInfoMarkingVisitor : public ObjectVisitor {
|
| // TODO(gc) ISOLATES MERGE
|
| MarkBit shared_mark = HEAP->marking()->MarkBitFrom(shared);
|
| MarkBit code_mark =
|
| - HEAP->marking()->MarkBitFromOldSpace(shared->unchecked_code());
|
| + HEAP->marking()->MarkBitFrom(shared->unchecked_code());
|
| HEAP->mark_compact_collector()->MarkObject(shared->unchecked_code(),
|
| code_mark);
|
| HEAP->mark_compact_collector()->MarkObject(shared, shared_mark);
|
| @@ -1168,7 +1141,7 @@ void MarkCompactCollector::PrepareForCodeFlushing() {
|
| ASSERT(this == heap()->mark_compact_collector());
|
| for (StackFrameIterator it; !it.done(); it.Advance()) {
|
| Code* code = it.frame()->unchecked_code();
|
| - MarkBit code_mark = Marking::MarkBitFromOldSpace(code);
|
| + MarkBit code_mark = Marking::MarkBitFrom(code);
|
| MarkObject(code, code_mark);
|
| }
|
|
|
| @@ -1215,7 +1188,7 @@ class RootMarkingVisitor : public ObjectVisitor {
|
| HEAP->mark_compact_collector()->SetMark(object, mark_bit);
|
|
|
| // Mark the map pointer and body, and push them on the marking stack.
|
| - MarkBit map_mark = Marking::MarkBitFromOldSpace(map);
|
| + MarkBit map_mark = Marking::MarkBitFrom(map);
|
| HEAP->mark_compact_collector()->MarkObject(map, map_mark);
|
| StaticMarkingVisitor::IterateBody(map, object);
|
|
|
| @@ -1551,7 +1524,7 @@ void MarkCompactCollector::EmptyMarkingDeque() {
|
| ASSERT(!object->IsOverflowed());
|
|
|
| Map* map = object->map();
|
| - MarkBit map_mark = Marking::MarkBitFromOldSpace(map);
|
| + MarkBit map_mark = Marking::MarkBitFrom(map);
|
| MarkObject(map, map_mark);
|
|
|
| StaticMarkingVisitor::IterateBody(map, object);
|
| @@ -1756,7 +1729,7 @@ void MarkCompactCollector::ClearNonLiveTransitions() {
|
| for (HeapObject* obj = map_iterator.Next();
|
| obj != NULL; obj = map_iterator.Next()) {
|
| Map* map = reinterpret_cast<Map*>(obj);
|
| - MarkBit map_mark = Marking::MarkBitFromOldSpace(map);
|
| + MarkBit map_mark = Marking::MarkBitFrom(map);
|
| if (map->IsFreeSpace()) continue;
|
|
|
| ASSERT(SafeIsMap(map));
|
| @@ -1781,7 +1754,7 @@ void MarkCompactCollector::ClearNonLiveTransitions() {
|
| HeapObject* prototype = HeapObject::cast(prototype_transitions->get(i));
|
| Map* cached_map = Map::cast(prototype_transitions->get(i + 1));
|
| MarkBit prototype_mark = heap()->marking()->MarkBitFrom(prototype);
|
| - MarkBit cached_map_mark = Marking::MarkBitFromOldSpace(cached_map);
|
| + MarkBit cached_map_mark = Marking::MarkBitFrom(cached_map);
|
| if (prototype_mark.Get() && cached_map_mark.Get()) {
|
| if (new_finger != i) {
|
| prototype_transitions->set_unchecked(heap_,
|
| @@ -1824,7 +1797,7 @@ void MarkCompactCollector::ClearNonLiveTransitions() {
|
| while (SafeIsMap(current)) {
|
| next = current->prototype();
|
| // There should never be a dead map above a live map.
|
| - MarkBit current_mark = Marking::MarkBitFromOldSpace(current);
|
| + MarkBit current_mark = Marking::MarkBitFrom(current);
|
| ASSERT(on_dead_path || current_mark.Get());
|
|
|
| // A live map above a dead map indicates a dead transition.
|
| @@ -2017,7 +1990,7 @@ void MarkCompactCollector::SweepNewSpace(NewSpace* space) {
|
| HeapObject* object = HeapObject::FromAddress(current);
|
|
|
|
|
| - MarkBit mark_bit = heap_->marking()->MarkBitFromNewSpace(object);
|
| + MarkBit mark_bit = heap_->marking()->MarkBitFrom(object);
|
| if (mark_bit.Get()) {
|
| mark_bit.Clear();
|
| heap_->mark_compact_collector()->tracer()->decrement_marked_count();
|
| @@ -2113,7 +2086,7 @@ static uint32_t SweepFree(PagedSpace* space,
|
| uint32_t free_start,
|
| uint32_t region_end,
|
| uint32_t* cells) {
|
| - uint32_t free_cell_index = Page::MarkbitsBitmap::IndexToCell(free_start);
|
| + uint32_t free_cell_index = Bitmap::IndexToCell(free_start);
|
| ASSERT(cells[free_cell_index] == 0);
|
| while (free_cell_index < region_end && cells[free_cell_index] == 0) {
|
| free_cell_index++;
|
| @@ -2123,7 +2096,7 @@ static uint32_t SweepFree(PagedSpace* space,
|
| return free_cell_index;
|
| }
|
|
|
| - uint32_t free_end = Page::MarkbitsBitmap::CellToIndex(free_cell_index);
|
| + uint32_t free_end = Bitmap::CellToIndex(free_cell_index);
|
| space->Free(p->MarkbitIndexToAddress(free_start),
|
| (free_end - free_start) << kPointerSizeLog2);
|
|
|
| @@ -2161,7 +2134,7 @@ static int SizeOfPreviousObject(Page* p,
|
| CompilerIntrinsics::CountLeadingZeros(cells[cell_index - 1]) + 1;
|
| Address addr =
|
| p->MarkbitIndexToAddress(
|
| - Page::MarkbitsBitmap::CellToIndex(cell_index) - leading_zeroes);
|
| + Bitmap::CellToIndex(cell_index) - leading_zeroes);
|
| HeapObject* obj = HeapObject::FromAddress(addr);
|
| ASSERT(obj->map()->IsMap());
|
| return (obj->Size() >> kPointerSizeLog2) - leading_zeroes;
|
| @@ -2456,8 +2429,8 @@ int MarkCompactCollector::SweepConservatively(PagedSpace* space, Page* p) {
|
| Address block_address = p->ObjectAreaStart();
|
|
|
| int last_cell_index =
|
| - Page::MarkbitsBitmap::IndexToCell(
|
| - Page::MarkbitsBitmap::CellAlignIndex(
|
| + Bitmap::IndexToCell(
|
| + Bitmap::CellAlignIndex(
|
| p->AddressToMarkbitIndex(p->ObjectAreaEnd())));
|
|
|
| int cell_index = Page::kFirstUsedCell;
|
| @@ -2492,8 +2465,8 @@ int MarkCompactCollector::SweepConservatively(PagedSpace* space, Page* p) {
|
| cell_index < last_cell_index;
|
| cell_index++, block_address += 32 * kPointerSize) {
|
| ASSERT((unsigned)cell_index ==
|
| - Page::MarkbitsBitmap::IndexToCell(
|
| - Page::MarkbitsBitmap::CellAlignIndex(
|
| + Bitmap::IndexToCell(
|
| + Bitmap::CellAlignIndex(
|
| p->AddressToMarkbitIndex(block_address))));
|
| uint32_t cell = cells[cell_index];
|
| if (cell != 0) {
|
| @@ -2537,8 +2510,8 @@ static void SweepPrecisely(PagedSpace* space,
|
| p->ClearFlag(MemoryChunk::WAS_SWEPT_CONSERVATIVELY);
|
|
|
| int last_cell_index =
|
| - Page::MarkbitsBitmap::IndexToCell(
|
| - Page::MarkbitsBitmap::CellAlignIndex(
|
| + Bitmap::IndexToCell(
|
| + Bitmap::CellAlignIndex(
|
| p->AddressToMarkbitIndex(p->ObjectAreaEnd())));
|
|
|
| int cell_index = Page::kFirstUsedCell;
|
| @@ -2551,8 +2524,8 @@ static void SweepPrecisely(PagedSpace* space,
|
| cell_index < last_cell_index;
|
| cell_index++, object_address += 32 * kPointerSize) {
|
| ASSERT((unsigned)cell_index ==
|
| - Page::MarkbitsBitmap::IndexToCell(
|
| - Page::MarkbitsBitmap::CellAlignIndex(
|
| + Bitmap::IndexToCell(
|
| + Bitmap::CellAlignIndex(
|
| p->AddressToMarkbitIndex(object_address))));
|
| int live_objects = MarkWordToObjectStarts(cells[cell_index], offsets);
|
| int live_index = 0;
|
|
|