Skip to content

Commit fc73ba9

Browse files
committed
renaming ideas
rename NoGcEnv to BasicEnv, AddPostFinalizer to PostFinalizer, NoGc/GcFinalizer to Sync/AsyncFinalizer
1 parent 321fe1f commit fc73ba9

File tree

4 files changed

+164
-141
lines changed

4 files changed

+164
-141
lines changed

napi-inl.h

Lines changed: 64 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ inline std::string StringFormat(const char* format, ...) {
427427
}
428428

429429
template <typename T>
430-
class HasGcFinalize {
430+
class HasAsyncFinalizer {
431431
private:
432432
template <typename U, void (U::*)(Napi::Env)>
433433
struct SFINAE {};
@@ -441,9 +441,9 @@ class HasGcFinalize {
441441
};
442442

443443
template <typename T>
444-
class HasNogcFinalize {
444+
class HasSyncFinalizer {
445445
private:
446-
template <typename U, void (U::*)(Napi::NogcEnv)>
446+
template <typename U, void (U::*)(Napi::BasicEnv)>
447447
struct SFINAE {};
448448
template <typename U>
449449
static char test(SFINAE<U, &U::Finalize>*);
@@ -563,16 +563,16 @@ inline Maybe<T> Just(const T& t) {
563563
}
564564

565565
////////////////////////////////////////////////////////////////////////////////
566-
// NogcEnv / Env class
566+
// BasicEnv / Env class
567567
////////////////////////////////////////////////////////////////////////////////
568568

569-
inline NogcEnv::NogcEnv(node_api_nogc_env env) : _env(env) {}
569+
inline BasicEnv::BasicEnv(node_api_nogc_env env) : _env(env) {}
570570

571-
inline NogcEnv::operator node_api_nogc_env() const {
571+
inline BasicEnv::operator node_api_nogc_env() const {
572572
return _env;
573573
}
574574

575-
inline Env::Env(napi_env env) : NogcEnv(env) {}
575+
inline Env::Env(napi_env env) : BasicEnv(env) {}
576576

577577
inline Env::operator napi_env() const {
578578
return const_cast<napi_env>(_env);
@@ -635,78 +635,80 @@ inline MaybeOrValue<Value> Env::RunScript(String script) const {
635635

636636
#if NAPI_VERSION > 2
637637
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);
642641
cleanupData->hook();
643642
delete cleanupData;
644643
}
645644

646645
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);
651650
cleanupData->hook(static_cast<Arg*>(cleanupData->arg));
652651
delete cleanupData;
653652
}
654653
#endif // NAPI_VERSION > 2
655654

656655
#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 {
659658
napi_status status = napi_set_instance_data(
660659
_env,
661660
data,
662661
[](napi_env env, void* data, void*) {
663-
gc_fini(env, static_cast<T*>(data));
662+
async_fini(env, static_cast<T*>(data));
664663
},
665664
nullptr);
666-
NAPI_FATAL_IF_FAILED(status, "NogcEnv::SetInstanceData", "invalid arguments");
665+
NAPI_FATAL_IF_FAILED(
666+
status, "BasicEnv::SetInstanceData", "invalid arguments");
667667
}
668668

669669
template <typename DataType,
670670
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 {
673673
napi_status status = napi_set_instance_data(
674674
_env,
675675
data,
676676
[](napi_env env, void* data, void* hint) {
677677
fini(env, static_cast<DataType*>(data), static_cast<HintType*>(hint));
678678
},
679679
hint);
680-
NAPI_FATAL_IF_FAILED(status, "NogcEnv::SetInstanceData", "invalid arguments");
680+
NAPI_FATAL_IF_FAILED(
681+
status, "BasicEnv::SetInstanceData", "invalid arguments");
681682
}
682683

683684
template <typename T>
684-
inline T* NogcEnv::GetInstanceData() const {
685+
inline T* BasicEnv::GetInstanceData() const {
685686
void* data = nullptr;
686687

687688
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");
689691

690692
return static_cast<T*>(data);
691693
}
692694

693695
template <typename T>
694-
void NogcEnv::DefaultGcFini(Env, T* data) {
696+
void BasicEnv::DefaultAsyncFini(Env, T* data) {
695697
delete data;
696698
}
697699

698700
template <typename DataType, typename HintType>
699-
void NogcEnv::DefaultGcFiniWithHint(Env, DataType* data, HintType*) {
701+
void BasicEnv::DefaultAsyncFiniWithHint(Env, DataType* data, HintType*) {
700702
delete data;
701703
}
702704
#endif // NAPI_VERSION > 5
703705

704706
#if NAPI_VERSION > 8
705-
inline const char* NogcEnv::GetModuleFileName() const {
707+
inline const char* BasicEnv::GetModuleFileName() const {
706708
const char* result;
707709
napi_status status = node_api_get_module_file_name(_env, &result);
708710
NAPI_FATAL_IF_FAILED(
709-
status, "NogcEnv::GetModuleFileName", "invalid arguments");
711+
status, "BasicEnv::GetModuleFileName", "invalid arguments");
710712
return result;
711713
}
712714
#endif // NAPI_VERSION > 8
@@ -3315,7 +3317,7 @@ inline Reference<T>::~Reference() {
33153317
if (_ref != nullptr) {
33163318
if (!_suppressDestruct) {
33173319
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
3318-
Env().AddPostFinalizer(
3320+
Env().PostFinalizer(
33193321
[](Napi::Env env, napi_ref ref) { napi_delete_reference(env, ref); },
33203322
_ref);
33213323
#else
@@ -4921,7 +4923,7 @@ template <typename T>
49214923
inline void ObjectWrap<T>::Finalize(Napi::Env /*env*/) {}
49224924

49234925
template <typename T>
4924-
inline void ObjectWrap<T>::Finalize(NogcEnv /*env*/) {}
4926+
inline void ObjectWrap<T>::Finalize(BasicEnv /*env*/) {}
49254927

49264928
template <typename T>
49274929
inline napi_value ObjectWrap<T>::ConstructorCallbackWrapper(
@@ -5016,26 +5018,39 @@ inline void ObjectWrap<T>::FinalizeCallback(node_api_nogc_env env,
50165018
// Prevent ~ObjectWrap from calling napi_remove_wrap
50175019
instance->_ref = nullptr;
50185020

5019-
if constexpr (details::HasNogcFinalize<T>::value) {
5021+
// If class overrides the synchronous finalizer, execute it.
5022+
if constexpr (details::HasSyncFinalizer<T>::value) {
50205023
#ifndef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
50215024
HandleScope scope(env);
50225025
#endif
50235026

5024-
instance->Finalize(Napi::NogcEnv(env));
5027+
instance->Finalize(Napi::BasicEnv(env));
50255028
}
50265029

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) {
50285033
#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.
50295037
napi_status status =
50305038
node_api_post_finalizer(env, PostFinalizeCallback, data, nullptr);
50315039
NAPI_FATAL_IF_FAILED(status,
50325040
"ObjectWrap<T>::FinalizeCallback",
50335041
"node_api_post_finalizer failed");
50345042
#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.
50355047
HandleScope scope(env);
50365048
PostFinalizeCallback(env, data, static_cast<void*>(nullptr));
50375049
#endif
5038-
} else {
5050+
}
5051+
// If the instance does _not_ have an asynchronous finalizer, delete the `T*
5052+
// instance` immediately.
5053+
else {
50395054
delete instance;
50405055
}
50415056
}
@@ -6723,12 +6738,12 @@ inline Napi::Object Addon<T>::DefineProperties(
67236738

67246739
#if NAPI_VERSION > 2
67256740
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) {
67276742
return CleanupHook<Hook, Arg>(*this, hook, arg);
67286743
}
67296744

67306745
template <typename Hook>
6731-
Env::CleanupHook<Hook> NogcEnv::AddCleanupHook(Hook hook) {
6746+
Env::CleanupHook<Hook> BasicEnv::AddCleanupHook(Hook hook) {
67326747
return CleanupHook<Hook>(*this, hook);
67336748
}
67346749

@@ -6738,7 +6753,7 @@ Env::CleanupHook<Hook, Arg>::CleanupHook() {
67386753
}
67396754

67406755
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)
67426757
: wrapper(Env::CleanupHook<Hook, Arg>::Wrapper) {
67436758
data = new CleanupData{std::move(hook), nullptr};
67446759
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)
67496764
}
67506765

67516766
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)
67536770
: wrapper(Env::CleanupHook<Hook, Arg>::WrapperWithArg) {
67546771
data = new CleanupData{std::move(hook), arg};
67556772
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)
67606777
}
67616778

67626779
template <class Hook, class Arg>
6763-
bool Env::CleanupHook<Hook, Arg>::Remove(NogcEnv env) {
6780+
bool Env::CleanupHook<Hook, Arg>::Remove(BasicEnv env) {
67646781
napi_status status = napi_remove_env_cleanup_hook(env, wrapper, data);
67656782
delete data;
67666783
data = nullptr;
@@ -6775,7 +6792,7 @@ bool Env::CleanupHook<Hook, Arg>::IsEmpty() const {
67756792

67766793
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
67776794
template <typename Finalizer>
6778-
inline void NogcEnv::AddPostFinalizer(Finalizer finalizeCallback) const {
6795+
inline void BasicEnv::PostFinalizer(Finalizer finalizeCallback) const {
67796796
using T = void*;
67806797
details::FinalizeData<T, Finalizer>* finalizeData =
67816798
new details::FinalizeData<T, Finalizer>(
@@ -6789,13 +6806,12 @@ inline void NogcEnv::AddPostFinalizer(Finalizer finalizeCallback) const {
67896806
if (status != napi_ok) {
67906807
delete finalizeData;
67916808
NAPI_FATAL_IF_FAILED(
6792-
status, "NogcEnv::AddPostFinalizer", "invalid arguments");
6809+
status, "BasicEnv::PostFinalizer", "invalid arguments");
67936810
}
67946811
}
67956812

67966813
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 {
67996815
details::FinalizeData<T, Finalizer>* finalizeData =
68006816
new details::FinalizeData<T, Finalizer>(
68016817
{std::move(finalizeCallback), nullptr});
@@ -6805,14 +6821,14 @@ inline void NogcEnv::AddPostFinalizer(Finalizer finalizeCallback,
68056821
if (status != napi_ok) {
68066822
delete finalizeData;
68076823
NAPI_FATAL_IF_FAILED(
6808-
status, "NogcEnv::AddPostFinalizer", "invalid arguments");
6824+
status, "BasicEnv::PostFinalizer", "invalid arguments");
68096825
}
68106826
}
68116827

68126828
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 {
68166832
details::FinalizeData<T, Finalizer, Hint>* finalizeData =
68176833
new details::FinalizeData<T, Finalizer, Hint>(
68186834
{std::move(finalizeCallback), finalizeHint});
@@ -6824,7 +6840,7 @@ inline void NogcEnv::AddPostFinalizer(Finalizer finalizeCallback,
68246840
if (status != napi_ok) {
68256841
delete finalizeData;
68266842
NAPI_FATAL_IF_FAILED(
6827-
status, "NogcEnv::AddPostFinalizer", "invalid arguments");
6843+
status, "BasicEnv::PostFinalizer", "invalid arguments");
68286844
}
68296845
}
68306846
#endif // NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER

0 commit comments

Comments
 (0)