@@ -44,7 +44,9 @@ static void * metacall_node_napi_to_value(/* loader_impl_node node_impl,*/ napi_
4444
4545static napi_value metacall_node_value_to_napi (/* loader_impl_node node_impl,*/ napi_env env, void * arg);
4646
47- static void * metacall_node_callback (size_t argc, void * args[], void * data);
47+ static void * metacall_node_callback_value_to_napi (size_t argc, void * args[], void * data);
48+
49+ static napi_value metacall_node_callback_napi_to_value (napi_env env, napi_callback_info info);
4850
4951typedef struct metacall_node_callback_closure_type
5052{
@@ -58,7 +60,7 @@ typedef struct metacall_node_callback_closure_type
5860
5961/* BEGIN-TODO: (Maybe) Implement this in the loader, then remove it from here */
6062
61- void * metacall_node_callback (size_t argc, void * args[], void * data)
63+ void * metacall_node_callback_value_to_napi (size_t argc, void * args[], void * data)
6264{
6365 metacall_node_callback_closure closure = static_cast <metacall_node_callback_closure>(data);
6466 napi_value ret;
@@ -119,6 +121,38 @@ void * metacall_node_callback(size_t argc, void * args[], void * data)
119121 return result;
120122}
121123
124+ napi_value metacall_node_callback_napi_to_value (napi_env env, napi_callback_info info)
125+ {
126+ void * f = NULL ;
127+ size_t iterator, argc = 0 ;
128+
129+ napi_get_cb_info (env, info, &argc, NULL , NULL , NULL );
130+
131+ napi_value argv[argc];
132+ void * args[argc];
133+ napi_value recv;
134+
135+ napi_get_cb_info (env, info, &argc, argv, &recv, &f);
136+
137+ for (iterator = 0 ; iterator < argc; ++iterator)
138+ {
139+ args[iterator] = metacall_node_napi_to_value (env, recv, argv[iterator]);
140+ }
141+
142+ void * ret = metacallfv (f, args);
143+
144+ for (iterator = 0 ; iterator < argc; ++iterator)
145+ {
146+ metacall_value_destroy (args[iterator]);
147+ }
148+
149+ napi_value result = metacall_node_value_to_napi (env, ret);
150+
151+ metacall_value_destroy (ret);
152+
153+ return result;
154+ }
155+
122156/* END-TODO */
123157
124158/* BEGIN-TODO: Remove this, it is duplicated code copied from node loader */
@@ -423,7 +457,7 @@ void * metacall_node_napi_to_value(/*loader_impl_node node_impl,*/ napi_env env,
423457 }
424458 else if (valuetype == napi_function)
425459 {
426- void * f = metacall_function (" __metacall_node_callback__ " );
460+ void * f = metacall_function (" __metacall_node_callback_value_to_napi__ " );
427461 metacall_node_callback_closure closure = static_cast <metacall_node_callback_closure>(malloc (sizeof (struct metacall_node_callback_closure_type )));
428462 napi_value length;
429463 uint32_t argc;
@@ -609,15 +643,11 @@ napi_value metacall_node_value_to_napi(/* loader_impl_node node_impl,*/ napi_env
609643 }
610644 else if (id == METACALL_FUNCTION)
611645 {
612- /* TODO: Implement function to pass callbacks through the callback again */
613- /*
614646 void * f = metacall_value_to_function (arg_value);
615647
616- // TODO:
617- status = napi_create_double(env, double_value, &v);
648+ status = napi_create_function (env, NULL , 0 , metacall_node_callback_napi_to_value, f, &v);
618649
619650 metacall_node_exception (env, status);
620- */
621651 }
622652 else
623653 {
@@ -863,7 +893,7 @@ napi_value metacall_node_initialize(napi_env env, napi_value exports)
863893 return NULL ;
864894 }
865895
866- if (metacall_register (" __metacall_node_callback__ " , metacall_node_callback , METACALL_INVALID, 0 ) != 0 )
896+ if (metacall_register (" __metacall_node_callback_value_to_napi__ " , metacall_node_callback_value_to_napi , METACALL_INVALID, 0 ) != 0 )
867897 {
868898 /* TODO: Show error message (when error handling is properly implemented in the core lib) */
869899 napi_throw_error (env, NULL , " MetaCall failed to initialize callback support" );
0 commit comments