@@ -442,6 +442,26 @@ inline Value Env::RunScript(String script) {
442
442
return Value (_env, result);
443
443
}
444
444
445
+ #if NAPI_VERSION > 2
446
+ template <typename Hook, typename Arg>
447
+ void Env::CleanupHook<Hook, Arg>::Wrapper(void * data) NAPI_NOEXCEPT {
448
+ auto * cleanupData =
449
+ static_cast <typename Napi::Env::CleanupHook<Hook, Arg>::CleanupData*>(
450
+ data);
451
+ cleanupData->hook ();
452
+ delete cleanupData;
453
+ }
454
+
455
+ template <typename Hook, typename Arg>
456
+ void Env::CleanupHook<Hook, Arg>::WrapperWithArg(void * data) NAPI_NOEXCEPT {
457
+ auto * cleanupData =
458
+ static_cast <typename Napi::Env::CleanupHook<Hook, Arg>::CleanupData*>(
459
+ data);
460
+ cleanupData->hook (static_cast <Arg*>(cleanupData->arg ));
461
+ delete cleanupData;
462
+ }
463
+ #endif // NAPI_VERSION > 2
464
+
445
465
#if NAPI_VERSION > 5
446
466
template <typename T, Env::Finalizer<T> fini>
447
467
inline void Env::SetInstanceData (T* data) {
@@ -5725,6 +5745,53 @@ Addon<T>::DefineProperties(Object object,
5725
5745
}
5726
5746
#endif // NAPI_VERSION > 5
5727
5747
5748
+ #if NAPI_VERSION > 2
5749
+ template <typename Hook, typename Arg>
5750
+ Env::CleanupHook<Hook, Arg> Env::AddCleanupHook (Hook hook, Arg* arg) {
5751
+ return CleanupHook<Hook, Arg>(*this , hook, arg);
5752
+ }
5753
+
5754
+ template <typename Hook>
5755
+ Env::CleanupHook<Hook> Env::AddCleanupHook (Hook hook) {
5756
+ return CleanupHook<Hook>(*this , hook);
5757
+ }
5758
+
5759
+ template <typename Hook, typename Arg>
5760
+ Env::CleanupHook<Hook, Arg>::CleanupHook(Napi::Env env, Hook hook)
5761
+ : wrapper(Env::CleanupHook<Hook, Arg>::Wrapper) {
5762
+ data = new CleanupData{std::move (hook), nullptr };
5763
+ napi_status status = napi_add_env_cleanup_hook (env, wrapper, data);
5764
+ if (status != napi_ok) {
5765
+ delete data;
5766
+ data = nullptr ;
5767
+ }
5768
+ }
5769
+
5770
+ template <typename Hook, typename Arg>
5771
+ Env::CleanupHook<Hook, Arg>::CleanupHook(Napi::Env env, Hook hook, Arg* arg)
5772
+ : wrapper(Env::CleanupHook<Hook, Arg>::WrapperWithArg) {
5773
+ data = new CleanupData{std::move (hook), arg};
5774
+ napi_status status = napi_add_env_cleanup_hook (env, wrapper, data);
5775
+ if (status != napi_ok) {
5776
+ delete data;
5777
+ data = nullptr ;
5778
+ }
5779
+ }
5780
+
5781
+ template <class Hook , class Arg >
5782
+ bool Env::CleanupHook<Hook, Arg>::Remove(Env env) {
5783
+ napi_status status = napi_remove_env_cleanup_hook (env, wrapper, data);
5784
+ delete data;
5785
+ data = nullptr ;
5786
+ return status == napi_ok;
5787
+ }
5788
+
5789
+ template <class Hook , class Arg >
5790
+ bool Env::CleanupHook<Hook, Arg>::IsEmpty() const {
5791
+ return data == nullptr ;
5792
+ }
5793
+ #endif // NAPI_VERSION > 2
5794
+
5728
5795
} // namespace Napi
5729
5796
5730
5797
#endif // SRC_NAPI_INL_H_
0 commit comments