@@ -129,7 +129,6 @@ using options_parser::kAllowedInEnvironment;
129129using options_parser::kDisallowedInEnvironment ;
130130
131131using v8::Boolean;
132- using v8::Context;
133132using v8::EscapableHandleScope;
134133using v8::Exception;
135134using 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
380391void MarkBootstrapComplete (const FunctionCallbackInfo<Value>& args) {
0 commit comments