Skip to content

Commit 5ca9633

Browse files
committed
finish renaming async finalizer to basic
1 parent 16bca96 commit 5ca9633

File tree

4 files changed

+77
-81
lines changed

4 files changed

+77
-81
lines changed

napi-inl.h

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ namespace details {
3535
constexpr int napi_no_external_buffers_allowed = 22;
3636

3737
template <typename FreeType>
38-
inline void default_finalizer(node_api_nogc_env /*env*/,
39-
void* data,
40-
void* /*hint*/) {
38+
inline void default_basic_finalizer(node_api_nogc_env /*env*/,
39+
void* data,
40+
void* /*hint*/) {
4141
delete static_cast<FreeType*>(data);
4242
}
4343

@@ -46,7 +46,7 @@ inline void default_finalizer(node_api_nogc_env /*env*/,
4646
// TODO: Replace this code with `napi_add_finalizer()` whenever it becomes
4747
// available on all supported versions of Node.js.
4848
template <typename FreeType,
49-
node_api_nogc_finalize finalizer = default_finalizer<FreeType>>
49+
node_api_nogc_finalize finalizer = default_basic_finalizer<FreeType>>
5050
inline napi_status AttachData(napi_env env,
5151
napi_value obj,
5252
FreeType* data,
@@ -427,7 +427,7 @@ inline std::string StringFormat(const char* format, ...) {
427427
}
428428

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

443443
template <typename T>
444-
class HasSyncFinalizer {
444+
class HasBasicFinalizer {
445445
private:
446446
template <typename U, void (U::*)(Napi::BasicEnv)>
447447
struct SFINAE {};
@@ -653,22 +653,20 @@ void BasicEnv::CleanupHook<Hook, Arg>::WrapperWithArg(void* data)
653653
#endif // NAPI_VERSION > 2
654654

655655
#if NAPI_VERSION > 5
656-
template <typename T, BasicEnv::AsyncFinalizer<T> async_fini>
656+
template <typename T, BasicEnv::Finalizer<T> fini>
657657
inline void BasicEnv::SetInstanceData(T* data) const {
658658
napi_status status = napi_set_instance_data(
659659
_env,
660660
data,
661-
[](napi_env env, void* data, void*) {
662-
async_fini(env, static_cast<T*>(data));
663-
},
661+
[](napi_env env, void* data, void*) { fini(env, static_cast<T*>(data)); },
664662
nullptr);
665663
NAPI_FATAL_IF_FAILED(
666664
status, "BasicEnv::SetInstanceData", "invalid arguments");
667665
}
668666

669667
template <typename DataType,
670668
typename HintType,
671-
Napi::BasicEnv::AsyncFinalizerWithHint<DataType, HintType> fini>
669+
Napi::BasicEnv::FinalizerWithHint<DataType, HintType> fini>
672670
inline void BasicEnv::SetInstanceData(DataType* data, HintType* hint) const {
673671
napi_status status = napi_set_instance_data(
674672
_env,
@@ -693,12 +691,12 @@ inline T* BasicEnv::GetInstanceData() const {
693691
}
694692

695693
template <typename T>
696-
void BasicEnv::DefaultAsyncFini(Env, T* data) {
694+
void BasicEnv::DefaultFini(Env, T* data) {
697695
delete data;
698696
}
699697

700698
template <typename DataType, typename HintType>
701-
void BasicEnv::DefaultAsyncFiniWithHint(Env, DataType* data, HintType*) {
699+
void BasicEnv::DefaultFiniWithHint(Env, DataType* data, HintType*) {
702700
delete data;
703701
}
704702
#endif // NAPI_VERSION > 5
@@ -5018,18 +5016,18 @@ inline void ObjectWrap<T>::FinalizeCallback(node_api_nogc_env env,
50185016
// Prevent ~ObjectWrap from calling napi_remove_wrap
50195017
instance->_ref = nullptr;
50205018

5021-
// If class overrides the synchronous finalizer, execute it.
5022-
if constexpr (details::HasSyncFinalizer<T>::value) {
5019+
// If class overrides the basic finalizer, execute it.
5020+
if constexpr (details::HasBasicFinalizer<T>::value) {
50235021
#ifndef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
50245022
HandleScope scope(env);
50255023
#endif
50265024

50275025
instance->Finalize(Napi::BasicEnv(env));
50285026
}
50295027

5030-
// If class overrides the asynchronous finalizer, either schedule it or
5028+
// If class overrides the (extended) finalizer, either schedule it or
50315029
// execute it immediately (depending on experimental features enabled).
5032-
if constexpr (details::HasAsyncFinalizer<T>::value) {
5030+
if constexpr (details::HasExtendedFinalizer<T>::value) {
50335031
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
50345032
// In experimental, attach via node_api_post_finalizer.
50355033
// `PostFinalizeCallback` is responsible for deleting the `T* instance`,
@@ -5040,16 +5038,16 @@ inline void ObjectWrap<T>::FinalizeCallback(node_api_nogc_env env,
50405038
"ObjectWrap<T>::FinalizeCallback",
50415039
"node_api_post_finalizer failed");
50425040
#else
5043-
// In non-experimental, this `FinalizeCallback` already executes from
5044-
// outside the garbage collector. Execute the override directly.
5041+
// In non-experimental, this `FinalizeCallback` already executes from a
5042+
// non-basic environment. Execute the override directly.
50455043
// `PostFinalizeCallback` is responsible for deleting the `T* instance`,
50465044
// after calling the user-provided finalizer.
50475045
HandleScope scope(env);
50485046
PostFinalizeCallback(env, data, static_cast<void*>(nullptr));
50495047
#endif
50505048
}
5051-
// If the instance does _not_ have an asynchronous finalizer, delete the `T*
5052-
// instance` immediately.
5049+
// If the instance does _not_ override the (extended) finalizer, delete the
5050+
// `T* instance` immediately.
50535051
else {
50545052
delete instance;
50555053
}

napi.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,9 @@ class BasicEnv {
318318
node_api_nogc_env _env;
319319
#if NAPI_VERSION > 5
320320
template <typename T>
321-
static void DefaultAsyncFini(Env, T* data);
321+
static void DefaultFini(Env, T* data);
322322
template <typename DataType, typename HintType>
323-
static void DefaultAsyncFiniWithHint(Env, DataType* data, HintType* hint);
323+
static void DefaultFiniWithHint(Env, DataType* data, HintType* hint);
324324
#endif // NAPI_VERSION > 5
325325
public:
326326
BasicEnv(node_api_nogc_env env);
@@ -355,17 +355,16 @@ class BasicEnv {
355355
T* GetInstanceData() const;
356356

357357
template <typename T>
358-
using AsyncFinalizer = void (*)(Env, T*);
359-
template <typename T,
360-
AsyncFinalizer<T> async_fini = BasicEnv::DefaultAsyncFini<T>>
358+
using Finalizer = void (*)(Env, T*);
359+
template <typename T, Finalizer<T> fini = BasicEnv::DefaultFini<T>>
361360
void SetInstanceData(T* data) const;
362361

363362
template <typename DataType, typename HintType>
364-
using AsyncFinalizerWithHint = void (*)(Env, DataType*, HintType*);
363+
using FinalizerWithHint = void (*)(Env, DataType*, HintType*);
365364
template <typename DataType,
366365
typename HintType,
367-
AsyncFinalizerWithHint<DataType, HintType> fini =
368-
BasicEnv::DefaultAsyncFiniWithHint<DataType, HintType>>
366+
FinalizerWithHint<DataType, HintType> fini =
367+
BasicEnv::DefaultFiniWithHint<DataType, HintType>>
369368
void SetInstanceData(DataType* data, HintType* hint) const;
370369
#endif // NAPI_VERSION > 5
371370

test/finalizer_order.cc

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ namespace {
44
class Test : public Napi::ObjectWrap<Test> {
55
public:
66
Test(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Test>(info) {
7-
syncFinalizerCalled = false;
8-
asyncFinalizerCalled = false;
7+
basicFinalizerCalled = false;
8+
finalizerCalled = false;
99

1010
if (info.Length() > 0) {
1111
finalizeCb_ = Napi::Persistent(info[0].As<Napi::Function>());
@@ -17,71 +17,71 @@ class Test : public Napi::ObjectWrap<Test> {
1717
DefineClass(env,
1818
"Test",
1919
{
20-
StaticAccessor("isSyncFinalizerCalled",
21-
&IsSyncFinalizerCalled,
20+
StaticAccessor("isBasicFinalizerCalled",
21+
&IsBasicFinalizerCalled,
2222
nullptr,
2323
napi_default),
24-
StaticAccessor("isAsyncFinalizerCalled",
25-
&IsAsyncFinalizerCalled,
24+
StaticAccessor("isFinalizerCalled",
25+
&IsFinalizerCalled,
2626
nullptr,
2727
napi_default),
2828
}));
2929
}
3030

31-
void Finalize(Napi::BasicEnv /*env*/) { syncFinalizerCalled = true; }
31+
void Finalize(Napi::BasicEnv /*env*/) { basicFinalizerCalled = true; }
3232

3333
void Finalize(Napi::Env /*env*/) {
34-
asyncFinalizerCalled = true;
34+
finalizerCalled = true;
3535
if (!finalizeCb_.IsEmpty()) {
3636
finalizeCb_.Call({});
3737
}
3838
}
3939

40-
static Napi::Value IsSyncFinalizerCalled(const Napi::CallbackInfo& info) {
41-
return Napi::Boolean::New(info.Env(), syncFinalizerCalled);
40+
static Napi::Value IsBasicFinalizerCalled(const Napi::CallbackInfo& info) {
41+
return Napi::Boolean::New(info.Env(), basicFinalizerCalled);
4242
}
4343

44-
static Napi::Value IsAsyncFinalizerCalled(const Napi::CallbackInfo& info) {
45-
return Napi::Boolean::New(info.Env(), asyncFinalizerCalled);
44+
static Napi::Value IsFinalizerCalled(const Napi::CallbackInfo& info) {
45+
return Napi::Boolean::New(info.Env(), finalizerCalled);
4646
}
4747

4848
private:
4949
Napi::FunctionReference finalizeCb_;
5050

51-
static bool syncFinalizerCalled;
52-
static bool asyncFinalizerCalled;
51+
static bool basicFinalizerCalled;
52+
static bool finalizerCalled;
5353
};
5454

55-
bool Test::syncFinalizerCalled = false;
56-
bool Test::asyncFinalizerCalled = false;
55+
bool Test::basicFinalizerCalled = false;
56+
bool Test::finalizerCalled = false;
5757

58-
bool externalSyncFinalizerCalled = false;
59-
bool externalAsyncFinalizerCalled = false;
58+
bool externalBasicFinalizerCalled = false;
59+
bool externalFinalizerCalled = false;
6060

61-
Napi::Value CreateExternalSyncFinalizer(const Napi::CallbackInfo& info) {
62-
externalSyncFinalizerCalled = false;
61+
Napi::Value CreateExternalBasicFinalizer(const Napi::CallbackInfo& info) {
62+
externalBasicFinalizerCalled = false;
6363
return Napi::External<int>::New(
6464
info.Env(), new int(1), [](Napi::BasicEnv /*env*/, int* data) {
65-
externalSyncFinalizerCalled = true;
65+
externalBasicFinalizerCalled = true;
6666
delete data;
6767
});
6868
}
6969

70-
Napi::Value CreateExternalAsyncFinalizer(const Napi::CallbackInfo& info) {
71-
externalAsyncFinalizerCalled = false;
70+
Napi::Value CreateExternalFinalizer(const Napi::CallbackInfo& info) {
71+
externalFinalizerCalled = false;
7272
return Napi::External<int>::New(
7373
info.Env(), new int(1), [](Napi::Env /*env*/, int* data) {
74-
externalAsyncFinalizerCalled = true;
74+
externalFinalizerCalled = true;
7575
delete data;
7676
});
7777
}
7878

79-
Napi::Value IsExternalSyncFinalizerCalled(const Napi::CallbackInfo& info) {
80-
return Napi::Boolean::New(info.Env(), externalSyncFinalizerCalled);
79+
Napi::Value isExternalBasicFinalizerCalled(const Napi::CallbackInfo& info) {
80+
return Napi::Boolean::New(info.Env(), externalBasicFinalizerCalled);
8181
}
8282

83-
Napi::Value IsExternalAsyncFinalizerCalled(const Napi::CallbackInfo& info) {
84-
return Napi::Boolean::New(info.Env(), externalAsyncFinalizerCalled);
83+
Napi::Value IsExternalFinalizerCalled(const Napi::CallbackInfo& info) {
84+
return Napi::Boolean::New(info.Env(), externalFinalizerCalled);
8585
}
8686

8787
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
@@ -132,14 +132,14 @@ Napi::Value PostFinalizerWithDataAndHint(const Napi::CallbackInfo& info) {
132132
Napi::Object InitFinalizerOrder(Napi::Env env) {
133133
Napi::Object exports = Napi::Object::New(env);
134134
Test::Initialize(env, exports);
135-
exports["createExternalSyncFinalizer"] =
136-
Napi::Function::New(env, CreateExternalSyncFinalizer);
137-
exports["createExternalAsyncFinalizer"] =
138-
Napi::Function::New(env, CreateExternalAsyncFinalizer);
139-
exports["isExternalSyncFinalizerCalled"] =
140-
Napi::Function::New(env, IsExternalSyncFinalizerCalled);
141-
exports["isExternalAsyncFinalizerCalled"] =
142-
Napi::Function::New(env, IsExternalAsyncFinalizerCalled);
135+
exports["createExternalBasicFinalizer"] =
136+
Napi::Function::New(env, CreateExternalBasicFinalizer);
137+
exports["createExternalFinalizer"] =
138+
Napi::Function::New(env, CreateExternalFinalizer);
139+
exports["isExternalBasicFinalizerCalled"] =
140+
Napi::Function::New(env, isExternalBasicFinalizerCalled);
141+
exports["isExternalFinalizerCalled"] =
142+
Napi::Function::New(env, IsExternalFinalizerCalled);
143143

144144
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
145145
exports["PostFinalizer"] = Napi::Function::New(env, PostFinalizer);

test/finalizer_order.js

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,47 +22,46 @@ function test (binding) {
2222
global.gc();
2323

2424
if (isExperimental) {
25-
assert.strictEqual(binding.finalizer_order.Test.isSyncFinalizerCalled, true, 'Expected sync finalizer to be called [before ticking]');
26-
assert.strictEqual(binding.finalizer_order.Test.isAsyncFinalizerCalled, false, 'Expected async finalizer to not be called [before ticking]');
25+
assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, true, 'Expected basic finalizer to be called [before ticking]');
26+
assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, false, 'Expected (extended) finalizer to not be called [before ticking]');
2727
assert.strictEqual(isCallbackCalled, false, 'Expected callback to not be called [before ticking]');
2828
} else {
29-
assert.strictEqual(binding.finalizer_order.Test.isSyncFinalizerCalled, false, 'Expected sync finalizer to not be called [before ticking]');
30-
assert.strictEqual(binding.finalizer_order.Test.isAsyncFinalizerCalled, false, 'Expected async finalizer to not be called [before ticking]');
29+
assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, false, 'Expected basic finalizer to not be called [before ticking]');
30+
assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, false, 'Expected (extended) finalizer to not be called [before ticking]');
3131
assert.strictEqual(isCallbackCalled, false, 'Expected callback to not be called [before ticking]');
3232
}
3333
},
3434
() => {
35-
assert.strictEqual(binding.finalizer_order.Test.isSyncFinalizerCalled, true, 'Expected sync finalizer to be called [after ticking]');
36-
assert.strictEqual(binding.finalizer_order.Test.isAsyncFinalizerCalled, true, 'Expected async finalizer to be called [after ticking]');
35+
assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, true, 'Expected basic finalizer to be called [after ticking]');
36+
assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, true, 'Expected (extended) finalizer to be called [after ticking]');
3737
assert.strictEqual(isCallbackCalled, true, 'Expected callback to be called [after ticking]');
3838
},
3939

40-
'Finalizer Order - External with Sync Finalizer',
40+
'Finalizer Order - External with Basic Finalizer',
4141
() => {
42-
console.log(binding.finalizer_order);
43-
let ext = binding.finalizer_order.createExternalSyncFinalizer();
42+
let ext = binding.finalizer_order.createExternalBasicFinalizer();
4443
ext = null;
4544
global.gc();
4645

4746
if (isExperimental) {
48-
assert.strictEqual(binding.finalizer_order.isExternalSyncFinalizerCalled(), true, 'Expected External sync finalizer to be called [before ticking]');
47+
assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), true, 'Expected External basic finalizer to be called [before ticking]');
4948
} else {
50-
assert.strictEqual(binding.finalizer_order.isExternalSyncFinalizerCalled(), false, 'Expected External sync finalizer to not be called [before ticking]');
49+
assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), false, 'Expected External basic finalizer to not be called [before ticking]');
5150
}
5251
},
5352
() => {
54-
assert.strictEqual(binding.finalizer_order.isExternalSyncFinalizerCalled(), true, 'Expected External sync finalizer to be called [after ticking]');
53+
assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), true, 'Expected External basic finalizer to be called [after ticking]');
5554
},
5655

57-
'Finalizer Order - External with Async Finalizer',
56+
'Finalizer Order - External with Finalizer',
5857
() => {
59-
let ext = binding.finalizer_order.createExternalAsyncFinalizer();
58+
let ext = binding.finalizer_order.createExternalFinalizer();
6059
ext = null;
6160
global.gc();
62-
assert.strictEqual(binding.finalizer_order.isExternalAsyncFinalizerCalled(), false, 'Expected External async finalizer to not be called [before ticking]');
61+
assert.strictEqual(binding.finalizer_order.isExternalFinalizerCalled(), false, 'Expected External extended finalizer to not be called [before ticking]');
6362
},
6463
() => {
65-
assert.strictEqual(binding.finalizer_order.isExternalAsyncFinalizerCalled(), true, 'Expected External async finalizer to be called [after ticking]');
64+
assert.strictEqual(binding.finalizer_order.isExternalFinalizerCalled(), true, 'Expected External extended finalizer to be called [after ticking]');
6665
}
6766
];
6867

0 commit comments

Comments
 (0)