// Copyright (c) 2021, 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. part of "dart:ffi"; /// An application binary interface (ABI). /// /// An ABI defines the memory layout of data /// and the function call protocol for native code. /// It is usually defined by the an operating system for each /// architecture that operating system runs on. /// /// The Dart VM can run on a variety of operating systems and architectures. /// Supported ABIs are represented by `Abi` objects. /// See [values] for all the supported ABIs. @Since('2.16') class Abi { /// The application binary interface for Android on the Arm architecture. static const androidArm = _androidArm; /// The application binary interface for Android on the Arm64 architecture. static const androidArm64 = _androidArm64; /// The application binary interface for Android on the IA32 architecture. static const androidIA32 = _androidIA32; /// The application binary interface for Android on the X64 architecture. static const androidX64 = _androidX64; /// The application binary interface for Android on 64-bit RISC-V. static const androidRiscv64 = _androidRiscv64; /// The application binary interface for Fuchsia on the Arm64 architecture. static const fuchsiaArm64 = _fuchsiaArm64; /// The application binary interface for Fuchsia on the X64 architecture. static const fuchsiaX64 = _fuchsiaX64; /// The application binary interface for Fuchsia on the Riscv64 architecture. static const fuchsiaRiscv64 = _fuchsiaRiscv64; /// The application binary interface for iOS on the Arm architecture. static const iosArm = _iosArm; /// The application binary interface for iOS on the Arm64 architecture. static const iosArm64 = _iosArm64; /// The application binary interface for iOS on the X64 architecture. static const iosX64 = _iosX64; /// The application binary interface for Linux on the Arm architecture. /// /// Does not distinguish between hard and soft fp. Currently, no uses of Abi /// require this distinction. static const linuxArm = _linuxArm; /// The application binary interface for linux on the Arm64 architecture. static const linuxArm64 = _linuxArm64; /// The application binary interface for linux on the IA32 architecture. static const linuxIA32 = _linuxIA32; /// The application binary interface for linux on the X64 architecture. static const linuxX64 = _linuxX64; /// The application binary interface for linux on 32-bit RISC-V. static const linuxRiscv32 = _linuxRiscv32; /// The application binary interface for linux on 64-bit RISC-V. static const linuxRiscv64 = _linuxRiscv64; /// The application binary interface for MacOS on the Arm64 architecture. static const macosArm64 = _macosArm64; /// The application binary interface for MacOS on the X64 architecture. static const macosX64 = _macosX64; /// The application binary interface for Windows on the Arm64 architecture. static const windowsArm64 = _windowsArm64; /// The application binary interface for Windows on the IA32 architecture. static const windowsIA32 = _windowsIA32; /// The application binary interface for Windows on the X64 architecture. static const windowsX64 = _windowsX64; /// The ABIs that the DartVM can run on. /// /// Does not contain a `macosIA32`. We have stopped supporting 32-bit MacOS. static const values = [ androidArm, androidArm64, androidIA32, androidX64, androidRiscv64, fuchsiaArm64, fuchsiaX64, fuchsiaRiscv64, iosArm, iosArm64, iosX64, linuxArm, linuxArm64, linuxIA32, linuxX64, linuxRiscv32, linuxRiscv64, macosArm64, macosX64, windowsArm64, windowsIA32, windowsX64, ]; /// The ABI the Dart VM is currently running on. external factory Abi.current(); /// A string representation of this ABI. /// /// The string is equal to the 'on' part from `Platform.version` and /// `dart --version`. @override String toString() => '${_os.name}_${_architecture.name}'; /// The operating system of this [Abi]. final _OS _os; /// The architecture of this [Abi]. final _Architecture _architecture; /// The constructor is private so that we can use [Abi.values] as opaque /// tokens. const Abi._(this._architecture, this._os); static const _androidArm = Abi._(_Architecture.arm, _OS.android); static const _androidArm64 = Abi._(_Architecture.arm64, _OS.android); static const _androidIA32 = Abi._(_Architecture.ia32, _OS.android); static const _androidX64 = Abi._(_Architecture.x64, _OS.android); static const _androidRiscv64 = Abi._(_Architecture.riscv64, _OS.android); static const _fuchsiaArm64 = Abi._(_Architecture.arm64, _OS.fuchsia); static const _fuchsiaX64 = Abi._(_Architecture.x64, _OS.fuchsia); static const _fuchsiaRiscv64 = Abi._(_Architecture.riscv64, _OS.fuchsia); static const _iosArm = Abi._(_Architecture.arm, _OS.ios); static const _iosArm64 = Abi._(_Architecture.arm64, _OS.ios); static const _iosX64 = Abi._(_Architecture.x64, _OS.ios); static const _linuxArm = Abi._(_Architecture.arm, _OS.linux); static const _linuxArm64 = Abi._(_Architecture.arm64, _OS.linux); static const _linuxIA32 = Abi._(_Architecture.ia32, _OS.linux); static const _linuxX64 = Abi._(_Architecture.x64, _OS.linux); static const _linuxRiscv32 = Abi._(_Architecture.riscv32, _OS.linux); static const _linuxRiscv64 = Abi._(_Architecture.riscv64, _OS.linux); static const _macosArm64 = Abi._(_Architecture.arm64, _OS.macos); static const _macosX64 = Abi._(_Architecture.x64, _OS.macos); static const _windowsArm64 = Abi._(_Architecture.arm64, _OS.windows); static const _windowsIA32 = Abi._(_Architecture.ia32, _OS.windows); static const _windowsX64 = Abi._(_Architecture.x64, _OS.windows); } /// The hardware architectures the Dart VM runs on. enum _Architecture { arm, arm64, ia32, x64, riscv32, riscv64 } /// The operating systems the Dart VM runs on. enum _OS { android, fuchsia, ios, linux, macos, windows }