@@ -49,8 +49,8 @@ static void * metacall_node_callback(size_t argc, void * args[], void * data);
4949typedef struct metacall_node_callback_closure_type
5050{
5151 napi_env env;
52- napi_value callback ;
53- napi_value recv ;
52+ napi_ref callback_ref ;
53+ napi_ref recv_ref ;
5454
5555} * metacall_node_callback_closure;
5656
@@ -64,6 +64,7 @@ void * metacall_node_callback(size_t argc, void * args[], void * data)
6464 napi_value ret;
6565 napi_status status;
6666 napi_value * argv = NULL ;
67+ napi_value callback, recv;
6768
6869 if (closure == NULL )
6970 {
@@ -86,19 +87,36 @@ void * metacall_node_callback(size_t argc, void * args[], void * data)
8687 }
8788 }
8889
89- status = napi_call_function (closure->env , closure->recv , closure-> callback , argc, argv, &ret );
90+ status = napi_get_reference_value (closure->env , closure->recv_ref , &recv );
9091
9192 metacall_node_exception (closure->env , status);
9293
93- free (closure);
94+ status = napi_get_reference_value (closure->env , closure->callback_ref , &callback);
95+
96+ metacall_node_exception (closure->env , status);
97+
98+ status = napi_call_function (closure->env , recv, callback, argc, argv, &ret);
99+
100+ metacall_node_exception (closure->env , status);
101+
102+ status = napi_delete_reference (closure->env , closure->callback_ref );
103+
104+ metacall_node_exception (closure->env , status);
94105
95106 if (argv != NULL )
96107 {
97108 free (argv);
98109 }
99110
100- /* return metacall_node_napi_to_value(closure->env, closure->recv, ret);*/
101- return NULL ;
111+ void * result = metacall_node_napi_to_value (closure->env , recv, ret);
112+
113+ status = napi_delete_reference (closure->env , closure->recv_ref );
114+
115+ metacall_node_exception (closure->env , status);
116+
117+ free (closure);
118+
119+ return result;
102120}
103121
104122/* END-TODO */
@@ -119,7 +137,7 @@ inline void metacall_node_exception(napi_env env, napi_status status)
119137
120138 napi_is_exception_pending (env, &pending);
121139
122- const char * message = (error_info->error_message == NULL ) ? " Error message not available" : error_info-> error_message ;
140+ const char * message = (error_info != NULL && error_info ->error_message != NULL ) ? error_info-> error_message : " Error message not available" ;
123141
124142 /* TODO: Notify MetaCall error handling system when it is implemented */
125143 /* ... */
@@ -411,8 +429,16 @@ void * metacall_node_napi_to_value(/*loader_impl_node node_impl,*/ napi_env env,
411429 uint32_t argc;
412430
413431 closure->env = env;
414- closure->callback = v;
415- closure->recv = recv;
432+
433+ // Create a reference to this
434+ status = napi_create_reference (env, v, 1 , &closure->recv_ref );
435+
436+ metacall_node_exception (env, status);
437+
438+ // Create a reference to the callback
439+ status = napi_create_reference (env, v, 1 , &closure->callback_ref );
440+
441+ metacall_node_exception (env, status);
416442
417443 // Get number of arguments to the callback (this workaround should be reviewed)
418444 status = napi_get_named_property (env, v, " length" , &length);
0 commit comments