// Copyright 2018 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_API_INL_H_
|
#define V8_API_INL_H_
|
|
#include "src/api.h"
|
#include "src/objects-inl.h"
|
|
namespace v8 {
|
|
template <typename T>
|
inline T ToCData(v8::internal::Object* obj) {
|
STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
|
if (obj == v8::internal::Smi::kZero) return nullptr;
|
return reinterpret_cast<T>(
|
v8::internal::Foreign::cast(obj)->foreign_address());
|
}
|
|
template <>
|
inline v8::internal::Address ToCData(v8::internal::Object* obj) {
|
if (obj == v8::internal::Smi::kZero) return v8::internal::kNullAddress;
|
return v8::internal::Foreign::cast(obj)->foreign_address();
|
}
|
|
template <typename T>
|
inline v8::internal::Handle<v8::internal::Object> FromCData(
|
v8::internal::Isolate* isolate, T obj) {
|
STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
|
if (obj == nullptr) return handle(v8::internal::Smi::kZero, isolate);
|
return isolate->factory()->NewForeign(
|
reinterpret_cast<v8::internal::Address>(obj));
|
}
|
|
template <>
|
inline v8::internal::Handle<v8::internal::Object> FromCData(
|
v8::internal::Isolate* isolate, v8::internal::Address obj) {
|
if (obj == v8::internal::kNullAddress) {
|
return handle(v8::internal::Smi::kZero, isolate);
|
}
|
return isolate->factory()->NewForeign(obj);
|
}
|
|
template <class From, class To>
|
inline Local<To> Utils::Convert(v8::internal::Handle<From> obj) {
|
DCHECK(obj.is_null() || (obj->IsSmi() || !obj->IsTheHole()));
|
return Local<To>(reinterpret_cast<To*>(obj.location()));
|
}
|
|
// Implementations of ToLocal
|
|
#define MAKE_TO_LOCAL(Name, From, To) \
|
Local<v8::To> Utils::Name(v8::internal::Handle<v8::internal::From> obj) { \
|
return Convert<v8::internal::From, v8::To>(obj); \
|
}
|
|
#define MAKE_TO_LOCAL_TYPED_ARRAY(Type, typeName, TYPE, ctype) \
|
Local<v8::Type##Array> Utils::ToLocal##Type##Array( \
|
v8::internal::Handle<v8::internal::JSTypedArray> obj) { \
|
DCHECK(obj->type() == v8::internal::kExternal##Type##Array); \
|
return Convert<v8::internal::JSTypedArray, v8::Type##Array>(obj); \
|
}
|
|
MAKE_TO_LOCAL(ToLocal, Context, Context)
|
MAKE_TO_LOCAL(ToLocal, Object, Value)
|
MAKE_TO_LOCAL(ToLocal, Module, Module)
|
MAKE_TO_LOCAL(ToLocal, Name, Name)
|
MAKE_TO_LOCAL(ToLocal, String, String)
|
MAKE_TO_LOCAL(ToLocal, Symbol, Symbol)
|
MAKE_TO_LOCAL(ToLocal, JSRegExp, RegExp)
|
MAKE_TO_LOCAL(ToLocal, JSReceiver, Object)
|
MAKE_TO_LOCAL(ToLocal, JSObject, Object)
|
MAKE_TO_LOCAL(ToLocal, JSFunction, Function)
|
MAKE_TO_LOCAL(ToLocal, JSArray, Array)
|
MAKE_TO_LOCAL(ToLocal, JSMap, Map)
|
MAKE_TO_LOCAL(ToLocal, JSSet, Set)
|
MAKE_TO_LOCAL(ToLocal, JSProxy, Proxy)
|
MAKE_TO_LOCAL(ToLocal, JSArrayBuffer, ArrayBuffer)
|
MAKE_TO_LOCAL(ToLocal, JSArrayBufferView, ArrayBufferView)
|
MAKE_TO_LOCAL(ToLocal, JSDataView, DataView)
|
MAKE_TO_LOCAL(ToLocal, JSTypedArray, TypedArray)
|
MAKE_TO_LOCAL(ToLocalShared, JSArrayBuffer, SharedArrayBuffer)
|
|
TYPED_ARRAYS(MAKE_TO_LOCAL_TYPED_ARRAY)
|
|
MAKE_TO_LOCAL(ToLocal, FunctionTemplateInfo, FunctionTemplate)
|
MAKE_TO_LOCAL(ToLocal, ObjectTemplateInfo, ObjectTemplate)
|
MAKE_TO_LOCAL(SignatureToLocal, FunctionTemplateInfo, Signature)
|
MAKE_TO_LOCAL(AccessorSignatureToLocal, FunctionTemplateInfo, AccessorSignature)
|
MAKE_TO_LOCAL(MessageToLocal, Object, Message)
|
MAKE_TO_LOCAL(PromiseToLocal, JSObject, Promise)
|
MAKE_TO_LOCAL(StackTraceToLocal, FixedArray, StackTrace)
|
MAKE_TO_LOCAL(StackFrameToLocal, StackFrameInfo, StackFrame)
|
MAKE_TO_LOCAL(NumberToLocal, Object, Number)
|
MAKE_TO_LOCAL(IntegerToLocal, Object, Integer)
|
MAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32)
|
MAKE_TO_LOCAL(ToLocal, BigInt, BigInt);
|
MAKE_TO_LOCAL(ExternalToLocal, JSObject, External)
|
MAKE_TO_LOCAL(CallableToLocal, JSReceiver, Function)
|
MAKE_TO_LOCAL(ToLocalPrimitive, Object, Primitive)
|
MAKE_TO_LOCAL(ToLocal, FixedArray, PrimitiveArray)
|
MAKE_TO_LOCAL(ScriptOrModuleToLocal, Script, ScriptOrModule)
|
|
#undef MAKE_TO_LOCAL_TYPED_ARRAY
|
#undef MAKE_TO_LOCAL
|
|
// Implementations of OpenHandle
|
|
#define MAKE_OPEN_HANDLE(From, To) \
|
v8::internal::Handle<v8::internal::To> Utils::OpenHandle( \
|
const v8::From* that, bool allow_empty_handle) { \
|
DCHECK(allow_empty_handle || that != nullptr); \
|
DCHECK(that == nullptr || \
|
(*reinterpret_cast<v8::internal::Object* const*>(that))->Is##To()); \
|
return v8::internal::Handle<v8::internal::To>( \
|
reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))); \
|
}
|
|
OPEN_HANDLE_LIST(MAKE_OPEN_HANDLE)
|
|
#undef MAKE_OPEN_HANDLE
|
#undef OPEN_HANDLE_LIST
|
|
namespace internal {
|
|
Handle<Context> HandleScopeImplementer::MicrotaskContext() {
|
if (microtask_context_) return Handle<Context>(microtask_context_, isolate_);
|
return Handle<Context>::null();
|
}
|
|
Handle<Context> HandleScopeImplementer::LastEnteredContext() {
|
if (entered_contexts_.empty()) return Handle<Context>::null();
|
return Handle<Context>(entered_contexts_.back(), isolate_);
|
}
|
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_API_INL_H_
|