@@ -48,6 +48,8 @@ static void * metacall_node_callback_value_to_napi(size_t argc, void * args[], v
4848
4949static napi_value metacall_node_callback_napi_to_value (napi_env env, napi_callback_info info);
5050
51+ static void metacall_node_finalizer (napi_env env, napi_value v, void * data);
52+
5153typedef struct metacall_node_callback_closure_type
5254{
5355 napi_env env;
@@ -148,11 +150,58 @@ napi_value metacall_node_callback_napi_to_value(napi_env env, napi_callback_info
148150
149151 napi_value result = metacall_node_value_to_napi (env, ret);
150152
151- metacall_value_destroy ( ret);
153+ metacall_node_finalizer (env, result, ret);
152154
153155 return result;
154156}
155157
158+ void metacall_node_finalizer (napi_env env, napi_value v, void * data)
159+ {
160+ napi_status status;
161+
162+ auto finalizer = [](napi_env, void * finalize_data, void *)
163+ {
164+ metacall_value_destroy (finalize_data);
165+ };
166+
167+ // Create a finalizer for the value
168+ #if (NAPI_VERSION < 5)
169+ {
170+ napi_value symbol, external;
171+
172+ status = napi_create_symbol (env, nullptr , &symbol);
173+
174+ metacall_node_exception (env, status);
175+
176+ status = napi_create_external (env, data, finalizer, nullptr , &external);
177+
178+ metacall_node_exception (env, status);
179+
180+ napi_property_descriptor desc =
181+ {
182+ nullptr ,
183+ symbol,
184+ nullptr ,
185+ nullptr ,
186+ nullptr ,
187+ external,
188+ napi_default,
189+ nullptr
190+ };
191+
192+ status = napi_define_properties (env, v, 1 , &desc);
193+
194+ metacall_node_exception (env, status);
195+ }
196+ #else // NAPI_VERSION >= 5
197+ {
198+ status = napi_add_finalizer (env, v, data, finalizer, nullptr , nullptr );
199+
200+ metacall_node_exception (env, status);
201+ }
202+ #endif
203+ }
204+
156205/* END-TODO */
157206
158207/* BEGIN-TODO: Remove this, it is duplicated code copied from node loader */
@@ -695,47 +744,7 @@ napi_value metacall_node_call(napi_env env, napi_callback_info info)
695744
696745 napi_value result = metacall_node_value_to_napi (env, ret);
697746
698- auto finalizer = [](napi_env, void * finalize_data, void *)
699- {
700- metacall_value_destroy (finalize_data);
701- };
702-
703- // Create a finalizer for the value
704- #if (NAPI_VERSION < 5)
705- {
706- napi_value symbol, external;
707-
708- status = napi_create_symbol (env, nullptr , &symbol);
709-
710- metacall_node_exception (env, status);
711-
712- status = napi_create_external (env, ret, finalizer, nullptr , &external);
713-
714- metacall_node_exception (env, status);
715-
716- napi_property_descriptor desc =
717- {
718- nullptr ,
719- symbol,
720- nullptr ,
721- nullptr ,
722- nullptr ,
723- external,
724- napi_default,
725- nullptr
726- };
727-
728- status = napi_define_properties (env, result, 1 , &desc);
729-
730- metacall_node_exception (env, status);
731- }
732- #else // NAPI_VERSION >= 5
733- {
734- status = napi_add_finalizer (env, result, ret, finalizer, nullptr , nullptr );
735-
736- metacall_node_exception (env, status);
737- }
738- #endif
747+ metacall_node_finalizer (env, result, ret);
739748
740749 return result;
741750}
0 commit comments