| Index: src/heap/slots-buffer.cc
|
| diff --git a/src/heap/slots-buffer.cc b/src/heap/slots-buffer.cc
|
| deleted file mode 100644
|
| index 5a3db281fda576180de0b76d8468e3f21d5fe345..0000000000000000000000000000000000000000
|
| --- a/src/heap/slots-buffer.cc
|
| +++ /dev/null
|
| @@ -1,164 +0,0 @@
|
| -// Copyright 2015 the V8 project authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "src/heap/slots-buffer.h"
|
| -
|
| -#include "src/assembler.h"
|
| -#include "src/heap/heap.h"
|
| -#include "src/objects-inl.h"
|
| -
|
| -namespace v8 {
|
| -namespace internal {
|
| -
|
| -bool SlotsBuffer::IsTypedSlot(ObjectSlot slot) {
|
| - return reinterpret_cast<uintptr_t>(slot) < NUMBER_OF_SLOT_TYPES;
|
| -}
|
| -
|
| -
|
| -bool SlotsBuffer::AddTo(SlotsBufferAllocator* allocator,
|
| - SlotsBuffer** buffer_address, SlotType type,
|
| - Address addr, AdditionMode mode) {
|
| - SlotsBuffer* buffer = *buffer_address;
|
| - if (buffer == NULL || !buffer->HasSpaceForTypedSlot()) {
|
| - if (mode == FAIL_ON_OVERFLOW && ChainLengthThresholdReached(buffer)) {
|
| - allocator->DeallocateChain(buffer_address);
|
| - return false;
|
| - }
|
| - buffer = allocator->AllocateBuffer(buffer);
|
| - *buffer_address = buffer;
|
| - }
|
| - DCHECK(buffer->HasSpaceForTypedSlot());
|
| - buffer->Add(reinterpret_cast<ObjectSlot>(type));
|
| - buffer->Add(reinterpret_cast<ObjectSlot>(addr));
|
| - return true;
|
| -}
|
| -
|
| -
|
| -void SlotsBuffer::RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer) {
|
| - // Remove entries by replacing them with an old-space slot containing a smi
|
| - // that is located in an unmovable page.
|
| - const ObjectSlot kRemovedEntry = HeapObject::RawField(
|
| - heap->empty_fixed_array(), FixedArrayBase::kLengthOffset);
|
| - DCHECK(Page::FromAddress(reinterpret_cast<Address>(kRemovedEntry))
|
| - ->NeverEvacuate());
|
| -
|
| - while (buffer != NULL) {
|
| - SlotsBuffer::ObjectSlot* slots = buffer->slots_;
|
| - intptr_t slots_count = buffer->idx_;
|
| -
|
| - for (int slot_idx = 0; slot_idx < slots_count; ++slot_idx) {
|
| - ObjectSlot slot = slots[slot_idx];
|
| - if (!IsTypedSlot(slot)) {
|
| - Object* object = *slot;
|
| - // Slots are invalid when they currently:
|
| - // - do not point to a heap object (SMI)
|
| - // - point to a heap object in new space
|
| - // - are not within a live heap object on a valid pointer slot
|
| - // - point to a heap object not on an evacuation candidate
|
| - // TODO(mlippautz): Move InNewSpace check above IsSlotInLiveObject once
|
| - // we filter out unboxed double slots eagerly.
|
| - if (!object->IsHeapObject() ||
|
| - !heap->mark_compact_collector()->IsSlotInLiveObject(
|
| - reinterpret_cast<Address>(slot)) ||
|
| - heap->InNewSpace(object) ||
|
| - !Page::FromAddress(reinterpret_cast<Address>(object))
|
| - ->IsEvacuationCandidate()) {
|
| - // TODO(hpayer): Instead of replacing slots with kRemovedEntry we
|
| - // could shrink the slots buffer in-place.
|
| - slots[slot_idx] = kRemovedEntry;
|
| - }
|
| - } else {
|
| - ++slot_idx;
|
| - DCHECK(slot_idx < slots_count);
|
| - }
|
| - }
|
| - buffer = buffer->next();
|
| - }
|
| -}
|
| -
|
| -
|
| -void SlotsBuffer::RemoveObjectSlots(Heap* heap, SlotsBuffer* buffer,
|
| - Address start_slot, Address end_slot) {
|
| - // Remove entries by replacing them with an old-space slot containing a smi
|
| - // that is located in an unmovable page.
|
| - const ObjectSlot kRemovedEntry = HeapObject::RawField(
|
| - heap->empty_fixed_array(), FixedArrayBase::kLengthOffset);
|
| - DCHECK(Page::FromAddress(reinterpret_cast<Address>(kRemovedEntry))
|
| - ->NeverEvacuate());
|
| -
|
| - while (buffer != NULL) {
|
| - SlotsBuffer::ObjectSlot* slots = buffer->slots_;
|
| - intptr_t slots_count = buffer->idx_;
|
| - bool is_typed_slot = false;
|
| -
|
| - for (int slot_idx = 0; slot_idx < slots_count; ++slot_idx) {
|
| - ObjectSlot slot = slots[slot_idx];
|
| - if (!IsTypedSlot(slot)) {
|
| - Address slot_address = reinterpret_cast<Address>(slot);
|
| - if (slot_address >= start_slot && slot_address < end_slot) {
|
| - // TODO(hpayer): Instead of replacing slots with kRemovedEntry we
|
| - // could shrink the slots buffer in-place.
|
| - slots[slot_idx] = kRemovedEntry;
|
| - if (is_typed_slot) {
|
| - slots[slot_idx - 1] = kRemovedEntry;
|
| - }
|
| - }
|
| - is_typed_slot = false;
|
| - } else {
|
| - is_typed_slot = true;
|
| - DCHECK(slot_idx < slots_count);
|
| - }
|
| - }
|
| - buffer = buffer->next();
|
| - }
|
| -}
|
| -
|
| -
|
| -void SlotsBuffer::VerifySlots(Heap* heap, SlotsBuffer* buffer) {
|
| - while (buffer != NULL) {
|
| - SlotsBuffer::ObjectSlot* slots = buffer->slots_;
|
| - intptr_t slots_count = buffer->idx_;
|
| -
|
| - for (int slot_idx = 0; slot_idx < slots_count; ++slot_idx) {
|
| - ObjectSlot slot = slots[slot_idx];
|
| - if (!IsTypedSlot(slot)) {
|
| - Object* object = *slot;
|
| - if (object->IsHeapObject()) {
|
| - HeapObject* heap_object = HeapObject::cast(object);
|
| - CHECK(!heap->InNewSpace(object));
|
| - heap->mark_compact_collector()->VerifyIsSlotInLiveObject(
|
| - reinterpret_cast<Address>(slot), heap_object);
|
| - }
|
| - } else {
|
| - ++slot_idx;
|
| - DCHECK(slot_idx < slots_count);
|
| - }
|
| - }
|
| - buffer = buffer->next();
|
| - }
|
| -}
|
| -
|
| -
|
| -SlotsBuffer* SlotsBufferAllocator::AllocateBuffer(SlotsBuffer* next_buffer) {
|
| - return new SlotsBuffer(next_buffer);
|
| -}
|
| -
|
| -
|
| -void SlotsBufferAllocator::DeallocateBuffer(SlotsBuffer* buffer) {
|
| - delete buffer;
|
| -}
|
| -
|
| -
|
| -void SlotsBufferAllocator::DeallocateChain(SlotsBuffer** buffer_address) {
|
| - SlotsBuffer* buffer = *buffer_address;
|
| - while (buffer != NULL) {
|
| - SlotsBuffer* next_buffer = buffer->next();
|
| - DeallocateBuffer(buffer);
|
| - buffer = next_buffer;
|
| - }
|
| - *buffer_address = NULL;
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace v8
|
|
|