@@ -58,6 +58,8 @@ typedef struct metacall_node_callback_closure_type
5858
5959} * metacall_node_callback_closure;
6060
61+ static void * metacall_node_callback_value_to_napi_func = NULL ;
62+
6163/* -- Methods -- */
6264
6365/* BEGIN-TODO: (Maybe) Implement this in the loader, then remove it from here */
@@ -103,22 +105,30 @@ void * metacall_node_callback_value_to_napi(size_t argc, void * args[], void * d
103105
104106 metacall_node_exception (closure->env , status);
105107
106- status = napi_delete_reference (closure->env , closure->callback_ref );
107-
108- metacall_node_exception (closure->env , status);
109-
110108 if (argv != NULL )
111109 {
112110 free (argv);
113111 }
114112
115113 void * result = metacall_node_napi_to_value (closure->env , recv, ret);
116114
117- status = napi_delete_reference (closure->env , closure->recv_ref );
115+ /* TODO: Clean up */
116+ /*
117+ auto delete_closure = [closure]()
118+ {
119+ napi_status status = napi_delete_reference(closure->env, closure->callback_ref);
120+
121+ metacall_node_exception(closure->env, status);
118122
119- metacall_node_exception (closure->env , status);
123+ status = napi_delete_reference(closure->env, closure->recv_ref);
124+
125+ metacall_node_exception(closure->env, status);
126+
127+ free(closure);
128+ };
129+ */
120130
121- free (closure);
131+ metacall_node_finalizer (closure-> env , ret, result /* , delete_closure */ );
122132
123133 return result;
124134}
@@ -139,15 +149,12 @@ napi_value metacall_node_callback_napi_to_value(napi_env env, napi_callback_info
139149 for (iterator = 0 ; iterator < argc; ++iterator)
140150 {
141151 args[iterator] = metacall_node_napi_to_value (env, recv, argv[iterator]);
152+
153+ metacall_node_finalizer (env, argv[iterator], args[iterator]);
142154 }
143155
144156 void * ret = metacallfv (f, args);
145157
146- for (iterator = 0 ; iterator < argc; ++iterator)
147- {
148- metacall_value_destroy (args[iterator]);
149- }
150-
151158 napi_value result = metacall_node_value_to_napi (env, ret);
152159
153160 metacall_node_finalizer (env, result, ret);
@@ -512,7 +519,6 @@ void * metacall_node_napi_to_value(/*loader_impl_node node_impl,*/ napi_env env,
512519 }
513520 else if (valuetype == napi_function)
514521 {
515- void * f = metacall_function (" __metacall_node_callback_value_to_napi__" );
516522 metacall_node_callback_closure closure = static_cast <metacall_node_callback_closure>(malloc (sizeof (struct metacall_node_callback_closure_type )));
517523
518524 closure->env = env;
@@ -527,7 +533,7 @@ void * metacall_node_napi_to_value(/*loader_impl_node node_impl,*/ napi_env env,
527533
528534 metacall_node_exception (env, status);
529535
530- return metacall_value_create_function_closure (f , (void *)closure);
536+ return metacall_value_create_function_closure (metacall_node_callback_value_to_napi_func , (void *)closure);
531537 }
532538 else if (valuetype == napi_external)
533539 {
@@ -737,18 +743,15 @@ napi_value metacall_node_call(napi_env env, napi_callback_info info)
737743
738744 metacall_node_exception (env, status);
739745
740- for (size_t i = 1 ; i < argc; ++i )
746+ for (size_t args_count = 1 ; args_count < argc; ++args_count )
741747 {
742- args[i - 1 ] = metacall_node_napi_to_value (env, recv, argv[i]);
748+ args[args_count - 1 ] = metacall_node_napi_to_value (env, recv, argv[args_count]);
749+
750+ metacall_node_finalizer (env, argv[args_count], args[args_count - 1 ]);
743751 }
744752
745753 void * ret = metacallv (name, args);
746754
747- for (size_t args_count = 0 ; args_count < argc - 1 ; ++args_count)
748- {
749- metacall_value_destroy (args[args_count]);
750- }
751-
752755 napi_value result = metacall_node_value_to_napi (env, ret);
753756
754757 metacall_node_finalizer (env, result, ret);
@@ -956,7 +959,8 @@ napi_value metacall_node_initialize(napi_env env, napi_value exports)
956959 return NULL ;
957960 }
958961
959- if (metacall_register (" __metacall_node_callback_value_to_napi__" , metacall_node_callback_value_to_napi, METACALL_INVALID, 0 ) != 0 )
962+ if (metacall_register (NULL , metacall_node_callback_value_to_napi, &metacall_node_callback_value_to_napi_func, METACALL_INVALID, 0 ) != 0
963+ || metacall_node_callback_value_to_napi_func == NULL )
960964 {
961965 /* TODO: Show error message (when error handling is properly implemented in the core lib) */
962966 napi_throw_error (env, NULL , " MetaCall failed to initialize callback support" );
0 commit comments