%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/cppgc/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/cppgc/raw-heap.h |
// Copyright 2020 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_CPPGC_RAW_HEAP_H_ #define V8_HEAP_CPPGC_RAW_HEAP_H_ #include <iterator> #include <memory> #include <vector> #include "include/cppgc/heap.h" #include "src/base/logging.h" #include "src/base/macros.h" namespace cppgc { namespace internal { class HeapBase; class BaseSpace; // RawHeap is responsible for space management. class V8_EXPORT_PRIVATE RawHeap final { public: // Normal spaces are used to store objects of different size classes: // - kNormal1: < 32 bytes // - kNormal2: < 64 bytes // - kNormal3: < 128 bytes // - kNormal4: >= 128 bytes // // Objects of size greater than 2^16 get stored in the large space. // // Users can override where objects are allocated via cppgc::CustomSpace to // force allocation in a custom space. enum class RegularSpaceType : uint8_t { kNormal1, kNormal2, kNormal3, kNormal4, kLarge, }; static constexpr size_t kNumberOfRegularSpaces = static_cast<size_t>(RegularSpaceType::kLarge) + 1; using Spaces = std::vector<std::unique_ptr<BaseSpace>>; using iterator = Spaces::iterator; using const_iterator = Spaces::const_iterator; RawHeap(HeapBase* heap, const std::vector<std::unique_ptr<CustomSpaceBase>>& custom_spaces); RawHeap(const RawHeap&) = delete; RawHeap& operator=(const RawHeap&) = delete; ~RawHeap(); // Space iteration support. iterator begin() { return spaces_.begin(); } const_iterator begin() const { return spaces_.begin(); } iterator end() { return spaces_.end(); } const_iterator end() const { return spaces_.end(); } iterator custom_begin() { return std::next(begin(), kNumberOfRegularSpaces); } iterator custom_end() { return end(); } size_t size() const { return spaces_.size(); } BaseSpace* Space(RegularSpaceType type) { const size_t index = static_cast<size_t>(type); DCHECK_GT(kNumberOfRegularSpaces, index); return Space(index); } const BaseSpace* Space(RegularSpaceType space) const { return const_cast<RawHeap&>(*this).Space(space); } BaseSpace* CustomSpace(CustomSpaceIndex space_index) { return Space(SpaceIndexForCustomSpace(space_index)); } const BaseSpace* CustomSpace(CustomSpaceIndex space_index) const { return const_cast<RawHeap&>(*this).CustomSpace(space_index); } HeapBase* heap() { return main_heap_; } const HeapBase* heap() const { return main_heap_; } private: size_t SpaceIndexForCustomSpace(CustomSpaceIndex space_index) const { DCHECK_LT(space_index.value, spaces_.size() - kNumberOfRegularSpaces); return kNumberOfRegularSpaces + space_index.value; } BaseSpace* Space(size_t space_index) { DCHECK_GT(spaces_.size(), space_index); BaseSpace* space = spaces_[space_index].get(); DCHECK(space); return space; } const BaseSpace* Space(size_t space_index) const { return const_cast<RawHeap&>(*this).Space(space_index); } HeapBase* main_heap_; Spaces spaces_; }; } // namespace internal } // namespace cppgc #endif // V8_HEAP_CPPGC_RAW_HEAP_H_