@@ -73,6 +73,29 @@ Dart_IsolateFlags DartIsolate::Flags::Get() const {
7373 return flags_;
7474}
7575
76+ std::weak_ptr<DartIsolate> DartIsolate::SpawnIsolate (
77+ const Settings& settings,
78+ std::unique_ptr<PlatformConfiguration> platform_configuration,
79+ fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
80+ fml::WeakPtr<HintFreedDelegate> hint_freed_delegate,
81+ std::string advisory_script_uri,
82+ std::string advisory_script_entrypoint,
83+ Flags flags,
84+ const fml::closure& isolate_create_callback,
85+ const fml::closure& isolate_shutdown_callback,
86+ std::optional<std::string> dart_entrypoint,
87+ std::optional<std::string> dart_entrypoint_library,
88+ std::unique_ptr<IsolateConfiguration> isolate_configration) const {
89+ return CreateRunningRootIsolate (
90+ settings, GetIsolateGroupData ().GetIsolateSnapshot (), GetTaskRunners (),
91+ std::move (platform_configuration), snapshot_delegate, hint_freed_delegate,
92+ GetIOManager (), GetSkiaUnrefQueue (), GetImageDecoder (),
93+ advisory_script_uri, advisory_script_entrypoint, flags,
94+ isolate_create_callback, isolate_shutdown_callback, dart_entrypoint,
95+ dart_entrypoint_library, std::move (isolate_configration),
96+ GetVolatilePathTracker (), this );
97+ }
98+
7699std::weak_ptr<DartIsolate> DartIsolate::CreateRunningRootIsolate (
77100 const Settings& settings,
78101 fml::RefPtr<const DartSnapshot> isolate_snapshot,
@@ -91,7 +114,8 @@ std::weak_ptr<DartIsolate> DartIsolate::CreateRunningRootIsolate(
91114 std::optional<std::string> dart_entrypoint,
92115 std::optional<std::string> dart_entrypoint_library,
93116 std::unique_ptr<IsolateConfiguration> isolate_configration,
94- std::shared_ptr<VolatilePathTracker> volatile_path_tracker) {
117+ std::shared_ptr<VolatilePathTracker> volatile_path_tracker,
118+ const DartIsolate* spawning_isolate) {
95119 if (!isolate_snapshot) {
96120 FML_LOG (ERROR) << " Invalid isolate snapshot." ;
97121 return {};
@@ -135,7 +159,8 @@ std::weak_ptr<DartIsolate> DartIsolate::CreateRunningRootIsolate(
135159 });
136160
137161 if (isolate->GetPhase () != DartIsolate::Phase::LibrariesSetup) {
138- FML_LOG (ERROR) << " Root isolate was created in an incorrect phase." ;
162+ FML_LOG (ERROR) << " Root isolate was created in an incorrect phase: "
163+ << static_cast <int >(isolate->GetPhase ());
139164 return {};
140165 }
141166
@@ -190,7 +215,8 @@ std::weak_ptr<DartIsolate> DartIsolate::CreateRootIsolate(
190215 Flags flags,
191216 const fml::closure& isolate_create_callback,
192217 const fml::closure& isolate_shutdown_callback,
193- std::shared_ptr<VolatilePathTracker> volatile_path_tracker) {
218+ std::shared_ptr<VolatilePathTracker> volatile_path_tracker,
219+ const DartIsolate* spawning_isolate) {
194220 TRACE_EVENT0 (" flutter" , " DartIsolate::CreateRootIsolate" );
195221
196222 // The child isolate preparer is null but will be set when the isolate is
@@ -223,13 +249,28 @@ std::weak_ptr<DartIsolate> DartIsolate::CreateRootIsolate(
223249 )));
224250
225251 DartErrorString error;
252+ Dart_Isolate vm_isolate = nullptr ;
226253 auto isolate_flags = flags.Get ();
227- Dart_Isolate vm_isolate = CreateDartIsolateGroup (
254+ // / TODO(b/72025) This will be where we call Dart_CreateIsolateInGroup if
255+ // / spawning_isolate != nullptr.
256+ vm_isolate = CreateDartIsolateGroup (
228257 std::move (isolate_group_data), std::move (isolate_data), &isolate_flags,
229- error.error ());
258+ error.error (),
259+ [](std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
260+ std::shared_ptr<DartIsolate>* isolate_data, Dart_IsolateFlags* flags,
261+ char ** error) {
262+ return Dart_CreateIsolateGroup (
263+ (*isolate_group_data)->GetAdvisoryScriptURI ().c_str (),
264+ (*isolate_group_data)->GetAdvisoryScriptEntrypoint ().c_str (),
265+ (*isolate_group_data)->GetIsolateSnapshot ()->GetDataMapping (),
266+ (*isolate_group_data)
267+ ->GetIsolateSnapshot ()
268+ ->GetInstructionsMapping (),
269+ flags, isolate_group_data, isolate_data, error);
270+ });
230271
231272 if (error) {
232- FML_LOG (ERROR) << " CreateDartIsolateGroup failed: " << error.str ();
273+ FML_LOG (ERROR) << " CreateRootIsolate failed: " << error.str ();
233274 }
234275
235276 if (vm_isolate == nullptr ) {
@@ -809,6 +850,11 @@ DartIsolateGroupData& DartIsolate::GetIsolateGroupData() {
809850 return **isolate_group_data;
810851}
811852
853+ const DartIsolateGroupData& DartIsolate::GetIsolateGroupData () const {
854+ DartIsolate* non_const_this = const_cast <DartIsolate*>(this );
855+ return non_const_this->GetIsolateGroupData ();
856+ }
857+
812858// |Dart_IsolateGroupCreateCallback|
813859Dart_Isolate DartIsolate::DartIsolateGroupCreateCallback (
814860 const char * advisory_script_uri,
@@ -871,7 +917,19 @@ Dart_Isolate DartIsolate::DartIsolateGroupCreateCallback(
871917 nullptr ))); // volatile path tracker
872918
873919 Dart_Isolate vm_isolate = CreateDartIsolateGroup (
874- std::move (isolate_group_data), std::move (isolate_data), flags, error);
920+ std::move (isolate_group_data), std::move (isolate_data), flags, error,
921+ [](std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
922+ std::shared_ptr<DartIsolate>* isolate_data, Dart_IsolateFlags* flags,
923+ char ** error) {
924+ return Dart_CreateIsolateGroup (
925+ (*isolate_group_data)->GetAdvisoryScriptURI ().c_str (),
926+ (*isolate_group_data)->GetAdvisoryScriptEntrypoint ().c_str (),
927+ (*isolate_group_data)->GetIsolateSnapshot ()->GetDataMapping (),
928+ (*isolate_group_data)
929+ ->GetIsolateSnapshot ()
930+ ->GetInstructionsMapping (),
931+ flags, isolate_group_data, isolate_data, error);
932+ });
875933
876934 if (*error) {
877935 FML_LOG (ERROR) << " CreateDartIsolateGroup failed: " << error;
@@ -933,16 +991,16 @@ Dart_Isolate DartIsolate::CreateDartIsolateGroup(
933991 std::unique_ptr<std::shared_ptr<DartIsolateGroupData>> isolate_group_data,
934992 std::unique_ptr<std::shared_ptr<DartIsolate>> isolate_data,
935993 Dart_IsolateFlags* flags,
936- char ** error) {
994+ char ** error,
995+ std::function<Dart_Isolate(std::shared_ptr<DartIsolateGroupData>*,
996+ std::shared_ptr<DartIsolate>*,
997+ Dart_IsolateFlags*,
998+ char **)> make_isolate) {
937999 TRACE_EVENT0 (" flutter" , " DartIsolate::CreateDartIsolateGroup" );
9381000
9391001 // Create the Dart VM isolate and give it the embedder object as the baton.
940- Dart_Isolate isolate = Dart_CreateIsolateGroup (
941- (*isolate_group_data)->GetAdvisoryScriptURI ().c_str (),
942- (*isolate_group_data)->GetAdvisoryScriptEntrypoint ().c_str (),
943- (*isolate_group_data)->GetIsolateSnapshot ()->GetDataMapping (),
944- (*isolate_group_data)->GetIsolateSnapshot ()->GetInstructionsMapping (),
945- flags, isolate_group_data.get (), isolate_data.get (), error);
1002+ Dart_Isolate isolate =
1003+ make_isolate (isolate_group_data.get (), isolate_data.get (), flags, error);
9461004
9471005 if (isolate == nullptr ) {
9481006 return nullptr ;
0 commit comments