Skip to content

Commit

Permalink
Solved double recursion case between node port and python loader, som…
Browse files Browse the repository at this point in the history
…e bugs where originated in the python loader.
  • Loading branch information
viferga committed Apr 3, 2020
1 parent 0f7b438 commit 5c9d717
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 24 deletions.
5 changes: 3 additions & 2 deletions source/loaders/py_loader/source/py_loader_impl.c
Original file line number Diff line number Diff line change
Expand Up @@ -633,6 +633,7 @@ PyObject * py_loader_impl_value_to_capi(loader_impl impl, loader_impl_py py_impl
else if (id == TYPE_FUNCTION)
{
loader_impl_py_function_type_invoke_state invoke_state = malloc(sizeof(struct loader_impl_py_function_type_invoke_state_type));

PyObject * invoke_state_capsule;

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

invoke_state_capsule = PyCapsule_New(invoke_state, NULL, NULL);

Py_INCREF(invoke_state_capsule);
Py_XINCREF(invoke_state_capsule);

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

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

if (py_func->values[args_count] != NULL)
{
Expand Down
48 changes: 26 additions & 22 deletions source/ports/node_port/source/node_port.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ typedef struct metacall_node_callback_closure_type

} * metacall_node_callback_closure;

static void * metacall_node_callback_value_to_napi_func = NULL;

/* -- Methods -- */

/* BEGIN-TODO: (Maybe) Implement this in the loader, then remove it from here */
Expand Down Expand Up @@ -103,22 +105,30 @@ void * metacall_node_callback_value_to_napi(size_t argc, void * args[], void * d

metacall_node_exception(closure->env, status);

status = napi_delete_reference(closure->env, closure->callback_ref);

metacall_node_exception(closure->env, status);

if (argv != NULL)
{
free(argv);
}

void * result = metacall_node_napi_to_value(closure->env, recv, ret);

status = napi_delete_reference(closure->env, closure->recv_ref);
/* TODO: Clean up */
/*
auto delete_closure = [closure]()
{
napi_status status = napi_delete_reference(closure->env, closure->callback_ref);
metacall_node_exception(closure->env, status);
metacall_node_exception(closure->env, status);
status = napi_delete_reference(closure->env, closure->recv_ref);
metacall_node_exception(closure->env, status);
free(closure);
};
*/

free(closure);
metacall_node_finalizer(closure->env, ret, result/*, delete_closure*/);

return result;
}
Expand All @@ -139,15 +149,12 @@ napi_value metacall_node_callback_napi_to_value(napi_env env, napi_callback_info
for (iterator = 0; iterator < argc; ++iterator)
{
args[iterator] = metacall_node_napi_to_value(env, recv, argv[iterator]);

metacall_node_finalizer(env, argv[iterator], args[iterator]);
}

void * ret = metacallfv(f, args);

for (iterator = 0; iterator < argc; ++iterator)
{
metacall_value_destroy(args[iterator]);
}

napi_value result = metacall_node_value_to_napi(env, ret);

metacall_node_finalizer(env, result, ret);
Expand Down Expand Up @@ -512,7 +519,6 @@ void * metacall_node_napi_to_value(/*loader_impl_node node_impl,*/ napi_env env,
}
else if (valuetype == napi_function)
{
void * f = metacall_function("__metacall_node_callback_value_to_napi__");
metacall_node_callback_closure closure = static_cast<metacall_node_callback_closure>(malloc(sizeof(struct metacall_node_callback_closure_type)));

closure->env = env;
Expand All @@ -527,7 +533,7 @@ void * metacall_node_napi_to_value(/*loader_impl_node node_impl,*/ napi_env env,

metacall_node_exception(env, status);

return metacall_value_create_function_closure(f, (void *)closure);
return metacall_value_create_function_closure(metacall_node_callback_value_to_napi_func, (void *)closure);
}
else if (valuetype == napi_external)
{
Expand Down Expand Up @@ -737,18 +743,15 @@ napi_value metacall_node_call(napi_env env, napi_callback_info info)

metacall_node_exception(env, status);

for (size_t i = 1; i < argc; ++i)
for (size_t args_count = 1; args_count < argc; ++args_count)
{
args[i - 1] = metacall_node_napi_to_value(env, recv, argv[i]);
args[args_count - 1] = metacall_node_napi_to_value(env, recv, argv[args_count]);

metacall_node_finalizer(env, argv[args_count], args[args_count - 1]);
}

void * ret = metacallv(name, args);

for (size_t args_count = 0; args_count < argc - 1; ++args_count)
{
metacall_value_destroy(args[args_count]);
}

napi_value result = metacall_node_value_to_napi(env, ret);

metacall_node_finalizer(env, result, ret);
Expand Down Expand Up @@ -956,7 +959,8 @@ napi_value metacall_node_initialize(napi_env env, napi_value exports)
return NULL;
}

if (metacall_register("__metacall_node_callback_value_to_napi__", metacall_node_callback_value_to_napi, METACALL_INVALID, 0) != 0)
if (metacall_register(NULL, metacall_node_callback_value_to_napi, &metacall_node_callback_value_to_napi_func, METACALL_INVALID, 0) != 0
|| metacall_node_callback_value_to_napi_func == NULL)
{
/* TODO: Show error message (when error handling is properly implemented in the core lib) */
napi_throw_error(env, NULL, "MetaCall failed to initialize callback support");
Expand Down

0 comments on commit 5c9d717

Please sign in to comment.