@@ -427,7 +427,7 @@ inline std::string StringFormat(const char* format, ...) {
427
427
}
428
428
429
429
template <typename T>
430
- class HasGcFinalize {
430
+ class HasAsyncFinalizer {
431
431
private:
432
432
template <typename U, void (U::*)(Napi::Env)>
433
433
struct SFINAE {};
@@ -441,9 +441,9 @@ class HasGcFinalize {
441
441
};
442
442
443
443
template <typename T>
444
- class HasNogcFinalize {
444
+ class HasSyncFinalizer {
445
445
private:
446
- template <typename U, void (U::*)(Napi::NogcEnv )>
446
+ template <typename U, void (U::*)(Napi::BasicEnv )>
447
447
struct SFINAE {};
448
448
template <typename U>
449
449
static char test (SFINAE<U, &U::Finalize>*);
@@ -563,16 +563,16 @@ inline Maybe<T> Just(const T& t) {
563
563
}
564
564
565
565
// //////////////////////////////////////////////////////////////////////////////
566
- // NogcEnv / Env class
566
+ // BasicEnv / Env class
567
567
// //////////////////////////////////////////////////////////////////////////////
568
568
569
- inline NogcEnv::NogcEnv (node_api_nogc_env env) : _env(env) {}
569
+ inline BasicEnv::BasicEnv (node_api_nogc_env env) : _env(env) {}
570
570
571
- inline NogcEnv ::operator node_api_nogc_env () const {
571
+ inline BasicEnv ::operator node_api_nogc_env () const {
572
572
return _env;
573
573
}
574
574
575
- inline Env::Env (napi_env env) : NogcEnv (env) {}
575
+ inline Env::Env (napi_env env) : BasicEnv (env) {}
576
576
577
577
inline Env::operator napi_env () const {
578
578
return const_cast <napi_env>(_env);
@@ -635,78 +635,80 @@ inline MaybeOrValue<Value> Env::RunScript(String script) const {
635
635
636
636
#if NAPI_VERSION > 2
637
637
template <typename Hook, typename Arg>
638
- void NogcEnv::CleanupHook<Hook, Arg>::Wrapper(void * data) NAPI_NOEXCEPT {
639
- auto * cleanupData =
640
- static_cast <typename Napi::NogcEnv::CleanupHook<Hook, Arg>::CleanupData*>(
641
- data);
638
+ void BasicEnv::CleanupHook<Hook, Arg>::Wrapper(void * data) NAPI_NOEXCEPT {
639
+ auto * cleanupData = static_cast <
640
+ typename Napi::BasicEnv::CleanupHook<Hook, Arg>::CleanupData*>(data);
642
641
cleanupData->hook ();
643
642
delete cleanupData;
644
643
}
645
644
646
645
template <typename Hook, typename Arg>
647
- void NogcEnv ::CleanupHook<Hook, Arg>::WrapperWithArg(void * data) NAPI_NOEXCEPT {
648
- auto * cleanupData =
649
- static_cast <typename Napi::NogcEnv::CleanupHook<Hook, Arg>::CleanupData*>(
650
- data);
646
+ void BasicEnv ::CleanupHook<Hook, Arg>::WrapperWithArg(void * data)
647
+ NAPI_NOEXCEPT {
648
+ auto * cleanupData = static_cast <
649
+ typename Napi::BasicEnv::CleanupHook<Hook, Arg>::CleanupData*>( data);
651
650
cleanupData->hook (static_cast <Arg*>(cleanupData->arg ));
652
651
delete cleanupData;
653
652
}
654
653
#endif // NAPI_VERSION > 2
655
654
656
655
#if NAPI_VERSION > 5
657
- template <typename T, NogcEnv::GcFinalizer <T> gc_fini >
658
- inline void NogcEnv ::SetInstanceData (T* data) const {
656
+ template <typename T, BasicEnv::AsyncFinalizer <T> async_fini >
657
+ inline void BasicEnv ::SetInstanceData (T* data) const {
659
658
napi_status status = napi_set_instance_data (
660
659
_env,
661
660
data,
662
661
[](napi_env env, void * data, void *) {
663
- gc_fini (env, static_cast <T*>(data));
662
+ async_fini (env, static_cast <T*>(data));
664
663
},
665
664
nullptr );
666
- NAPI_FATAL_IF_FAILED (status, " NogcEnv::SetInstanceData" , " invalid arguments" );
665
+ NAPI_FATAL_IF_FAILED (
666
+ status, " BasicEnv::SetInstanceData" , " invalid arguments" );
667
667
}
668
668
669
669
template <typename DataType,
670
670
typename HintType,
671
- Napi::NogcEnv::GcFinalizerWithHint <DataType, HintType> fini>
672
- inline void NogcEnv ::SetInstanceData (DataType* data, HintType* hint) const {
671
+ Napi::BasicEnv::AsyncFinalizerWithHint <DataType, HintType> fini>
672
+ inline void BasicEnv ::SetInstanceData (DataType* data, HintType* hint) const {
673
673
napi_status status = napi_set_instance_data (
674
674
_env,
675
675
data,
676
676
[](napi_env env, void * data, void * hint) {
677
677
fini (env, static_cast <DataType*>(data), static_cast <HintType*>(hint));
678
678
},
679
679
hint);
680
- NAPI_FATAL_IF_FAILED (status, " NogcEnv::SetInstanceData" , " invalid arguments" );
680
+ NAPI_FATAL_IF_FAILED (
681
+ status, " BasicEnv::SetInstanceData" , " invalid arguments" );
681
682
}
682
683
683
684
template <typename T>
684
- inline T* NogcEnv ::GetInstanceData () const {
685
+ inline T* BasicEnv ::GetInstanceData () const {
685
686
void * data = nullptr ;
686
687
687
688
napi_status status = napi_get_instance_data (_env, &data);
688
- NAPI_FATAL_IF_FAILED (status, " NogcEnv::GetInstanceData" , " invalid arguments" );
689
+ NAPI_FATAL_IF_FAILED (
690
+ status, " BasicEnv::GetInstanceData" , " invalid arguments" );
689
691
690
692
return static_cast <T*>(data);
691
693
}
692
694
693
695
template <typename T>
694
- void NogcEnv::DefaultGcFini (Env, T* data) {
696
+ void BasicEnv::DefaultAsyncFini (Env, T* data) {
695
697
delete data;
696
698
}
697
699
698
700
template <typename DataType, typename HintType>
699
- void NogcEnv::DefaultGcFiniWithHint (Env, DataType* data, HintType*) {
701
+ void BasicEnv::DefaultAsyncFiniWithHint (Env, DataType* data, HintType*) {
700
702
delete data;
701
703
}
702
704
#endif // NAPI_VERSION > 5
703
705
704
706
#if NAPI_VERSION > 8
705
- inline const char * NogcEnv ::GetModuleFileName () const {
707
+ inline const char * BasicEnv ::GetModuleFileName () const {
706
708
const char * result;
707
709
napi_status status = node_api_get_module_file_name (_env, &result);
708
710
NAPI_FATAL_IF_FAILED (
709
- status, " NogcEnv ::GetModuleFileName" , " invalid arguments" );
711
+ status, " BasicEnv ::GetModuleFileName" , " invalid arguments" );
710
712
return result;
711
713
}
712
714
#endif // NAPI_VERSION > 8
@@ -3315,7 +3317,7 @@ inline Reference<T>::~Reference() {
3315
3317
if (_ref != nullptr ) {
3316
3318
if (!_suppressDestruct) {
3317
3319
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
3318
- Env ().AddPostFinalizer (
3320
+ Env ().PostFinalizer (
3319
3321
[](Napi::Env env, napi_ref ref) { napi_delete_reference (env, ref); },
3320
3322
_ref);
3321
3323
#else
@@ -4921,7 +4923,7 @@ template <typename T>
4921
4923
inline void ObjectWrap<T>::Finalize (Napi::Env /* env*/ ) {}
4922
4924
4923
4925
template <typename T>
4924
- inline void ObjectWrap<T>::Finalize (NogcEnv /* env*/ ) {}
4926
+ inline void ObjectWrap<T>::Finalize (BasicEnv /* env*/ ) {}
4925
4927
4926
4928
template <typename T>
4927
4929
inline napi_value ObjectWrap<T>::ConstructorCallbackWrapper (
@@ -5016,26 +5018,39 @@ inline void ObjectWrap<T>::FinalizeCallback(node_api_nogc_env env,
5016
5018
// Prevent ~ObjectWrap from calling napi_remove_wrap
5017
5019
instance->_ref = nullptr ;
5018
5020
5019
- if constexpr (details::HasNogcFinalize<T>::value) {
5021
+ // If class overrides the synchronous finalizer, execute it.
5022
+ if constexpr (details::HasSyncFinalizer<T>::value) {
5020
5023
#ifndef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
5021
5024
HandleScope scope (env);
5022
5025
#endif
5023
5026
5024
- instance->Finalize (Napi::NogcEnv (env));
5027
+ instance->Finalize (Napi::BasicEnv (env));
5025
5028
}
5026
5029
5027
- if constexpr (details::HasGcFinalize<T>::value) {
5030
+ // If class overrides the asynchronous finalizer, either schedule it or
5031
+ // execute it immediately (depending on experimental features enabled).
5032
+ if constexpr (details::HasAsyncFinalizer<T>::value) {
5028
5033
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
5034
+ // In experimental, attach via node_api_post_finalizer.
5035
+ // `PostFinalizeCallback` is responsible for deleting the `T* instance`,
5036
+ // after calling the user-provided finalizer.
5029
5037
napi_status status =
5030
5038
node_api_post_finalizer (env, PostFinalizeCallback, data, nullptr );
5031
5039
NAPI_FATAL_IF_FAILED (status,
5032
5040
" ObjectWrap<T>::FinalizeCallback" ,
5033
5041
" node_api_post_finalizer failed" );
5034
5042
#else
5043
+ // In non-experimental, this `FinalizeCallback` already executes from
5044
+ // outside the garbage collector. Execute the override directly.
5045
+ // `PostFinalizeCallback` is responsible for deleting the `T* instance`,
5046
+ // after calling the user-provided finalizer.
5035
5047
HandleScope scope (env);
5036
5048
PostFinalizeCallback (env, data, static_cast <void *>(nullptr ));
5037
5049
#endif
5038
- } else {
5050
+ }
5051
+ // If the instance does _not_ have an asynchronous finalizer, delete the `T*
5052
+ // instance` immediately.
5053
+ else {
5039
5054
delete instance;
5040
5055
}
5041
5056
}
@@ -6723,12 +6738,12 @@ inline Napi::Object Addon<T>::DefineProperties(
6723
6738
6724
6739
#if NAPI_VERSION > 2
6725
6740
template <typename Hook, typename Arg>
6726
- Env::CleanupHook<Hook, Arg> NogcEnv ::AddCleanupHook (Hook hook, Arg* arg) {
6741
+ Env::CleanupHook<Hook, Arg> BasicEnv ::AddCleanupHook (Hook hook, Arg* arg) {
6727
6742
return CleanupHook<Hook, Arg>(*this , hook, arg);
6728
6743
}
6729
6744
6730
6745
template <typename Hook>
6731
- Env::CleanupHook<Hook> NogcEnv ::AddCleanupHook (Hook hook) {
6746
+ Env::CleanupHook<Hook> BasicEnv ::AddCleanupHook (Hook hook) {
6732
6747
return CleanupHook<Hook>(*this , hook);
6733
6748
}
6734
6749
@@ -6738,7 +6753,7 @@ Env::CleanupHook<Hook, Arg>::CleanupHook() {
6738
6753
}
6739
6754
6740
6755
template <typename Hook, typename Arg>
6741
- Env::CleanupHook<Hook, Arg>::CleanupHook (Napi::NogcEnv env, Hook hook)
6756
+ Env::CleanupHook<Hook, Arg>::CleanupHook (Napi::BasicEnv env, Hook hook)
6742
6757
: wrapper (Env::CleanupHook<Hook, Arg>::Wrapper) {
6743
6758
data = new CleanupData{std::move (hook), nullptr };
6744
6759
napi_status status = napi_add_env_cleanup_hook (env, wrapper, data);
@@ -6749,7 +6764,9 @@ Env::CleanupHook<Hook, Arg>::CleanupHook(Napi::NogcEnv env, Hook hook)
6749
6764
}
6750
6765
6751
6766
template <typename Hook, typename Arg>
6752
- Env::CleanupHook<Hook, Arg>::CleanupHook (Napi::NogcEnv env, Hook hook, Arg* arg)
6767
+ Env::CleanupHook<Hook, Arg>::CleanupHook (Napi::BasicEnv env,
6768
+ Hook hook,
6769
+ Arg* arg)
6753
6770
: wrapper (Env::CleanupHook<Hook, Arg>::WrapperWithArg) {
6754
6771
data = new CleanupData{std::move (hook), arg};
6755
6772
napi_status status = napi_add_env_cleanup_hook (env, wrapper, data);
@@ -6760,7 +6777,7 @@ Env::CleanupHook<Hook, Arg>::CleanupHook(Napi::NogcEnv env, Hook hook, Arg* arg)
6760
6777
}
6761
6778
6762
6779
template <class Hook , class Arg >
6763
- bool Env::CleanupHook<Hook, Arg>::Remove (NogcEnv env) {
6780
+ bool Env::CleanupHook<Hook, Arg>::Remove (BasicEnv env) {
6764
6781
napi_status status = napi_remove_env_cleanup_hook (env, wrapper, data);
6765
6782
delete data;
6766
6783
data = nullptr ;
@@ -6775,7 +6792,7 @@ bool Env::CleanupHook<Hook, Arg>::IsEmpty() const {
6775
6792
6776
6793
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
6777
6794
template <typename Finalizer>
6778
- inline void NogcEnv::AddPostFinalizer (Finalizer finalizeCallback) const {
6795
+ inline void BasicEnv::PostFinalizer (Finalizer finalizeCallback) const {
6779
6796
using T = void *;
6780
6797
details::FinalizeData<T, Finalizer>* finalizeData =
6781
6798
new details::FinalizeData<T, Finalizer>(
@@ -6789,13 +6806,12 @@ inline void NogcEnv::AddPostFinalizer(Finalizer finalizeCallback) const {
6789
6806
if (status != napi_ok) {
6790
6807
delete finalizeData;
6791
6808
NAPI_FATAL_IF_FAILED (
6792
- status, " NogcEnv::AddPostFinalizer " , " invalid arguments" );
6809
+ status, " BasicEnv::PostFinalizer " , " invalid arguments" );
6793
6810
}
6794
6811
}
6795
6812
6796
6813
template <typename Finalizer, typename T>
6797
- inline void NogcEnv::AddPostFinalizer (Finalizer finalizeCallback,
6798
- T* data) const {
6814
+ inline void BasicEnv::PostFinalizer (Finalizer finalizeCallback, T* data) const {
6799
6815
details::FinalizeData<T, Finalizer>* finalizeData =
6800
6816
new details::FinalizeData<T, Finalizer>(
6801
6817
{std::move (finalizeCallback), nullptr });
@@ -6805,14 +6821,14 @@ inline void NogcEnv::AddPostFinalizer(Finalizer finalizeCallback,
6805
6821
if (status != napi_ok) {
6806
6822
delete finalizeData;
6807
6823
NAPI_FATAL_IF_FAILED (
6808
- status, " NogcEnv::AddPostFinalizer " , " invalid arguments" );
6824
+ status, " BasicEnv::PostFinalizer " , " invalid arguments" );
6809
6825
}
6810
6826
}
6811
6827
6812
6828
template <typename Finalizer, typename T, typename Hint>
6813
- inline void NogcEnv::AddPostFinalizer (Finalizer finalizeCallback,
6814
- T* data,
6815
- Hint* finalizeHint) const {
6829
+ inline void BasicEnv::PostFinalizer (Finalizer finalizeCallback,
6830
+ T* data,
6831
+ Hint* finalizeHint) const {
6816
6832
details::FinalizeData<T, Finalizer, Hint>* finalizeData =
6817
6833
new details::FinalizeData<T, Finalizer, Hint>(
6818
6834
{std::move (finalizeCallback), finalizeHint});
@@ -6824,7 +6840,7 @@ inline void NogcEnv::AddPostFinalizer(Finalizer finalizeCallback,
6824
6840
if (status != napi_ok) {
6825
6841
delete finalizeData;
6826
6842
NAPI_FATAL_IF_FAILED (
6827
- status, " NogcEnv::AddPostFinalizer " , " invalid arguments" );
6843
+ status, " BasicEnv::PostFinalizer " , " invalid arguments" );
6828
6844
}
6829
6845
}
6830
6846
#endif // NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
0 commit comments