|
3 | 3 | #include "assert.h"
|
4 | 4 | #include "myobject.h"
|
5 | 5 |
|
| 6 | +typedef int32_t FinalizerData; |
| 7 | + |
6 | 8 | napi_ref MyObject::constructor;
|
7 | 9 |
|
8 | 10 | MyObject::MyObject(double value)
|
9 | 11 | : value_(value), env_(nullptr), wrapper_(nullptr) {}
|
10 | 12 |
|
11 | 13 | MyObject::~MyObject() { napi_delete_reference(env_, wrapper_); }
|
12 | 14 |
|
13 |
| -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*/) { |
15 | 18 | MyObject* obj = static_cast<MyObject*>(nativeObject);
|
16 | 19 | 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; |
17 | 25 | }
|
18 | 26 |
|
19 | 27 | void MyObject::Init(napi_env env, napi_value exports) {
|
@@ -154,7 +162,7 @@ napi_value MyObject::Multiply(napi_env env, napi_callback_info info) {
|
154 | 162 | }
|
155 | 163 |
|
156 | 164 | // This finalizer should never be invoked.
|
157 |
| -void ObjectWrapDanglingReferenceFinalizer(napi_env env, |
| 165 | +void ObjectWrapDanglingReferenceFinalizer(node_api_basic_env env, |
158 | 166 | void* finalize_data,
|
159 | 167 | void* finalize_hint) {
|
160 | 168 | assert(0 && "unreachable");
|
@@ -198,15 +206,38 @@ napi_value ObjectWrapDanglingReferenceTest(napi_env env,
|
198 | 206 | return ret;
|
199 | 207 | }
|
200 | 208 |
|
| 209 | +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 | + |
201 | 227 | EXTERN_C_START
|
202 | 228 | 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 | + |
203 | 233 | MyObject::Init(env, exports);
|
204 | 234 |
|
205 | 235 | napi_property_descriptor descriptors[] = {
|
206 | 236 | DECLARE_NODE_API_PROPERTY("objectWrapDanglingReference",
|
207 | 237 | ObjectWrapDanglingReference),
|
208 | 238 | DECLARE_NODE_API_PROPERTY("objectWrapDanglingReferenceTest",
|
209 | 239 | ObjectWrapDanglingReferenceTest),
|
| 240 | + DECLARE_NODE_API_PROPERTY("getFinalizerCallCount", GetFinalizerCallCount), |
210 | 241 | };
|
211 | 242 |
|
212 | 243 | NODE_API_CALL(
|
|
0 commit comments