8000
We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent e6ccdfb commit abd9fd6Copy full SHA for abd9fd6
src/node_api.cc
@@ -481,9 +481,10 @@ class Reference : private Finalizer {
481
// Check before calling the finalize callback, because the callback might
482
// delete it.
483
bool delete_self = reference->_delete_self;
484
+ napi_env env = reference->_env;
485
486
if (reference->_finalize_callback != nullptr) {
- NAPI_CALL_INTO_MODULE_THROW(reference->_env,
487
+ NAPI_CALL_INTO_MODULE_THROW(env,
488
reference->_finalize_callback(
489
reference->_env,
490
reference->_finalize_data,
test/addons-napi/8_passing_wrapped/binding.cc
@@ -1,7 +1,9 @@
1
#include "myobject.h"
2
#include "../common.h"
3
4
-napi_value CreateObject(napi_env env, napi_callback_info info) {
+extern size_t finalize_count;
5
+
6
+static napi_value CreateObject(napi_env env, napi_callback_info info) {
7
size_t argc = 1;
8
napi_value args[1];
9
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
@@ -12,7 +14,7 @@ napi_value CreateObject(napi_env env, napi_callback_info info) {
12
14
return instance;
13
15
}
16
-napi_value Add(napi_env env, napi_callback_info info) {
17
+static napi_value Add(napi_env env, napi_callback_info info) {
18
size_t argc = 2;
19
napi_value args[2];
20
@@ -29,12 +31,19 @@ napi_value Add(napi_env env, napi_callback_info info) {
29
31
return sum;
30
32
33
-napi_value Init(napi_env env, napi_value exports) {
34
+static napi_value FinalizeCount(napi_env env, napi_callback_info info) {
35
+ napi_value return_value;
36
+ NAPI_CALL(env, napi_create_uint32(env, finalize_count, &return_value));
37
+ return return_value;
38
+}
39
40
+static napi_value Init(napi_env env, napi_value exports) {
41
MyObject::Init(env);
42
43
napi_property_descriptor desc[] = {
44
DECLARE_NAPI_PROPERTY("createObject", CreateObject),
45
DECLARE_NAPI_PROPERTY("add", Add),
46
+ DECLARE_NAPI_PROPERTY("finalizeCount", FinalizeCount),
47
};
48
49
NAPI_CALL(env,
test/addons-napi/8_passing_wrapped/myobject.cc
@@ -1,9 +1,14 @@
+size_t finalize_count = 0;
MyObject::MyObject() : env_(nullptr), wrapper_(nullptr) {}
-MyObject::~MyObject() { napi_delete_reference(env_, wrapper_); }
+MyObject::~MyObject() {
+ finalize_count++;
10
+ napi_delete_reference(env_, wrapper_);
11
void MyObject::Destructor(
napi_env env, void* nativeObject, void* /*finalize_hint*/) {
@@ -45,6 +50,11 @@ napi_value MyObject::New(napi_env env, napi_callback_info info) {
50
51
52
obj->env_ = env;
53
54
+ // It is important that the below call to napi_wrap() be such that we request
55
+ // a reference to the wrapped object via the out-parameter, because this
56
+ // ensures that we test the code path that deals with a reference that is
57
+ // destroyed from its own finalizer.
58
NAPI_CALL(env, napi_wrap(env,
59
_this,
60
obj,
test/addons-napi/8_passing_wrapped/test.js
@@ -1,9 +1,16 @@
'use strict';
+// Flags: --expose-gc
const common = require('../../common');
const assert = require('assert');
const addon = require(`./build/${common.buildType}/binding`);
-const obj1 = addon.createObject(10);
+let obj1 = addon.createObject(10);
const obj2 = addon.createObject(20);
const result = addon.add(obj1, obj2);
assert.strictEqual(result, 30);
+// Make sure the native destructor gets called.
+obj1 = null;
+global.gc();
+assert.strictEqual(addon.finalizeCount(), 1);