v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
paged-spaces-inl.h
Go to the documentation of this file.
1// Copyright 2020 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_HEAP_PAGED_SPACES_INL_H_
6#define V8_HEAP_PAGED_SPACES_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
11#include "src/common/globals.h"
12#include "src/heap/heap-inl.h"
16
17namespace v8 {
18namespace internal {
19
21
23 : cage_base_(page->heap()->isolate()),
24 cur_addr_(page->area_start()),
25 cur_end_(page->area_end()) {
27}
28
30 DCHECK_GT(cur_size_, 0);
31 cur_addr_ += cur_size_;
32 AdvanceToNextObject();
33 return *this;
34}
35
37 iterator retval = *this;
38 ++(*this);
39 return retval;
40}
41
44 while (cur_addr_ != cur_end_) {
47 cur_size_ = ALIGN_TO_ALLOCATION_ALIGNMENT(obj->Size(cage_base()));
48 DCHECK_LE(cur_addr_ + cur_size_, cur_end_);
49 if (IsFreeSpaceOrFiller(obj, cage_base())) {
50 cur_addr_ += cur_size_;
51 } else {
52 if (IsInstructionStream(obj, cage_base())) {
53 DCHECK_EQ(PageMetadata::FromHeapObject(obj)->owner_identity(),
55 DCHECK_CODEOBJECT_SIZE(cur_size_);
56 } else {
57 DCHECK_OBJECT_SIZE(cur_size_);
58 }
59 return;
60 }
61 }
63}
64
66
68
70 do {
71 if (cur_ != end_) {
72 return *cur_++;
73 }
74 } while (AdvanceToNextPage());
75 return Tagged<HeapObject>();
76}
77
79 return PageMetadata::FromAddress(addr)->owner() == this;
80}
81
83 if (!IsHeapObject(o)) return false;
84 return PageMetadata::FromAddress(o.ptr())->owner() == this;
85}
86
87template <bool during_sweep>
88size_t PagedSpaceBase::FreeInternal(Address start, size_t size_in_bytes) {
89 if (size_in_bytes == 0) return 0;
90 size_t wasted;
91 if (executable_) {
92 WritableJitPage jit_page(start, size_in_bytes);
93 WritableFreeSpace free_space = jit_page.FreeRange(start, size_in_bytes);
94 heap()->CreateFillerObjectAtBackground(free_space);
95 wasted = free_list_->Free(
96 free_space, during_sweep ? kDoNotLinkCategory : kLinkCategory);
97 } else {
98 WritableFreeSpace free_space =
100 heap()->CreateFillerObjectAtBackground(free_space);
101 wasted = free_list_->Free(
102 free_space, during_sweep ? kDoNotLinkCategory : kLinkCategory);
103 }
104
105 if constexpr (!during_sweep) {
107 accounting_stats_.DecreaseAllocatedBytes(size_in_bytes, page);
108 free_list()->increase_wasted_bytes(wasted);
109 }
110
111 DCHECK_GE(size_in_bytes, wasted);
112 return size_in_bytes - wasted;
113}
114
115size_t PagedSpaceBase::Free(Address start, size_t size_in_bytes) {
116 return FreeInternal</*during_sweep=*/false>(start, size_in_bytes);
117}
118
119size_t PagedSpaceBase::FreeDuringSweep(Address start, size_t size_in_bytes) {
120 return FreeInternal</*during_sweep=*/true>(start, size_in_bytes);
121}
122
123} // namespace internal
124} // namespace v8
125
126#endif // V8_HEAP_PAGED_SPACES_INL_H_
const PageMetadata *const page_
static Tagged< HeapObject > FromAddress(Address address)
static V8_INLINE PageMetadata * FromHeapObject(Tagged< HeapObject > o)
static V8_INLINE PageMetadata * FromAddress(Address addr)
V8_INLINE size_t Free(Address start, size_t size_in_bytes)
V8_INLINE size_t FreeInternal(Address start, size_t size_in_bytes)
bool Contains(Address a) const
V8_INLINE size_t FreeDuringSweep(Address start, size_t size_in_bytes)
Tagged< HeapObject > Next() override
V8_INLINE constexpr StorageType ptr() const
static V8_INLINE WritableFreeSpace ForNonExecutableMemory(base::Address addr, size_t size)
V8_INLINE WritableFreeSpace FreeRange(Address addr, size_t size)
#define ALIGN_TO_ALLOCATION_ALIGNMENT(value)
Definition globals.h:1796
FreeList & free_list_
Definition sweeper.cc:156
const v8::base::TimeTicks end_
Definition sweeper.cc:54
int start
@ kDoNotLinkCategory
Definition free-list.h:42
kInterpreterTrampolineOffset Tagged< HeapObject >
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
Definition objects.h:669
static constexpr Address kNullAddress
Definition v8-internal.h:53
Address cur_addr_
Address cur_end_
#define DCHECK_CODEOBJECT_SIZE(size)
Definition spaces.h:54
#define DCHECK_OBJECT_SIZE(size)
Definition spaces.h:51
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK_GE(v1, v2)
Definition logging.h:488
#define DCHECK_LT(v1, v2)
Definition logging.h:489
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define DCHECK_GT(v1, v2)
Definition logging.h:487