| Index: src/heap/spaces.h
|
| diff --git a/src/heap/spaces.h b/src/heap/spaces.h
|
| index 342ea79ad5f96f296aa08876e5ea7729c303ef74..84c6d68bcc162051d2e5336105554eea003b4be5 100644
|
| --- a/src/heap/spaces.h
|
| +++ b/src/heap/spaces.h
|
| @@ -14,6 +14,7 @@
|
| #include "src/base/hashmap.h"
|
| #include "src/base/platform/mutex.h"
|
| #include "src/flags.h"
|
| +#include "src/heap/marking.h"
|
| #include "src/list.h"
|
| #include "src/objects.h"
|
| #include "src/utils.h"
|
| @@ -110,187 +111,6 @@ class Space;
|
| #define DCHECK_PAGE_OFFSET(offset) \
|
| DCHECK((Page::kObjectStartOffset <= offset) && (offset <= Page::kPageSize))
|
|
|
| -class MarkBit {
|
| - public:
|
| - typedef uint32_t CellType;
|
| -
|
| - inline MarkBit(CellType* cell, CellType mask) : cell_(cell), mask_(mask) {}
|
| -
|
| -#ifdef DEBUG
|
| - bool operator==(const MarkBit& other) {
|
| - return cell_ == other.cell_ && mask_ == other.mask_;
|
| - }
|
| -#endif
|
| -
|
| - private:
|
| - inline CellType* cell() { return cell_; }
|
| - inline CellType mask() { return mask_; }
|
| -
|
| - inline MarkBit Next() {
|
| - CellType new_mask = mask_ << 1;
|
| - if (new_mask == 0) {
|
| - return MarkBit(cell_ + 1, 1);
|
| - } else {
|
| - return MarkBit(cell_, new_mask);
|
| - }
|
| - }
|
| -
|
| - inline void Set() { *cell_ |= mask_; }
|
| - inline bool Get() { return (*cell_ & mask_) != 0; }
|
| - inline void Clear() { *cell_ &= ~mask_; }
|
| -
|
| - CellType* cell_;
|
| - CellType mask_;
|
| -
|
| - friend class Marking;
|
| -};
|
| -
|
| -
|
| -// Bitmap is a sequence of cells each containing fixed number of bits.
|
| -class Bitmap {
|
| - public:
|
| - static const uint32_t kBitsPerCell = 32;
|
| - static const uint32_t kBitsPerCellLog2 = 5;
|
| - static const uint32_t kBitIndexMask = kBitsPerCell - 1;
|
| - static const uint32_t kBytesPerCell = kBitsPerCell / kBitsPerByte;
|
| - static const uint32_t kBytesPerCellLog2 = kBitsPerCellLog2 - kBitsPerByteLog2;
|
| -
|
| - static const size_t kLength = (1 << kPageSizeBits) >> (kPointerSizeLog2);
|
| -
|
| - static const size_t kSize =
|
| - (1 << kPageSizeBits) >> (kPointerSizeLog2 + kBitsPerByteLog2);
|
| -
|
| -
|
| - static int CellsForLength(int length) {
|
| - return (length + kBitsPerCell - 1) >> kBitsPerCellLog2;
|
| - }
|
| -
|
| - int CellsCount() { return CellsForLength(kLength); }
|
| -
|
| - static int SizeFor(int cells_count) {
|
| - return sizeof(MarkBit::CellType) * cells_count;
|
| - }
|
| -
|
| - INLINE(static uint32_t IndexToCell(uint32_t index)) {
|
| - return index >> kBitsPerCellLog2;
|
| - }
|
| -
|
| - V8_INLINE static uint32_t IndexInCell(uint32_t index) {
|
| - return index & kBitIndexMask;
|
| - }
|
| -
|
| - INLINE(static uint32_t CellToIndex(uint32_t index)) {
|
| - return index << kBitsPerCellLog2;
|
| - }
|
| -
|
| - INLINE(static uint32_t CellAlignIndex(uint32_t index)) {
|
| - return (index + kBitIndexMask) & ~kBitIndexMask;
|
| - }
|
| -
|
| - INLINE(MarkBit::CellType* cells()) {
|
| - return reinterpret_cast<MarkBit::CellType*>(this);
|
| - }
|
| -
|
| - INLINE(Address address()) { return reinterpret_cast<Address>(this); }
|
| -
|
| - INLINE(static Bitmap* FromAddress(Address addr)) {
|
| - return reinterpret_cast<Bitmap*>(addr);
|
| - }
|
| -
|
| - inline MarkBit MarkBitFromIndex(uint32_t index) {
|
| - MarkBit::CellType mask = 1u << IndexInCell(index);
|
| - MarkBit::CellType* cell = this->cells() + (index >> kBitsPerCellLog2);
|
| - return MarkBit(cell, mask);
|
| - }
|
| -
|
| - static inline void Clear(MemoryChunk* chunk);
|
| -
|
| - static inline void SetAllBits(MemoryChunk* chunk);
|
| -
|
| - static void PrintWord(uint32_t word, uint32_t himask = 0) {
|
| - for (uint32_t mask = 1; mask != 0; mask <<= 1) {
|
| - if ((mask & himask) != 0) PrintF("[");
|
| - PrintF((mask & word) ? "1" : "0");
|
| - if ((mask & himask) != 0) PrintF("]");
|
| - }
|
| - }
|
| -
|
| - class CellPrinter {
|
| - public:
|
| - CellPrinter() : seq_start(0), seq_type(0), seq_length(0) {}
|
| -
|
| - void Print(uint32_t pos, uint32_t cell) {
|
| - if (cell == seq_type) {
|
| - seq_length++;
|
| - return;
|
| - }
|
| -
|
| - Flush();
|
| -
|
| - if (IsSeq(cell)) {
|
| - seq_start = pos;
|
| - seq_length = 0;
|
| - seq_type = cell;
|
| - return;
|
| - }
|
| -
|
| - PrintF("%d: ", pos);
|
| - PrintWord(cell);
|
| - PrintF("\n");
|
| - }
|
| -
|
| - void Flush() {
|
| - if (seq_length > 0) {
|
| - PrintF("%d: %dx%d\n", seq_start, seq_type == 0 ? 0 : 1,
|
| - seq_length * kBitsPerCell);
|
| - seq_length = 0;
|
| - }
|
| - }
|
| -
|
| - static bool IsSeq(uint32_t cell) { return cell == 0 || cell == 0xFFFFFFFF; }
|
| -
|
| - private:
|
| - uint32_t seq_start;
|
| - uint32_t seq_type;
|
| - uint32_t seq_length;
|
| - };
|
| -
|
| - void Print() {
|
| - CellPrinter printer;
|
| - for (int i = 0; i < CellsCount(); i++) {
|
| - printer.Print(i, cells()[i]);
|
| - }
|
| - printer.Flush();
|
| - PrintF("\n");
|
| - }
|
| -
|
| - bool IsClean() {
|
| - for (int i = 0; i < CellsCount(); i++) {
|
| - if (cells()[i] != 0) {
|
| - return false;
|
| - }
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - // Clears all bits starting from {cell_base_index} up to and excluding
|
| - // {index}. Note that {cell_base_index} is required to be cell aligned.
|
| - void ClearRange(uint32_t cell_base_index, uint32_t index) {
|
| - DCHECK_EQ(IndexInCell(cell_base_index), 0u);
|
| - DCHECK_GE(index, cell_base_index);
|
| - uint32_t start_cell_index = IndexToCell(cell_base_index);
|
| - uint32_t end_cell_index = IndexToCell(index);
|
| - DCHECK_GE(end_cell_index, start_cell_index);
|
| - // Clear all cells till the cell containing the last index.
|
| - for (uint32_t i = start_cell_index; i < end_cell_index; i++) {
|
| - cells()[i] = 0;
|
| - }
|
| - // Clear all bits in the last cell till the last bit before index.
|
| - uint32_t clear_mask = ~((1u << IndexInCell(index)) - 1);
|
| - cells()[end_cell_index] &= clear_mask;
|
| - }
|
| -};
|
| -
|
| enum FreeListCategoryType {
|
| kTiniest,
|
| kTiny,
|
| @@ -697,6 +517,8 @@ class MemoryChunk {
|
| return this->address() + (index << kPointerSizeLog2);
|
| }
|
|
|
| + void ClearLiveness();
|
| +
|
| void PrintMarkbits() { markbits()->Print(); }
|
|
|
| void SetFlag(int flag) { flags_ |= static_cast<uintptr_t>(1) << flag; }
|
|
|