@@ -36,8 +36,7 @@ NodeMainInstance::NodeMainInstance(Isolate* isolate,
3636 isolate_(isolate),
3737 platform_(platform),
3838 isolate_data_(nullptr ),
39- owns_isolate_(false ),
40- deserialize_mode_(false ) {
39+ snapshot_data_(nullptr ) {
4140 isolate_data_ =
4241 std::make_unique<IsolateData>(isolate_, event_loop, platform, nullptr );
4342
@@ -61,77 +60,81 @@ std::unique_ptr<NodeMainInstance> NodeMainInstance::Create(
6160 new NodeMainInstance (isolate, event_loop, platform, args, exec_args));
6261}
6362
64- NodeMainInstance::NodeMainInstance (
65- Isolate::CreateParams* params,
66- uv_loop_t * event_loop,
67- MultiIsolatePlatform* platform,
68- const std::vector<std::string>& args,
69- const std::vector<std::string>& exec_args,
70- const std::vector<size_t >* per_isolate_data_indexes)
63+ NodeMainInstance::NodeMainInstance (const SnapshotData* snapshot_data,
64+ uv_loop_t * event_loop,
65+ MultiIsolatePlatform* platform,
66+ const std::vector<std::string>& args,
67+ const std::vector<std::string>& exec_args)
7168 : args_(args),
7269 exec_args_(exec_args),
7370 array_buffer_allocator_(ArrayBufferAllocator::Create()),
7471 isolate_(nullptr ),
7572 platform_(platform),
76- isolate_data_(nullptr ),
77- owns_isolate_( true ) {
78- params-> array_buffer_allocator = array_buffer_allocator_. get ();
79- deserialize_mode_ = per_isolate_data_indexes != nullptr ;
80- if (deserialize_mode_ ) {
73+ isolate_data_(),
74+ isolate_params_(std::make_unique<Isolate::CreateParams>()),
75+ snapshot_data_(snapshot_data) {
76+ isolate_params_-> array_buffer_allocator = array_buffer_allocator_. get () ;
77+ if (snapshot_data != nullptr ) {
8178 // TODO(joyeecheung): collect external references and set it in
8279 // params.external_references.
8380 const std::vector<intptr_t >& external_references =
8481 CollectExternalReferences ();
85- params->external_references = external_references.data ();
82+ isolate_params_->external_references = external_references.data ();
83+ isolate_params_->snapshot_blob =
84+ const_cast <v8::StartupData*>(&(snapshot_data->blob ));
8685 }
8786
8887 isolate_ = Isolate::Allocate ();
8988 CHECK_NOT_NULL (isolate_);
9089 // Register the isolate on the platform before the isolate gets initialized,
9190 // so that the isolate can access the platform during initialization.
9291 platform->RegisterIsolate (isolate_, event_loop);
93- SetIsolateCreateParamsForNode (params );
94- Isolate::Initialize (isolate_, *params );
92+ SetIsolateCreateParamsForNode (isolate_params_. get () );
93+ Isolate::Initialize (isolate_, *isolate_params_ );
9594
9695 // If the indexes are not nullptr, we are not deserializing
97- CHECK_IMPLIES (deserialize_mode_, params->external_references != nullptr );
98- isolate_data_ = std::make_unique<IsolateData>(isolate_,
99- event_loop,
100- platform,
101- array_buffer_allocator_.get (),
102- per_isolate_data_indexes);
96+ isolate_data_ = std::make_unique<IsolateData>(
97+ isolate_,
98+ event_loop,
99+ platform,
100+ array_buffer_allocator_.get (),
101+ snapshot_data == nullptr ? nullptr
102+ : &(snapshot_data->isolate_data_indices ));
103103 IsolateSettings s;
104104 SetIsolateMiscHandlers (isolate_, s);
105- if (!deserialize_mode_ ) {
105+ if (snapshot_data == nullptr ) {
106106 // If in deserialize mode, delay until after the deserialization is
107107 // complete.
108108 SetIsolateErrorHandlers (isolate_, s);
109109 }
110110 isolate_data_->max_young_gen_size =
111- params ->constraints .max_young_generation_size_in_bytes ();
111+ isolate_params_ ->constraints .max_young_generation_size_in_bytes ();
112112}
113113
114114void NodeMainInstance::Dispose () {
115- CHECK (!owns_isolate_);
115+ // This should only be called on a main instance that does not own its
116+ // isolate.
117+ CHECK_NULL (isolate_params_);
116118 platform_->DrainTasks (isolate_);
117119}
118120
119121NodeMainInstance::~NodeMainInstance () {
120- if (!owns_isolate_ ) {
122+ if (isolate_params_ == nullptr ) {
121123 return ;
122124 }
125+ // This should only be done on a main instance that owns its isolate.
123126 platform_->UnregisterIsolate (isolate_);
124127 isolate_->Dispose ();
125128}
126129
127- int NodeMainInstance::Run (const EnvSerializeInfo* env_info ) {
130+ int NodeMainInstance::Run () {
128131 Locker locker (isolate_);
129132 Isolate::Scope isolate_scope (isolate_);
130133 HandleScope handle_scope (isolate_);
131134
132135 int exit_code = 0 ;
133136 DeleteFnPtr<Environment, FreeEnvironment> env =
134- CreateMainEnvironment (&exit_code, env_info );
137+ CreateMainEnvironment (&exit_code);
135138 CHECK_NOT_NULL (env);
136139
137140 Context::Scope context_scope (env->context ());
@@ -167,8 +170,7 @@ void NodeMainInstance::Run(int* exit_code, Environment* env) {
167170}
168171
169172DeleteFnPtr<Environment, FreeEnvironment>
170- NodeMainInstance::CreateMainEnvironment (int * exit_code,
171- const EnvSerializeInfo* env_info) {
173+ NodeMainInstance::CreateMainEnvironment (int * exit_code) {
172174 *exit_code = 0 ; // Reset the exit code to 0
173175
174176 HandleScope handle_scope (isolate_);
@@ -179,16 +181,15 @@ NodeMainInstance::CreateMainEnvironment(int* exit_code,
179181 isolate_->GetHeapProfiler ()->StartTrackingHeapObjects (true );
180182 }
181183
182- CHECK_IMPLIES (deserialize_mode_, env_info != nullptr );
183184 Local<Context> context;
184185 DeleteFnPtr<Environment, FreeEnvironment> env;
185186
186- if (deserialize_mode_ ) {
187+ if (snapshot_data_ != nullptr ) {
187188 env.reset (new Environment (isolate_data_.get (),
188189 isolate_,
189190 args_,
190191 exec_args_,
191- env_info,
192+ &(snapshot_data_-> env_info ) ,
192193 EnvironmentFlags::kDefaultFlags ,
193194 {}));
194195 context = Context::FromSnapshot (isolate_,
@@ -200,7 +201,7 @@ NodeMainInstance::CreateMainEnvironment(int* exit_code,
200201 Context::Scope context_scope (context);
201202 CHECK (InitializeContextRuntime (context).IsJust ());
202203 SetIsolateErrorHandlers (isolate_, {});
203- env->InitializeMainContext (context, env_info);
204+ env->InitializeMainContext (context, &(snapshot_data_-> env_info ) );
204205#if HAVE_INSPECTOR
205206 env->InitializeInspector ({});
206207#endif
0 commit comments