// Copyright (c) 2012, 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.

@patch class _Platform {
  @patch static int _numberOfProcessors()
      native "Platform_NumberOfProcessors";
  @patch static String _pathSeparator()
      native "Platform_PathSeparator";
  @patch static String _operatingSystem()
      native "Platform_OperatingSystem";
  @patch static _localHostname()
      native "Platform_LocalHostname";
  @patch static _executable()
      native "Platform_ExecutableName";
  @patch static _resolvedExecutable()
      native "Platform_ResolvedExecutableName";
  @patch static _environment()
      native "Platform_Environment";
  @patch static List<String> _executableArguments()
      native "Platform_ExecutableArguments";
  @patch static String _version()
      native "Platform_GetVersion";

  @patch static String _packageRoot()
      => VMLibraryHooks.packageRootString;
  @patch static String _packageConfig()
      => VMLibraryHooks.packageConfigString;

  // This script singleton is written to by the embedder if applicable.
  @patch static void set _nativeScript(String path) {
    if (path.startsWith('http:') ||
        path.startsWith('https:') ||
        path.startsWith('package:') ||
        path.startsWith('dart:') ||
        path.startsWith('data:') ||
        path.startsWith('file:')) {
      script = Uri.parse(path);
    } else {
      script = Uri.base.resolveUri(new Uri.file(path));
    }
    VMLibraryHooks.platformScript = script;
  }
}
