9
9
#include " node_platform.h"
10
10
#include " node_realm-inl.h"
11
11
#include " node_shadow_realm.h"
12
+ #include " node_snapshot_builder.h"
12
13
#include " node_v8_platform-inl.h"
13
14
#include " node_wasm_web_api.h"
14
15
#include " uv.h"
@@ -315,9 +316,15 @@ void SetIsolateUpForNode(v8::Isolate* isolate) {
315
316
Isolate* NewIsolate (Isolate::CreateParams* params,
316
317
uv_loop_t * event_loop,
317
318
MultiIsolatePlatform* platform,
318
- bool has_snapshot_data) {
319
+ const SnapshotData* snapshot_data,
320
+ const IsolateSettings& settings) {
319
321
Isolate* isolate = Isolate::Allocate ();
320
322
if (isolate == nullptr ) return nullptr ;
323
+
324
+ if (snapshot_data != nullptr ) {
325
+ SnapshotBuilder::InitializeIsolateParams (snapshot_data, params);
326
+ }
327
+
321
328
#ifdef NODE_V8_SHARED_RO_HEAP
322
329
{
323
330
// In shared-readonly-heap mode, V8 requires all snapshots used for
@@ -336,38 +343,73 @@ Isolate* NewIsolate(Isolate::CreateParams* params,
336
343
337
344
SetIsolateCreateParamsForNode (params);
338
345
Isolate::Initialize (isolate, *params);
339
- if (!has_snapshot_data ) {
346
+ if (snapshot_data == nullptr ) {
340
347
// If in deserialize mode, delay until after the deserialization is
341
348
// complete.
342
- SetIsolateUpForNode (isolate);
349
+ SetIsolateUpForNode (isolate, settings );
343
350
} else {
344
- SetIsolateMiscHandlers (isolate, {} );
351
+ SetIsolateMiscHandlers (isolate, settings );
345
352
}
346
353
347
354
return isolate;
348
355
}
349
356
350
357
Isolate* NewIsolate (ArrayBufferAllocator* allocator,
351
358
uv_loop_t * event_loop,
352
- MultiIsolatePlatform* platform) {
359
+ MultiIsolatePlatform* platform,
360
+ const EmbedderSnapshotData* snapshot_data,
361
+ const IsolateSettings& settings) {
353
362
Isolate::CreateParams params;
354
363
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);
356
369
}
357
370
358
371
Isolate* NewIsolate (std::shared_ptr<ArrayBufferAllocator> allocator,
359
372
uv_loop_t * event_loop,
360
- MultiIsolatePlatform* platform) {
373
+ MultiIsolatePlatform* platform,
374
+ const EmbedderSnapshotData* snapshot_data,
375
+ const IsolateSettings& settings) {
361
376
Isolate::CreateParams params;
362
377
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);
364
406
}
365
407
366
408
IsolateData* CreateIsolateData (Isolate* isolate,
367
409
uv_loop_t * loop,
368
410
MultiIsolatePlatform* platform,
369
411
ArrayBufferAllocator* allocator) {
370
- return new IsolateData (isolate, loop, platform, allocator);
412
+ return CreateIsolateData (isolate, loop, platform, allocator, nullptr );
371
413
}
372
414
373
415
void FreeIsolateData (IsolateData* isolate_data) {
@@ -395,13 +437,45 @@ Environment* CreateEnvironment(
395
437
EnvironmentFlags::Flags flags,
396
438
ThreadId thread_id,
397
439
std::unique_ptr<InspectorParentHandle> inspector_parent_handle) {
398
- Isolate* isolate = context-> GetIsolate ();
440
+ Isolate* isolate = isolate_data-> isolate ();
399
441
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
+
401
450
// TODO(addaleax): This is a much better place for parsing per-Environment
402
451
// 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);
405
479
406
480
#if HAVE_INSPECTOR
407
481
if (env->should_create_inspector ()) {
@@ -415,7 +489,7 @@ Environment* CreateEnvironment(
415
489
}
416
490
#endif
417
491
418
- if (env->principal_realm ()->RunBootstrapping ().IsEmpty ()) {
492
+ if (!use_snapshot && env->principal_realm ()->RunBootstrapping ().IsEmpty ()) {
419
493
FreeEnvironment (env);
420
494
return nullptr ;
421
495
}
@@ -500,6 +574,10 @@ ArrayBufferAllocator* GetArrayBufferAllocator(IsolateData* isolate_data) {
500
574
return isolate_data->node_allocator ();
501
575
}
502
576
577
+ Local<Context> GetMainContext (Environment* env) {
578
+ return env->context ();
579
+ }
580
+
503
581
MultiIsolatePlatform* GetMultiIsolatePlatform (Environment* env) {
504
582
return GetMultiIsolatePlatform (env->isolate_data ());
505
583
}
0 commit comments