node-api: allow napi_delete_reference in finalizers · nodejs/node@f883bed
@@ -3,17 +3,25 @@
33#include "assert.h"
44#include "myobject.h"
556+typedef int32_t FinalizerData;
7+68napi_ref MyObject::constructor;
79810MyObject::MyObject(double value)
911 : value_(value), env_(nullptr), wrapper_(nullptr) {}
10121113MyObject::~MyObject() { napi_delete_reference(env_, wrapper_); }
121413-void MyObject::Destructor(
14- napi_env env, void* nativeObject, void* /*finalize_hint*/) {
15+void MyObject::Destructor(node_api_basic_env env,
16+void* nativeObject,
17+void* /*finalize_hint*/) {
1518 MyObject* obj = static_cast<MyObject*>(nativeObject);
1619delete obj;
20+21+ FinalizerData* data;
22+NODE_API_BASIC_CALL_RETURN_VOID(
23+ env, napi_get_instance_data(env, reinterpret_cast<void**>(&data)));
24+ *data += 1;
1725}
18261927void MyObject::Init(napi_env env, napi_value exports) {
@@ -154,7 +162,7 @@ napi_value MyObject::Multiply(napi_env env, napi_callback_info info) {
154162}
155163156164// This finalizer should never be invoked.
157-void ObjectWrapDanglingReferenceFinalizer(napi_env env,
165+void ObjectWrapDanglingReferenceFinalizer(node_api_basic_env env,
158166void* finalize_data,
159167void* finalize_hint) {
160168assert(0 && "unreachable");
@@ -198,15 +206,38 @@ napi_value ObjectWrapDanglingReferenceTest(napi_env env,
198206return ret;
199207}
200208209+static napi_value GetFinalizerCallCount(napi_env env, napi_callback_info info) {
210+size_t argc = 1;
211+ napi_value argv[1];
212+ FinalizerData* data;
213+ napi_value result;
214+215+NODE_API_CALL(env,
216+napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
217+NODE_API_CALL(env,
218+napi_get_instance_data(env, reinterpret_cast<void**>(&data)));
219+NODE_API_CALL(env, napi_create_int32(env, *data, &result));
220+return result;
221+}
222+223+static void finalizeData(napi_env env, void* data, void* hint) {
224+delete reinterpret_cast<FinalizerData*>(data);
225+}
226+201227EXTERN_C_START
202228napi_value Init(napi_env env, napi_value exports) {
229+ FinalizerData* data = new FinalizerData;
230+ *data = 0;
231+NODE_API_CALL(env, napi_set_instance_data(env, data, finalizeData, nullptr));
232+203233MyObject::Init(env, exports);
204234205235 napi_property_descriptor descriptors[] = {
206236DECLARE_NODE_API_PROPERTY("objectWrapDanglingReference",
207237 ObjectWrapDanglingReference),
208238DECLARE_NODE_API_PROPERTY("objectWrapDanglingReferenceTest",
209239 ObjectWrapDanglingReferenceTest),
240+DECLARE_NODE_API_PROPERTY("getFinalizerCallCount", GetFinalizerCallCount),
210241 };
211242212243NODE_API_CALL(