@@ -3341,13 +3341,7 @@ template <typename T>
33413341inline Reference<T>::~Reference () {
33423342 if (_ref != nullptr ) {
33433343 if (!_suppressDestruct) {
3344- #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
3345- Env ().PostFinalizer (
3346- [](Napi::Env env, napi_ref ref) { napi_delete_reference (env, ref); },
3347- _ref);
3348- #else
33493344 napi_delete_reference (_env, _ref);
3350- #endif
33513345 }
33523346
33533347 _ref = nullptr ;
@@ -4595,7 +4589,7 @@ template <typename T>
45954589inline ObjectWrap<T>::~ObjectWrap () {
45964590 // If the JS object still exists at this point, remove the finalizer added
45974591 // through `napi_wrap()`.
4598- if (!IsEmpty ()) {
4592+ if (!IsEmpty () && !_finalized ) {
45994593 Object object = Value ();
46004594 // It is not valid to call `napi_remove_wrap()` with an empty `object`.
46014595 // This happens e.g. during garbage collection.
@@ -5044,8 +5038,10 @@ inline void ObjectWrap<T>::FinalizeCallback(node_addon_api_basic_env env,
50445038 (void )env;
50455039 T* instance = static_cast <T*>(data);
50465040
5047- // Prevent ~ObjectWrap from calling napi_remove_wrap
5048- instance->_ref = nullptr ;
5041+ // Prevent ~ObjectWrap from calling napi_remove_wrap.
5042+ // The instance->_ref should be deleted with napi_delete_reference in
5043+ // ~Reference.
5044+ instance->_finalized = true ;
50495045
50505046 // If class overrides the basic finalizer, execute it.
50515047 if constexpr (details::HasBasicFinalizer<T>::value) {
0 commit comments