| // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | #ifndef RUNTIME_BIN_DARTDEV_ISOLATE_H_ | 
 | #define RUNTIME_BIN_DARTDEV_ISOLATE_H_ | 
 |  | 
 | #if !defined(DART_PRECOMPILED_RUNTIME) | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "bin/thread.h" | 
 | #include "include/dart_api.h" | 
 | #include "include/dart_native_api.h" | 
 | #include "platform/globals.h" | 
 | #include "platform/utils.h" | 
 |  | 
 | #define DART_DEV_ISOLATE_NAME "dartdev" | 
 |  | 
 | namespace dart { | 
 | namespace bin { | 
 |  | 
 | class CommandLineOptions; | 
 |  | 
 | class DartDevIsolate { | 
 |  public: | 
 |   // Note: keep in sync with pkg/dartdev/lib/vm_interop_handler.dart | 
 |   typedef enum { | 
 |     DartDev_Result_Unknown = -1, | 
 |     DartDev_Result_Run = 1, | 
 |     DartDev_Result_Exit = 2, | 
 |   } DartDev_Result; | 
 |  | 
 |   // Returns true if there does not exist a file at |script_uri| or the URI is | 
 |   // not an HTTP resource. | 
 |   static bool ShouldParseCommand(const char* script_uri); | 
 |  | 
 |   static void set_should_run_dart_dev(bool enable) { | 
 |     should_run_dart_dev_ = enable; | 
 |   } | 
 |  | 
 |   static void PrintUsageErrorOnRun() { | 
 |     set_should_run_dart_dev(true); | 
 |     print_usage_error_ = true; | 
 |   } | 
 |  | 
 |   static bool should_run_dart_dev() { return should_run_dart_dev_; } | 
 |  | 
 |   // Attempts to find the path of the DartDev kernel file. | 
 |   static Utils::CStringUniquePtr TryResolveDartDevKernelPath(); | 
 |  | 
 |   // Attempts to find the path of the DartDev snapshot. | 
 |   static Utils::CStringUniquePtr TryResolveDartDevSnapshotPath(); | 
 |  | 
 |   // Starts a DartDev instance in a new isolate and runs it to completion. | 
 |   // | 
 |   // Returns true if the VM should run the result in `script`, in which case | 
 |   // `script` and `dart_options` will have been repopulated with the correct | 
 |   // values. | 
 |   static DartDev_Result RunDartDev( | 
 |       Dart_IsolateGroupCreateCallback create_isolate, | 
 |       char** packages_file, | 
 |       char** script, | 
 |       CommandLineOptions* dart_options); | 
 |  | 
 |  protected: | 
 |   class DartDevRunner { | 
 |    public: | 
 |     DartDevRunner() {} | 
 |  | 
 |     void Run(Dart_IsolateGroupCreateCallback create_isolate, | 
 |              char** package_config_override_, | 
 |              char** script, | 
 |              CommandLineOptions* dart_options); | 
 |  | 
 |     DartDev_Result result() const { return result_; } | 
 |  | 
 |    private: | 
 |     static void DartDevResultCallback(Dart_Port dest_port_id, | 
 |                                       Dart_CObject* message); | 
 |     static void RunCallback(uword arg); | 
 |     static void ProcessError(const char* msg, int32_t exit_code); | 
 |  | 
 |     static DartDev_Result result_; | 
 |     static char** script_; | 
 |     static char** package_config_override_; | 
 |     static std::unique_ptr<char*[], void (*)(char**)> argv_; | 
 |     static intptr_t argc_; | 
 |  | 
 |     Dart_IsolateGroupCreateCallback create_isolate_; | 
 |     CommandLineOptions* dart_options_; | 
 |     const char* packages_file_; | 
 |     static Monitor* monitor_; | 
 |  | 
 |     DISALLOW_ALLOCATION(); | 
 |   }; | 
 |  | 
 |  private: | 
 |   static Utils::CStringUniquePtr TryResolveArtifactPath(const char* filename); | 
 |  | 
 |   static DartDevRunner runner_; | 
 |   static bool should_run_dart_dev_; | 
 |   static bool print_usage_error_; | 
 |  | 
 |   DISALLOW_ALLOCATION(); | 
 |   DISALLOW_IMPLICIT_CONSTRUCTORS(DartDevIsolate); | 
 | }; | 
 |  | 
 | }  // namespace bin | 
 | }  // namespace dart | 
 |  | 
 | #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 
 | #endif  // RUNTIME_BIN_DARTDEV_ISOLATE_H_ |