◐ Shell
clean mode source ↗

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+68

napi_ref MyObject::constructor;

79810

MyObject::MyObject(double value)

911

: value_(value), env_(nullptr), wrapper_(nullptr) {}

10121113

MyObject::~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);

1619

delete 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

}

18261927

void 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,

158166

void* finalize_data,

159167

void* finalize_hint) {

160168

assert(0 && "unreachable");

@@ -198,15 +206,38 @@ napi_value ObjectWrapDanglingReferenceTest(napi_env env,

198206

return 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+201227

EXTERN_C_START

202228

napi_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+203233

MyObject::Init(env, exports);

204234205235

napi_property_descriptor descriptors[] = {

206236

DECLARE_NODE_API_PROPERTY("objectWrapDanglingReference",

207237

ObjectWrapDanglingReference),

208238

DECLARE_NODE_API_PROPERTY("objectWrapDanglingReferenceTest",

209239

ObjectWrapDanglingReferenceTest),

240+

DECLARE_NODE_API_PROPERTY("getFinalizerCallCount", GetFinalizerCallCount),

210241

};

211242212243

NODE_API_CALL(