Skip to content

Commit 5c9d717

Browse files
committed
Solved double recursion case between node port and python loader, some bugs where originated in the python loader.
1 parent 0f7b438 commit 5c9d717

File tree

2 files changed

+29
-24
lines changed

2 files changed

+29
-24
lines changed

source/loaders/py_loader/source/py_loader_impl.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,7 @@ PyObject * py_loader_impl_value_to_capi(loader_impl impl, loader_impl_py py_impl
633633
else if (id == TYPE_FUNCTION)
634634
{
635635
loader_impl_py_function_type_invoke_state invoke_state = malloc(sizeof(struct loader_impl_py_function_type_invoke_state_type));
636+
636637
PyObject * invoke_state_capsule;
637638

638639
if (invoke_state == NULL)
@@ -646,7 +647,7 @@ PyObject * py_loader_impl_value_to_capi(loader_impl impl, loader_impl_py py_impl
646647

647648
invoke_state_capsule = PyCapsule_New(invoke_state, NULL, NULL);
648649

649-
Py_INCREF(invoke_state_capsule);
650+
Py_XINCREF(invoke_state_capsule);
650651

651652
return PyCFunction_New(py_loader_impl_function_type_invoke_defs, invoke_state_capsule);
652653
}
@@ -711,7 +712,7 @@ function_return function_py_interface_invoke(function func, function_impl impl,
711712
log_write("metacall", LOG_LEVEL_DEBUG, "Argument #%u Type (%p): %s", args_count, (void *)t, type_name(t));
712713
}
713714

714-
py_func->values[args_count] = py_loader_impl_value_to_capi(impl, py_impl, id, args[args_count]);
715+
py_func->values[args_count] = py_loader_impl_value_to_capi(py_func->impl, py_impl, id, args[args_count]);
715716

716717
if (py_func->values[args_count] != NULL)
717718
{

source/ports/node_port/source/node_port.cpp

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)