@@ -39,8 +39,7 @@ NodeMainInstance::NodeMainInstance(Isolate* isolate,
3939 isolate_(isolate),
4040 platform_(platform),
4141 isolate_data_(nullptr ),
42- owns_isolate_(false ),
43- deserialize_mode_(false ) {
42+ snapshot_data_(nullptr ) {
4443 isolate_data_ =
4544 std::make_unique<IsolateData>(isolate_, event_loop, platform, nullptr );
4645
@@ -64,77 +63,81 @@ std::unique_ptr<NodeMainInstance> NodeMainInstance::Create(
6463 new NodeMainInstance (isolate, event_loop, platform, args, exec_args));
6564}
6665
67- NodeMainInstance::NodeMainInstance (
68- Isolate::CreateParams* params,
69- uv_loop_t * event_loop,
70- MultiIsolatePlatform* platform,
71- const std::vector<std::string>& args,
72- const std::vector<std::string>& exec_args,
73- const std::vector<size_t >* per_isolate_data_indexes)
66+ NodeMainInstance::NodeMainInstance (const SnapshotData* snapshot_data,
67+ uv_loop_t * event_loop,
68+ MultiIsolatePlatform* platform,
69+ const std::vector<std::string>& args,
70+ const std::vector<std::string>& exec_args)
7471 : args_(args),
7572 exec_args_(exec_args),
7673 array_buffer_allocator_(ArrayBufferAllocator::Create()),
7774 isolate_(nullptr ),
7875 platform_(platform),
79- isolate_data_(nullptr ),
80- owns_isolate_( true ) {
81- params-> array_buffer_allocator = array_buffer_allocator_. get ();
82- deserialize_mode_ = per_isolate_data_indexes != nullptr ;
83- if (deserialize_mode_ ) {
76+ isolate_data_(),
77+ isolate_params_(std::make_unique<Isolate::CreateParams>()),
78+ snapshot_data_(snapshot_data) {
79+ isolate_params_-> array_buffer_allocator = array_buffer_allocator_. get () ;
80+ if (snapshot_data != nullptr ) {
8481 // TODO(joyeecheung): collect external references and set it in
8582 // params.external_references.
8683 const std::vector<intptr_t >& external_references =
8784 CollectExternalReferences ();
88- params->external_references = external_references.data ();
85+ isolate_params_->external_references = external_references.data ();
86+ isolate_params_->snapshot_blob =
87+ const_cast <v8::StartupData*>(&(snapshot_data->blob ));
8988 }
9089
9190 isolate_ = Isolate::Allocate ();
9291 CHECK_NOT_NULL (isolate_);
9392 // Register the isolate on the platform before the isolate gets initialized,
9493 // so that the isolate can access the platform during initialization.
9594 platform->RegisterIsolate (isolate_, event_loop);
96- SetIsolateCreateParamsForNode (params );
97- Isolate::Initialize (isolate_, *params );
95+ SetIsolateCreateParamsForNode (isolate_params_. get () );
96+ Isolate::Initialize (isolate_, *isolate_params_ );
9897
9998 // If the indexes are not nullptr, we are not deserializing
100- CHECK_IMPLIES (deserialize_mode_, params->external_references != nullptr );
101- isolate_data_ = std::make_unique<IsolateData>(isolate_,
102- event_loop,
103- platform,
104- array_buffer_allocator_.get (),
105- per_isolate_data_indexes);
99+ isolate_data_ = std::make_unique<IsolateData>(
100+ isolate_,
101+ event_loop,
102+ platform,
103+ array_buffer_allocator_.get (),
104+ snapshot_data == nullptr ? nullptr
105+ : &(snapshot_data->isolate_data_indices ));
106106 IsolateSettings s;
107107 SetIsolateMiscHandlers (isolate_, s);
108- if (!deserialize_mode_ ) {
108+ if (snapshot_data == nullptr ) {
109109 // If in deserialize mode, delay until after the deserialization is
110110 // complete.
111111 SetIsolateErrorHandlers (isolate_, s);
112112 }
113113 isolate_data_->max_young_gen_size =
114- params ->constraints .max_young_generation_size_in_bytes ();
114+ isolate_params_ ->constraints .max_young_generation_size_in_bytes ();
115115}
116116
117117void NodeMainInstance::Dispose () {
118- CHECK (!owns_isolate_);
118+ // This should only be called on a main instance that does not own its
119+ // isolate.
120+ CHECK_NULL (isolate_params_);
119121 platform_->DrainTasks (isolate_);
120122}
121123
122124NodeMainInstance::~NodeMainInstance () {
123- if (!owns_isolate_ ) {
125+ if (isolate_params_ == nullptr ) {
124126 return ;
125127 }
128+ // This should only be done on a main instance that owns its isolate.
126129 platform_->UnregisterIsolate (isolate_);
127130 isolate_->Dispose ();
128131}
129132
130- int NodeMainInstance::Run (const EnvSerializeInfo* env_info ) {
133+ int NodeMainInstance::Run () {
131134 Locker locker (isolate_);
132135 Isolate::Scope isolate_scope (isolate_);
133136 HandleScope handle_scope (isolate_);
134137
135138 int exit_code = 0 ;
136139 DeleteFnPtr<Environment, FreeEnvironment> env =
137- CreateMainEnvironment (&exit_code, env_info );
140+ CreateMainEnvironment (&exit_code);
138141 CHECK_NOT_NULL (env);
139142
140143 Context::Scope context_scope (env->context ());
@@ -170,8 +173,7 @@ void NodeMainInstance::Run(int* exit_code, Environment* env) {
170173}
171174
172175DeleteFnPtr<Environment, FreeEnvironment>
173- NodeMainInstance::CreateMainEnvironment (int * exit_code,
174- const EnvSerializeInfo* env_info) {
176+ NodeMainInstance::CreateMainEnvironment (int * exit_code) {
175177 *exit_code = 0 ; // Reset the exit code to 0
176178
177179 HandleScope handle_scope (isolate_);
@@ -182,16 +184,15 @@ NodeMainInstance::CreateMainEnvironment(int* exit_code,
182184 isolate_->GetHeapProfiler ()->StartTrackingHeapObjects (true );
183185 }
184186
185- CHECK_IMPLIES (deserialize_mode_, env_info != nullptr );
186187 Local<Context> context;
187188 DeleteFnPtr<Environment, FreeEnvironment> env;
188189
189- if (deserialize_mode_ ) {
190+ if (snapshot_data_ != nullptr ) {
190191 env.reset (new Environment (isolate_data_.get (),
191192 isolate_,
192193 args_,
193194 exec_args_,
194- env_info,
195+ &(snapshot_data_-> env_info ) ,
195196 EnvironmentFlags::kDefaultFlags ,
196197 {}));
197198 context = Context::FromSnapshot (isolate_,
@@ -203,7 +204,7 @@ NodeMainInstance::CreateMainEnvironment(int* exit_code,
203204 Context::Scope context_scope (context);
204205 CHECK (InitializeContextRuntime (context).IsJust ());
205206 SetIsolateErrorHandlers (isolate_, {});
206- env->InitializeMainContext (context, env_info);
207+ env->InitializeMainContext (context, &(snapshot_data_-> env_info ) );
207208#if HAVE_INSPECTOR
208209 env->InitializeInspector ({});
209210#endif
0 commit comments