Skip to content

Commit 9869baa

Browse files
committed
Solve some leaks in node loader port.
1 parent 4fb5701 commit 9869baa

File tree

2 files changed

+46
-34
lines changed

2 files changed

+46
-34
lines changed

source/loaders/node_loader/source/node_loader_impl.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ typedef struct loader_impl_napi_to_value_callback_closure_type
377377
} * loader_impl_napi_to_value_callback_closure;
378378

379379
/* Type conversion */
380+
static void node_loader_impl_napi_to_value_callback_finalizer(value v, void * data);
381+
380382
static napi_value node_loader_impl_napi_to_value_callback(napi_env env, napi_callback_info info);
381383

382384
/* Function */
@@ -836,6 +838,15 @@ value node_loader_impl_napi_to_value(loader_impl_node node_impl, napi_env env, n
836838
return ret;
837839
}
838840

841+
void node_loader_impl_napi_to_value_callback_finalizer(value v, void * data)
842+
{
843+
loader_impl_napi_to_value_callback_closure closure = static_cast<loader_impl_napi_to_value_callback_closure>(data);
844+
845+
(void)v;
846+
847+
delete closure;
848+
}
849+
839850
napi_value node_loader_impl_napi_to_value_callback(napi_env env, napi_callback_info info)
840851
{
841852
size_t iterator, argc = 0;
@@ -861,24 +872,20 @@ napi_value node_loader_impl_napi_to_value_callback(napi_env env, napi_callback_i
861872

862873
void * ret = metacallfv_s(value_to_function(closure->func), args, argc);
863874

864-
// TODO: Implement finalizer where the closure is allocated
865-
866-
// IMPORTANT TODO:
867-
//value_type_destroy(closure->func);
868-
869875
napi_value result = node_loader_impl_value_to_napi(closure->node_impl, env, ret);
870876

877+
/* Set result finalizer */
871878
node_loader_impl_finalizer(env, result, ret);
872879

880+
/* Set closure finalizer */
881+
value_finalizer(closure->func, &node_loader_impl_napi_to_value_callback_finalizer, closure);
882+
873883
/* Reset environment */
874884
// closure->node_impl->env = NULL;
875885

876886
delete[] argv;
877887
delete[] args;
878888

879-
// IMPORTANT TODO:
880-
//delete closure;
881-
882889
return result;
883890
}
884891

@@ -1042,6 +1049,8 @@ napi_value node_loader_impl_value_to_napi(loader_impl_node node_impl, napi_env e
10421049
status = napi_create_function(env, NULL, 0, node_loader_impl_napi_to_value_callback, closure, &v);
10431050

10441051
node_loader_impl_exception(env, status);
1052+
1053+
node_loader_impl_finalizer(env, v, closure->func);
10451054
}
10461055
else if (id == TYPE_CLASS)
10471056
{

source/loaders/node_loader/source/node_loader_port.cpp

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -72,27 +72,30 @@ napi_value node_loader_port_call(napi_env env, napi_callback_info info)
7272

7373
/* Obtain NodeJS loader implementation */
7474
loader_impl impl = loader_get_impl("node");
75-
loader_impl_node node_impl = (loader_impl_node)loader_impl_get(impl);
76-
77-
/* Store current reference of the environment */
75+
loader_impl_node node_impl = (loader_impl_node)loader_impl_get(impl);
76+
77+
/* Store current reference of the environment */
7878
node_loader_impl_env(node_impl, env);
7979

8080
for (size_t args_count = 1; args_count < argc; ++args_count)
8181
{
8282
args[args_count - 1] = node_loader_impl_napi_to_value(node_impl, env, recv, argv[args_count]);
83-
84-
node_loader_impl_finalizer(env, argv[args_count], args[args_count - 1]);
8583
}
86-
84+
8785
/* Call to the function */
8886
void * ret = metacallv_s(name, args, argc - 1);
8987

90-
napi_value result = node_loader_impl_value_to_napi(node_impl, env, ret);
91-
92-
/* Release current reference of the environment */
88+
napi_value result = node_loader_impl_value_to_napi(node_impl, env, ret);
89+
90+
/* Release current reference of the environment */
9391
// node_loader_impl_env(node_impl, NULL);
9492

95-
node_loader_impl_finalizer(env, result, ret);
93+
for (size_t args_count = 0; args_count < argc -1; ++args_count)
94+
{
95+
metacall_value_destroy(args[args_count]);
96+
}
97+
98+
metacall_value_destroy(ret);
9699

97100
delete[] argv;
98101
delete[] args;
@@ -153,20 +156,20 @@ napi_value node_loader_port_load_from_file(napi_env env, napi_callback_info info
153156
}
154157

155158
if (path_index == paths_size)
156-
{
159+
{
157160
/* Obtain NodeJS loader implementation */
158161
loader_impl impl = loader_get_impl("node");
159-
loader_impl_node node_impl = (loader_impl_node)loader_impl_get(impl);
160-
161-
/* Store current reference of the environment */
162+
loader_impl_node node_impl = (loader_impl_node)loader_impl_get(impl);
163+
164+
/* Store current reference of the environment */
162165
node_loader_impl_env(node_impl, env);
163-
166+
164167
if (metacall_load_from_file(tag, (const char **)paths, paths_size, NULL) != 0)
165168
{
166169
napi_throw_error(env, NULL, "MetaCall could not load from file");
167-
}
168-
169-
/* Release current reference of the environment */
170+
}
171+
172+
/* Release current reference of the environment */
170173
// node_loader_impl_env(node_impl, NULL);
171174
}
172175
else
@@ -253,23 +256,23 @@ napi_value node_loader_port_load_from_memory(napi_env env, napi_callback_info in
253256
status = napi_get_value_string_utf8(env, argv[1], script, script_size, &script_length);
254257

255258
node_loader_impl_exception(env, status);
256-
259+
257260
/* Obtain NodeJS loader implementation */
258261
loader_impl impl = loader_get_impl("node");
259-
loader_impl_node node_impl = (loader_impl_node)loader_impl_get(impl);
260-
261-
/* Store current reference of the environment */
262+
loader_impl_node node_impl = (loader_impl_node)loader_impl_get(impl);
263+
264+
/* Store current reference of the environment */
262265
node_loader_impl_env(node_impl, env);
263-
266+
264267
// Load script from memory
265268
if (metacall_load_from_memory(tag, script, script_size, NULL) != 0)
266269
{
267270
napi_throw_error(env, NULL, "MetaCall could not load from memory");
268271
}
269-
270-
/* Release current reference of the environment */
272+
273+
/* Release current reference of the environment */
271274
// node_loader_impl_env(node_impl, NULL);
272-
275+
273276
free(tag);
274277
free(script);
275278

0 commit comments

Comments
 (0)