| Index: src/heap/slots-buffer.h
|
| diff --git a/src/heap/slots-buffer.h b/src/heap/slots-buffer.h
|
| deleted file mode 100644
|
| index dc6c92296375e4428ecee0f2d2818112921f0445..0000000000000000000000000000000000000000
|
| --- a/src/heap/slots-buffer.h
|
| +++ /dev/null
|
| @@ -1,175 +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.
|
| -
|
| -#ifndef V8_HEAP_SLOTS_BUFFER_H_
|
| -#define V8_HEAP_SLOTS_BUFFER_H_
|
| -
|
| -#include "src/objects.h"
|
| -
|
| -namespace v8 {
|
| -namespace internal {
|
| -
|
| -// Forward declarations.
|
| -class SlotsBuffer;
|
| -
|
| -
|
| -// SlotsBufferAllocator manages the allocation and deallocation of slots buffer
|
| -// chunks and links them together. Slots buffer chunks are always created by the
|
| -// SlotsBufferAllocator.
|
| -class SlotsBufferAllocator {
|
| - public:
|
| - SlotsBuffer* AllocateBuffer(SlotsBuffer* next_buffer);
|
| - void DeallocateBuffer(SlotsBuffer* buffer);
|
| -
|
| - void DeallocateChain(SlotsBuffer** buffer_address);
|
| -};
|
| -
|
| -
|
| -// SlotsBuffer records a sequence of slots that has to be updated
|
| -// after live objects were relocated from evacuation candidates.
|
| -// All slots are either untyped or typed:
|
| -// - Untyped slots are expected to contain a tagged object pointer.
|
| -// They are recorded by an address.
|
| -// - Typed slots are expected to contain an encoded pointer to a heap
|
| -// object where the way of encoding depends on the type of the slot.
|
| -// They are recorded as a pair (SlotType, slot address).
|
| -// We assume that zero-page is never mapped this allows us to distinguish
|
| -// untyped slots from typed slots during iteration by a simple comparison:
|
| -// if element of slots buffer is less than NUMBER_OF_SLOT_TYPES then it
|
| -// is the first element of typed slot's pair.
|
| -class SlotsBuffer {
|
| - public:
|
| - typedef Object** ObjectSlot;
|
| -
|
| - explicit SlotsBuffer(SlotsBuffer* next_buffer)
|
| - : idx_(0), chain_length_(1), next_(next_buffer) {
|
| - if (next_ != NULL) {
|
| - chain_length_ = next_->chain_length_ + 1;
|
| - }
|
| - }
|
| -
|
| - ~SlotsBuffer() {}
|
| -
|
| - void Add(ObjectSlot slot) {
|
| - DCHECK(0 <= idx_ && idx_ < kNumberOfElements);
|
| -#ifdef DEBUG
|
| - if (slot >= reinterpret_cast<ObjectSlot>(NUMBER_OF_SLOT_TYPES)) {
|
| - DCHECK_NOT_NULL(*slot);
|
| - }
|
| -#endif
|
| - slots_[idx_++] = slot;
|
| - }
|
| -
|
| - ObjectSlot Get(intptr_t i) {
|
| - DCHECK(i >= 0 && i < kNumberOfElements);
|
| - return slots_[i];
|
| - }
|
| -
|
| - size_t Size() {
|
| - DCHECK(idx_ <= kNumberOfElements);
|
| - return idx_;
|
| - }
|
| -
|
| - enum SlotType {
|
| - EMBEDDED_OBJECT_SLOT,
|
| - OBJECT_SLOT,
|
| - RELOCATED_CODE_OBJECT,
|
| - CELL_TARGET_SLOT,
|
| - CODE_TARGET_SLOT,
|
| - CODE_ENTRY_SLOT,
|
| - DEBUG_TARGET_SLOT,
|
| - NUMBER_OF_SLOT_TYPES
|
| - };
|
| -
|
| - static const char* SlotTypeToString(SlotType type) {
|
| - switch (type) {
|
| - case EMBEDDED_OBJECT_SLOT:
|
| - return "EMBEDDED_OBJECT_SLOT";
|
| - case OBJECT_SLOT:
|
| - return "OBJECT_SLOT";
|
| - case RELOCATED_CODE_OBJECT:
|
| - return "RELOCATED_CODE_OBJECT";
|
| - case CELL_TARGET_SLOT:
|
| - return "CELL_TARGET_SLOT";
|
| - case CODE_TARGET_SLOT:
|
| - return "CODE_TARGET_SLOT";
|
| - case CODE_ENTRY_SLOT:
|
| - return "CODE_ENTRY_SLOT";
|
| - case DEBUG_TARGET_SLOT:
|
| - return "DEBUG_TARGET_SLOT";
|
| - case NUMBER_OF_SLOT_TYPES:
|
| - return "NUMBER_OF_SLOT_TYPES";
|
| - }
|
| - return "UNKNOWN SlotType";
|
| - }
|
| -
|
| - SlotsBuffer* next() { return next_; }
|
| -
|
| - static int SizeOfChain(SlotsBuffer* buffer) {
|
| - if (buffer == NULL) return 0;
|
| - return static_cast<int>(buffer->idx_ +
|
| - (buffer->chain_length_ - 1) * kNumberOfElements);
|
| - }
|
| -
|
| - inline bool IsFull() { return idx_ == kNumberOfElements; }
|
| -
|
| - inline bool HasSpaceForTypedSlot() { return idx_ < kNumberOfElements - 1; }
|
| -
|
| - enum AdditionMode { FAIL_ON_OVERFLOW, IGNORE_OVERFLOW };
|
| -
|
| - static bool ChainLengthThresholdReached(SlotsBuffer* buffer) {
|
| - return buffer != NULL && buffer->chain_length_ >= kChainLengthThreshold;
|
| - }
|
| -
|
| - INLINE(static bool AddTo(SlotsBufferAllocator* allocator,
|
| - SlotsBuffer** buffer_address, ObjectSlot slot,
|
| - AdditionMode mode)) {
|
| - SlotsBuffer* buffer = *buffer_address;
|
| - if (buffer == NULL || buffer->IsFull()) {
|
| - if (mode == FAIL_ON_OVERFLOW && ChainLengthThresholdReached(buffer)) {
|
| - allocator->DeallocateChain(buffer_address);
|
| - return false;
|
| - }
|
| - buffer = allocator->AllocateBuffer(buffer);
|
| - *buffer_address = buffer;
|
| - }
|
| - buffer->Add(slot);
|
| - return true;
|
| - }
|
| -
|
| - static bool IsTypedSlot(ObjectSlot slot);
|
| -
|
| - static bool AddTo(SlotsBufferAllocator* allocator,
|
| - SlotsBuffer** buffer_address, SlotType type, Address addr,
|
| - AdditionMode mode);
|
| -
|
| - // Eliminates all stale entries from the slots buffer, i.e., slots that
|
| - // are not part of live objects anymore. This method must be called after
|
| - // marking, when the whole transitive closure is known and must be called
|
| - // before sweeping when mark bits are still intact.
|
| - static void RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer);
|
| -
|
| - // Eliminate all slots that are within the given address range.
|
| - static void RemoveObjectSlots(Heap* heap, SlotsBuffer* buffer,
|
| - Address start_slot, Address end_slot);
|
| -
|
| - // Ensures that there are no invalid slots in the chain of slots buffers.
|
| - static void VerifySlots(Heap* heap, SlotsBuffer* buffer);
|
| -
|
| - static const int kNumberOfElements = 1021;
|
| -
|
| - private:
|
| - static const int kChainLengthThreshold = 15;
|
| -
|
| - intptr_t idx_;
|
| - intptr_t chain_length_;
|
| - SlotsBuffer* next_;
|
| - ObjectSlot slots_[kNumberOfElements];
|
| -};
|
| -
|
| -
|
| -} // namespace internal
|
| -} // namespace v8
|
| -
|
| -#endif // V8_HEAP_SLOTS_BUFFER_H_
|
|
|