1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
#include <napi.h>
namespace {
class Test : public Napi::ObjectWrap<Test> {
public:
Test(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Test>(info) {
basicFinalizerCalled = false;
finalizerCalled = false;
if (info.Length() > 0) {
finalizeCb_ = Napi::Persistent(info[0].As<Napi::Function>());
}
}
static void Initialize(Napi::Env env, Napi::Object exports) {
exports.Set("Test",
DefineClass(env,
"Test",
{
StaticAccessor("isBasicFinalizerCalled",
&IsBasicFinalizerCalled,
nullptr,
napi_default),
StaticAccessor("isFinalizerCalled",
&IsFinalizerCalled,
nullptr,
napi_default),
}));
}
void Finalize(Napi::BasicEnv /*env*/) { basicFinalizerCalled = true; }
void Finalize(Napi::Env /*env*/) {
finalizerCalled = true;
if (!finalizeCb_.IsEmpty()) {
finalizeCb_.Call({});
}
}
static Napi::Value IsBasicFinalizerCalled(const Napi::CallbackInfo& info) {
return Napi::Boolean::New(info.Env(), basicFinalizerCalled);
}
static Napi::Value IsFinalizerCalled(const Napi::CallbackInfo& info) {
return Napi::Boolean::New(info.Env(), finalizerCalled);
}
private:
Napi::FunctionReference finalizeCb_;
static bool basicFinalizerCalled;
static bool finalizerCalled;
};
bool Test::basicFinalizerCalled = false;
bool Test::finalizerCalled = false;
bool externalBasicFinalizerCalled = false;
bool externalFinalizerCalled = false;
Napi::Value CreateExternalBasicFinalizer(const Napi::CallbackInfo& info) {
externalBasicFinalizerCalled = false;
return Napi::External<int>::New(
info.Env(), new int(1), [](Napi::BasicEnv /*env*/, int* data) {
externalBasicFinalizerCalled = true;
delete data;
});
}
Napi::Value CreateExternalFinalizer(const Napi::CallbackInfo& info) {
externalFinalizerCalled = false;
return Napi::External<int>::New(
info.Env(), new int(1), [](Napi::Env /*env*/, int* data) {
externalFinalizerCalled = true;
delete data;
});
}
Napi::Value isExternalBasicFinalizerCalled(const Napi::CallbackInfo& info) {
return Napi::Boolean::New(info.Env(), externalBasicFinalizerCalled);
}
Napi::Value IsExternalFinalizerCalled(const Napi::CallbackInfo& info) {
return Napi::Boolean::New(info.Env(), externalFinalizerCalled);
}
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
Napi::Value PostFinalizer(const Napi::CallbackInfo& info) {
auto env = info.Env();
env.PostFinalizer([callback = Napi::Persistent(info[0].As<Napi::Function>())](
Napi::Env /*env*/) { callback.Call({}); });
return env.Undefined();
}
Napi::Value PostFinalizerWithData(const Napi::CallbackInfo& info) {
auto env = info.Env();
env.PostFinalizer(
[callback = Napi::Persistent(info[0].As<Napi::Function>())](
Napi::Env /*env*/, Napi::Reference<Napi::Value>* data) {
callback.Call({data->Value()});
delete data;
},
new Napi::Reference<Napi::Value>(Napi::Persistent(info[1])));
return env.Undefined();
}
Napi::Value PostFinalizerWithDataAndHint(const Napi::CallbackInfo& info) {
auto env = info.Env();
env.PostFinalizer(
[callback = Napi::Persistent(info[0].As<Napi::Function>())](
Napi::Env /*env*/,
Napi::Reference<Napi::Value>* data,
Napi::Reference<Napi::Value>* hint) {
callback.Call({data->Value(), hint->Value()});
delete data;
delete hint;
},
new Napi::Reference<Napi::Value>(Napi::Persistent(info[1])),
new Napi::Reference<Napi::Value>(Napi::Persistent(info[2])));
return env.Undefined();
}
#endif
} // namespace
Napi::Object InitFinalizerOrder(Napi::Env env) {
Napi::Object exports = Napi::Object::New(env);
Test::Initialize(env, exports);
exports["createExternalBasicFinalizer"] =
Napi::Function::New(env, CreateExternalBasicFinalizer);
exports["createExternalFinalizer"] =
Napi::Function::New(env, CreateExternalFinalizer);
exports["isExternalBasicFinalizerCalled"] =
Napi::Function::New(env, isExternalBasicFinalizerCalled);
exports["isExternalFinalizerCalled"] =
Napi::Function::New(env, IsExternalFinalizerCalled);
#ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
exports["PostFinalizer"] = Napi::Function::New(env, PostFinalizer);
exports["PostFinalizerWithData"] =
Napi::Function::New(env, PostFinalizerWithData);
exports["PostFinalizerWithDataAndHint"] =
Napi::Function::New(env, PostFinalizerWithDataAndHint);
#endif
return exports;
}
|