[vm] Avoid repeating parameters from prematurely destructuring Dart_InitializeParams.

TEST=ci
Change-Id: I39288fc4d79c5933d5c8b274c0a66bdd25f6bf29
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/231529
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 58d16b6..994f542 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -373,20 +373,19 @@
   TesterState::argv = dart_argv;
   TesterState::argc = dart_argc;
 
-  error = Dart::Init(
-      dart::bin::vm_snapshot_data, dart::bin::vm_snapshot_instructions,
-      /*create_group=*/CreateIsolateAndSetup,
-      /*initialize_isolate=*/nullptr,
-      /*shutdown_isolate=*/nullptr,
-      /*cleanup_isolate=*/nullptr,
-      /*cleanup_group=*/CleanupIsolateGroup,
-      /*thread_start=*/nullptr,
-      /*thread_exit=*/nullptr, dart::bin::DartUtils::OpenFile,
-      dart::bin::DartUtils::ReadFile, dart::bin::DartUtils::WriteFile,
-      dart::bin::DartUtils::CloseFile, /*entropy_source=*/nullptr,
-      /*get_service_assets=*/nullptr, start_kernel_isolate,
-      /*code_observer=*/nullptr, /*post_task=*/nullptr,
-      /*post_task_data*/ nullptr);
+  Dart_InitializeParams init_params;
+  memset(&init_params, 0, sizeof(init_params));
+  init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
+  init_params.vm_snapshot_data = dart::bin::vm_snapshot_data;
+  init_params.vm_snapshot_instructions = dart::bin::vm_snapshot_instructions;
+  init_params.create_group = CreateIsolateAndSetup;
+  init_params.cleanup_group = CleanupIsolateGroup;
+  init_params.file_open = dart::bin::DartUtils::OpenFile;
+  init_params.file_read = dart::bin::DartUtils::ReadFile;
+  init_params.file_write = dart::bin::DartUtils::WriteFile;
+  init_params.file_close = dart::bin::DartUtils::CloseFile;
+  init_params.start_kernel_isolate = start_kernel_isolate;
+  error = Dart::Init(&init_params);
   if (error != nullptr) {
     Syslog::PrintErr("Failed to initialize VM: %s\n", error);
     free(error);
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index e4e2869..ad53435 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -246,25 +246,7 @@
 #endif  // !defined(IS_SIMARM_X64)
 }
 
-char* Dart::DartInit(const uint8_t* vm_isolate_snapshot,
-                     const uint8_t* instructions_snapshot,
-                     Dart_IsolateGroupCreateCallback create_group,
-                     Dart_InitializeIsolateCallback initialize_isolate,
-                     Dart_IsolateShutdownCallback shutdown,
-                     Dart_IsolateCleanupCallback cleanup,
-                     Dart_IsolateGroupCleanupCallback cleanup_group,
-                     Dart_ThreadStartCallback thread_start,
-                     Dart_ThreadExitCallback thread_exit,
-                     Dart_FileOpenCallback file_open,
-                     Dart_FileReadCallback file_read,
-                     Dart_FileWriteCallback file_write,
-                     Dart_FileCloseCallback file_close,
-                     Dart_EntropySource entropy_source,
-                     Dart_GetVMServiceAssetsArchive get_service_assets,
-                     bool start_kernel_isolate,
-                     Dart_CodeObserver* observer,
-                     Dart_PostTaskCallback post_task,
-                     void* post_task_data) {
+char* Dart::DartInit(const Dart_InitializeParams* params) {
   CheckOffsets();
 
   if (!Flags::Initialized()) {
@@ -275,8 +257,8 @@
   }
 
   const Snapshot* snapshot = nullptr;
-  if (vm_isolate_snapshot != nullptr) {
-    snapshot = Snapshot::SetupFromBuffer(vm_isolate_snapshot);
+  if (params->vm_snapshot_data != nullptr) {
+    snapshot = Snapshot::SetupFromBuffer(params->vm_snapshot_data);
     if (snapshot == nullptr) {
       return Utils::StrDup("Invalid vm isolate snapshot seen");
     }
@@ -296,16 +278,17 @@
 
   UntaggedFrame::Init();
 
-  set_thread_start_callback(thread_start);
-  set_thread_exit_callback(thread_exit);
-  SetFileCallbacks(file_open, file_read, file_write, file_close);
-  set_entropy_source_callback(entropy_source);
-  set_post_task_callback(post_task);
-  set_post_task_data(post_task_data);
+  set_thread_start_callback(params->thread_start);
+  set_thread_exit_callback(params->thread_exit);
+  SetFileCallbacks(params->file_open, params->file_read, params->file_write,
+                   params->file_close);
+  set_entropy_source_callback(params->entropy_source);
+  set_post_task_callback(params->post_task);
+  set_post_task_data(params->post_task_data);
   OS::Init();
   NOT_IN_PRODUCT(CodeObservers::Init());
-  if (observer != nullptr) {
-    NOT_IN_PRODUCT(CodeObservers::RegisterExternal(*observer));
+  if (params->code_observer != nullptr) {
+    NOT_IN_PRODUCT(CodeObservers::RegisterExternal(*params->code_observer));
   }
   start_time_micros_ = OS::GetCurrentMonotonicMicros();
   VirtualMemory::Init();
@@ -364,8 +347,8 @@
     // really an isolate itself - it acts more as a container for VM-global
     // objects.
     std::unique_ptr<IsolateGroupSource> source(new IsolateGroupSource(
-        kVmIsolateName, kVmIsolateName, vm_isolate_snapshot,
-        instructions_snapshot, nullptr, -1, api_flags));
+        kVmIsolateName, kVmIsolateName, params->vm_snapshot_data,
+        params->vm_snapshot_instructions, nullptr, -1, api_flags));
     // ObjectStore should be created later, after null objects are initialized.
     auto group = new IsolateGroup(std::move(source), /*embedder_data=*/nullptr,
                                   /*object_store=*/nullptr, api_flags);
@@ -392,7 +375,7 @@
     ArgumentsDescriptor::Init();
     ICData::Init();
     SubtypeTestCache::Init();
-    if (vm_isolate_snapshot != NULL) {
+    if (params->vm_snapshot_data != nullptr) {
 #if defined(SUPPORT_TIMELINE)
       TimelineBeginEndScope tbes(Timeline::GetVMStream(), "ReadVMSnapshot");
 #endif
@@ -405,7 +388,7 @@
           return Utils::StrDup("JIT runtime cannot run a precompiled snapshot");
 #endif
         }
-        if (instructions_snapshot == NULL) {
+        if (params->vm_snapshot_instructions == nullptr) {
           return Utils::StrDup("Missing instructions snapshot");
         }
       } else if (Snapshot::IsFull(vm_snapshot_kind_)) {
@@ -426,7 +409,7 @@
       } else {
         return Utils::StrDup("Invalid vm isolate snapshot seen");
       }
-      FullSnapshotReader reader(snapshot, instructions_snapshot, T);
+      FullSnapshotReader reader(snapshot, params->vm_snapshot_instructions, T);
       const Error& error = Error::Handle(reader.ReadVMSnapshot());
       if (!error.IsNull()) {
         // Must copy before leaving the zone.
@@ -496,15 +479,15 @@
   Api::InitHandles();
 
   Thread::ExitIsolate();  // Unregister the VM isolate from this thread.
-  Isolate::SetCreateGroupCallback(create_group);
-  Isolate::SetInitializeCallback_(initialize_isolate);
-  Isolate::SetShutdownCallback(shutdown);
-  Isolate::SetCleanupCallback(cleanup);
-  Isolate::SetGroupCleanupCallback(cleanup_group);
+  Isolate::SetCreateGroupCallback(params->create_group);
+  Isolate::SetInitializeCallback_(params->initialize_isolate);
+  Isolate::SetShutdownCallback(params->shutdown_isolate);
+  Isolate::SetCleanupCallback(params->cleanup_isolate);
+  Isolate::SetGroupCleanupCallback(params->cleanup_group);
 
 #ifndef PRODUCT
   const bool support_service = true;
-  Service::SetGetServiceAssetsCallback(get_service_assets);
+  Service::SetGetServiceAssetsCallback(params->get_service_assets);
 #else
   const bool support_service = false;
 #endif
@@ -518,7 +501,7 @@
   }
 
 #ifndef DART_PRECOMPILED_RUNTIME
-  if (start_kernel_isolate) {
+  if (params->start_kernel_isolate) {
     KernelIsolate::InitializeState();
   }
 #endif  // DART_PRECOMPILED_RUNTIME
@@ -526,37 +509,14 @@
   return NULL;
 }
 
-char* Dart::Init(const uint8_t* vm_isolate_snapshot,
-                 const uint8_t* instructions_snapshot,
-                 Dart_IsolateGroupCreateCallback create_group,
-                 Dart_InitializeIsolateCallback initialize_isolate,
-                 Dart_IsolateShutdownCallback shutdown,
-                 Dart_IsolateCleanupCallback cleanup,
-                 Dart_IsolateGroupCleanupCallback cleanup_group,
-                 Dart_ThreadStartCallback thread_start,
-                 Dart_ThreadExitCallback thread_exit,
-                 Dart_FileOpenCallback file_open,
-                 Dart_FileReadCallback file_read,
-                 Dart_FileWriteCallback file_write,
-                 Dart_FileCloseCallback file_close,
-                 Dart_EntropySource entropy_source,
-                 Dart_GetVMServiceAssetsArchive get_service_assets,
-                 bool start_kernel_isolate,
-                 Dart_CodeObserver* observer,
-                 Dart_PostTaskCallback post_task,
-                 void* post_task_data) {
+char* Dart::Init(const Dart_InitializeParams* params) {
   if (!init_state_.SetInitializing()) {
     return Utils::StrDup(
         "Bad VM initialization state, "
         "already initialized or "
         "multiple threads initializing the VM.");
   }
-  char* retval =
-      DartInit(vm_isolate_snapshot, instructions_snapshot, create_group,
-               initialize_isolate, shutdown, cleanup, cleanup_group,
-               thread_start, thread_exit, file_open, file_read, file_write,
-               file_close, entropy_source, get_service_assets,
-               start_kernel_isolate, observer, post_task, post_task_data);
+  char* retval = DartInit(params);
   if (retval != NULL) {
     init_state_.ResetInitializing();
     return retval;
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 5a170c2..9b88af1 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -29,25 +29,7 @@
  public:
   // Returns null if initialization succeeds, otherwise returns an error message
   // (caller owns error message and has to free it).
-  static char* Init(const uint8_t* vm_snapshot_data,
-                    const uint8_t* vm_snapshot_instructions,
-                    Dart_IsolateGroupCreateCallback create_group,
-                    Dart_InitializeIsolateCallback initialize_isolate,
-                    Dart_IsolateShutdownCallback shutdown,
-                    Dart_IsolateCleanupCallback cleanup,
-                    Dart_IsolateGroupCleanupCallback cleanup_group,
-                    Dart_ThreadStartCallback thread_start,
-                    Dart_ThreadExitCallback thread_exit,
-                    Dart_FileOpenCallback file_open,
-                    Dart_FileReadCallback file_read,
-                    Dart_FileWriteCallback file_write,
-                    Dart_FileCloseCallback file_close,
-                    Dart_EntropySource entropy_source,
-                    Dart_GetVMServiceAssetsArchive get_service_assets,
-                    bool start_kernel_isolate,
-                    Dart_CodeObserver* observer,
-                    Dart_PostTaskCallback post_task,
-                    void* post_task_data);
+  static char* Init(const Dart_InitializeParams* params);
 
   // Returns null if cleanup succeeds, otherwise returns an error message
   // (caller owns error message and has to free it).
@@ -176,25 +158,7 @@
   static Dart_GCEventCallback gc_event_callback() { return gc_event_callback_; }
 
  private:
-  static char* DartInit(const uint8_t* vm_snapshot_data,
-                        const uint8_t* vm_snapshot_instructions,
-                        Dart_IsolateGroupCreateCallback create_group,
-                        Dart_InitializeIsolateCallback initialize_isolate,
-                        Dart_IsolateShutdownCallback shutdown,
-                        Dart_IsolateCleanupCallback cleanup,
-                        Dart_IsolateGroupCleanupCallback cleanup_group,
-                        Dart_ThreadStartCallback thread_start,
-                        Dart_ThreadExitCallback thread_exit,
-                        Dart_FileOpenCallback file_open,
-                        Dart_FileReadCallback file_read,
-                        Dart_FileWriteCallback file_write,
-                        Dart_FileCloseCallback file_close,
-                        Dart_EntropySource entropy_source,
-                        Dart_GetVMServiceAssetsArchive get_service_assets,
-                        bool start_kernel_isolate,
-                        Dart_CodeObserver* observer,
-                        Dart_PostTaskCallback post_task,
-                        void* post_task_data);
+  static char* DartInit(const Dart_InitializeParams* params);
 
   static constexpr const char* kVmIsolateName = "vm-isolate";
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index b421ddc..d7d2208 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1204,15 +1204,7 @@
         "Invalid Dart_InitializeParams version.");
   }
 
-  return Dart::Init(params->vm_snapshot_data, params->vm_snapshot_instructions,
-                    params->create_group, params->initialize_isolate,
-                    params->shutdown_isolate, params->cleanup_isolate,
-                    params->cleanup_group, params->thread_start,
-                    params->thread_exit, params->file_open, params->file_read,
-                    params->file_write, params->file_close,
-                    params->entropy_source, params->get_service_assets,
-                    params->start_kernel_isolate, params->code_observer,
-                    params->post_task, params->post_task_data);
+  return Dart::Init(params);
 }
 
 DART_EXPORT char* Dart_Cleanup() {