@@ -24,16 +24,21 @@ namespace details {
24
24
template <typename FreeType>
25
25
static inline napi_status AttachData (napi_env env,
26
26
napi_value obj,
27
- FreeType* data) {
27
+ FreeType* data,
28
+ napi_finalize finalizer = nullptr ,
29
+ void * hint = nullptr ) {
28
30
napi_value symbol, external;
29
31
napi_status status = napi_create_symbol (env, nullptr , &symbol);
30
32
if (status == napi_ok) {
33
+ if (finalizer == nullptr ) {
34
+ finalizer = [](napi_env /* env*/ , void * data, void * /* hint*/ ) {
35
+ delete static_cast <FreeType*>(data);
36
+ };
37
+ }
31
38
status = napi_create_external (env,
32
39
data,
33
- [](napi_env /* env*/ , void * data, void * /* hint*/ ) {
34
- delete static_cast <FreeType*>(data);
35
- },
36
- nullptr ,
40
+ finalizer,
41
+ hint,
37
42
&external);
38
43
if (status == napi_ok) {
39
44
napi_property_descriptor desc = {
@@ -1170,6 +1175,40 @@ inline bool Object::InstanceOf(const Function& constructor) const {
1170
1175
return result;
1171
1176
}
1172
1177
1178
+ template <typename Finalizer, typename T>
1179
+ inline void Object::AddFinalizer (Finalizer finalizeCallback, T* data) {
1180
+ details::FinalizeData<T, Finalizer>* finalizeData =
1181
+ new details::FinalizeData<T, Finalizer>({ finalizeCallback, nullptr });
1182
+ napi_status status =
1183
+ details::AttachData (_env,
1184
+ *this ,
1185
+ data,
1186
+ details::FinalizeData<T, Finalizer>::Wrapper,
1187
+ finalizeData);
1188
+ if (status != napi_ok) {
1189
+ delete finalizeData;
1190
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1191
+ }
1192
+ }
1193
+
1194
+ template <typename Finalizer, typename T, typename Hint>
1195
+ inline void Object::AddFinalizer (Finalizer finalizeCallback,
1196
+ T* data,
1197
+ Hint* finalizeHint) {
1198
+ details::FinalizeData<T, Finalizer, Hint>* finalizeData =
1199
+ new details::FinalizeData<T, Finalizer, Hint>({ finalizeCallback, finalizeHint });
1200
+ napi_status status =
1201
+ details::AttachData (_env,
1202
+ *this ,
1203
+ data,
1204
+ details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint,
1205
+ finalizeData);
1206
+ if (status != napi_ok) {
1207
+ delete finalizeData;
1208
+ NAPI_THROW_IF_FAILED_VOID (_env, status);
1209
+ }
1210
+ }
1211
+
1173
1212
// //////////////////////////////////////////////////////////////////////////////
1174
1213
// External class
1175
1214
// //////////////////////////////////////////////////////////////////////////////
0 commit comments