5#ifndef V8_API_API_INL_H_
6#define V8_API_API_INL_H_
22template <
typename T,
internal::ExternalPo
interTag tag>
27 return reinterpret_cast<T
>(
32template <
internal::ExternalPo
interTag tag>
40template <
internal::ExternalPo
interTag tag,
typename T>
45 return isolate->factory()->NewForeign<tag>(
49template <
internal::ExternalPo
interTag tag>
55 return isolate->factory()->NewForeign<tag>(obj);
58template <
class From,
class To>
61#ifdef V8_ENABLE_DIRECT_HANDLE
73#define MAKE_TO_LOCAL(Name) \
74 template <template <typename> typename HandleType, typename T, typename> \
75 inline auto Utils::Name(HandleType<T> obj) { \
76 return Utils::Name##_helper(v8::internal::DirectHandle<T>(obj)); \
81#define MAKE_TO_LOCAL_PRIVATE(Name, From, To) \
82 inline Local<v8::To> Utils::Name##_helper( \
83 v8::internal::DirectHandle<v8::internal::From> obj) { \
84 return Convert<v8::internal::From, v8::To>(obj); \
89#define MAKE_TO_LOCAL_TYPED_ARRAY(Type, typeName, TYPE, ctype) \
90 Local<v8::Type##Array> Utils::ToLocal##Type##Array( \
91 v8::internal::DirectHandle<v8::internal::JSTypedArray> obj) { \
92 DCHECK(obj->type() == v8::internal::kExternal##Type##Array); \
93 return Convert<v8::internal::JSTypedArray, v8::Type##Array>(obj); \
98#undef MAKE_TO_LOCAL_TYPED_ARRAY
100#undef MAKE_TO_LOCAL_PRIVATE
105#ifdef V8_ENABLE_DIRECT_HANDLE
107#define MAKE_OPEN_HANDLE(From, To) \
108 v8::internal::Handle<v8::internal::To> Utils::OpenHandle( \
109 const v8::From* that, bool allow_empty_handle) { \
110 DCHECK(allow_empty_handle || !v8::internal::ValueHelper::IsEmpty(that)); \
111 DCHECK(v8::internal::ValueHelper::IsEmpty(that) || \
112 Is##To(v8::internal::Tagged<v8::internal::Object>( \
113 v8::internal::ValueHelper::ValueAsAddress(that)))); \
114 if (v8::internal::ValueHelper::IsEmpty(that)) { \
115 return v8::internal::Handle<v8::internal::To>::null(); \
117 return v8::internal::Handle<v8::internal::To>( \
118 v8::HandleScope::CreateHandleForCurrentIsolate( \
119 v8::internal::ValueHelper::ValueAsAddress(that))); \
122 v8::internal::DirectHandle<v8::internal::To> Utils::OpenDirectHandle( \
123 const v8::From* that, bool allow_empty_handle) { \
124 DCHECK(allow_empty_handle || !v8::internal::ValueHelper::IsEmpty(that)); \
125 DCHECK(v8::internal::ValueHelper::IsEmpty(that) || \
126 Is##To(v8::internal::Tagged<v8::internal::Object>( \
127 v8::internal::ValueHelper::ValueAsAddress(that)))); \
128 return v8::internal::DirectHandle<v8::internal::To>::FromAddress( \
129 v8::internal::ValueHelper::ValueAsAddress(that)); \
132 v8::internal::IndirectHandle<v8::internal::To> Utils::OpenIndirectHandle( \
133 const v8::From* that, bool allow_empty_handle) { \
134 return Utils::OpenHandle(that, allow_empty_handle); \
139#define MAKE_OPEN_HANDLE(From, To) \
140 v8::internal::Handle<v8::internal::To> Utils::OpenHandle( \
141 const v8::From* that, bool allow_empty_handle) { \
142 DCHECK(allow_empty_handle || !v8::internal::ValueHelper::IsEmpty(that)); \
143 DCHECK(v8::internal::ValueHelper::IsEmpty(that) || \
144 Is##To(v8::internal::Tagged<v8::internal::Object>( \
145 v8::internal::ValueHelper::ValueAsAddress(that)))); \
146 return v8::internal::Handle<v8::internal::To>( \
147 reinterpret_cast<v8::internal::Address*>( \
148 const_cast<v8::From*>(that))); \
151 v8::internal::DirectHandle<v8::internal::To> Utils::OpenDirectHandle( \
152 const v8::From* that, bool allow_empty_handle) { \
153 return Utils::OpenHandle(that, allow_empty_handle); \
156 v8::internal::IndirectHandle<v8::internal::To> Utils::OpenIndirectHandle( \
157 const v8::From* that, bool allow_empty_handle) { \
158 return Utils::OpenHandle(that, allow_empty_handle); \
165#undef MAKE_OPEN_HANDLE
166#undef OPEN_HANDLE_LIST
168template <
bool do_callback>
173 isolate_->thread_local_top()->IncrementCallDepth<do_callback>(
this);
175 isolate->set_context(env);
177 if (do_callback)
isolate_->FireBeforeCallEnteredCallback();
184 isolate_->thread_local_top()->DecrementCallDepth(
this);
189 if (
isolate_->thread_local_top()->CallDepthIsZero() &&
190 (
isolate_->thread_local_top()->try_catch_handler_ ==
nullptr ||
191 !
isolate_->is_execution_terminating())) {
192 isolate_->clear_internal_exception();
206 isolate_->set_context(*saved_context_);
214 bool CheckKeptObjectsClearedAfterMicrotaskCheckpoint(
216 bool did_perform_microtask_checkpoint =
217 isolate_->thread_local_top()->CallDepthIsZero() && do_callback &&
220 !
isolate_->is_execution_terminating();
221 return !did_perform_microtask_checkpoint ||
247#ifdef V8_ENABLE_DIRECT_HANDLE
258 if (!maybe_value.
ToLocal(&value))
return maybe_value;
259 return Escape(value);
267 double value = i::Object::NumberValue(
279 double value = elements->get_scalar(
static_cast<int>(
i));
286template <CTypeInfo::Identifier type_info_
id,
typename T>
288 uint32_t max_length) {
292 "Type mismatch between the expected CTypeInfo::Type and the destination "
295 uint32_t length = src->Length();
301 if (length > max_length) {
307 if (i::Object::IterationHasObservableEffects(obj)) {
313 switch (obj->GetElementsKind()) {
328template <const CTypeInfo* type_info,
typename T>
331 uint32_t max_length) {
336template <CTypeInfo::Identifier type_info_
id,
typename T>
339 uint32_t max_length) {
#define MAKE_TO_LOCAL_PRIVATE(Name, From, To)
#define MAKE_OPEN_HANDLE(From, To)
#define MAKE_TO_LOCAL_TYPED_ARRAY(Type, typeName, TYPE, ctype)
#define MAKE_TO_LOCAL(Name)
#define TO_LOCAL_NAME_LIST(V)
#define OPEN_HANDLE_LIST(V)
constexpr Type GetType() const
i::Address previous_stack_height_
i::Isolate *const isolate_
CallDepthScope(i::Isolate *isolate, Local< Context > context)
i::Handle< i::Context > saved_context_
CallDepthScope & operator=(const CallDepthScope &)=delete
CallDepthScope(const CallDepthScope &)=delete
InternalEscapableScope(i::Isolate *isolate)
V8_INLINE MaybeLocal< T > EscapeMaybe(MaybeLocal< T > maybe_value)
V8_INLINE Local< T > Escape(Local< T > value)
static V8_INLINE Local< T > FromSlot(internal::Address *slot)
V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local< S > *out) const
static Local< To > Convert(v8::internal::DirectHandle< From > obj)
static v8::internal::DirectHandle< To > OpenDirectHandle(v8::Local< From > handle)
V8_INLINE bool is_null() const
V8_INLINE Address address() const
DetachableVector< Tagged< NativeContext > > entered_contexts_
DirectHandle< NativeContext > LastEnteredContext()
void EnterContext(Tagged< NativeContext > context)
static constexpr Tagged< Smi > zero()
MicrotaskQueue * microtask_queue
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
int32_t ConvertDouble(double d)
static constexpr Address kNullAddress
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
void CopyDoubleElementsToTypedBuffer(T *dst, uint32_t length, i::Tagged< i::FixedDoubleArray > elements)
bool V8_EXPORT TryCopyAndConvertArrayToCppBuffer(Local< Array > src, T *dst, uint32_t max_length)
v8::internal::DirectHandle< i::UnionOf< i::Smi, i::Foreign > > FromCData(v8::internal::Isolate *isolate, T obj)
void CopySmiElementsToTypedBuffer(T *dst, uint32_t length, i::Tagged< i::FixedArray > elements)
T ToCData(i::Isolate *isolate, v8::internal::Tagged< v8::internal::Object > obj)
bool CopyAndConvertArrayToCppBuffer(Local< Array > src, T *dst, uint32_t max_length)
bool V8_EXPORT TryToCopyAndConvertArrayToCppBuffer(Local< Array > src, T *dst, uint32_t max_length)
#define DCHECK(condition)
#define DISALLOW_NEW_AND_DELETE()
std::unique_ptr< ValueMirror > value