Skip to content

Commit 8d400df

Browse files
committed
src: Split RunBootstrapping()
Split `RunBootstrapping()` into `BootstrapInternalLoaders()` and `BootstrapNode()` from so the two can be snapshotted incrementally.
1 parent 6430100 commit 8d400df

File tree

6 files changed

+82
-68
lines changed

6 files changed

+82
-68
lines changed

src/api/environment.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ Environment* CreateEnvironment(IsolateData* isolate_data,
250250
Environment::kOwnsProcessState |
251251
Environment::kOwnsInspector));
252252
env->InitializeLibuv(per_process::v8_is_profiling);
253-
if (RunBootstrapping(env).IsEmpty()) {
253+
if (env->RunBootstrapping().IsEmpty()) {
254254
return nullptr;
255255
}
256256

src/env.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,10 @@ class Environment : public MemoryRetainer {
806806
#endif
807807
void InitializeDiagnostics();
808808

809+
v8::MaybeLocal<v8::Value> BootstrapInternalLoaders();
810+
v8::MaybeLocal<v8::Value> BootstrapNode();
811+
v8::MaybeLocal<v8::Value> RunBootstrapping();
812+
809813
inline size_t async_callback_scope_depth() const;
810814
inline void PushAsyncCallbackScope();
811815
inline void PopAsyncCallbackScope();

src/node.cc

Lines changed: 75 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ using options_parser::kAllowedInEnvironment;
129129
using options_parser::kDisallowedInEnvironment;
130130

131131
using v8::Boolean;
132-
using v8::Context;
133132
using v8::EscapableHandleScope;
134133
using v8::Exception;
135134
using v8::Function;
@@ -282,99 +281,111 @@ void Environment::InitializeDiagnostics() {
282281
#endif
283282
}
284283

285-
MaybeLocal<Value> RunBootstrapping(Environment* env) {
286-
CHECK(!env->has_run_bootstrapping_code());
287-
288-
EscapableHandleScope scope(env->isolate());
289-
Isolate* isolate = env->isolate();
290-
Local<Context> context = env->context();
291-
292-
293-
// Add a reference to the global object
294-
Local<Object> global = context->Global();
295-
Local<Object> process = env->process_object();
296-
297-
// Setting global properties for the bootstrappers to use:
298-
// - global
299-
// Expose the global object as a property on itself
300-
// (Allows you to set stuff on `global` from anywhere in JavaScript.)
301-
global->Set(context, FIXED_ONE_BYTE_STRING(env->isolate(), "global"), global)
302-
.Check();
303-
284+
MaybeLocal<Value> Environment::BootstrapInternalLoaders() {
285+
EscapableHandleScope scope(isolate_);
304286

305287
// Create binding loaders
306288
std::vector<Local<String>> loaders_params = {
307-
env->process_string(),
308-
FIXED_ONE_BYTE_STRING(isolate, "getLinkedBinding"),
309-
FIXED_ONE_BYTE_STRING(isolate, "getInternalBinding"),
310-
env->primordials_string()};
289+
process_string(),
290+
FIXED_ONE_BYTE_STRING(isolate_, "getLinkedBinding"),
291+
FIXED_ONE_BYTE_STRING(isolate_, "getInternalBinding"),
292+
primordials_string()};
311293
std::vector<Local<Value>> loaders_args = {
312-
process,
313-
env->NewFunctionTemplate(binding::GetLinkedBinding)
314-
->GetFunction(context)
294+
process_object(),
295+
NewFunctionTemplate(binding::GetLinkedBinding)
296+
->GetFunction(context())
315297
.ToLocalChecked(),
316-
env->NewFunctionTemplate(binding::GetInternalBinding)
317-
->GetFunction(context)
298+
NewFunctionTemplate(binding::GetInternalBinding)
299+
->GetFunction(context())
318300
.ToLocalChecked(),
319-
env->primordials()};
301+
primordials()};
320302

321303
// Bootstrap internal loaders
322-
MaybeLocal<Value> loader_exports = ExecuteBootstrapper(
323-
env, "internal/bootstrap/loaders", &loaders_params, &loaders_args);
324-
if (loader_exports.IsEmpty()) {
304+
Local<Value> loader_exports;
305+
if (!ExecuteBootstrapper(
306+
this, "internal/bootstrap/loaders", &loaders_params, &loaders_args)
307+
.ToLocal(&loader_exports)) {
325308
return MaybeLocal<Value>();
326309
}
327-
328-
Local<Object> loader_exports_obj =
329-
loader_exports.ToLocalChecked().As<Object>();
310+
CHECK(loader_exports->IsObject());
311+
Local<Object> loader_exports_obj = loader_exports.As<Object>();
330312
Local<Value> internal_binding_loader =
331-
loader_exports_obj->Get(context, env->internal_binding_string())
313+
loader_exports_obj->Get(context(), internal_binding_string())
332314
.ToLocalChecked();
333-
env->set_internal_binding_loader(internal_binding_loader.As<Function>());
334-
315+
CHECK(internal_binding_loader->IsFunction());
316+
set_internal_binding_loader(internal_binding_loader.As<Function>());
335317
Local<Value> require =
336-
loader_exports_obj->Get(context, env->require_string()).ToLocalChecked();
337-
env->set_native_module_require(require.As<Function>());
318+
loader_exports_obj->Get(context(), require_string()).ToLocalChecked();
319+
CHECK(require->IsFunction());
320+
set_native_module_require(require.As<Function>());
321+
322+
return scope.Escape(loader_exports);
323+
}
324+
325+
MaybeLocal<Value> Environment::BootstrapNode() {
326+
EscapableHandleScope scope(isolate_);
327+
328+
Local<Object> global = context()->Global();
329+
// TODO(joyeecheung): this can be done in JS land now.
330+
global->Set(context(), FIXED_ONE_BYTE_STRING(isolate_, "global"), global)
331+
.Check();
338332

339333
// process, require, internalBinding, isMainThread,
340334
// ownsProcessState, primordials
341335
std::vector<Local<String>> node_params = {
342-
env->process_string(),
343-
env->require_string(),
344-
env->internal_binding_string(),
345-
FIXED_ONE_BYTE_STRING(isolate, "isMainThread"),
346-
FIXED_ONE_BYTE_STRING(isolate, "ownsProcessState"),
347-
env->primordials_string()};
336+
process_string(),
337+
require_string(),
338+
internal_binding_string(),
339+
FIXED_ONE_BYTE_STRING(isolate_, "isMainThread"),
340+
FIXED_ONE_BYTE_STRING(isolate_, "ownsProcessState"),
341+
primordials_string()};
348342
std::vector<Local<Value>> node_args = {
349-
process,
350-
require,
351-
internal_binding_loader,
352-
Boolean::New(isolate, env->is_main_thread()),
353-
Boolean::New(isolate, env->owns_process_state()),
354-
env->primordials()};
343+
process_object(),
344+
native_module_require(),
345+
internal_binding_loader(),
346+
Boolean::New(isolate_, is_main_thread()),
347+
Boolean::New(isolate_, owns_process_state()),
348+
primordials()};
355349

356350
MaybeLocal<Value> result = ExecuteBootstrapper(
357-
env, "internal/bootstrap/node", &node_params, &node_args);
351+
this, "internal/bootstrap/node", &node_params, &node_args);
358352

359353
Local<Object> env_var_proxy;
360-
if (!CreateEnvVarProxy(context, isolate, env->as_callback_data())
354+
if (!CreateEnvVarProxy(context(), isolate_, as_callback_data())
361355
.ToLocal(&env_var_proxy) ||
362-
process
363-
->Set(env->context(),
364-
FIXED_ONE_BYTE_STRING(env->isolate(), "env"),
365-
env_var_proxy)
366-
.IsNothing())
356+
process_object()
357+
->Set(
358+
context(), FIXED_ONE_BYTE_STRING(isolate_, "env"), env_var_proxy)
359+
.IsNothing()) {
360+
return MaybeLocal<Value>();
361+
}
362+
363+
return scope.EscapeMaybe(result);
364+
}
365+
366+
MaybeLocal<Value> Environment::RunBootstrapping() {
367+
EscapableHandleScope scope(isolate_);
368+
369+
CHECK(!has_run_bootstrapping_code());
370+
371+
if (BootstrapInternalLoaders().IsEmpty()) {
372+
return MaybeLocal<Value>();
373+
}
374+
375+
Local<Value> result;
376+
if (!BootstrapNode().ToLocal(&result)) {
367377
return MaybeLocal<Value>();
378+
}
368379

369380
// Make sure that no request or handle is created during bootstrap -
370381
// if necessary those should be done in pre-execution.
371382
// TODO(joyeecheung): print handles/requests before aborting
372-
CHECK(env->req_wrap_queue()->IsEmpty());
373-
CHECK(env->handle_wrap_queue()->IsEmpty());
383+
CHECK(req_wrap_queue()->IsEmpty());
384+
CHECK(handle_wrap_queue()->IsEmpty());
374385

375-
env->set_has_run_bootstrapping_code(true);
386+
set_has_run_bootstrapping_code(true);
376387

377-
return scope.EscapeMaybe(result);
388+
return scope.Escape(result);
378389
}
379390

380391
void MarkBootstrapComplete(const FunctionCallbackInfo<Value>& args) {

src/node_internals.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,6 @@ void DefineZlibConstants(v8::Local<v8::Object> target);
296296
v8::Isolate* NewIsolate(v8::Isolate::CreateParams* params,
297297
uv_loop_t* event_loop,
298298
MultiIsolatePlatform* platform);
299-
v8::MaybeLocal<v8::Value> RunBootstrapping(Environment* env);
300299
v8::MaybeLocal<v8::Value> StartExecution(Environment* env,
301300
const char* main_script_id);
302301
v8::MaybeLocal<v8::Object> GetPerContextExports(v8::Local<v8::Context> context);

src/node_main_instance.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ std::unique_ptr<Environment> NodeMainInstance::CreateMainEnvironment(
205205
}
206206

207207
env->InitializeDiagnostics();
208-
if (RunBootstrapping(env.get()).IsEmpty()) {
208+
if (env->RunBootstrapping().IsEmpty()) {
209209
*exit_code = 1;
210210
}
211211

src/node_worker.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ void Worker::Run() {
271271
HandleScope handle_scope(isolate_);
272272
AsyncCallbackScope callback_scope(env_.get());
273273
env_->async_hooks()->push_async_ids(1, 0);
274-
if (!RunBootstrapping(env_.get()).IsEmpty()) {
274+
if (!env_->RunBootstrapping().IsEmpty()) {
275275
CreateEnvMessagePort(env_.get());
276276
if (is_stopped()) return;
277277
Debug(this, "Created message port for worker %llu", thread_id_);

0 commit comments

Comments
 (0)