Skip to content

Commit ccd228b

Browse files
mmomtchevvmoroz
authored andcommitted
adapt to the new embedding API
1 parent a0b3b25 commit ccd228b

File tree

6 files changed

+46
-65
lines changed

6 files changed

+46
-65
lines changed

doc/api/embedding.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,13 @@ An example can be found [in the Node.js source tree][napi_embedding.c].
180180
napi_env env;
181181
const char *main_script = "console.log('hello world')";
182182

183-
if (napi_create_platform(0, NULL, 0, NULL, NULL, &platform) != napi_ok) {
183+
if (napi_create_platform(0, NULL, NULL, &platform) != napi_ok) {
184184
fprintf(stderr, "Failed creating the platform\n");
185185
return -1;
186186
}
187187

188188
if (napi_create_environment(platform, NULL, main_script,
189-
(napi_stdio){NULL, NULL, NULL}, &env) != napi_ok) {
189+
(napi_stdio){NULL, NULL, NULL}, NAPI_VERSION, &env) != napi_ok) {
190190
fprintf(stderr, "Failed running JS\n");
191191
return -1;
192192
}

doc/api/n-api.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6594,16 +6594,12 @@ added: REPLACEME
65946594
```c
65956595
napi_status napi_create_platform(int argc,
65966596
char** argv,
6597-
int exec_argc,
6598-
char** exec_argv,
65996597
napi_error_message_handler err_handler,
66006598
napi_platform* result);
66016599
```
66026600

66036601
* `[in] argc`: CLI argument count, pass 0 for autofilling.
66046602
* `[in] argv`: CLI arguments, pass NULL for autofilling.
6605-
* `[in] exec_argc`: Node.js CLI options count.
6606-
* `[in] exec_argv`: Node.js CLI options.
66076603
* `[in] err_handler`: If different than NULL, will be called back with each
66086604
error message. There can be multiple error messages but the API guarantees
66096605
that no calls will be made after the `napi_create_platform` has returned.
@@ -6642,6 +6638,7 @@ added: REPLACEME
66426638
napi_status napi_create_environment(napi_platform platform,
66436639
napi_error_message_handler err_handler,
66446640
const char* main_script,
6641+
int32_t api_version,
66456642
napi_env* result);
66466643
```
66476644

@@ -6658,6 +6655,8 @@ napi_status napi_create_environment(napi_platform platform,
66586655
the compiled binary.
66596656
It can be used to redirect `process.stdin`/ `process.stdout` streams
66606657
since Node.js might switch these file descriptors to non-blocking mode.
6658+
* `[in] api_version`: Node-API version to conform to, pass `NAPI_VERSION`
6659+
for the latest available.
66616660
* `[out] result`: A `napi_env` result.
66626661

66636662
Initialize a new environment. A single platform can hold multiple Node.js

src/js_native_api_v8.cc

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -263,21 +263,6 @@ inline v8impl::Persistent<v8::Value>* NodePersistentFromJsDeferred(
263263
return reinterpret_cast<v8impl::Persistent<v8::Value>*>(local);
264264
}
265265

266-
struct PlatformWrapper {
267-
explicit PlatformWrapper(int argc,
268-
char** argv,
269-
int exec_argc,
270-
char** exec_argv,
271-
int32_t _api_version)
272-
: args(argv, argv + argc),
273-
exec_args(exec_argv, exec_argv + exec_argc),
274-
api_version(_api_version) {}
275-
std::unique_ptr<node::MultiIsolatePlatform> platform;
276-
std::vector<std::string> args;
277-
std::vector<std::string> exec_args;
278-
int32_t api_version;
279-
};
280-
281266
class EmbeddedEnvironment : public node::EmbeddedEnvironment {
282267
public:
283268
explicit EmbeddedEnvironment(
@@ -988,49 +973,48 @@ napi_status NAPI_CDECL napi_get_last_error_info(
988973
}
989974

990975
napi_status NAPI_CDECL
991-
napi_create_platform_version(int argc,
992-
char** argv,
993-
int exec_argc,
994-
char** exec_argv,
995-
napi_error_message_handler err_handler,
996-
napi_platform* result,
997-
int32_t api_version) {
976+
napi_create_platform(int argc,
977+
char** argv,
978+
napi_error_message_handler err_handler,
979+
napi_platform* result) {
998980
argv = uv_setup_args(argc, argv);
999-
std::vector<std::string> errors_vec;
1000-
1001-
v8impl::PlatformWrapper* platform = new v8impl::PlatformWrapper(
1002-
argc, argv, exec_argc, exec_argv, api_version);
1003-
if (platform->args.size() < 1) platform->args.push_back("libnode");
981+
std::vector<std::string> args(argv, argv + argc);
982+
if (args.size() < 1) args.push_back("libnode");
1004983

1005-
int exit_code = node::InitializeNodeWithArgs(
1006-
&platform->args, &platform->exec_args, &errors_vec);
984+
std::unique_ptr<node::InitializationResult> node_platform =
985+
node::InitializeOncePerProcess(
986+
args,
987+
{node::ProcessInitializationFlags::kNoInitializeV8,
988+
node::ProcessInitializationFlags::kNoInitializeNodeV8Platform});
1007989

1008-
for (const std::string& error : errors_vec) {
990+
for (const std::string& error : node_platform->errors()) {
1009991
if (err_handler != nullptr) {
1010992
err_handler(error.c_str());
1011993
} else {
1012994
fprintf(stderr, "%s\n", error.c_str());
1013995
}
1014996
}
1015-
1016-
if (exit_code != 0) {
997+
if (node_platform->early_return() != 0) {
1017998
return napi_generic_failure;
1018999
}
10191000

10201001
auto thread_pool_size = node::per_process::cli_options->v8_thread_pool_size;
1021-
platform->platform = node::MultiIsolatePlatform::Create(thread_pool_size);
1022-
v8::V8::InitializePlatform(platform->platform.get());
1002+
std::unique_ptr<node::MultiIsolatePlatform> v8_platform =
1003+
node::MultiIsolatePlatform::Create(thread_pool_size);
1004+
v8::V8::InitializePlatform(v8_platform.get());
10231005
v8::V8::Initialize();
1024-
*result = reinterpret_cast<napi_platform>(platform);
1006+
reinterpret_cast<node::InitializationResultImpl*>(node_platform.get())
1007+
->platform_ = v8_platform.release();
1008+
*result = reinterpret_cast<napi_platform>(node_platform.release());
10251009
return napi_ok;
10261010
}
10271011

10281012
napi_status NAPI_CDECL napi_destroy_platform(napi_platform platform) {
1029-
auto wrapper = reinterpret_cast<v8impl::PlatformWrapper*>(platform);
1013+
auto wrapper = reinterpret_cast<node::InitializationResult*>(platform);
10301014
v8::V8::Dispose();
10311015
v8::V8::DisposePlatform();
1032-
1033-
// The node::CommonEnvironmentSetup::Create uniq_ptr is destroyed here
1016+
node::TearDownOncePerProcess();
1017+
delete wrapper->platform();
10341018
delete wrapper;
10351019
return napi_ok;
10361020
}
@@ -1039,12 +1023,13 @@ napi_status NAPI_CDECL
10391023
napi_create_environment(napi_platform platform,
10401024
napi_error_message_handler err_handler,
10411025
const char* main_script,
1026+
int32_t api_version,
10421027
napi_env* result) {
1043-
auto wrapper = reinterpret_cast<v8impl::PlatformWrapper*>(platform);
1028+
auto wrapper = reinterpret_cast<node::InitializationResult*>(platform);
10441029
std::vector<std::string> errors_vec;
10451030

10461031
auto setup = node::CommonEnvironmentSetup::Create(
1047-
wrapper->platform.get(), &errors_vec, wrapper->args, wrapper->exec_args);
1032+
wrapper->platform(), &errors_vec, wrapper->args(), wrapper->exec_args());
10481033

10491034
for (const std::string& error : errors_vec) {
10501035
if (err_handler != nullptr) {
@@ -1076,9 +1061,9 @@ napi_create_environment(napi_platform platform,
10761061
new v8impl::EmbeddedEnvironment(std::move(setup), main_resource);
10771062

10781063
std::string filename =
1079-
wrapper->args.size() > 1 ? wrapper->args[1] : "<internal>";
1080-
auto env__ = new node_napi_env__(
1081-
emb_env->setup()->context(), filename, wrapper->api_version);
1064+
wrapper->args().size() > 1 ? wrapper->args()[1] : "<internal>";
1065+
auto env__ =
1066+
new node_napi_env__(emb_env->setup()->context(), filename, api_version);
10821067
emb_env->setup()->env()->set_embedded(emb_env);
10831068
env__->node_env()->AddCleanupHook(
10841069
[](void* arg) { static_cast<napi_env>(arg)->Unref(); },
@@ -1128,6 +1113,8 @@ napi_status NAPI_CDECL napi_destroy_environment(napi_env env, int* exit_code) {
11281113
// and the v8::locker
11291114
delete emb_env;
11301115

1116+
cppgc::ShutdownProcess();
1117+
11311118
return napi_ok;
11321119
}
11331120

src/node_api_embedding.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,10 @@ EXTERN_C_START
1717
typedef void (*napi_error_message_handler)(const char* msg);
1818

1919
NAPI_EXTERN napi_status NAPI_CDECL
20-
napi_create_platform_version(int argc,
21-
char** argv,
22-
int exec_argc,
23-
char** exec_argv,
24-
napi_error_message_handler err_handler,
25-
napi_platform* result,
26-
int32_t api_version);
27-
#define napi_create_platform( \
28-
argc, argv, exec_args, exec_argv, err_handler, result) \
29-
napi_create_platform_version( \
30-
argc, argv, exec_args, exec_argv, err_handler, result, NAPI_VERSION)
20+
napi_create_platform(int argc,
21+
char** argv,
22+
napi_error_message_handler err_handler,
23+
napi_platform* result);
3124

3225
NAPI_EXTERN napi_status NAPI_CDECL
3326
napi_destroy_platform(napi_platform platform);
@@ -36,6 +29,7 @@ NAPI_EXTERN napi_status NAPI_CDECL
3629
napi_create_environment(napi_platform platform,
3730
napi_error_message_handler err_handler,
3831
const char* main_script,
32+
int32_t api_version,
3933
napi_env* result);
4034

4135
NAPI_EXTERN napi_status NAPI_CDECL napi_run_environment(napi_env env);

test/embedding/napi_embedding.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const char* main_script =
2323
int main(int argc, char** argv) {
2424
napi_platform platform;
2525

26-
CHECK(napi_create_platform(argc, argv, 0, NULL, NULL, &platform),
26+
CHECK(napi_create_platform(argc, argv, NULL, &platform),
2727
"Failed creating the platform");
2828

2929
int exit_code = RunNodeInstance(platform);
@@ -240,8 +240,9 @@ int RunNodeInstance(napi_platform platform) {
240240
napi_env env;
241241
int exit_code;
242242

243-
CHECK(napi_create_environment(platform, NULL, main_script, &env),
244-
"Failed running JS");
243+
CHECK(
244+
napi_create_environment(platform, NULL, main_script, NAPI_VERSION, &env),
245+
"Failed running JS");
245246

246247
if (callMe(env) != 0) exit_code = -1;
247248
if (waitMe(env) != 0) exit_code = -1;

test/embedding/napi_modules.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ int main(int argc, char* argv[]) {
1818
return -2;
1919
}
2020

21-
CHECK(napi_create_platform(0, NULL, 0, NULL, NULL, &platform),
21+
CHECK(napi_create_platform(0, NULL, NULL, &platform),
2222
"Failed creating the platform");
2323

2424
napi_env env;
25-
CHECK(napi_create_environment(platform, NULL, NULL, &env),
25+
CHECK(napi_create_environment(platform, NULL, NULL, NAPI_VERSION, &env),
2626
"Failed running JS");
2727

2828
napi_handle_scope scope;

0 commit comments

Comments
 (0)