|
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