From e777fc41268ef798efbe0033fc3fca34460625f2 Mon Sep 17 00:00:00 2001 From: "ulan@chromium.org" Date: Tue, 21 Oct 2014 09:42:16 +0000 Subject: [PATCH] Use smi zero instead of undefine_value to zap dead weak cells. It is faster to test for smi zero from generated code. BUG= R=erikcorry@chromium.org Review URL: https://codereview.chromium.org/637253004 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24758 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/heap/mark-compact.cc | 6 ++++-- src/heap/objects-visiting-inl.h | 6 +++--- src/objects-inl.h | 10 +++++++--- src/objects.cc | 2 +- src/objects.h | 6 ++++-- test/cctest/test-heap.cc | 4 ++-- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc index 7e674ab..f309eae 100644 --- a/src/heap/mark-compact.cc +++ b/src/heap/mark-compact.cc @@ -2744,9 +2744,11 @@ void MarkCompactCollector::ProcessAndClearWeakCells() { Object* weak_cell_obj = heap()->encountered_weak_cells(); while (weak_cell_obj != Smi::FromInt(0)) { WeakCell* weak_cell = reinterpret_cast(weak_cell_obj); - HeapObject* value = weak_cell->value(); + // We do not insert cleared weak cells into the list, so the value + // cannot be a Smi here. + HeapObject* value = HeapObject::cast(weak_cell->value()); if (!MarkCompactCollector::IsMarked(value)) { - weak_cell->clear(undefined); + weak_cell->clear(); } else { Object** slot = HeapObject::RawField(weak_cell, WeakCell::kValueOffset); heap()->mark_compact_collector()->RecordSlot(slot, slot, value); diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h index 28dfbc5..1f37306 100644 --- a/src/heap/objects-visiting-inl.h +++ b/src/heap/objects-visiting-inl.h @@ -359,9 +359,9 @@ void StaticMarkingVisitor::VisitWeakCell(Map* map, WeakCell* weak_cell = reinterpret_cast(object); Object* undefined = heap->undefined_value(); // Enqueue weak cell in linked list of encountered weak collections. - // We can ignore weak cells with cleared values because they will always point - // to the undefined_value. - if (weak_cell->next() == undefined && weak_cell->value() != undefined) { + // We can ignore weak cells with cleared values because they will always + // contain smi zero. + if (weak_cell->next() == undefined && !weak_cell->cleared()) { weak_cell->set_next(heap->encountered_weak_cells()); heap->set_encountered_weak_cells(weak_cell); } diff --git a/src/objects-inl.h b/src/objects-inl.h index a5b46a4..26adbc1 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -1930,13 +1930,14 @@ void PropertyCell::set_type_raw(Object* val, WriteBarrierMode ignored) { } -HeapObject* WeakCell::value() const { +Object* WeakCell::value() const { return HeapObject::cast(READ_FIELD(this, kValueOffset)); } -void WeakCell::clear(HeapObject* undefined) { - WRITE_FIELD(this, kValueOffset, undefined); +void WeakCell::clear() { + DCHECK(GetHeap()->gc_state() == Heap::MARK_COMPACT); + WRITE_FIELD(this, kValueOffset, Smi::FromInt(0)); } @@ -1946,6 +1947,9 @@ void WeakCell::initialize(HeapObject* val) { } +bool WeakCell::cleared() const { return value() == Smi::FromInt(0); } + + Object* WeakCell::next() const { return READ_FIELD(this, kNextOffset); } diff --git a/src/objects.cc b/src/objects.cc index 07ad6f1..811ad74 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -9829,7 +9829,7 @@ Handle Script::GetWrapper(Handle