Skip to content

Commit

Permalink
fix compilation error with duplicate Finalizer identifier
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinEady committed Jul 25, 2024
1 parent ddd1ea4 commit 31d6c6c
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 36 deletions.
29 changes: 18 additions & 11 deletions doc/basic_env.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,9 @@ its `Remove()` method.
### PostFinalizer
```cpp
template <typename Finalizer>
inline void PostFinalizer(Finalizer finalizeCallback) const;
using FinalizerWithoutData = void (*)(Env);
inline void PostFinalizer(FinalizerWithoutData finalizeCallback) const;
```

- `[in] finalizeCallback`: The function to queue for execution outside of the GC
Expand All @@ -128,28 +129,34 @@ inline void PostFinalizer(Finalizer finalizeCallback) const;
### PostFinalizer

```cpp
template <typename Finalizer, typename T>
inline void PostFinalizer(Finalizer finalizeCallback, T* data) const;
template <typename T>
using Finalizer = void (*)(Napi::Env, T*);

template <typename DataType>
inline void PostFinalizer(Finalizer<DataType> finalizeCallback, DataType* data) const;
```
- `[in] finalizeCallback`: The function to queue for execution outside of the GC
finalization, implementing `operator()(Napi::Env, T*)`. See [Finalization]()
finalization, implementing `operator()(Napi::Env, DataType*)`. See [Finalization]()
for more details.
- `[in] data`: The data to associate with the object.
- `[in] data`: The data value passed to the `finalizeCallback` function.
### PostFinalizer
```cpp
template <typename Finalizer, typename T, typename Hint>
inline void PostFinalizer(Finalizer finalizeCallback,
T* data,
template <typename DataType, typename HintType>
using FinalizerWithHint = void (*)(Napi::Env, DataType*, HintType*);
template <typename DataType, typename HintType>
inline void PostFinalizer(FinalizerWithHint<DataType, HintType> finalizeCallback,
DataType* data,
Hint* finalizeHint) const;
```

- `[in] finalizeCallback`: The function to queue for execution outside of the GC
finalization, implementing `operator()(Napi::Env, T*, Hint*)`. See
finalization, implementing `operator()(Napi::Env, DataType*, HintType*)`. See
[Finalization]() for more details.
- `[in] data`: The data to associate with the object.
- `[in] data`: The data value passed to the `finalizeCallback` function.
- `[in] finalizeHint`: The hint value passed to the `finalizeCallback` function.

### AddCleanupHook
Expand Down
43 changes: 26 additions & 17 deletions napi-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -6789,16 +6789,16 @@ bool Env::CleanupHook<Hook, Arg>::IsEmpty() const {
#endif // NAPI_VERSION > 2

#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
template <typename Finalizer>
inline void BasicEnv::PostFinalizer(Finalizer finalizeCallback) const {
inline void BasicEnv::PostFinalizer(
FinalizerWithoutData finalizeCallback) const {
using T = void*;
details::FinalizeData<T, Finalizer>* finalizeData =
new details::FinalizeData<T, Finalizer>(
details::FinalizeData<T, FinalizerWithoutData>* finalizeData =
new details::FinalizeData<T, FinalizerWithoutData>(
{std::move(finalizeCallback), nullptr});

napi_status status = node_api_post_finalizer(
_env,
details::FinalizeData<T, Finalizer>::WrapperGCWithoutData,
details::FinalizeData<T, FinalizerWithoutData>::WrapperGCWithoutData,
static_cast<void*>(nullptr),
finalizeData);
if (status != napi_ok) {
Expand All @@ -6808,31 +6808,40 @@ inline void BasicEnv::PostFinalizer(Finalizer finalizeCallback) const {
}
}

template <typename Finalizer, typename T>
inline void BasicEnv::PostFinalizer(Finalizer finalizeCallback, T* data) const {
details::FinalizeData<T, Finalizer>* finalizeData =
new details::FinalizeData<T, Finalizer>(
template <typename DataType>
inline void BasicEnv::PostFinalizer(Finalizer<DataType> finalizeCallback,
DataType* data) const {
details::FinalizeData<DataType, Finalizer<DataType>>* finalizeData =
new details::FinalizeData<DataType, Finalizer<DataType>>(
{std::move(finalizeCallback), nullptr});

napi_status status = node_api_post_finalizer(
_env, details::FinalizeData<T, Finalizer>::WrapperGC, data, finalizeData);
_env,
details::FinalizeData<DataType, Finalizer<DataType>>::WrapperGC,
data,
finalizeData);
if (status != napi_ok) {
delete finalizeData;
NAPI_FATAL_IF_FAILED(
status, "BasicEnv::PostFinalizer", "invalid arguments");
}
}

template <typename Finalizer, typename T, typename Hint>
inline void BasicEnv::PostFinalizer(Finalizer finalizeCallback,
T* data,
Hint* finalizeHint) const {
details::FinalizeData<T, Finalizer, Hint>* finalizeData =
new details::FinalizeData<T, Finalizer, Hint>(
template <typename DataType, typename HintType>
inline void BasicEnv::PostFinalizer(
FinalizerWithHint<DataType, HintType> finalizeCallback,
DataType* data,
HintType* finalizeHint) const {
details::FinalizeData<DataType,
FinalizerWithHint<DataType, HintType>,
HintType>* finalizeData = new details::
FinalizeData<DataType, FinalizerWithHint<DataType, HintType>, HintType>(
{std::move(finalizeCallback), finalizeHint});
napi_status status = node_api_post_finalizer(
_env,
details::FinalizeData<T, Finalizer, Hint>::WrapperGCWithHint,
details::FinalizeData<DataType,
FinalizerWithHint<DataType, HintType>,
HintType>::WrapperGCWithHint,
data,
finalizeData);
if (status != napi_ok) {
Expand Down
18 changes: 10 additions & 8 deletions napi.h
Original file line number Diff line number Diff line change
Expand Up @@ -395,16 +395,18 @@ class BasicEnv {
#endif // NAPI_VERSION > 8

#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
template <typename Finalizer>
inline void PostFinalizer(Finalizer finalizeCallback) const;
using FinalizerWithoutData = void (*)(Env);
inline void PostFinalizer(FinalizerWithoutData finalizeCallback) const;

template <typename Finalizer, typename T>
inline void PostFinalizer(Finalizer finalizeCallback, T* data) const;
template <typename DataType>
inline void PostFinalizer(Finalizer<DataType> finalizeCallback,
DataType* data) const;

template <typename Finalizer, typename T, typename Hint>
inline void PostFinalizer(Finalizer finalizeCallback,
T* data,
Hint* finalizeHint) const;
template <typename DataType, typename HintType>
inline void PostFinalizer(
FinalizerWithHint<DataType, HintType> finalizeCallback,
DataType* data,
HintType* finalizeHint) const;
#endif // NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER

friend class Env;
Expand Down

0 comments on commit 31d6c6c

Please sign in to comment.