5#ifndef INCLUDE_V8_FAST_API_CALLS_H_
6#define INCLUDE_V8_FAST_API_CALLS_H_
210#include <type_traits>
265 : type_(type), flags_(flags) {}
269 : type_(static_cast<
Type>((identifier >> 8) & 255)),
270 flags_(static_cast<
Flags>(identifier & 255)) {}
272 return static_cast<uint8_t
>(type_) << 8 |
273 static_cast<uint8_t
>(flags_);
325 return HasOptions() ? arg_count_ - 1 : arg_count_;
338 return arg_count_ > 0 && arg_info_[arg_count_ - 1].GetType() ==
339 CTypeInfo::kCallbackOptionsType;
344 const Int64Representation repr_;
345 const unsigned int arg_count_;
349struct FastApiCallbackOptions;
355#if defined(V8_ENABLE_LOCAL_OFF_STACK_CHECK) && V8_HAS_ATTRIBUTE_TRIVIAL_ABI
359 AnyCType& operator=(
const AnyCType& other) {
360 int64_value = other.int64_value;
381 "The union AnyCType should have size == 64 bits, as this is assumed "
382 "by FastApiCallLoweringReducer.");
386 constexpr CFunction() : address_(nullptr), type_info_(nullptr) {}
391 return type_info_->ArgumentInfo(index);
398 return type_info_->GetInt64Representation();
404 template <
typename F>
407 CFunctionInfo::Int64Representation::kNumber) {
408 CFunction result = ArgUnwrap<F*>::Make(func, int64_rep);
414 template <
typename R,
typename... Args,
typename R_Patch,
415 typename... Args_Patch>
417 R_Patch (*patching_func)(Args_Patch...),
419 CFunctionInfo::Int64Representation::kNumber) {
420 CFunction c_func = ArgUnwrap<R (*)(Args...)>::Make(func, int64_rep);
422 sizeof...(Args_Patch) ==
sizeof...(Args),
423 "The patching function must have the same number of arguments.");
424 c_func.address_ =
reinterpret_cast<void*
>(patching_func);
431 const void* address_;
434 template <
typename F>
436 static_assert(
sizeof(F) !=
sizeof(F),
437 "CFunction must be created from a function pointer.");
440 template <
typename R,
typename... Args>
441 class ArgUnwrap<R (*)(Args...)> {
443 static CFunction Make(R (*func)(Args...),
445 CFunctionInfo::Int64Representation::kNumber);
483template <
typename T,
typename... List>
484struct count : std::integral_constant<int, 0> {};
485template <
typename T,
typename... Args>
487 : std::integral_constant<std::size_t, 1 + count<T, Args...>::value> {};
488template <
typename T,
typename U,
typename... Args>
492 typename RetBuilder,
typename... ArgBuilders>
494 static constexpr int kOptionsArgCount =
496 static constexpr int kReceiverCount = 1;
498 static_assert(kOptionsArgCount == 0 || kOptionsArgCount == 1,
499 "Only one options parameter is supported.");
501 static_assert(
sizeof...(ArgBuilders) >= kOptionsArgCount + kReceiverCount,
502 "The receiver or the options argument is missing.");
507 arg_info_storage_, Representation),
508 arg_info_storage_{ArgBuilders::Build()...} {
520 "String and api object values are not currently "
521 "supported return types.");
525 const CTypeInfo arg_info_storage_[
sizeof...(ArgBuilders)];
530 static_assert(
sizeof(T) !=
sizeof(T),
"This type is not supported");
533#define SPECIALIZE_GET_TYPE_INFO_HELPER_FOR(T, Enum) \
535 struct TypeInfoHelper<T> { \
536 static constexpr CTypeInfo::Flags Flags() { \
537 return CTypeInfo::Flags::kNone; \
540 static constexpr CTypeInfo::Type Type() { return CTypeInfo::Type::Enum; } \
543template <CTypeInfo::Type type>
546#define DEFINE_TYPE_INFO_TRAITS(CType, Enum) \
548 struct CTypeInfoTraits<CTypeInfo::Type::Enum> { \
549 using ctype = CType; \
552#define PRIMITIVE_C_TYPES(V) \
556 V(uint32_t, kUint32) \
558 V(uint64_t, kUint64) \
560 V(double, kFloat64) \
564#define ALL_C_TYPES(V) \
565 PRIMITIVE_C_TYPES(V) \
567 V(v8::Local<v8::Value>, kV8Value) \
568 V(v8::Local<v8::Object>, kV8Value) \
569 V(v8::Local<v8::Array>, kV8Value) \
579#undef PRIMITIVE_C_TYPES
582#undef TYPED_ARRAY_C_TYPES
602#define STATIC_ASSERT_IMPLIES(COND, ASSERTION, MSG) \
603 static_assert(((COND) == 0) || (ASSERTION), MSG)
618 uint8_t(kFlags) & uint8_t(CTypeInfo::Flags::kEnforceRangeBit),
619 CTypeInfo::IsIntegralType(kType),
620 "kEnforceRangeBit is only allowed for integral types.");
622 uint8_t(kFlags) & uint8_t(CTypeInfo::Flags::kClampBit),
623 CTypeInfo::IsIntegralType(kType),
624 "kClampBit is only allowed for integral types.");
626 uint8_t(kFlags) & uint8_t(CTypeInfo::Flags::kIsRestrictedBit),
627 CTypeInfo::IsFloatingPointType(kType),
628 "kIsRestrictedBit is only allowed for floating point types.");
635 template <
typename... Rest>
640 static constexpr CTypeInfo::Flags MergeFlags() {
return CTypeInfo::Flags(0); }
644template <
typename RetBuilder,
typename... ArgBuilders>
650 constexpr auto Ret() {
653 ArgBuilders...>(fn_);
657 constexpr auto Arg() {
660 return ArgImpl<N, Flags...>(
661 std::make_index_sequence<
sizeof...(ArgBuilders)>());
665 template <
typename Ret,
typename... Args>
666 auto Patch(
Ret (*patching_func)(Args...)) {
668 sizeof...(Args) ==
sizeof...(ArgBuilders),
669 "The patching function must have the same number of arguments.");
670 fn_ =
reinterpret_cast<void*
>(patching_func);
684 struct GetArgBuilder;
689 struct GetArgBuilder<false, N, Flags...> {
690 using type = std::tuple_element_t<N, std::tuple<ArgBuilders...>>;
696 struct GetArgBuilder<true, N, Flags...> {
698 typename std::tuple_element_t<N, std::tuple<ArgBuilders...>>::BaseType,
699 std::tuple_element_t<N, std::tuple<ArgBuilders...>>
::Build().GetFlags(),
707 constexpr auto ArgImpl(std::index_sequence<I...>) {
708 return CFunctionBuilderWithFunction<
709 RetBuilder,
typename GetArgBuilder<N == I, I, Flags...>::type...>(fn_);
719 template <
typename R,
typename... Args>
720 constexpr auto Fn(R (*fn)(Args...)) {
723 reinterpret_cast<const void*
>(fn));
730template <
typename R,
typename... Args>
731CFunction CFunction::ArgUnwrap<R (*)(Args...)>::Make(
734 return internal::CFunctionBuilder().Fn(func).
Build();
736 return internal::CFunctionBuilder()
738 .template Build<CFunctionInfo::Int64Representation::kBigInt>();
744static constexpr CTypeInfo kTypeInfoFloat64 =
759template <CTypeInfo::Identifier type_info_
id,
typename T>
761 Local<Array> src, T* dst, uint32_t max_length);
765TryToCopyAndConvertArrayToCppBuffer<CTypeInfoBuilder<int32_t>::Build().GetId(),
766 int32_t>(Local<Array> src, int32_t* dst,
767 uint32_t max_length);
771TryToCopyAndConvertArrayToCppBuffer<CTypeInfoBuilder<uint32_t>::Build().GetId(),
772 uint32_t>(Local<Array> src, uint32_t* dst,
773 uint32_t max_length);
777TryToCopyAndConvertArrayToCppBuffer<CTypeInfoBuilder<float>::Build().GetId(),
778 float>(Local<Array> src,
float* dst,
779 uint32_t max_length);
783TryToCopyAndConvertArrayToCppBuffer<CTypeInfoBuilder<double>::Build().GetId(),
785 uint32_t max_length);
Definition: v8-fast-api-calls.h:304
Int64Representation GetInt64Representation() const
Definition: v8-fast-api-calls.h:328
Int64Representation
Definition: v8-fast-api-calls.h:306
const CTypeInfo & ReturnInfo() const
Definition: v8-fast-api-calls.h:320
const CTypeInfo & ArgumentInfo(unsigned int index) const
bool HasOptions() const
Definition: v8-fast-api-calls.h:336
unsigned int ArgumentCount() const
Definition: v8-fast-api-calls.h:324
CFunctionInfo(const CTypeInfo &return_info, unsigned int arg_count, const CTypeInfo *arg_info, Int64Representation repr=Int64Representation::kNumber)
Definition: v8-fast-api-calls.h:384
const CTypeInfo & ReturnInfo() const
Definition: v8-fast-api-calls.h:388
constexpr CFunction()
Definition: v8-fast-api-calls.h:386
const CTypeInfo & ArgumentInfo(unsigned int index) const
Definition: v8-fast-api-calls.h:390
unsigned int ArgumentCount() const
Definition: v8-fast-api-calls.h:394
CFunctionInfo::Int64Representation GetInt64Representation() const
Definition: v8-fast-api-calls.h:397
CFunction(const void *address, const CFunctionInfo *type_info)
static CFunction Make(R(*func)(Args...), R_Patch(*patching_func)(Args_Patch...), CFunctionInfo::Int64Representation int64_rep=CFunctionInfo::Int64Representation::kNumber)
Definition: v8-fast-api-calls.h:416
const void * GetAddress() const
Definition: v8-fast-api-calls.h:396
OverloadResolution
Definition: v8-fast-api-calls.h:402
const CFunctionInfo * GetTypeInfo() const
Definition: v8-fast-api-calls.h:400
static CFunction Make(F *func, CFunctionInfo::Int64Representation int64_rep=CFunctionInfo::Int64Representation::kNumber)
Definition: v8-fast-api-calls.h:405
Definition: v8-fast-api-calls.h:605
static constexpr CTypeInfo Build()
Definition: v8-fast-api-calls.h:609
T BaseType
Definition: v8-fast-api-calls.h:607
Definition: v8-fast-api-calls.h:223
Flags
Definition: v8-fast-api-calls.h:256
constexpr CTypeInfo(Type type, Flags flags=Flags::kNone)
Definition: v8-fast-api-calls.h:264
static constexpr bool IsFloatingPointType(Type type)
Definition: v8-fast-api-calls.h:285
static constexpr bool IsPrimitive(Type type)
Definition: v8-fast-api-calls.h:289
static constexpr Type kCallbackOptionsType
Definition: v8-fast-api-calls.h:254
static constexpr bool IsIntegralType(Type type)
Definition: v8-fast-api-calls.h:279
constexpr Identifier GetId() const
Definition: v8-fast-api-calls.h:271
constexpr Type GetType() const
Definition: v8-fast-api-calls.h:276
constexpr Flags GetFlags() const
Definition: v8-fast-api-calls.h:277
Type
Definition: v8-fast-api-calls.h:225
uint32_t Identifier
Definition: v8-fast-api-calls.h:267
constexpr CTypeInfo(Identifier identifier)
Definition: v8-fast-api-calls.h:268
Definition: v8-isolate.h:298
Definition: v8-local-handle.h:366
Definition: v8-value.h:32
Definition: v8-fast-api-calls.h:642
auto Build()
Definition: v8-fast-api-calls.h:673
constexpr auto Ret()
Definition: v8-fast-api-calls.h:647
constexpr auto Arg()
Definition: v8-fast-api-calls.h:654
auto Patch(Ret(*patching_func)(Args...))
Definition: v8-fast-api-calls.h:663
Definition: v8-fast-api-calls.h:712
constexpr CFunctionBuilder()
Definition: v8-fast-api-calls.h:714
constexpr auto Fn(R(*fn)(Args...))
Definition: v8-fast-api-calls.h:717
Definition: v8-fast-api-calls.h:493
constexpr CFunctionInfoImpl()
Definition: v8-fast-api-calls.h:505
Definition: libplatform.h:15
constexpr v8::ExternalPointerTypeTag kFastAPIPointerTag
Definition: v8-fast-api-calls.h:784
bool TryToCopyAndConvertArrayToCppBuffer(Local< Array > src, T *dst, uint32_t max_length)
uint16_t ExternalPointerTypeTag
Definition: v8-external.h:21
internal::CFunctionBuilder CFunctionBuilder
Definition: v8-fast-api-calls.h:738
Definition: v8-fast-api-calls.h:455
v8::Isolate * isolate
Definition: v8-fast-api-calls.h:464
v8::Local< v8::Value > data
Definition: v8-fast-api-calls.h:470
static FastApiCallbackOptions CreateForTesting(Isolate *isolate)
Definition: v8-fast-api-calls.h:460
v8::Local< v8::Data > DataV2() const
Definition: v8-fast-api-calls.h:476
Definition: v8-fast-api-calls.h:299
const char * data
Definition: v8-fast-api-calls.h:300
uint32_t length
Definition: v8-fast-api-calls.h:301
Definition: v8-fast-api-calls.h:544
Definition: v8-fast-api-calls.h:529
Definition: v8-fast-api-calls.h:484
Definition: v8-fast-api-calls.h:352
FastApiCallbackOptions * options_value
Definition: v8-fast-api-calls.h:376
AnyCType()
Definition: v8-fast-api-calls.h:353
const FastOneByteString * string_value
Definition: v8-fast-api-calls.h:375
Local< Array > sequence_value
Definition: v8-fast-api-calls.h:374
Local< Object > object_value
Definition: v8-fast-api-calls.h:373
double double_value
Definition: v8-fast-api-calls.h:371
void * pointer_value
Definition: v8-fast-api-calls.h:372
uint32_t uint32_value
Definition: v8-fast-api-calls.h:367
bool bool_value
Definition: v8-fast-api-calls.h:365
float float_value
Definition: v8-fast-api-calls.h:370
uint64_t uint64_value
Definition: v8-fast-api-calls.h:369
int32_t int32_value
Definition: v8-fast-api-calls.h:366
int64_t int64_value
Definition: v8-fast-api-calls.h:368
#define DEFINE_TYPE_INFO_TRAITS(CType, Enum)
Definition: v8-fast-api-calls.h:546
#define PRIMITIVE_C_TYPES(V)
Definition: v8-fast-api-calls.h:552
#define SPECIALIZE_GET_TYPE_INFO_HELPER_FOR(T, Enum)
Definition: v8-fast-api-calls.h:533
#define ALL_C_TYPES(V)
Definition: v8-fast-api-calls.h:564
#define STATIC_ASSERT_IMPLIES(COND, ASSERTION, MSG)
Definition: v8-fast-api-calls.h:599
#define V8_EXTERNAL_POINTER_TAG_COUNT
Definition: v8-internal.h:466
#define V8_EXPORT
Definition: v8config.h:874
#define V8_INLINE
Definition: v8config.h:518
#define V8_DEPRECATE_SOON(message)
Definition: v8config.h:631
#define END_ALLOW_USE_DEPRECATED()
Definition: v8config.h:651
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:688
#define V8_TRIVIAL_ABI
Definition: v8config.h:827
#define START_ALLOW_USE_DEPRECATED()
Definition: v8config.h:650