12
12
namespace facebook ::react::bridging {
13
13
14
14
template <
15
- typename T ,
16
- typename C ,
17
- typename R ,
18
- typename ... Args ,
19
- typename ... JSArgs >
20
- T callFromJs (
15
+ typename JSReturnT ,
16
+ typename ClassT ,
17
+ typename ReturnT ,
18
+ typename ... ArgsT ,
19
+ typename ... JSArgsT >
20
+ JSReturnT callFromJs (
21
21
jsi::Runtime& rt,
22
- R (C ::*method)(jsi::Runtime&, Args ...),
22
+ ReturnT (ClassT ::*method)(jsi::Runtime&, ArgsT ...),
23
23
const std::shared_ptr<CallInvoker>& jsInvoker,
24
- C * instance,
25
- JSArgs &&... args) {
24
+ ClassT * instance,
25
+ JSArgsT &&... args) {
26
26
static_assert (
27
- sizeof ...(Args ) == sizeof ...(JSArgs ), " Incorrect arguments length" );
27
+ sizeof ...(ArgsT ) == sizeof ...(JSArgsT ), " Incorrect arguments length" );
28
28
static_assert (
29
- (supportsFromJs<Args, JSArgs > && ...), " Incompatible arguments" );
29
+ (supportsFromJs<ArgsT, JSArgsT > && ...), " Incompatible arguments" );
30
30
31
- if constexpr (std::is_void_v<T >) {
31
+ if constexpr (std::is_void_v<JSReturnT >) {
32
32
(instance->*method)(
33
- rt, fromJs<Args >(rt, std::forward<JSArgs >(args), jsInvoker)...);
33
+ rt, fromJs<ArgsT >(rt, std::forward<JSArgsT >(args), jsInvoker)...);
34
34
35
- } else if constexpr (std::is_void_v<R >) {
35
+ } else if constexpr (std::is_void_v<ReturnT >) {
36
36
static_assert (
37
- std::is_same_v<T , jsi::Value>,
37
+ std::is_same_v<JSReturnT , jsi::Value>,
38
38
" Void functions may only return undefined" );
39
39
40
40
(instance->*method)(
41
- rt, fromJs<Args >(rt, std::forward<JSArgs >(args), jsInvoker)...);
41
+ rt, fromJs<ArgsT >(rt, std::forward<JSArgsT >(args), jsInvoker)...);
42
42
return jsi::Value ();
43
-
44
- } else if constexpr (is_jsi_v<T> || supportsToJs<R, T>) {
45
- static_assert (supportsToJs<R, T>, " Incompatible return type" );
46
-
43
+ } else if constexpr (
44
+ is_jsi_v<JSReturnT> || supportsToJs<ReturnT, JSReturnT>) {
45
+ static_assert (supportsToJs<ReturnT, JSReturnT>, " Incompatible return type" );
47
46
return toJs (
48
47
rt,
49
48
(instance->*method)(
50
- rt, fromJs<Args >(rt, std::forward<JSArgs >(args), jsInvoker)...),
49
+ rt, fromJs<ArgsT >(rt, std::forward<JSArgsT >(args), jsInvoker)...),
51
50
jsInvoker);
52
- } else if constexpr (is_optional_jsi_v<T >) {
51
+ } else if constexpr (is_optional_jsi_v<JSReturnT >) {
53
52
static_assert (
54
- is_optional_v<R>
55
- ? supportsToJs<typename R::value_type, typename T::value_type>
56
- : supportsToJs<R, typename T::value_type>,
53
+ is_optional_v<ReturnT>
54
+ ? supportsToJs<
55
+ typename ReturnT::value_type,
56
+ typename JSReturnT::value_type>
57
+ : supportsToJs<ReturnT, typename JSReturnT::value_type>,
57
58
" Incompatible return type" );
58
59
59
60
auto result = toJs (
60
61
rt,
61
62
(instance->*method)(
62
- rt, fromJs<Args >(rt, std::forward<JSArgs >(args), jsInvoker)...),
63
+ rt, fromJs<ArgsT >(rt, std::forward<JSArgsT >(args), jsInvoker)...),
63
64
jsInvoker);
64
65
65
66
if constexpr (std::is_same_v<decltype (result), jsi::Value>) {
@@ -70,20 +71,21 @@ T callFromJs(
70
71
71
72
return convert (rt, std::move (result));
72
73
} else {
73
- static_assert (std::is_convertible_v<R, T>, " Incompatible return type" );
74
+ static_assert (
75
+ std::is_convertible_v<ReturnT, JSReturnT>, " Incompatible return type" );
74
76
return (instance->*method)(
75
- rt, fromJs<Args >(rt, std::forward<JSArgs >(args), jsInvoker)...);
77
+ rt, fromJs<ArgsT >(rt, std::forward<JSArgsT >(args), jsInvoker)...);
76
78
}
77
79
}
78
80
79
- template <typename R , typename ... Args >
80
- constexpr size_t getParameterCount (R (*)(Args ...)) {
81
- return sizeof ...(Args );
81
+ template <typename ReturnT , typename ... ArgsT >
82
+ constexpr size_t getParameterCount (ReturnT (*)(ArgsT ...)) {
83
+ return sizeof ...(ArgsT );
82
84
}
83
85
84
- template <typename C , typename R , typename ... Args >
85
- constexpr size_t getParameterCount (R (C ::*)(Args ...)) {
86
- return sizeof ...(Args );
86
+ template <typename Class , typename ReturnT , typename ... ArgsT >
87
+ constexpr size_t getParameterCount (ReturnT (Class ::*)(ArgsT ...)) {
88
+ return sizeof ...(ArgsT );
87
89
}
88
90
89
91
} // namespace facebook::react::bridging
0 commit comments