@@ -187,6 +187,7 @@ namespace NAPI_CPP_CUSTOM_NAMESPACE {
187
187
#endif
188
188
189
189
// Forward declarations
190
+ class NogcEnv ;
190
191
class Env ;
191
192
class Value ;
192
193
class Boolean ;
@@ -299,6 +300,16 @@ template <typename T>
299
300
using MaybeOrValue = T;
300
301
#endif
301
302
303
+ #if defined(NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER)
304
+ #define NODE_ADDON_API_NOGC_ENV node_api_nogc_env
305
+ #define NODE_ADDON_API_NOGC_ENV_CLASS Napi::NogcEnv
306
+ #define NODE_ADDON_API_NOGC_FINALIZER node_api_nogc_finalize
307
+ #else
308
+ #define NODE_ADDON_API_NOGC_ENV napi_env
309
+ #define NODE_ADDON_API_NOGC_ENV_CLASS Napi::Env
310
+ #define NODE_ADDON_API_NOGC_FINALIZER napi_finalize
311
+ #endif
312
+
302
313
// / Environment for Node-API values and operations.
303
314
// /
304
315
// / All Node-API values and operations must be associated with an environment.
@@ -312,30 +323,31 @@ using MaybeOrValue = T;
312
323
// /
313
324
// / In the V8 JavaScript engine, a Node-API environment approximately
314
325
// / corresponds to an Isolate.
315
- class Env {
316
- private :
317
- napi_env _env;
326
+ class NogcEnv {
327
+ protected :
328
+ NODE_ADDON_API_NOGC_ENV _env;
318
329
#if NAPI_VERSION > 5
319
330
template <typename T>
320
- static void DefaultFini (Env, T* data);
331
+ static void DefaultGcFini (Env, T* data);
321
332
template <typename DataType, typename HintType>
322
- static void DefaultFiniWithHint (Env, DataType* data, HintType* hint);
333
+ static void DefaultGcFiniWithHint (Env, DataType* data, HintType* hint);
323
334
#endif // NAPI_VERSION > 5
324
335
public:
325
- Env (napi_env env);
326
-
327
- operator napi_env () const ;
328
-
329
- Object Global () const ;
330
- Value Undefined () const ;
331
- Value Null () const ;
332
-
333
- bool IsExceptionPending () const ;
334
- Error GetAndClearPendingException () const ;
335
-
336
- MaybeOrValue<Value> RunScript (const char * utf8script) const ;
337
- MaybeOrValue<Value> RunScript (const std::string& utf8script) const ;
338
- MaybeOrValue<Value> RunScript (String script) const ;
336
+ NogcEnv (NODE_ADDON_API_NOGC_ENV env);
337
+ operator NODE_ADDON_API_NOGC_ENV () const ;
338
+
339
+ // Without these operator overloads, the error:
340
+ //
341
+ // Use of overloaded operator '==' is ambiguous (with operand types
342
+ // 'Napi::Env' and 'Napi::Env')
343
+ //
344
+ // ... occurs when comparing foo.Env() == bar.Env() or foo.Env() == nullptr
345
+ bool operator ==(const NogcEnv& other) const {
346
+ return _env == other._env ;
347
+ };
348
+ bool operator ==(const std::nullptr_t & /* other*/ ) const {
349
+ return _env == nullptr ;
350
+ };
339
351
340
352
#if NAPI_VERSION > 2
341
353
template <typename Hook, typename Arg = void >
@@ -353,16 +365,16 @@ class Env {
353
365
T* GetInstanceData () const ;
354
366
355
367
template <typename T>
356
- using Finalizer = void (*)(Env, T*);
357
- template <typename T, Finalizer <T> fini = Env::DefaultFini <T>>
368
+ using GcFinalizer = void (*)(Env, T*);
369
+ template <typename T, GcFinalizer <T> gc_fini = NogcEnv::DefaultGcFini <T>>
358
370
void SetInstanceData (T* data) const ;
359
371
360
372
template <typename DataType, typename HintType>
361
373
using FinalizerWithHint = void (*)(Env, DataType*, HintType*);
362
374
template <typename DataType,
363
375
typename HintType,
364
376
FinalizerWithHint<DataType, HintType> fini =
365
- Env::DefaultFiniWithHint <DataType, HintType>>
377
+ NogcEnv::DefaultGcFiniWithHint <DataType, HintType>>
366
378
void SetInstanceData (DataType* data, HintType* hint) const ;
367
379
#endif // NAPI_VERSION > 5
368
380
@@ -371,9 +383,9 @@ class Env {
371
383
class CleanupHook {
372
384
public:
373
385
CleanupHook ();
374
- CleanupHook (Env env, Hook hook, Arg* arg);
375
- CleanupHook (Env env, Hook hook);
376
- bool Remove (Env env);
386
+ CleanupHook (NogcEnv env, Hook hook, Arg* arg);
387
+ CleanupHook (NogcEnv env, Hook hook);
388
+ bool Remove (NogcEnv env);
377
389
bool IsEmpty () const ;
378
390
379
391
private:
@@ -391,6 +403,37 @@ class Env {
391
403
#if NAPI_VERSION > 8
392
404
const char * GetModuleFileName () const ;
393
405
#endif // NAPI_VERSION > 8
406
+
407
+ #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
408
+ template <typename Finalizer>
409
+ inline void AddPostFinalizer (Finalizer finalizeCallback) const ;
410
+
411
+ template <typename Finalizer, typename T>
412
+ inline void AddPostFinalizer (Finalizer finalizeCallback, T* data) const ;
413
+
414
+ template <typename Finalizer, typename T, typename Hint>
415
+ inline void AddPostFinalizer (Finalizer finalizeCallback,
416
+ T* data,
417
+ Hint* finalizeHint) const ;
418
+ #endif // NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
419
+ };
420
+
421
+ class Env : public NogcEnv {
422
+ public:
423
+ Env (napi_env env);
424
+
425
+ operator napi_env () const ;
426
+
427
+ Object Global () const ;
428
+ Value Undefined () const ;
429
+ Value Null () const ;
430
+
431
+ bool IsExceptionPending () const ;
432
+ Error GetAndClearPendingException () const ;
433
+
434
+ MaybeOrValue<Value> RunScript (const char * utf8script) const ;
435
+ MaybeOrValue<Value> RunScript (const std::string& utf8script) const ;
436
+ MaybeOrValue<Value> RunScript (String script) const ;
394
437
};
395
438
396
439
// / A JavaScript value of unknown type.
@@ -2414,7 +2457,7 @@ class ObjectWrap : public InstanceWrap<T>, public Reference<Object> {
2414
2457
Napi::Value value,
2415
2458
napi_property_attributes attributes = napi_default);
2416
2459
static Napi::Value OnCalledAsFunction (const Napi::CallbackInfo& callbackInfo);
2417
- virtual void Finalize (Napi::Env env);
2460
+ virtual void Finalize (NODE_ADDON_API_NOGC_ENV_CLASS env);
2418
2461
2419
2462
private:
2420
2463
using This = ObjectWrap<T>;
@@ -2429,7 +2472,9 @@ class ObjectWrap : public InstanceWrap<T>, public Reference<Object> {
2429
2472
napi_callback_info info);
2430
2473
static napi_value StaticSetterCallbackWrapper (napi_env env,
2431
2474
napi_callback_info info);
2432
- static void FinalizeCallback (napi_env env, void * data, void * hint);
2475
+ static void FinalizeCallback (NODE_ADDON_API_NOGC_ENV env,
2476
+ void * data,
2477
+ void * hint);
2433
2478
static Function DefineClass (Napi::Env env,
2434
2479
const char * utf8name,
2435
2480
const size_t props_count,
0 commit comments