Skip to content

Commit c69554f

Browse files
committed
sfinae FinalizeData::Wrapper
1 parent 4a112dd commit c69554f

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

napi-inl.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,11 @@ napi_value TemplatedInstanceVoidCallback(napi_env env, napi_callback_info info)
190190

191191
template <typename T, typename Finalizer, typename Hint = void>
192192
struct FinalizeData {
193+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
194+
template <typename F = Finalizer,
195+
typename =
196+
std::enable_if_t<std::is_invocable_v<F, node_api_nogc_env, T*>>>
197+
#endif
193198
static inline void Wrapper(NODE_ADDON_API_NOGC_ENV env,
194199
void* data,
195200
void* finalizeHint) NAPI_NOEXCEPT {
@@ -200,6 +205,26 @@ struct FinalizeData {
200205
});
201206
}
202207

208+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
209+
template <typename F = Finalizer,
210+
typename = std::enable_if_t<
211+
!std::is_invocable_v<F, node_api_nogc_env, T*>>,
212+
typename = void>
213+
static inline void Wrapper(NODE_ADDON_API_NOGC_ENV env,
214+
void* data,
215+
void* finalizeHint) NAPI_NOEXCEPT {
216+
napi_status status =
217+
node_api_post_finalizer(env, WrapperGC, data, finalizeHint);
218+
NAPI_FATAL_IF_FAILED(
219+
status, "PostFinalizerWrapper", "node_api_post_finalizer failed");
220+
}
221+
#endif
222+
223+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
224+
template <typename F = Finalizer,
225+
typename = std::enable_if_t<
226+
std::is_invocable_v<F, node_api_nogc_env, T*, Hint*>>>
227+
#endif
203228
static inline void WrapperWithHint(NODE_ADDON_API_NOGC_ENV env,
204229
void* data,
205230
void* finalizeHint) NAPI_NOEXCEPT {
@@ -210,6 +235,21 @@ struct FinalizeData {
210235
});
211236
}
212237

238+
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
239+
template <typename F = Finalizer,
240+
typename = std::enable_if_t<
241+
!std::is_invocable_v<F, node_api_nogc_env, T*, Hint*>>,
242+
typename = void>
243+
static inline void WrapperWithHint(NODE_ADDON_API_NOGC_ENV env,
244+
void* data,
245+
void* finalizeHint) NAPI_NOEXCEPT {
246+
napi_status status =
247+
node_api_post_finalizer(env, WrapperGCWithHint, data, finalizeHint);
248+
NAPI_FATAL_IF_FAILED(
249+
status, "PostFinalizerWrapper", "node_api_post_finalizer failed");
250+
}
251+
#endif
252+
213253
static inline void WrapperGCWithoutData(napi_env env,
214254
void* /*data*/,
215255
void* finalizeHint) NAPI_NOEXCEPT {

0 commit comments

Comments
 (0)