v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
maybe-handles-inl.h
Go to the documentation of this file.
1// Copyright 2018 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_HANDLES_MAYBE_HANDLES_INL_H_
6#define V8_HANDLES_MAYBE_HANDLES_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
11#include "src/base/macros.h"
13#include "src/objects/casting.h"
15
16namespace v8 {
17namespace internal {
18
19template <typename T>
21 : MaybeHandle(handle(object, isolate)) {}
22
23template <typename T>
25 : MaybeHandle(handle(object, local_heap)) {}
26
27template <typename T, typename U>
28inline bool Is(MaybeIndirectHandle<U> value) {
30 return !value.ToHandle(&handle) || Is<T>(handle);
31}
32template <typename To, typename From>
36
37template <typename T>
38template <typename S>
40 if (location_ == nullptr) {
41 *out = DirectHandle<T>::null();
42 return false;
43 } else {
45 return true;
46 }
47}
48
50 Isolate* isolate) {
51 Tagged<HeapObject> heap_object;
52 DCHECK(!object.IsCleared());
53 if (object.GetHeapObjectIfWeak(&heap_object)) {
54 handle_ = handle(heap_object, isolate);
55 reference_type_ = HeapObjectReferenceType::WEAK;
56 } else {
57 handle_ = handle(Cast<Object>(object), isolate);
58 reference_type_ = HeapObjectReferenceType::STRONG;
59 }
60}
61
63 LocalHeap* local_heap) {
64 Tagged<HeapObject> heap_object;
65 DCHECK(!object.IsCleared());
66 if (object.GetHeapObjectIfWeak(&heap_object)) {
67 handle_ = handle(heap_object, local_heap);
68 reference_type_ = HeapObjectReferenceType::WEAK;
69 } else {
70 handle_ = handle(Cast<Object>(object), local_heap);
71 reference_type_ = HeapObjectReferenceType::STRONG;
72 }
73}
74
76 : reference_type_(HeapObjectReferenceType::STRONG), handle_(object) {}
77
79 : reference_type_(HeapObjectReferenceType::STRONG),
80 handle_(object, isolate) {}
81
83 : reference_type_(HeapObjectReferenceType::STRONG),
84 handle_(object, isolate) {}
85
87 LocalHeap* local_heap)
88 : reference_type_(HeapObjectReferenceType::STRONG),
89 handle_(object, local_heap) {}
90
92 : reference_type_(HeapObjectReferenceType::STRONG),
93 handle_(object, local_heap) {}
94
96 HeapObjectReferenceType reference_type,
97 Isolate* isolate)
98 : reference_type_(reference_type), handle_(handle(object, isolate)) {}
99
101 HeapObjectReferenceType reference_type)
102 : reference_type_(reference_type), handle_(object) {}
103
105 return MaybeObjectHandle(object, HeapObjectReferenceType::WEAK);
106}
107
109 Isolate* isolate) {
110 return MaybeObjectHandle(object, HeapObjectReferenceType::WEAK, isolate);
111}
112
114 Handle<Object> this_handle;
115 Handle<Object> other_handle;
116 return reference_type_ == other.reference_type_ &&
117 handle_.ToHandle(&this_handle) ==
118 other.handle_.ToHandle(&other_handle) &&
119 this_handle.is_identical_to(other_handle);
120}
121
123 if (reference_type_ == HeapObjectReferenceType::WEAK) {
124 return MakeWeak(*handle_.ToHandleChecked());
125 } else {
126 return *handle_.ToHandleChecked();
127 }
128}
129
131 if (reference_type_ == HeapObjectReferenceType::WEAK) {
132 return MakeWeak(*handle_.ToHandleChecked());
133 } else {
134 return *handle_.ToHandleChecked();
135 }
136}
137
139 return handle_.ToHandleChecked();
140}
141
143 return MaybeObjectHandle(object, isolate);
144}
145
147 LocalHeap* local_heap) {
148 return MaybeObjectHandle(object, local_heap);
149}
150
151template <typename T>
152inline std::ostream& operator<<(std::ostream& os,
154 if (handle.is_null()) return os << "null";
155 return os << handle.ToHandleChecked();
156}
157
158#ifdef V8_ENABLE_DIRECT_HANDLE
159
160template <typename T>
161MaybeDirectHandle<T>::MaybeDirectHandle(Tagged<T> object, Isolate* isolate)
162 : MaybeDirectHandle(direct_handle(object, isolate)) {}
163
164template <typename T>
165MaybeDirectHandle<T>::MaybeDirectHandle(Tagged<T> object, LocalHeap* local_heap)
166 : MaybeDirectHandle(direct_handle(object, local_heap)) {}
167
168template <typename T, typename U>
169inline bool Is(MaybeDirectHandle<U> value) {
170 DirectHandle<U> handle;
171 return !value.ToHandle(&handle) || Is<T>(handle);
172}
173
174template <typename To, typename From>
175inline MaybeDirectHandle<To> UncheckedCast(MaybeDirectHandle<From> value) {
176 return MaybeDirectHandle<To>(value.location_);
177}
178
179#else
180
181template <typename T, typename U>
182inline bool Is(MaybeDirectHandle<U> value) {
184 return !value.ToHandle(&handle) || Is<T>(handle);
185}
186
187template <typename To, typename From>
189 return MaybeDirectHandle<To>(UncheckedCast<To>(value.handle_));
190}
191
192#endif // V8_ENABLE_DIRECT_HANDLE
193
194template <typename T>
195inline std::ostream& operator<<(std::ostream& os, MaybeDirectHandle<T> handle) {
196 if (handle.is_null()) return os << "null";
197 return os << handle.ToHandleChecked();
198}
199
200MaybeObjectDirectHandle::MaybeObjectDirectHandle(Tagged<MaybeObject> object,
201 Isolate* isolate) {
202 Tagged<HeapObject> heap_object;
203 DCHECK(!object.IsCleared());
204 if (object.GetHeapObjectIfWeak(&heap_object)) {
205 handle_ = direct_handle(heap_object, isolate);
206 reference_type_ = HeapObjectReferenceType::WEAK;
207 } else {
208 handle_ = direct_handle(Cast<Object>(object), isolate);
209 reference_type_ = HeapObjectReferenceType::STRONG;
210 }
211}
212
213MaybeObjectDirectHandle::MaybeObjectDirectHandle(Tagged<MaybeObject> object,
214 LocalHeap* local_heap) {
215 Tagged<HeapObject> heap_object;
216 DCHECK(!object.IsCleared());
217 if (object.GetHeapObjectIfWeak(&heap_object)) {
218 handle_ = direct_handle(heap_object, local_heap);
219 reference_type_ = HeapObjectReferenceType::WEAK;
220 } else {
221 handle_ = direct_handle(Cast<Object>(object), local_heap);
222 reference_type_ = HeapObjectReferenceType::STRONG;
223 }
224}
225
226MaybeObjectDirectHandle::MaybeObjectDirectHandle(Tagged<Object> object,
227 Isolate* isolate)
228 : reference_type_(HeapObjectReferenceType::STRONG),
229 handle_(object, isolate) {}
230
232 Isolate* isolate)
233 : reference_type_(HeapObjectReferenceType::STRONG),
234 handle_(object, isolate) {}
235
237 LocalHeap* local_heap)
238 : reference_type_(HeapObjectReferenceType::STRONG),
239 handle_(object, local_heap) {}
240
242 LocalHeap* local_heap)
243 : reference_type_(HeapObjectReferenceType::STRONG),
244 handle_(object, local_heap) {}
245
247 Tagged<Object> object, HeapObjectReferenceType reference_type,
248 Isolate* isolate)
249 : reference_type_(reference_type), handle_(object, isolate) {}
250
252 : reference_type_(object.reference_type_), handle_(object.handle_) {}
253
255 Isolate* isolate) {
256 return MaybeObjectDirectHandle(object, HeapObjectReferenceType::WEAK,
257 isolate);
258}
259
261 const MaybeObjectDirectHandle& other) const {
262 DirectHandle<Object> this_handle;
263 DirectHandle<Object> other_handle;
264 return reference_type_ == other.reference_type_ &&
265 handle_.ToHandle(&this_handle) ==
266 other.handle_.ToHandle(&other_handle) &&
267 this_handle.is_identical_to(other_handle);
268}
269
271 const MaybeObjectHandle& other) const {
272 DirectHandle<Object> this_handle;
273 Handle<Object> other_handle;
274 return reference_type_ == other.reference_type_ &&
275 handle_.ToHandle(&this_handle) ==
276 other.handle_.ToHandle(&other_handle) &&
277 this_handle.is_identical_to(other_handle);
278}
279
281 if (reference_type_ == HeapObjectReferenceType::WEAK) {
282 return MakeWeak(*handle_.ToHandleChecked());
283 } else {
284 return *handle_.ToHandleChecked();
285 }
286}
287
289 if (reference_type_ == HeapObjectReferenceType::WEAK) {
290 return MakeWeak(*handle_.ToHandleChecked());
291 } else {
292 return *handle_.ToHandleChecked();
294}
295
296template <typename T>
298 MaybeDirectHandle<T> maybe_handle, Isolate* isolate) {
299#ifdef V8_ENABLE_DIRECT_HANDLE
300 if (DirectHandle<T> handle; maybe_handle.ToHandle(&handle))
301 return indirect_handle(handle, isolate);
302 return {};
303#else
304 return maybe_handle.handle_;
305#endif
306}
307
308template <typename T>
310 MaybeDirectHandle<T> maybe_handle, LocalIsolate* isolate) {
311#ifdef V8_ENABLE_DIRECT_HANDLE
312 if (DirectHandle<T> handle; maybe_handle.ToHandle(&handle))
313 return indirect_handle(handle, isolate);
314 return {};
315#else
316 return maybe_handle.handle_;
317#endif
318}
319
320} // namespace internal
321} // namespace v8
322
323#endif // V8_HANDLES_MAYBE_HANDLES_INL_H_
static V8_INLINE const DirectHandle null()
Definition handles.h:661
V8_INLINE bool is_identical_to(Handle< S > other) const
Definition handles.h:716
IndirectHandle< T > handle_
Definition handles.h:753
V8_INLINE bool is_identical_to(const HandleBase &that) const
Definition handles-inl.h:36
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(DirectHandle< S > *out) const
MaybeIndirectHandle< T > handle_
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(Handle< S > *out) const
bool is_identical_to(const MaybeObjectDirectHandle &other) const
MaybeDirectHandle< Object > handle_
Tagged< MaybeObject > operator*() const
HeapObjectReferenceType reference_type_
Tagged< MaybeObject > operator->() const
static MaybeObjectDirectHandle Weak(Tagged< Object > object, Isolate *isolate)
HeapObjectReferenceType reference_type_
bool is_identical_to(const MaybeObjectHandle &other) const
static MaybeObjectHandle Weak(Tagged< Object > object, Isolate *isolate)
Tagged< MaybeObject > operator->() const
IndirectHandle< Object > object() const
Tagged< MaybeObject > operator*() const
MaybeHandle< Object > handle_
STRONG
Definition globals.h:1033
LinkageLocation location_
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
Definition handles-inl.h:72
bool Is(IndirectHandle< U > value)
Definition handles-inl.h:51
MaybeHandle< T > MaybeIndirectHandle
Definition globals.h:1109
V8_INLINE IndirectHandle< T > indirect_handle(DirectHandle< T > handle)
Definition handles.h:757
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
std::ostream & operator<<(std::ostream &os, AtomicMemoryOrder order)
Handle< To > UncheckedCast(Handle< From > value)
Definition handles-inl.h:55
Tagged< MaybeWeak< T > > MakeWeak(Tagged< T > value)
Definition tagged.h:893
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
std::ostream & operator<<(std::ostream &os, const Operation &operation)
Definition operation.h:49
#define DCHECK(condition)
Definition logging.h:482
#define V8_INLINE
Definition v8config.h:500
WasmOrphanedGlobalHandle * handle_