Skip to content

Commit c1e8f56

Browse files
committed
Solve minor bugs and properly implemented callbacks in node port (return still not implemented).
1 parent c530f6e commit c1e8f56

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

source/loaders/node_loader/source/node_loader_impl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ inline void node_loader_impl_exception(napi_env env, napi_status status)
316316

317317
napi_is_exception_pending(env, &pending);
318318

319-
const char * message = (error_info->error_message == NULL) ? "Error message not available" : error_info->error_message;
319+
const char * message = (error_info != NULL && error_info->error_message != NULL) ? error_info->error_message : "Error message not available";
320320

321321
/* TODO: Notify MetaCall error handling system when it is implemented */
322322
/* ... */
@@ -2655,7 +2655,7 @@ void node_loader_impl_async_destroy(uv_async_t * async)
26552655
napi_handle_scope handle_scope;
26562656

26572657
/* Create scope */
2658-
status = napi_open_handle_scope(node_impl->env, &handle_scope);
2658+
status = napi_open_handle_scope(env, &handle_scope);
26592659

26602660
node_loader_impl_exception(env, status);
26612661

source/ports/node_port/source/node_port.cpp

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ static void * metacall_node_callback(size_t argc, void * args[], void * data);
4949
typedef struct metacall_node_callback_closure_type
5050
{
5151
napi_env env;
52-
napi_value callback;
53-
napi_value recv;
52+
napi_ref callback_ref;
53+
napi_ref recv_ref;
5454

5555
} * metacall_node_callback_closure;
5656

@@ -64,6 +64,7 @@ void * metacall_node_callback(size_t argc, void * args[], void * data)
6464
napi_value ret;
6565
napi_status status;
6666
napi_value * argv = NULL;
67+
napi_value callback, recv;
6768

6869
if (closure == NULL)
6970
{
@@ -86,19 +87,36 @@ void * metacall_node_callback(size_t argc, void * args[], void * data)
8687
}
8788
}
8889

89-
status = napi_call_function(closure->env, closure->recv, closure->callback, argc, argv, &ret);
90+
status = napi_get_reference_value(closure->env, closure->recv_ref, &recv);
9091

9192
metacall_node_exception(closure->env, status);
9293

93-
free(closure);
94+
status = napi_get_reference_value(closure->env, closure->callback_ref, &callback);
95+
96+
metacall_node_exception(closure->env, status);
97+
98+
status = napi_call_function(closure->env, recv, callback, argc, argv, &ret);
99+
100+
metacall_node_exception(closure->env, status);
101+
102+
status = napi_delete_reference(closure->env, closure->callback_ref);
103+
104+
metacall_node_exception(closure->env, status);
94105

95106
if (argv != NULL)
96107
{
97108
free(argv);
98109
}
99110

100-
/*return metacall_node_napi_to_value(closure->env, closure->recv, ret);*/
101-
return NULL;
111+
void * result = metacall_node_napi_to_value(closure->env, recv, ret);
112+
113+
status = napi_delete_reference(closure->env, closure->recv_ref);
114+
115+
metacall_node_exception(closure->env, status);
116+
117+
free(closure);
118+
119+
return result;
102120
}
103121

104122
/* END-TODO */
@@ -119,7 +137,7 @@ inline void metacall_node_exception(napi_env env, napi_status status)
119137

120138
napi_is_exception_pending(env, &pending);
121139

122-
const char * message = (error_info->error_message == NULL) ? "Error message not available" : error_info->error_message;
140+
const char * message = (error_info != NULL && error_info->error_message != NULL) ? error_info->error_message : "Error message not available";
123141

124142
/* TODO: Notify MetaCall error handling system when it is implemented */
125143
/* ... */
@@ -411,8 +429,16 @@ void * metacall_node_napi_to_value(/*loader_impl_node node_impl,*/ napi_env env,
411429
uint32_t argc;
412430

413431
closure->env = env;
414-
closure->callback = v;
415-
closure->recv = recv;
432+
433+
// Create a reference to this
434+
status = napi_create_reference(env, v, 1, &closure->recv_ref);
435+
436+
metacall_node_exception(env, status);
437+
438+
// Create a reference to the callback
439+
status = napi_create_reference(env, v, 1, &closure->callback_ref);
440+
441+
metacall_node_exception(env, status);
416442

417443
// Get number of arguments to the callback (this workaround should be reviewed)
418444
status = napi_get_named_property(env, v, "length", &length);

0 commit comments

Comments
 (0)