18
18
19
19
namespace v8pp { namespace detail {
20
20
21
- template <typename F, size_t Offset = 0 >
21
+ template <typename F, bool use_shared_ptr = false , size_t Offset = 0 >
22
22
struct call_from_v8_traits
23
23
{
24
24
static bool const is_mem_fun = std::is_member_function_pointer<F>::value;
@@ -43,15 +43,24 @@ struct call_from_v8_traits
43
43
using arg_type = typename tuple_element<Index + is_mem_fun,
44
44
Index < (arg_count + Offset)>::type;
45
45
46
- template <size_t Index>
47
- using convert_type = decltype(convert<arg_type<Index>>::from_v8(
48
- std::declval<v8::Isolate*>(), std::declval<v8::Handle <v8::Value>>()));
46
+ template <size_t Index, typename Arg = arg_type<Index>,
47
+ typename T = typename std::remove_reference<Arg>::type,
48
+ typename U = typename std::remove_pointer<T>::type
49
+ >
50
+ using arg_convert = typename std::conditional<
51
+ is_wrapped_class<U>::value && use_shared_ptr,
52
+ typename std::conditional<std::is_pointer<T>::value,
53
+ convert<std::shared_ptr<U>>,
54
+ convert<U, ref_from_shared_ptr>
55
+ >::type,
56
+ convert<Arg>
57
+ >::type;
49
58
50
59
template <size_t Index>
51
- static convert_type <Index>
60
+ static decltype (arg_convert <Index>::from_v8(std::declval<v8::Isolate*>(), std::declval<v8::Handle<v8::Value>>()))
52
61
arg_from_v8(v8::FunctionCallbackInfo<v8::Value> const & args)
53
62
{
54
- return convert<arg_type< Index> >::from_v8 (args.GetIsolate (), args[Index - Offset]);
63
+ return arg_convert< Index>::from_v8 (args.GetIsolate (), args[Index - Offset]);
55
64
}
56
65
57
66
static void check (v8::FunctionCallbackInfo<v8::Value> const & args)
@@ -63,11 +72,11 @@ struct call_from_v8_traits
63
72
}
64
73
};
65
74
66
- template <typename F>
67
- using isolate_arg_call_traits = call_from_v8_traits<F, 1 >;
75
+ template <typename F, bool use_shared_ptr = false >
76
+ using isolate_arg_call_traits = call_from_v8_traits<F, use_shared_ptr, 1 >;
68
77
69
78
template <typename F, size_t Offset = 0 >
70
- struct v8_args_call_traits : call_from_v8_traits<F, Offset>
79
+ struct v8_args_call_traits : call_from_v8_traits<F, false , Offset>
71
80
{
72
81
template <size_t Index>
73
82
using arg_type = v8::FunctionCallbackInfo<v8::Value> const &;
@@ -102,12 +111,14 @@ using is_first_arg_isolate = std::integral_constant<bool,
102
111
std::is_same<typename call_from_v8_traits<F>::template arg_type<0 >,
103
112
v8::Isolate*>::value>;
104
113
105
- template <typename F>
114
+ template <typename F, bool use_shared_ptr = false >
106
115
using select_call_traits = typename std::conditional<is_first_arg_isolate<F>::value,
107
116
typename std::conditional<is_direct_args<F, 1 >::value,
108
- isolate_v8_args_call_traits<F>, isolate_arg_call_traits<F>>::type,
117
+ isolate_v8_args_call_traits<F>,
118
+ isolate_arg_call_traits<F, use_shared_ptr>>::type,
109
119
typename std::conditional<is_direct_args<F, 0 >::value,
110
- v8_args_call_traits<F>, call_from_v8_traits<F>>::type
120
+ v8_args_call_traits<F>,
121
+ call_from_v8_traits<F, use_shared_ptr>>::type
111
122
>::type;
112
123
113
124
template <typename F, typename CallTraits, size_t ...Indices>
@@ -126,22 +137,22 @@ call_from_v8_impl(T& obj, F&& func, v8::FunctionCallbackInfo<v8::Value> const& a
126
137
return (obj.*func)(CallTraits::template arg_from_v8<Indices>(args)...);
127
138
}
128
139
129
- template <typename F, size_t ...Indices>
140
+ template <typename F, bool use_shared_ptr, size_t ...Indices>
130
141
typename function_traits<F>::return_type
131
142
call_from_v8_impl (F&& func, v8::FunctionCallbackInfo<v8::Value> const & args,
132
- isolate_arg_call_traits<F>, index_sequence<Indices...>)
143
+ isolate_arg_call_traits<F, use_shared_ptr >, index_sequence<Indices...>)
133
144
{
134
145
return func (args.GetIsolate (),
135
- isolate_arg_call_traits<F>::template arg_from_v8<Indices + 1 >(args)...);
146
+ isolate_arg_call_traits<F, use_shared_ptr >::template arg_from_v8<Indices + 1 >(args)...);
136
147
}
137
148
138
- template <typename T, typename F, size_t ...Indices>
149
+ template <typename T, bool use_shared_ptr, typename F, size_t ...Indices>
139
150
typename function_traits<F>::return_type
140
151
call_from_v8_impl (T& obj, F&& func, v8::FunctionCallbackInfo<v8::Value> const & args,
141
- isolate_arg_call_traits<F>, index_sequence<Indices...>)
152
+ isolate_arg_call_traits<F, use_shared_ptr >, index_sequence<Indices...>)
142
153
{
143
154
return (obj.*func)(args.GetIsolate (),
144
- isolate_arg_call_traits<F>::template arg_from_v8<Indices + 1 >(args)...);
155
+ isolate_arg_call_traits<F, use_shared_ptr >::template arg_from_v8<Indices + 1 >(args)...);
145
156
}
146
157
147
158
template <typename F, size_t ...Indices>
@@ -160,21 +171,21 @@ call_from_v8_impl(T& obj, F&& func, v8::FunctionCallbackInfo<v8::Value> const& a
160
171
return (obj.*func)(args.GetIsolate (), args);
161
172
}
162
173
163
- template <typename F>
174
+ template <typename F, bool use_shared_ptr >
164
175
typename function_traits<F>::return_type
165
176
call_from_v8 (F&& func, v8::FunctionCallbackInfo<v8::Value> const & args)
166
177
{
167
- using call_traits = select_call_traits<F>;
178
+ using call_traits = select_call_traits<F, use_shared_ptr >;
168
179
call_traits::check (args);
169
180
return call_from_v8_impl (std::forward<F>(func), args,
170
181
call_traits (), make_index_sequence<call_traits::arg_count>());
171
182
}
172
183
173
- template <typename T, typename F>
184
+ template <typename T, typename F, bool use_shared_ptr >
174
185
typename function_traits<F>::return_type
175
186
call_from_v8 (T& obj, F&& func, v8::FunctionCallbackInfo<v8::Value> const & args)
176
187
{
177
- using call_traits = select_call_traits<F>;
188
+ using call_traits = select_call_traits<F, use_shared_ptr >;
178
189
call_traits::check (args);
179
190
return call_from_v8_impl (obj, std::forward<F>(func), args,
180
191
call_traits (), make_index_sequence<call_traits::arg_count>());
0 commit comments