99#include " node_platform.h"
1010#include " node_realm-inl.h"
1111#include " node_shadow_realm.h"
12+ #include " node_snapshot_builder.h"
1213#include " node_v8_platform-inl.h"
1314#include " node_wasm_web_api.h"
1415#include " uv.h"
@@ -315,9 +316,15 @@ void SetIsolateUpForNode(v8::Isolate* isolate) {
315316Isolate* NewIsolate (Isolate::CreateParams* params,
316317 uv_loop_t * event_loop,
317318 MultiIsolatePlatform* platform,
318- bool has_snapshot_data) {
319+ const SnapshotData* snapshot_data,
320+ const IsolateSettings& settings) {
319321 Isolate* isolate = Isolate::Allocate ();
320322 if (isolate == nullptr ) return nullptr ;
323+
324+ if (snapshot_data != nullptr ) {
325+ SnapshotBuilder::InitializeIsolateParams (snapshot_data, params);
326+ }
327+
321328#ifdef NODE_V8_SHARED_RO_HEAP
322329 {
323330 // In shared-readonly-heap mode, V8 requires all snapshots used for
@@ -336,38 +343,73 @@ Isolate* NewIsolate(Isolate::CreateParams* params,
336343
337344 SetIsolateCreateParamsForNode (params);
338345 Isolate::Initialize (isolate, *params);
339- if (!has_snapshot_data ) {
346+ if (snapshot_data == nullptr ) {
340347 // If in deserialize mode, delay until after the deserialization is
341348 // complete.
342- SetIsolateUpForNode (isolate);
349+ SetIsolateUpForNode (isolate, settings );
343350 } else {
344- SetIsolateMiscHandlers (isolate, {} );
351+ SetIsolateMiscHandlers (isolate, settings );
345352 }
346353
347354 return isolate;
348355}
349356
350357Isolate* NewIsolate (ArrayBufferAllocator* allocator,
351358 uv_loop_t * event_loop,
352- MultiIsolatePlatform* platform) {
359+ MultiIsolatePlatform* platform,
360+ const EmbedderSnapshotData* snapshot_data,
361+ const IsolateSettings& settings) {
353362 Isolate::CreateParams params;
354363 if (allocator != nullptr ) params.array_buffer_allocator = allocator;
355- return NewIsolate (¶ms, event_loop, platform);
364+ return NewIsolate (¶ms,
365+ event_loop,
366+ platform,
367+ SnapshotData::FromEmbedderWrapper (snapshot_data),
368+ settings);
356369}
357370
358371Isolate* NewIsolate (std::shared_ptr<ArrayBufferAllocator> allocator,
359372 uv_loop_t * event_loop,
360- MultiIsolatePlatform* platform) {
373+ MultiIsolatePlatform* platform,
374+ const EmbedderSnapshotData* snapshot_data,
375+ const IsolateSettings& settings) {
361376 Isolate::CreateParams params;
362377 if (allocator) params.array_buffer_allocator_shared = allocator;
363- return NewIsolate (¶ms, event_loop, platform);
378+ return NewIsolate (¶ms,
379+ event_loop,
380+ platform,
381+ SnapshotData::FromEmbedderWrapper (snapshot_data),
382+ settings);
383+ }
384+
385+ Isolate* NewIsolate (ArrayBufferAllocator* allocator,
386+ uv_loop_t * event_loop,
387+ MultiIsolatePlatform* platform) {
388+ return NewIsolate (allocator, event_loop, platform, nullptr );
389+ }
390+
391+ Isolate* NewIsolate (std::shared_ptr<ArrayBufferAllocator> allocator,
392+ uv_loop_t * event_loop,
393+ MultiIsolatePlatform* platform) {
394+ return NewIsolate (allocator, event_loop, platform, nullptr );
395+ }
396+
397+ IsolateData* CreateIsolateData (
398+ Isolate* isolate,
399+ uv_loop_t * loop,
400+ MultiIsolatePlatform* platform,
401+ ArrayBufferAllocator* allocator,
402+ const EmbedderSnapshotData* embedder_snapshot_data) {
403+ const SnapshotData* snapshot_data =
404+ SnapshotData::FromEmbedderWrapper (embedder_snapshot_data);
405+ return new IsolateData (isolate, loop, platform, allocator, snapshot_data);
364406}
365407
366408IsolateData* CreateIsolateData (Isolate* isolate,
367409 uv_loop_t * loop,
368410 MultiIsolatePlatform* platform,
369411 ArrayBufferAllocator* allocator) {
370- return new IsolateData (isolate, loop, platform, allocator);
412+ return CreateIsolateData (isolate, loop, platform, allocator, nullptr );
371413}
372414
373415void FreeIsolateData (IsolateData* isolate_data) {
@@ -395,13 +437,45 @@ Environment* CreateEnvironment(
395437 EnvironmentFlags::Flags flags,
396438 ThreadId thread_id,
397439 std::unique_ptr<InspectorParentHandle> inspector_parent_handle) {
398- Isolate* isolate = context-> GetIsolate ();
440+ Isolate* isolate = isolate_data-> isolate ();
399441 HandleScope handle_scope (isolate);
400- Context::Scope context_scope (context);
442+
443+ const bool use_snapshot = context.IsEmpty ();
444+ const EnvSerializeInfo* env_snapshot_info = nullptr ;
445+ if (use_snapshot) {
446+ CHECK_NOT_NULL (isolate_data->snapshot_data ());
447+ env_snapshot_info = &isolate_data->snapshot_data ()->env_info ;
448+ }
449+
401450 // TODO(addaleax): This is a much better place for parsing per-Environment
402451 // options than the global parse call.
403- Environment* env = new Environment (
404- isolate_data, context, args, exec_args, nullptr , flags, thread_id);
452+ Environment* env = new Environment (isolate_data,
453+ isolate,
454+ args,
455+ exec_args,
456+ env_snapshot_info,
457+ flags,
458+ thread_id);
459+ CHECK_NOT_NULL (env);
460+
461+ if (use_snapshot) {
462+ context = Context::FromSnapshot (isolate,
463+ SnapshotData::kNodeMainContextIndex ,
464+ {DeserializeNodeInternalFields, env})
465+ .ToLocalChecked ();
466+
467+ CHECK (!context.IsEmpty ());
468+ Context::Scope context_scope (context);
469+
470+ if (InitializeContextRuntime (context).IsNothing ()) {
471+ FreeEnvironment (env);
472+ return nullptr ;
473+ }
474+ SetIsolateErrorHandlers (isolate, {});
475+ }
476+
477+ Context::Scope context_scope (context);
478+ env->InitializeMainContext (context, env_snapshot_info);
405479
406480#if HAVE_INSPECTOR
407481 if (env->should_create_inspector ()) {
@@ -415,7 +489,7 @@ Environment* CreateEnvironment(
415489 }
416490#endif
417491
418- if (env->principal_realm ()->RunBootstrapping ().IsEmpty ()) {
492+ if (!use_snapshot && env->principal_realm ()->RunBootstrapping ().IsEmpty ()) {
419493 FreeEnvironment (env);
420494 return nullptr ;
421495 }
@@ -500,6 +574,10 @@ ArrayBufferAllocator* GetArrayBufferAllocator(IsolateData* isolate_data) {
500574 return isolate_data->node_allocator ();
501575}
502576
577+ Local<Context> GetMainContext (Environment* env) {
578+ return env->context ();
579+ }
580+
503581MultiIsolatePlatform* GetMultiIsolatePlatform (Environment* env) {
504582 return GetMultiIsolatePlatform (env->isolate_data ());
505583}
0 commit comments