%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/marking.cc |
// Copyright 2017 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/marking-inl.h" namespace v8 { namespace internal { namespace { constexpr MarkBit::CellType kAllBitsSetInCellValue = std::numeric_limits<MarkBit::CellType>::max(); } bool MarkingBitmap::AllBitsSetInRange(MarkBitIndex start_index, MarkBitIndex end_index) const { if (start_index >= end_index) return false; end_index--; const CellIndex start_cell_index = IndexToCell(start_index); MarkBit::CellType start_index_mask = IndexInCellMask(start_index); const CellIndex end_cell_index = IndexToCell(end_index); MarkBit::CellType end_index_mask = IndexInCellMask(end_index); MarkBit::CellType matching_mask; if (start_cell_index != end_cell_index) { matching_mask = ~(start_index_mask - 1); if ((cells()[start_cell_index] & matching_mask) != matching_mask) { return false; } for (unsigned int i = start_cell_index + 1; i < end_cell_index; i++) { if (cells()[i] != kAllBitsSetInCellValue) return false; } matching_mask = end_index_mask | (end_index_mask - 1); return ((cells()[end_cell_index] & matching_mask) == matching_mask); } else { matching_mask = end_index_mask | (end_index_mask - start_index_mask); return (cells()[end_cell_index] & matching_mask) == matching_mask; } } bool MarkingBitmap::AllBitsClearInRange(MarkBitIndex start_index, MarkBitIndex end_index) const { if (start_index >= end_index) return true; end_index--; const CellIndex start_cell_index = IndexToCell(start_index); MarkBit::CellType start_index_mask = IndexInCellMask(start_index); const CellIndex end_cell_index = IndexToCell(end_index); MarkBit::CellType end_index_mask = IndexInCellMask(end_index); MarkBit::CellType matching_mask; if (start_cell_index != end_cell_index) { matching_mask = ~(start_index_mask - 1); if ((cells()[start_cell_index] & matching_mask)) return false; for (size_t i = start_cell_index + 1; i < end_cell_index; i++) { if (cells()[i]) return false; } matching_mask = end_index_mask | (end_index_mask - 1); return !(cells()[end_cell_index] & matching_mask); } else { matching_mask = end_index_mask | (end_index_mask - start_index_mask); return !(cells()[end_cell_index] & matching_mask); } } namespace { void PrintWord(MarkBit::CellType word, MarkBit::CellType himask = 0) { for (MarkBit::CellType mask = 1; mask != 0; mask <<= 1) { if ((mask & himask) != 0) PrintF("["); PrintF((mask & word) ? "1" : "0"); if ((mask & himask) != 0) PrintF("]"); } } class CellPrinter final { public: CellPrinter() = default; void Print(size_t pos, MarkBit::CellType cell) { if (cell == seq_type) { seq_length++; return; } Flush(); if (IsSeq(cell)) { seq_start = pos; seq_length = 0; seq_type = cell; return; } PrintF("%zu: ", pos); PrintWord(cell); PrintF("\n"); } void Flush() { if (seq_length > 0) { PrintF("%zu: %dx%zu\n", seq_start, seq_type == 0 ? 0 : 1, seq_length * MarkingBitmap::kBitsPerCell); seq_length = 0; } } static bool IsSeq(MarkBit::CellType cell) { return cell == 0 || cell == kAllBitsSetInCellValue; } private: size_t seq_start = 0; MarkBit::CellType seq_type = 0; size_t seq_length = 0; }; } // anonymous namespace void MarkingBitmap::Print() const { CellPrinter printer; for (size_t i = 0; i < kCellsCount; i++) { printer.Print(i, cells()[i]); } printer.Flush(); PrintF("\n"); } bool MarkingBitmap::IsClean() const { for (size_t i = 0; i < kCellsCount; i++) { if (cells()[i] != 0) { return false; } } return true; } // static MarkBit MarkBit::FromForTesting(Address address) { return MarkingBitmap::MarkBitFromAddress(address); } // static MarkBit MarkBit::FromForTesting(Tagged<HeapObject> heap_object) { return MarkingBitmap::MarkBitFromAddress(heap_object.ptr()); } } // namespace internal } // namespace v8