1#include <assert.h> 2#include <js_native_api.h> 3#include <stdlib.h> 4#include "../common.h" 5#include "../entry_point.h" 6 7static int test_value = 1; 8static int finalize_count = 0; 9 10static void FinalizeExternalCallJs(napi_env env, void* data, void* hint) { 11 int* actual_value = data; 12 NODE_API_ASSERT_RETURN_VOID( 13 env, 14 actual_value == &test_value, 15 "The correct pointer was passed to the finalizer"); 16 17 napi_ref finalizer_ref = (napi_ref)hint; 18 napi_value js_finalizer; 19 napi_value recv; 20 NODE_API_CALL_RETURN_VOID( 21 env, napi_get_reference_value(env, finalizer_ref, &js_finalizer)); 22 NODE_API_CALL_RETURN_VOID(env, napi_get_global(env, &recv)); 23 NODE_API_CALL_RETURN_VOID( 24 env, napi_call_function(env, recv, js_finalizer, 0, NULL, NULL)); 25 NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, finalizer_ref)); 26} 27 28static napi_value CreateExternalWithJsFinalize(napi_env env, 29 napi_callback_info info) { 30 size_t argc = 1; 31 napi_value args[1]; 32 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); 33 NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments"); 34 napi_value finalizer = args[0]; 35 napi_valuetype finalizer_valuetype; 36 NODE_API_CALL(env, napi_typeof(env, finalizer, &finalizer_valuetype)); 37 NODE_API_ASSERT(env, 38 finalizer_valuetype == napi_function, 39 "Wrong type of first argument"); 40 napi_ref finalizer_ref; 41 NODE_API_CALL(env, napi_create_reference(env, finalizer, 1, &finalizer_ref)); 42 43 napi_value result; 44 NODE_API_CALL(env, 45 napi_create_external(env, 46 &test_value, 47 FinalizeExternalCallJs, 48 finalizer_ref, /* finalize_hint */ 49 &result)); 50 51 finalize_count = 0; 52 return result; 53} 54 55EXTERN_C_START 56napi_value Init(napi_env env, napi_value exports) { 57 napi_property_descriptor descriptors[] = { 58 DECLARE_NODE_API_PROPERTY("createExternalWithJsFinalize", 59 CreateExternalWithJsFinalize), 60 }; 61 62 NODE_API_CALL( 63 env, 64 napi_define_properties(env, 65 exports, 66 sizeof(descriptors) / sizeof(*descriptors), 67 descriptors)); 68 69 return exports; 70} 71EXTERN_C_END 72