%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
// 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_