| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index ec2a470abb8268897290511a34ea60ec5be12c57..b1536cdf6237437753e2492464bafabb7fa7976f 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -3110,9 +3110,9 @@ AllocationResult Heap::AllocateBytecodeArray(int length,
|
| return result;
|
| }
|
|
|
| -void Heap::CreateFillerObjectAt(Address addr, int size,
|
| - ClearRecordedSlots mode) {
|
| - if (size == 0) return;
|
| +HeapObject* Heap::CreateFillerObjectAt(Address addr, int size,
|
| + ClearRecordedSlots mode) {
|
| + if (size == 0) return nullptr;
|
| HeapObject* filler = HeapObject::FromAddress(addr);
|
| if (size == kPointerSize) {
|
| filler->set_map_no_write_barrier(
|
| @@ -3134,6 +3134,7 @@ void Heap::CreateFillerObjectAt(Address addr, int size,
|
| // none of the maps have been created yet and are NULL.
|
| DCHECK((filler->map() == NULL && !deserialization_complete_) ||
|
| filler->map()->IsMap());
|
| + return filler;
|
| }
|
|
|
|
|
| @@ -3160,7 +3161,7 @@ void Heap::AdjustLiveBytes(HeapObject* object, int by) {
|
| lo_space()->AdjustLiveBytes(by);
|
| } else if (!in_heap_iterator() &&
|
| !mark_compact_collector()->sweeping_in_progress() &&
|
| - Marking::IsBlack(ObjectMarking::MarkBitFrom(object->address()))) {
|
| + Marking::IsBlack(ObjectMarking::MarkBitFrom(object))) {
|
| DCHECK(MemoryChunk::FromAddress(object->address())->SweepingDone());
|
| MemoryChunk::IncrementLiveBytes(object, by);
|
| }
|
| @@ -3196,8 +3197,10 @@ FixedArrayBase* Heap::LeftTrimFixedArray(FixedArrayBase* object,
|
| // Transfer the mark bits to their new location if the object is not within
|
| // a black area.
|
| if (!incremental_marking()->black_allocation() ||
|
| - !Marking::IsBlack(ObjectMarking::MarkBitFrom(new_start))) {
|
| - IncrementalMarking::TransferMark(this, old_start, new_start);
|
| + !Marking::IsBlack(
|
| + ObjectMarking::MarkBitFrom(HeapObject::FromAddress(new_start)))) {
|
| + IncrementalMarking::TransferMark(this, object,
|
| + HeapObject::FromAddress(new_start));
|
| }
|
|
|
| // Technically in new space this write might be omitted (except for
|
| @@ -3208,7 +3211,7 @@ FixedArrayBase* Heap::LeftTrimFixedArray(FixedArrayBase* object,
|
| // Clear the mark bits of the black area that belongs now to the filler.
|
| // This is an optimization. The sweeper will release black fillers anyway.
|
| if (incremental_marking()->black_allocation() &&
|
| - Marking::IsBlackOrGrey(ObjectMarking::MarkBitFrom(old_start))) {
|
| + Marking::IsBlackOrGrey(ObjectMarking::MarkBitFrom(object))) {
|
| Page* page = Page::FromAddress(old_start);
|
| page->markbits()->ClearRange(
|
| page->AddressToMarkbitIndex(old_start),
|
| @@ -3283,11 +3286,13 @@ void Heap::RightTrimFixedArray(FixedArrayBase* object, int elements_to_trim) {
|
| // TODO(hpayer): We should shrink the large object page if the size
|
| // of the object changed significantly.
|
| if (!lo_space()->Contains(object)) {
|
| - CreateFillerObjectAt(new_end, bytes_to_trim, ClearRecordedSlots::kYes);
|
| + HeapObject* filler =
|
| + CreateFillerObjectAt(new_end, bytes_to_trim, ClearRecordedSlots::kYes);
|
| + DCHECK_NOT_NULL(filler);
|
| // Clear the mark bits of the black area that belongs now to the filler.
|
| // This is an optimization. The sweeper will release black fillers anyway.
|
| if (incremental_marking()->black_allocation() &&
|
| - Marking::IsBlackOrGrey(ObjectMarking::MarkBitFrom(new_end))) {
|
| + Marking::IsBlackOrGrey(ObjectMarking::MarkBitFrom(filler))) {
|
| Page* page = Page::FromAddress(new_end);
|
| page->markbits()->ClearRange(
|
| page->AddressToMarkbitIndex(new_end),
|
|
|