@@ -47,7 +47,6 @@ napi_value node_loader_port_metacall(napi_env env, napi_callback_info info)
47
47
if (argc == 0 )
48
48
{
49
49
napi_throw_error (env, nullptr , " Invalid number of arguments" );
50
-
51
50
return nullptr ;
52
51
}
53
52
@@ -65,7 +64,8 @@ napi_value node_loader_port_metacall(napi_env env, napi_callback_info info)
65
64
if (name == nullptr )
66
65
{
67
66
napi_throw_error (env, nullptr , " Invalid function name allocation" );
68
-
67
+ delete[] argv;
68
+ delete[] args;
69
69
return nullptr ;
70
70
}
71
71
@@ -114,6 +114,105 @@ napi_value node_loader_port_metacall(napi_env env, napi_callback_info info)
114
114
return result;
115
115
}
116
116
117
+ napi_value node_loader_port_metacallfms (napi_env env, napi_callback_info info)
118
+ {
119
+ size_t argc = 0 ;
120
+
121
+ napi_get_cb_info (env, info, &argc, nullptr , nullptr , nullptr );
122
+
123
+ if (argc != 2 )
124
+ {
125
+ napi_throw_error (env, nullptr , " Invalid number of arguments" );
126
+ return nullptr ;
127
+ }
128
+
129
+ napi_value *argv = new napi_value[argc];
130
+ napi_value recv;
131
+
132
+ napi_get_cb_info (env, info, &argc, argv, &recv, nullptr );
133
+
134
+ size_t name_length;
135
+ napi_status status = napi_get_value_string_utf8 (env, argv[0 ], nullptr , 0 , &name_length);
136
+
137
+ char *name = new char [name_length + 1 ];
138
+
139
+ if (name == nullptr )
140
+ {
141
+ napi_throw_error (env, nullptr , " Invalid function name allocation" );
142
+ delete[] argv;
143
+ return nullptr ;
144
+ }
145
+
146
+ status = napi_get_value_string_utf8 (env, argv[0 ], name, name_length + 1 , &name_length);
147
+
148
+ name[name_length] = ' \0 ' ;
149
+
150
+ node_loader_impl_exception (env, status);
151
+
152
+ void *func = metacall_function (name);
153
+
154
+ if (func == NULL )
155
+ {
156
+ napi_throw_error (env, nullptr , " The function does not exist" );
157
+ delete[] argv;
158
+ delete[] name;
159
+ return nullptr ;
160
+ }
161
+
162
+ size_t buffer_length;
163
+ status = napi_get_value_string_utf8 (env, argv[1 ], nullptr , 0 , &buffer_length);
164
+
165
+ char *buffer = new char [buffer_length + 1 ];
166
+
167
+ if (buffer == nullptr )
168
+ {
169
+ napi_throw_error (env, nullptr , " Invalid function buffer allocation" );
170
+ delete[] argv;
171
+ delete[] name;
172
+ return nullptr ;
173
+ }
174
+
175
+ status = napi_get_value_string_utf8 (env, argv[1 ], buffer, buffer_length + 1 , &buffer_length);
176
+
177
+ buffer[buffer_length] = ' \0 ' ;
178
+
179
+ node_loader_impl_exception (env, status);
180
+
181
+ /* Obtain NodeJS loader implementation */
182
+ loader_impl impl = loader_get_impl (node_loader_tag);
183
+ loader_impl_node node_impl = (loader_impl_node)loader_impl_get (impl);
184
+
185
+ /* Store current reference of the environment */
186
+ node_loader_impl_env (node_impl, env);
187
+
188
+ struct metacall_allocator_std_type std_ctx = { &std::malloc, &std::realloc, &std::free };
189
+
190
+ void *allocator = metacall_allocator_create (METACALL_ALLOCATOR_STD, (void *)&std_ctx);
191
+
192
+ /* Call to the function */
193
+ void *ret = metacallfms (func, buffer, buffer_length + 1 , allocator);
194
+
195
+ metacall_allocator_destroy (allocator);
196
+
197
+ napi_value result = node_loader_impl_value_to_napi (node_impl, env, ret);
198
+
199
+ if (metacall_value_id (ret) == METACALL_THROWABLE)
200
+ {
201
+ napi_throw (env, result);
202
+ }
203
+
204
+ /* Release current reference of the environment */
205
+ // node_loader_impl_env(node_impl, nullptr);
206
+
207
+ metacall_value_destroy (ret);
208
+
209
+ delete[] argv;
210
+ delete[] name;
211
+ delete[] buffer;
212
+
213
+ return result;
214
+ }
215
+
117
216
napi_value node_loader_port_metacall_await (napi_env env, napi_callback_info info)
118
217
{
119
218
size_t argc = 0 ;
@@ -123,7 +222,6 @@ napi_value node_loader_port_metacall_await(napi_env env, napi_callback_info info
123
222
if (argc == 0 )
124
223
{
125
224
napi_throw_error (env, nullptr , " Invalid number of arguments" );
126
-
127
225
return nullptr ;
128
226
}
129
227
@@ -142,7 +240,8 @@ napi_value node_loader_port_metacall_await(napi_env env, napi_callback_info info
142
240
if (name == nullptr )
143
241
{
144
242
napi_throw_error (env, nullptr , " Invalid function name allocation" );
145
-
243
+ delete[] argv;
244
+ delete[] args;
146
245
return nullptr ;
147
246
}
148
247
@@ -414,8 +513,8 @@ napi_value node_loader_port_metacall_load_from_memory(napi_env env, napi_callbac
414
513
415
514
if (script == nullptr )
416
515
{
417
- delete[] tag;
418
516
napi_throw_error (env, nullptr , " MetaCall could not load from memory, script allocation failed" );
517
+ delete[] tag;
419
518
return nullptr ;
420
519
}
421
520
@@ -489,8 +588,8 @@ napi_value node_loader_port_metacall_load_from_memory_export(napi_env env, napi_
489
588
490
589
if (script == nullptr )
491
590
{
492
- delete[] tag;
493
591
napi_throw_error (env, nullptr , " MetaCall could not load from memory, script allocation failed" );
592
+ delete[] tag;
494
593
return nullptr ;
495
594
}
496
595
@@ -715,6 +814,7 @@ void node_loader_port_exports(napi_env env, napi_value exports)
715
814
716
815
#define NODE_LOADER_PORT_DECL_X_MACRO (x ) \
717
816
x (metacall); \
817
+ x (metacallfms); \
718
818
x (metacall_await); \
719
819
x (metacall_load_from_file); \
720
820
x (metacall_load_from_file_export); \
0 commit comments