From f8f7c1e5bdb18e2aca027e68322016f0161013d4 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Thu, 24 Mar 2022 21:50:55 +0800 Subject: [PATCH] bootstrap: run inspector and event loop in snapshot builder This makes --inspect and stdin/out functional in the embedded snapshot, currently it's not guaranteed that these work perfectly, the plan is to investigate any out-of-sync states that might appear in user land snapshots with this while the it is a configure-time feature. PR-URL: https://github.com/nodejs/node/pull/42466 Reviewed-By: Darshan Sen Reviewed-By: Mohammed Keyvanzadeh Reviewed-By: Khaidi Chu Reviewed-By: Chengzhong Wu --- src/node_snapshotable.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/node_snapshotable.cc b/src/node_snapshotable.cc index 327246743bb076..9330da6568ce20 100644 --- a/src/node_snapshotable.cc +++ b/src/node_snapshotable.cc @@ -15,6 +15,10 @@ #include "node_v8.h" #include "node_v8_platform-inl.h" +#if HAVE_INSPECTOR +#include "inspector/worker_inspector.h" // ParentInspectorHandle +#endif + namespace node { using v8::Context; @@ -136,7 +140,7 @@ void SnapshotBuilder::Generate(SnapshotData* out, nullptr, node::EnvironmentFlags::kDefaultFlags, {}); - // TODO(joyeecheung): run env->InitializeInspector({}) here. + // Run scripts in lib/internal/bootstrap/ { TryCatch bootstrapCatch(isolate); @@ -153,6 +157,9 @@ void SnapshotBuilder::Generate(SnapshotData* out, // could also explore snapshotting other kinds of execution modes // in the future). if (per_process::cli_options->build_snapshot) { +#if HAVE_INSPECTOR + env->InitializeInspector({}); +#endif TryCatch bootstrapCatch(isolate); // TODO(joyeecheung): we could use the result for something special, // like setting up initializers that should be invoked at snapshot @@ -163,7 +170,15 @@ void SnapshotBuilder::Generate(SnapshotData* out, PrintCaughtException(isolate, context, bootstrapCatch); } result.ToLocalChecked(); - // TODO(joyeecheung): run SpinEventLoop here. + // FIXME(joyeecheung): right now running the loop in the snapshot + // builder seems to introduces inconsistencies in JS land that need to + // be synchronized again after snapshot restoration. + int exit_code = SpinEventLoop(env).FromMaybe(1); + CHECK_EQ(exit_code, 0); + if (bootstrapCatch.HasCaught()) { + PrintCaughtException(isolate, context, bootstrapCatch); + abort(); + } } if (per_process::enabled_debug_list.enabled(DebugCategory::MKSNAPSHOT)) {