// 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_NEW_SPACES_H_ #define V8_HEAP_NEW_SPACES_H_ #include <atomic> #include <memory> #include <numeric> #include <optional> #include "include/v8-internal.h" #include "src/base/logging.h" #include "src/base/macros.h" #include "src/base/platform/mutex.h" #include "src/common/globals.h" #include "src/heap/allocation-observer.h" #include "src/heap/heap-verifier.h" #include "src/heap/heap.h" #include "src/heap/paged-spaces.h" #include "src/heap/spaces.h" #include "src/objects/heap-object.h" namespace v8 { namespace internal { class Heap; class MutablePageMetadata; class SemiSpaceNewSpace; enum SemiSpaceId { … }; // ----------------------------------------------------------------------------- // SemiSpace in young generation // // A SemiSpace is a contiguous chunk of memory holding page-like memory chunks. // The mark-compact collector uses the memory of the first page in the from // space as a marking stack when tracing live objects. class SemiSpace final : public Space { … }; // A SemiSpaceObjectIterator is an ObjectIterator that iterates over the active // semispace of the heap's new space. class SemiSpaceObjectIterator : public ObjectIterator { … }; class NewSpace : NON_EXPORTED_BASE(public SpaceWithLinearArea) { … }; // ----------------------------------------------------------------------------- // The young generation space. // // The new space consists of a contiguous pair of semispaces. It simply // forwards most functions to the appropriate semispace. class V8_EXPORT_PRIVATE SemiSpaceNewSpace final : public NewSpace { … }; // ----------------------------------------------------------------------------- // PagedNewSpace class V8_EXPORT_PRIVATE PagedSpaceForNewSpace final : public PagedSpaceBase { … }; // TODO(v8:12612): PagedNewSpace is a bridge between the NewSpace interface and // the PagedSpaceForNewSpace implementation. Once we settle on a single new // space implementation, we can merge these 3 classes into 1. class V8_EXPORT_PRIVATE PagedNewSpace final : public NewSpace { … }; // For contiguous spaces, top should be in the space (or at the end) and limit // should be the end of the space. #define DCHECK_SEMISPACE_ALLOCATION_TOP(top, space) … } // namespace internal } // namespace v8 #endif // V8_HEAP_NEW_SPACES_H_