5#ifndef INCLUDE_V8_LOCAL_HANDLE_H_
6#define INCLUDE_V8_LOCAL_HANDLE_H_
33class NonCopyablePersistentTraits;
36template <
class T,
class M = NonCopyablePersistentTraits<T>>
53template <
class F1,
class F2,
class F3>
70class ConsoleCallArguments;
78class SamplingHeapProfiler;
85#ifdef V8_ENABLE_CHECKS
86template <
typename T,
typename V =
Value>
106
107
108
109
110
111
112
113
114
115
116
117
118
126
127
151 void DeleteExtensions(
Isolate* isolate);
153#ifdef V8_ENABLE_CHECKS
166 void* operator
new(size_t size);
167 void* operator
new[](size_t size);
168 void operator
delete(
void*, size_t);
169 void operator
delete[](
void*, size_t);
174#ifdef V8_ENABLE_CHECKS
179 template <
typename T>
193 isolate_ = v8_isolate;
194 prev_next_ = current
->next;
197#ifdef V8_ENABLE_CHECKS
198 DoInitializeAsserts(v8_isolate);
199 scope_level_ = current->level;
205#ifdef V8_ENABLE_CHECKS
206 AssertScopeLevelsMatch();
207 int handle_count_before = NumberOfHandles(isolate_);
212 std::swap(current
->next, prev_next_);
218 DeleteExtensions(isolate_);
220#ifdef V8_ENABLE_CHECKS
221 DoCloseScopeAsserts(handle_count_before, limit, current);
233 result = Extend(v8_isolate);
244
245
246
247
248
249#ifdef V8_ENABLE_DIRECT_HANDLE
260#ifdef V8_ENABLE_CHECKS
265 template <
typename S>
300#ifdef V8_ENABLE_CHECKS
301 if (!IsEmpty()) api_internal::TypeCheckLocal<T>(value<Value>());
305 template <
typename S>
315 internal::ValueHelper::ValueAsAddress(that));
323 internal::ValueHelper::InternalRepresentationType repr) {
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
361#ifdef V8_ENABLE_LOCAL_OFF_STACK_CHECK
369
370
374
375
376
377
387
388
389
390
391
392
393
394
395
418
419
420
421
424#ifdef V8_ENABLE_CHECKS
434
435
436
437
444
445
446
447
473 template <
class F,
class M>
492 friend class InternalEscapableScope;
493 template <
class F1,
class F2,
class F3>
501 friend class debug::ConsoleCallArguments;
502 friend class internal::LocalUnchecked<T>;
504 explicit Local(no_checking_tag do_not_check)
505 :
LocalBase<T>(), StackAllocated(do_not_check) {}
506 explicit Local(
const Local<T>& other, no_checking_tag do_not_check)
507 :
LocalBase<T>(other), StackAllocated(do_not_check) {}
512 internal::ValueHelper::InternalRepresentationType repr) {
520#ifdef V8_ENABLE_DIRECT_HANDLE
555 const LocalUnchecked& other)
noexcept
556 : Local<T>(other, Local<T>::do_not_check) {}
557 LocalUnchecked& operator=(
const LocalUnchecked&)
noexcept =
default;
565#ifdef V8_ENABLE_DIRECT_HANDLE
579 template <
typename U>
596 using element_type =
internal::LocalUnchecked<T>;
598#ifdef V8_ENABLE_DIRECT_HANDLE
599 using allocator_type = internal::StrongRootAllocator<element_type>;
601 static allocator_type make_allocator(Isolate* isolate)
noexcept {
602 return allocator_type(isolate);
605 using allocator_type = std::allocator<element_type>;
607 static allocator_type make_allocator(
Isolate* isolate)
noexcept {
608 return allocator_type();
612 using vector_type = std::vector<element_type, allocator_type>;
616 using reference = value_type&;
617 using const_reference =
const value_type&;
618 using size_type = size_t;
619 using difference_type = ptrdiff_t;
622 using const_iterator =
628 : backing_(n, make_allocator(isolate)) {}
630 : backing_(make_allocator(isolate)) {
631 if (init.size() == 0)
return;
632 backing_.reserve(init.size());
633 backing_.insert(backing_.end(), init.begin(), init.end());
636 iterator
begin()
noexcept {
return iterator(backing_.begin()); }
637 const_iterator
begin()
const noexcept {
638 return const_iterator(backing_.begin());
640 iterator
end()
noexcept {
return iterator(backing_.end()); }
641 const_iterator
end()
const noexcept {
return const_iterator(backing_.end()); }
644 bool empty()
const noexcept {
return backing_.empty(); }
645 void reserve(size_t n) { backing_.reserve(n); }
651 Local<T>&
at(size_t n) {
return backing_.at(n); }
652 const Local<T>&
at(size_t n)
const {
return backing_.at(n); }
657 const Local<T>&
back()
const {
return backing_.back(); }
660 const Local<T>*
data()
const noexcept {
return backing_.data(); }
663 return iterator(backing_.insert(pos.base(), value));
666 template <
typename InputIt>
667 iterator
insert(const_iterator pos, InputIt first, InputIt last) {
668 return iterator(backing_.insert(pos.base(), first, last));
671 iterator
insert(const_iterator pos, std::initializer_list<
Local<T>> init) {
672 return iterator(backing_.insert(pos.base(), init.begin(), init.end()));
677 backing_.reserve(init.size());
678 backing_.insert(backing_.end(), init.begin(), init.end());
685 template <
typename... Args>
687 backing_.push_back(value_type{std::forward<Args>(args)...});
690 void clear()
noexcept { backing_.clear(); }
691 void resize(size_t n) { backing_.resize(n); }
692 void swap(LocalVector<T>& other) { backing_.swap(other.backing_); }
694 friend bool operator==(
const LocalVector<T>& x,
const LocalVector<T>& y) {
695 return x.backing_ == y.backing_;
697 friend bool operator!=(
const LocalVector<T>& x,
const LocalVector<T>& y) {
698 return x.backing_ != y.backing_;
700 friend bool operator<(
const LocalVector<T>& x,
const LocalVector<T>& y) {
701 return x.backing_ < y.backing_;
703 friend bool operator>(
const LocalVector<T>& x,
const LocalVector<T>& y) {
704 return x.backing_ > y.backing_;
706 friend bool operator<=(
const LocalVector<T>& x,
const LocalVector<T>& y) {
707 return x.backing_ <= y.backing_;
709 friend bool operator>=(
const LocalVector<T>& x,
const LocalVector<T>& y) {
710 return x.backing_ >= y.backing_;
714 vector_type backing_;
717#if !defined(V8_IMMINENT_DEPRECATION_WARNINGS)
724
725
726
727
728
729
730
731
732
737
738
741
742
747
748
756
757
758
766
767
768
775
776
777
784
785
786
787
794
795
796
797
806 template <
typename S>
811
812
813
828
829
830
845#ifdef V8_ENABLE_DIRECT_HANDLE
848 if (value.IsEmpty())
return value;
855 return Escape(value.FromMaybe(
Local<T>()));
860
861
862
863
877 internal::Isolate*
const i_isolate_;
879 int prev_sealed_level_;
friend class TracedReference
friend class BasicTracedReference
EscapableHandleScopeBase(const EscapableHandleScopeBase &)=delete
internal::Address * EscapeSlot(internal::Address *escape_value)
EscapableHandleScopeBase(Isolate *isolate)
void * operator new(size_t size)=delete
void operator=(const EscapableHandleScopeBase &)=delete
void operator delete(void *, size_t)=delete
void operator delete[](void *, size_t)=delete
void * operator new[](size_t size)=delete
V8_INLINE ~EscapableHandleScopeBase()=default
V8_INLINE Local< T > Escape(Local< T > value)
EscapableHandleScope(Isolate *isolate)
V8_INLINE MaybeLocal< T > EscapeMaybe(MaybeLocal< T > value)
V8_INLINE ~EscapableHandleScope()=default
V8_INLINE void Initialize(Isolate *isolate)
V8_INLINE HandleScope()=default
static int NumberOfHandles(Isolate *isolate)
V8_INLINE Isolate * GetIsolate() const
static V8_INLINE internal::Address * CreateHandle(Isolate *i_isolate, internal::Address value)
HandleScope(const HandleScope &)=delete
static internal::Address * CreateHandleForCurrentIsolate(internal::Address value)
V8_INLINE HandleScope(Isolate *isolate)
void operator=(const HandleScope &)=delete
V8_INLINE LocalBase(internal::Address *location)
V8_INLINE LocalBase(const LocalBase< S > &other)
V8_INLINE LocalBase()=default
static V8_INLINE LocalBase< T > FromRepr(internal::ValueHelper::InternalRepresentationType repr)
static V8_INLINE LocalBase< T > New(Isolate *isolate, T *that)
static V8_INLINE LocalBase< T > New(Isolate *isolate, internal::Address value)
static V8_INLINE LocalBase< T > FromSlot(internal::Address *slot)
friend Local< Primitive > Null(Isolate *isolate)
friend class internal::CustomArguments
friend Local< Boolean > False(Isolate *isolate)
friend Local< Primitive > Undefined(Isolate *isolate)
friend Local< Boolean > True(Isolate *isolate)
V8_INLINE Local()=default
friend bool operator>=(const LocalVector< T > &x, const LocalVector< T > &y)
const_iterator begin() const noexcept
friend bool operator<(const LocalVector< T > &x, const LocalVector< T > &y)
size_t size() const noexcept
friend bool operator<=(const LocalVector< T > &x, const LocalVector< T > &y)
bool empty() const noexcept
LocalVector(Isolate *isolate, std::initializer_list< Local< T > > init)
const Local< T > * data() const noexcept
friend bool operator!=(const LocalVector< T > &x, const LocalVector< T > &y)
iterator insert(const_iterator pos, std::initializer_list< Local< T > > init)
const_iterator end() const noexcept
LocalVector(Isolate *isolate, size_t n)
const Local< T > & back() const
Local< T > * data() noexcept
void swap(LocalVector< T > &other)
LocalVector(Isolate *isolate)
iterator begin() noexcept
iterator insert(const_iterator pos, const Local< T > &value)
LocalVector< T > & operator=(std::initializer_list< Local< T > > init)
Local< T > & operator[](size_t n)
const Local< T > & operator[](size_t n) const
iterator insert(const_iterator pos, InputIt first, InputIt last)
void emplace_back(Args &&... args)
friend bool operator==(const LocalVector< T > &x, const LocalVector< T > &y)
const Local< T > & front() const
void push_back(const Local< T > &x)
const Local< T > & at(size_t n) const
Local< T > & at(size_t n)
friend bool operator>(const LocalVector< T > &x, const LocalVector< T > &y)
V8_INLINE MaybeLocal()=default
friend class PersistentBase
friend class PersistentValueMapBase
friend class FunctionCallbackInfo
void operator=(const SealHandleScope &)=delete
void * operator new(size_t size)=delete
void operator delete(void *, size_t)=delete
void operator delete[](void *, size_t)=delete
void * operator new[](size_t size)=delete
SealHandleScope(Isolate *isolate)
SealHandleScope(const SealHandleScope &)=delete
static V8_INLINE HandleScopeData * GetHandleScopeData(v8::Isolate *isolate)
LocalUnchecked(const Local< T > &other) noexcept
V8_EXPORT void ToLocalEmpty()
#define V8_HAS_ATTRIBUTE_TRIVIAL_ABI
#define V8_WARN_UNUSED_RESULT
#define V8_UNLIKELY(condition)