Revert "[vm/ffi] Add common C types"

This reverts commit 85a87ca7ae.

Reason for revert: 

* Adding `Char` breaks `package:win32` which is used in Flutter so it
breaks the Flutter build:
https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8824468064587445729/+/u/Android_Views_Integration_Tests/stdout

For reference: full list of Flutter failues:
https://github.com/flutter/flutter/runs/4890844911

Original change's description:
> [vm/ffi] Add common C types
>
> We're adding these types to `dart:ffi` rather than `package:ffi` so that
> they can be used with `FfiNative`s.
>
> Adds `NativeType`s for the following C types:
>
> * char
> * unsigned char
> * signed char
> * short
> * unsigned short
> * int
> * unsigned int
> * long
> * unsigned long
> * long long
> * unsigned long long
> * uintptr_t
> * size_t
> * wchar_t
>
> Because the C standard only defines minimum sizes for many of these
> types, future platforms might diverge from the typical size even if all
> platforms currently agree on a size. To avoid having to reification
> later, we define all types as AbiSpecificIntegers rather than typedefs,
> even if all current target platforms agree on the size.
>
> Closes: https://github.com/dart-lang/sdk/issues/36140
>
> TEST=tests/ffi/c_types_test.dart
>
> Change-Id: Ie97d253856d787386529231e8060f879069be886
> Cq-Include-Trybots: luci.dart.try:dart-sdk-linux-try,dart-sdk-mac-try,dart-sdk-win-try,vm-ffi-android-debug-arm64c-try,vm-ffi-android-debug-arm-try,vm-canary-linux-debug-try,vm-fuchsia-release-x64-try,vm-kernel-gcc-linux-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-mac-debug-x64-try,vm-kernel-mac-release-arm64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-nnbd-win-release-x64-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-win-release-x64-try
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/228541
> Reviewed-by: Martin Kustermann <kustermann@google.com>

# Not skipping CQ checks because original CL landed > 1 day ago.

Change-Id: Ic56df88c653b1395ed5e5a71af5e571b1adc3671
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/229152
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
This commit is contained in:
Daco Harkes 2022-01-21 17:05:42 +00:00 committed by Commit Bot
parent 8415b70e75
commit 5183ba3ca4
43 changed files with 494 additions and 914 deletions

View file

@ -15,6 +15,36 @@ import 'dart:typed_data';
import 'package:ffi/ffi.dart';
import 'package:benchmark_harness/benchmark_harness.dart';
/// Represents a native unsigned pointer-sized integer in C.
///
/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint64(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint64(),
})
class UintPtr extends AbiSpecificInteger {
const UintPtr();
}
//
// Pointer store.
//

View file

@ -17,6 +17,36 @@ import 'dart:typed_data';
import 'package:ffi/ffi.dart';
import 'package:benchmark_harness/benchmark_harness.dart';
/// Represents a native unsigned pointer-sized integer in C.
///
/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint64(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint64(),
})
class UintPtr extends AbiSpecificInteger {
const UintPtr();
}
//
// Pointer store.
//

View file

@ -40,7 +40,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -40,7 +40,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -74,7 +74,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -51,7 +51,6 @@ additionalExports = (ffi::nullptr,
ffi::Bool,
ffi::BoolArray,
ffi::BoolPointer,
ffi::Char,
ffi::DartRepresentationOf,
ffi::Dart_CObject,
ffi::Double,
@ -64,7 +63,6 @@ additionalExports = (ffi::nullptr,
ffi::FloatArray,
ffi::FloatPointer,
ffi::Handle,
ffi::Int,
ffi::Int16,
ffi::Int16Array,
ffi::Int16Pointer,
@ -78,8 +76,6 @@ additionalExports = (ffi::nullptr,
ffi::Int8Array,
ffi::Int8Pointer,
ffi::IntPtr,
ffi::Long,
ffi::LongLong,
ffi::NativeApi,
ffi::NativeFunction,
ffi::NativeFunctionPointer,
@ -90,9 +86,6 @@ additionalExports = (ffi::nullptr,
ffi::Pointer,
ffi::PointerArray,
ffi::PointerPointer,
ffi::Short,
ffi::SignedChar,
ffi::Size,
ffi::Struct,
ffi::StructArray,
ffi::StructPointer,
@ -108,18 +101,11 @@ additionalExports = (ffi::nullptr,
ffi::Uint8,
ffi::Uint8Array,
ffi::Uint8Pointer,
ffi::UintPtr,
ffi::Union,
ffi::UnionArray,
ffi::UnionPointer,
ffi::UnsignedChar,
ffi::UnsignedInt,
ffi::UnsignedLong,
ffi::UnsignedLongLong,
ffi::UnsignedShort,
ffi::Unsized,
ffi::Void,
ffi::WChar)
ffi::Void)
export "org-dartlang-test:///lib3.dart";
@ -141,7 +127,6 @@ additionalExports = (ffi::nullptr,
ffi::Bool,
ffi::BoolArray,
ffi::BoolPointer,
ffi::Char,
ffi::DartRepresentationOf,
ffi::Dart_CObject,
ffi::Double,
@ -154,7 +139,6 @@ additionalExports = (ffi::nullptr,
ffi::FloatArray,
ffi::FloatPointer,
ffi::Handle,
ffi::Int,
ffi::Int16,
ffi::Int16Array,
ffi::Int16Pointer,
@ -168,8 +152,6 @@ additionalExports = (ffi::nullptr,
ffi::Int8Array,
ffi::Int8Pointer,
ffi::IntPtr,
ffi::Long,
ffi::LongLong,
ffi::NativeApi,
ffi::NativeFunction,
ffi::NativeFunctionPointer,
@ -180,9 +162,6 @@ additionalExports = (ffi::nullptr,
ffi::Pointer,
ffi::PointerArray,
ffi::PointerPointer,
ffi::Short,
ffi::SignedChar,
ffi::Size,
ffi::Struct,
ffi::StructArray,
ffi::StructPointer,
@ -198,18 +177,11 @@ additionalExports = (ffi::nullptr,
ffi::Uint8,
ffi::Uint8Array,
ffi::Uint8Pointer,
ffi::UintPtr,
ffi::Union,
ffi::UnionArray,
ffi::UnionPointer,
ffi::UnsignedChar,
ffi::UnsignedInt,
ffi::UnsignedLong,
ffi::UnsignedLongLong,
ffi::UnsignedShort,
ffi::Unsized,
ffi::Void,
ffi::WChar)
ffi::Void)
export "dart:ffi";

View file

@ -51,7 +51,6 @@ additionalExports = (ffi::nullptr,
ffi::Bool,
ffi::BoolArray,
ffi::BoolPointer,
ffi::Char,
ffi::DartRepresentationOf,
ffi::Dart_CObject,
ffi::Double,
@ -64,7 +63,6 @@ additionalExports = (ffi::nullptr,
ffi::FloatArray,
ffi::FloatPointer,
ffi::Handle,
ffi::Int,
ffi::Int16,
ffi::Int16Array,
ffi::Int16Pointer,
@ -78,8 +76,6 @@ additionalExports = (ffi::nullptr,
ffi::Int8Array,
ffi::Int8Pointer,
ffi::IntPtr,
ffi::Long,
ffi::LongLong,
ffi::NativeApi,
ffi::NativeFunction,
ffi::NativeFunctionPointer,
@ -90,9 +86,6 @@ additionalExports = (ffi::nullptr,
ffi::Pointer,
ffi::PointerArray,
ffi::PointerPointer,
ffi::Short,
ffi::SignedChar,
ffi::Size,
ffi::Struct,
ffi::StructArray,
ffi::StructPointer,
@ -108,18 +101,11 @@ additionalExports = (ffi::nullptr,
ffi::Uint8,
ffi::Uint8Array,
ffi::Uint8Pointer,
ffi::UintPtr,
ffi::Union,
ffi::UnionArray,
ffi::UnionPointer,
ffi::UnsignedChar,
ffi::UnsignedInt,
ffi::UnsignedLong,
ffi::UnsignedLongLong,
ffi::UnsignedShort,
ffi::Unsized,
ffi::Void,
ffi::WChar)
ffi::Void)
export "org-dartlang-test:///lib3.dart";
@ -141,7 +127,6 @@ additionalExports = (ffi::nullptr,
ffi::Bool,
ffi::BoolArray,
ffi::BoolPointer,
ffi::Char,
ffi::DartRepresentationOf,
ffi::Dart_CObject,
ffi::Double,
@ -154,7 +139,6 @@ additionalExports = (ffi::nullptr,
ffi::FloatArray,
ffi::FloatPointer,
ffi::Handle,
ffi::Int,
ffi::Int16,
ffi::Int16Array,
ffi::Int16Pointer,
@ -168,8 +152,6 @@ additionalExports = (ffi::nullptr,
ffi::Int8Array,
ffi::Int8Pointer,
ffi::IntPtr,
ffi::Long,
ffi::LongLong,
ffi::NativeApi,
ffi::NativeFunction,
ffi::NativeFunctionPointer,
@ -180,9 +162,6 @@ additionalExports = (ffi::nullptr,
ffi::Pointer,
ffi::PointerArray,
ffi::PointerPointer,
ffi::Short,
ffi::SignedChar,
ffi::Size,
ffi::Struct,
ffi::StructArray,
ffi::StructPointer,
@ -198,18 +177,11 @@ additionalExports = (ffi::nullptr,
ffi::Uint8,
ffi::Uint8Array,
ffi::Uint8Pointer,
ffi::UintPtr,
ffi::Union,
ffi::UnionArray,
ffi::UnionPointer,
ffi::UnsignedChar,
ffi::UnsignedInt,
ffi::UnsignedLong,
ffi::UnsignedLongLong,
ffi::UnsignedShort,
ffi::Unsized,
ffi::Void,
ffi::WChar)
ffi::Void)
export "dart:ffi";

View file

@ -34,7 +34,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -65,7 +65,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -34,7 +34,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -34,7 +34,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -65,7 +65,7 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:114:9)
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:144:9)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -25,5 +25,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -52,5 +52,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -25,5 +25,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -25,5 +25,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -52,5 +52,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -33,5 +33,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -84,5 +84,5 @@ Extra constant evaluation: evaluated: 110, effectively constant: 2
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -33,5 +33,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -33,5 +33,5 @@ constants {
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -84,5 +84,5 @@ Extra constant evaluation: evaluated: 110, effectively constant: 2
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:139:9)
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

View file

@ -1138,36 +1138,27 @@ DART_EXPORT uint64_t SizeOfStruct3BytesPackedInt() {
typedef intptr_t ssize_t;
#endif
#define DEFINE_SIZE_OF_AND_SIGN_OF(type_modifier, type, type2) \
DART_EXPORT uint64_t FfiSizeOf_##type_modifier##_##type##_##type2() { \
return sizeof(type_modifier type type2); \
} \
\
DART_EXPORT uint64_t FfiSignOf_##type_modifier##_##type##_##type2() { \
return std::numeric_limits<type_modifier type type2>::is_signed; \
#define DEFINE_SIZE_OF(type_modifier, type) \
DART_EXPORT uint64_t FfiSizeOf_##type_modifier##_##type() { \
return sizeof(type_modifier type); \
}
#define TYPES(F) \
F(, char, ) /* NOLINT */ \
F(signed, char, ) /* NOLINT */ \
F(unsigned, char, ) /* NOLINT */ \
F(, short, ) /* NOLINT */ \
F(unsigned, short, ) /* NOLINT */ \
F(, int, ) /* NOLINT */ \
F(unsigned, int, ) /* NOLINT */ \
F(, long, ) /* NOLINT */ \
F(unsigned, long, ) /* NOLINT */ \
F(, long, long) /* NOLINT */ \
F(unsigned, long, long) /* NOLINT */ \
F(, intptr_t, ) /* NOLINT */ \
F(, uintptr_t, ) /* NOLINT */ \
F(, size_t, ) /* NOLINT */ \
F(, wchar_t, ) /* NOLINT */
#define SIZES(F) \
F(, intptr_t) \
F(, uintptr_t) \
F(, int) \
F(unsigned, int) \
F(, long) /* NOLINT */ \
F(unsigned, long) /* NOLINT */ \
F(, wchar_t) \
F(, size_t) \
F(, ssize_t) \
F(, off_t)
TYPES(DEFINE_SIZE_OF_AND_SIGN_OF)
SIZES(DEFINE_SIZE_OF)
#undef DEFINE_SIZE_OF_AND_SIGN_OF
#undef TYPES
#undef DEFINE_SIZE_OF
#undef SIZES
DART_EXPORT int64_t WCharMinValue() {
return WCHAR_MIN;

View file

@ -55,6 +55,11 @@ class Uint32 extends _NativeInteger {}
@pragma("vm:entry-point")
class Uint64 extends _NativeInteger {}
// TODO(http://dartbug.com/47938): Implement as AbiSpecificInteger.
@patch
@pragma("vm:entry-point")
class IntPtr extends _NativeInteger {}
@patch
@pragma("vm:entry-point")
class Float extends _NativeDouble {}

View file

@ -13,12 +13,10 @@ part of dart.ffi;
/// For example:
///
/// ```
/// /// The C `uintptr_t` type.
/// /// Represents a `uintptr_t` in C.
/// ///
/// /// The [UintPtr] type is a native type, and should not be constructed in
/// /// Dart code.
/// /// It occurs only in native type signatures and as annotation on [Struct]
/// /// and [Union] fields.
/// /// [UintPtr] is not constructible in the Dart code and serves purely as
/// /// marker in type signatures.
/// @AbiSpecificIntegerMapping({
/// Abi.androidArm: Uint32(),
/// Abi.androidArm64: Uint64(),

View file

@ -1,541 +0,0 @@
// Copyright (c) 2022, 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.
/// This library defines [NativeType]s for common C types.
///
/// Many C types only define a minimal size in the C standard, but they are
/// consistent per [Abi]. Therefore we use [AbiSpecificInteger]s to define
/// these C types in this library.
part of dart.ffi;
/// The C `char` type.
///
/// Typically a signed or unsigned 8-bit integer.
/// For a guaranteed 8-bit integer, use [Int8] with the C `int8_t` type
/// or [Uint8] with the C `uint8_t` type.
/// For a specifically `signed` or `unsigned` `char`, use [SignedChar] or
/// [UnsignedChar].
///
/// The [Char] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint8(),
Abi.androidArm64: Uint8(),
Abi.androidIA32: Uint8(),
Abi.androidX64: Uint8(),
Abi.fuchsiaArm64: Int8(),
Abi.fuchsiaX64: Int8(),
Abi.iosArm: Uint8(),
Abi.iosArm64: Int8(),
Abi.iosX64: Int8(),
Abi.linuxArm: Uint8(),
Abi.linuxArm64: Int8(),
Abi.linuxIA32: Int8(),
Abi.linuxX64: Int8(),
Abi.linuxRiscv32: Int8(),
Abi.linuxRiscv64: Int8(),
Abi.macosArm64: Int8(),
Abi.macosX64: Int8(),
Abi.windowsArm64: Int8(),
Abi.windowsIA32: Int8(),
Abi.windowsX64: Int8(),
})
class Char extends AbiSpecificInteger {
const Char();
}
/// The C `signed char` type.
///
/// Typically a signed 8-bit integer.
/// For a guaranteed 8-bit integer, use [Int8] with the C `int8_t` type.
/// For an `unsigned char`, use [UnsignedChar].
///
/// The [SignedChar] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int8(),
Abi.androidArm64: Int8(),
Abi.androidIA32: Int8(),
Abi.androidX64: Int8(),
Abi.fuchsiaArm64: Int8(),
Abi.fuchsiaX64: Int8(),
Abi.iosArm: Int8(),
Abi.iosArm64: Int8(),
Abi.iosX64: Int8(),
Abi.linuxArm: Int8(),
Abi.linuxArm64: Int8(),
Abi.linuxIA32: Int8(),
Abi.linuxX64: Int8(),
Abi.linuxRiscv32: Int8(),
Abi.linuxRiscv64: Int8(),
Abi.macosArm64: Int8(),
Abi.macosX64: Int8(),
Abi.windowsArm64: Int8(),
Abi.windowsIA32: Int8(),
Abi.windowsX64: Int8(),
})
class SignedChar extends AbiSpecificInteger {
const SignedChar();
}
/// The C `unsigned char` type.
///
/// Typically an unsigned 8-bit integer.
/// For a guaranteed 8-bit integer, use [Uint8] with the C `uint8_t` type.
/// For a `signed char`, use [Char].
///
/// The [UnsignedChar] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint8(),
Abi.androidArm64: Uint8(),
Abi.androidIA32: Uint8(),
Abi.androidX64: Uint8(),
Abi.fuchsiaArm64: Uint8(),
Abi.fuchsiaX64: Uint8(),
Abi.iosArm: Uint8(),
Abi.iosArm64: Uint8(),
Abi.iosX64: Uint8(),
Abi.linuxArm: Uint8(),
Abi.linuxArm64: Uint8(),
Abi.linuxIA32: Uint8(),
Abi.linuxX64: Uint8(),
Abi.linuxRiscv32: Uint8(),
Abi.linuxRiscv64: Uint8(),
Abi.macosArm64: Uint8(),
Abi.macosX64: Uint8(),
Abi.windowsArm64: Uint8(),
Abi.windowsIA32: Uint8(),
Abi.windowsX64: Uint8(),
})
class UnsignedChar extends AbiSpecificInteger {
const UnsignedChar();
}
/// The C `short` type.
///
/// Typically a signed 16-bit integer.
/// For a guaranteed 16-bit integer, use [Int16] with the C `int16_t` type.
/// For an `unsigned short`, use [UnsignedShort].
///
/// The [Short] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int16(),
Abi.androidArm64: Int16(),
Abi.androidIA32: Int16(),
Abi.androidX64: Int16(),
Abi.fuchsiaArm64: Int16(),
Abi.fuchsiaX64: Int16(),
Abi.iosArm: Int16(),
Abi.iosArm64: Int16(),
Abi.iosX64: Int16(),
Abi.linuxArm: Int16(),
Abi.linuxArm64: Int16(),
Abi.linuxIA32: Int16(),
Abi.linuxX64: Int16(),
Abi.linuxRiscv32: Int16(),
Abi.linuxRiscv64: Int16(),
Abi.macosArm64: Int16(),
Abi.macosX64: Int16(),
Abi.windowsArm64: Int16(),
Abi.windowsIA32: Int16(),
Abi.windowsX64: Int16(),
})
class Short extends AbiSpecificInteger {
const Short();
}
/// The C `unsigned short` type.
///
/// Typically an unsigned 16-bit integer.
/// For a guaranteed 16-bit integer, use [Uint16] with the C `uint16_t` type.
/// For a signed `short`, use [Short].
///
/// The [UnsignedShort] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint16(),
Abi.androidArm64: Uint16(),
Abi.androidIA32: Uint16(),
Abi.androidX64: Uint16(),
Abi.fuchsiaArm64: Uint16(),
Abi.fuchsiaX64: Uint16(),
Abi.iosArm: Uint16(),
Abi.iosArm64: Uint16(),
Abi.iosX64: Uint16(),
Abi.linuxArm: Uint16(),
Abi.linuxArm64: Uint16(),
Abi.linuxIA32: Uint16(),
Abi.linuxX64: Uint16(),
Abi.linuxRiscv32: Uint16(),
Abi.linuxRiscv64: Uint16(),
Abi.macosArm64: Uint16(),
Abi.macosX64: Uint16(),
Abi.windowsArm64: Uint16(),
Abi.windowsIA32: Uint16(),
Abi.windowsX64: Uint16(),
})
class UnsignedShort extends AbiSpecificInteger {
const UnsignedShort();
}
/// The C `int` type.
///
/// Typically a signed 32-bit integer.
/// For a guaranteed 32-bit integer, use [Int32] with the C `int32_t` type.
/// For an `unsigned int`, use [UnsignedInt].
///
/// The [Int] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int32(),
Abi.androidArm64: Int32(),
Abi.androidIA32: Int32(),
Abi.androidX64: Int32(),
Abi.fuchsiaArm64: Int32(),
Abi.fuchsiaX64: Int32(),
Abi.iosArm: Int32(),
Abi.iosArm64: Int32(),
Abi.iosX64: Int32(),
Abi.linuxArm: Int32(),
Abi.linuxArm64: Int32(),
Abi.linuxIA32: Int32(),
Abi.linuxX64: Int32(),
Abi.linuxRiscv32: Int32(),
Abi.linuxRiscv64: Int32(),
Abi.macosArm64: Int32(),
Abi.macosX64: Int32(),
Abi.windowsArm64: Int32(),
Abi.windowsIA32: Int32(),
Abi.windowsX64: Int32(),
})
class Int extends AbiSpecificInteger {
const Int();
}
/// The C `unsigned int` type.
///
/// Typically an unsigned 32-bit integer.
/// For a guaranteed 32-bit integer, use [Uint32] with the C `uint32_t` type.
/// For a signed `int`, use [Int].
///
/// The [UnsignedInt] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint32(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint32(),
Abi.fuchsiaArm64: Uint32(),
Abi.fuchsiaX64: Uint32(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint32(),
Abi.iosX64: Uint32(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint32(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint32(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint32(),
Abi.macosArm64: Uint32(),
Abi.macosX64: Uint32(),
Abi.windowsArm64: Uint32(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint32(),
})
class UnsignedInt extends AbiSpecificInteger {
const UnsignedInt();
}
/// The C `long int`, aka. `long`, type.
///
/// Typically a signed 32- or 64-bit integer.
/// For a guaranteed 32-bit integer, use [Int32] with the C `int32_t` type.
/// For a guaranteed 64-bit integer, use [Int64] with the C `int64_t` type.
/// For an `unsigned long`, use [UnsignedLong].
///
/// The [Long] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int32(),
Abi.androidArm64: Int64(),
Abi.androidIA32: Int32(),
Abi.androidX64: Int64(),
Abi.fuchsiaArm64: Int64(),
Abi.fuchsiaX64: Int64(),
Abi.iosArm: Int32(),
Abi.iosArm64: Int64(),
Abi.iosX64: Int64(),
Abi.linuxArm: Int32(),
Abi.linuxArm64: Int64(),
Abi.linuxIA32: Int32(),
Abi.linuxX64: Int64(),
Abi.linuxRiscv32: Int32(),
Abi.linuxRiscv64: Int64(),
Abi.macosArm64: Int64(),
Abi.macosX64: Int64(),
Abi.windowsArm64: Int32(),
Abi.windowsIA32: Int32(),
Abi.windowsX64: Int32(),
})
class Long extends AbiSpecificInteger {
const Long();
}
/// The C `unsigned long int`, aka. `unsigned long`, type.
///
/// Typically an unsigned 32- or 64-bit integer.
/// For a guaranteed 32-bit integer, use [Uint32] with the C `uint32_t` type.
/// For a guaranteed 64-bit integer, use [Uint64] with the C `uint64_t` type.
/// For a signed `long`, use [Long].
///
/// The [UnsignedLong] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint32(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint32(),
})
class UnsignedLong extends AbiSpecificInteger {
const UnsignedLong();
}
/// The C `long long` type.
///
/// Typically a signed 64-bit integer.
/// For a guaranteed 64-bit integer, use [Int64] with the C `int64_t` type.
/// For an `unsigned long long`, use [UnsignedLongLong].
///
/// The [LongLong] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int64(),
Abi.androidArm64: Int64(),
Abi.androidIA32: Int64(),
Abi.androidX64: Int64(),
Abi.fuchsiaArm64: Int64(),
Abi.fuchsiaX64: Int64(),
Abi.iosArm: Int64(),
Abi.iosArm64: Int64(),
Abi.iosX64: Int64(),
Abi.linuxArm: Int64(),
Abi.linuxArm64: Int64(),
Abi.linuxIA32: Int64(),
Abi.linuxX64: Int64(),
Abi.linuxRiscv32: Int64(),
Abi.linuxRiscv64: Int64(),
Abi.macosArm64: Int64(),
Abi.macosX64: Int64(),
Abi.windowsArm64: Int64(),
Abi.windowsIA32: Int64(),
Abi.windowsX64: Int64(),
})
class LongLong extends AbiSpecificInteger {
const LongLong();
}
/// The C `unsigned long long` type.
///
/// Typically an unsigned 64-bit integer.
/// For a guaranteed 64-bit integer, use [Uint64] with the C `uint64_t` type.
/// For a signed `long long`, use [LongLong].
///
/// The [UnsignedLongLong] type is a native type, and should not be constructed
/// in Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint64(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint64(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint64(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint64(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint64(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint64(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint64(),
Abi.windowsIA32: Uint64(),
Abi.windowsX64: Uint64(),
})
class UnsignedLongLong extends AbiSpecificInteger {
const UnsignedLongLong();
}
/// The C `intptr_t` type.
///
/// The [IntPtr] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int32(),
Abi.androidArm64: Int64(),
Abi.androidIA32: Int32(),
Abi.androidX64: Int64(),
Abi.fuchsiaArm64: Int64(),
Abi.fuchsiaX64: Int64(),
Abi.iosArm: Int32(),
Abi.iosArm64: Int64(),
Abi.iosX64: Int64(),
Abi.linuxArm: Int32(),
Abi.linuxArm64: Int64(),
Abi.linuxIA32: Int32(),
Abi.linuxX64: Int64(),
Abi.linuxRiscv32: Int32(),
Abi.linuxRiscv64: Int64(),
Abi.macosArm64: Int64(),
Abi.macosX64: Int64(),
Abi.windowsArm64: Int64(),
Abi.windowsIA32: Int32(),
Abi.windowsX64: Int64(),
})
class IntPtr extends AbiSpecificInteger {
const IntPtr();
}
/// The C `uintptr_t` type.
///
/// The [UintPtr] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint64(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint64(),
})
class UintPtr extends AbiSpecificInteger {
const UintPtr();
}
/// The C `size_t` type.
///
/// The [Size] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint64(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint64(),
})
class Size extends AbiSpecificInteger {
const Size();
}
/// The C `wchar_t` type.
///
/// The signedness of `wchar_t` is undefined in C. Here, it is exposed as the
/// defaults on the tested [Abi]s.
///
/// The [WChar] type is a native type, and should not be constructed in
/// Dart code.
/// It occurs only in native type signatures and as annotation on [Struct] and
/// [Union] fields.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint32(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint32(),
Abi.fuchsiaArm64: Uint32(),
Abi.fuchsiaX64: Int32(),
Abi.iosArm: Int32(),
Abi.iosArm64: Int32(),
Abi.iosX64: Int32(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint32(),
Abi.linuxIA32: Int32(),
Abi.linuxX64: Int32(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint32(),
Abi.macosArm64: Int32(),
Abi.macosX64: Int32(),
Abi.windowsArm64: Uint16(),
Abi.windowsIA32: Uint16(),
Abi.windowsX64: Uint16(),
})
class WChar extends AbiSpecificInteger {
const WChar();
}

View file

@ -20,7 +20,6 @@ part 'abi_specific.dart';
part 'native_type.dart';
part 'allocation.dart';
part 'annotations.dart';
part 'c_type.dart';
part 'dynamic_library.dart';
part 'struct.dart';
part 'union.dart';

View file

@ -98,6 +98,36 @@ class Uint64 extends _NativeInteger {
const Uint64();
}
/// Represents a native pointer-sized integer in C.
///
/// [IntPtr] is not constructible in the Dart code and serves purely as marker
/// in type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int32(),
Abi.androidArm64: Int64(),
Abi.androidIA32: Int32(),
Abi.androidX64: Int64(),
Abi.fuchsiaArm64: Int64(),
Abi.fuchsiaX64: Int64(),
Abi.iosArm: Int32(),
Abi.iosArm64: Int64(),
Abi.iosX64: Int64(),
Abi.linuxArm: Int32(),
Abi.linuxArm64: Int64(),
Abi.linuxIA32: Int32(),
Abi.linuxX64: Int64(),
Abi.linuxRiscv32: Int32(),
Abi.linuxRiscv64: Int64(),
Abi.macosArm64: Int64(),
Abi.macosX64: Int64(),
Abi.windowsArm64: Int64(),
Abi.windowsIA32: Int32(),
Abi.windowsX64: Int64(),
})
class IntPtr extends AbiSpecificInteger {
const IntPtr();
}
/// Represents a native 32 bit float in C.
///
/// [Float] is not constructible in the Dart code and serves purely as marker

View file

@ -8,6 +8,8 @@ import 'dart:io';
import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';
import 'abi_specific_ints.dart';
void main() {
testSizeOf();
testStoreLoad();

View file

@ -0,0 +1,145 @@
// 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.
import 'dart:ffi';
// TODO(dacoharkes): These should move to `package:ffi`.
// `int` in C.
typedef Int = Int32;
// `unsigned int` in C.
typedef UnsignedInt = Uint32;
// `size_t` in C.
typedef Size = UintPtr;
// `ssize_t` in C.
typedef SSize = IntPtr;
// `off_t` in C.
typedef Off = Long;
/// Represents a native unsigned pointer-sized integer in C.
///
/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint64(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint64(),
})
class UintPtr extends AbiSpecificInteger {
const UintPtr();
}
/// `long` in C.
///
/// [Long] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int32(),
Abi.androidArm64: Int64(),
Abi.androidIA32: Int32(),
Abi.androidX64: Int64(),
Abi.fuchsiaArm64: Int64(),
Abi.fuchsiaX64: Int64(),
Abi.iosArm: Int32(),
Abi.iosArm64: Int64(),
Abi.iosX64: Int64(),
Abi.linuxArm: Int32(),
Abi.linuxArm64: Int64(),
Abi.linuxIA32: Int32(),
Abi.linuxX64: Int64(),
Abi.linuxRiscv32: Int32(),
Abi.linuxRiscv64: Int64(),
Abi.macosArm64: Int64(),
Abi.macosX64: Int64(),
Abi.windowsArm64: Int32(),
Abi.windowsIA32: Int32(),
Abi.windowsX64: Int32(),
})
class Long extends AbiSpecificInteger {
const Long();
}
/// `unsigned long` in C.
///
/// [UnsignedLong] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint32(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint32(),
})
class UnsignedLong extends AbiSpecificInteger {
const UnsignedLong();
}
/// `wchar_t` in C.
///
/// The signedness of `wchar_t` is undefined in C. Here, it is exposed as an
/// unsigned integer.
///
/// [WChar] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint32(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint32(),
Abi.fuchsiaArm64: Uint32(),
Abi.fuchsiaX64: Uint32(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint32(),
Abi.iosX64: Uint32(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint32(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint32(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint32(),
Abi.macosArm64: Uint32(),
Abi.macosX64: Uint32(),
Abi.windowsArm64: Uint16(),
Abi.windowsIA32: Uint16(),
Abi.windowsX64: Uint16(),
})
class WChar extends AbiSpecificInteger {
const WChar();
}

View file

@ -7,11 +7,11 @@
// SharedObjects=ffi_test_functions
import 'dart:ffi';
import "package:expect/expect.dart";
import 'dart:io' show Platform;
import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';
import 'abi_specific_ints.dart';
import 'ffi_test_helpers.dart';
void main() {
@ -20,162 +20,62 @@ void main() {
testIntAssumptions();
testSizeTAssumptions();
testLongAssumptions();
testOffTAssumptions();
testWCharTAssumptions();
}
class CType {
final int ffiSize;
final int Function(Pointer)? ffiLoad;
final String modifier;
final String type;
final String type2;
CType(this.ffiSize, this.type,
{this.type2 = '', this.modifier = '', this.ffiLoad});
CType(this.ffiSize, this.type, [this.modifier = ""]);
String get cRepresentation => '$modifier $type $type2'.trim();
String get cRepresentation => "$modifier $type".trim();
String get _getSizeName => 'FfiSizeOf_$modifier\_$type\_$type2';
String get _getSignName => 'FfiSignOf_$modifier\_$type\_$type2';
String get _getSizeName => "FfiSizeOf_$modifier\_$type";
int Function() get sizeFunction => ffiTestFunctions
.lookupFunction<Uint64 Function(), int Function()>(_getSizeName);
int Function() get signFunction => ffiTestFunctions
.lookupFunction<Uint64 Function(), int Function()>(_getSignName);
int get size => sizeFunction();
bool get isSigned => signFunction() != 0;
bool? get ffiIsSigned {
final ffiLoad_ = ffiLoad;
if (ffiLoad_ == null) {
return null;
}
assert(size < 8);
return using((Arena arena) {
final p = arena<Int64>()..value = -1;
return ffiLoad_(p) < 0;
});
}
String toString() => cRepresentation;
}
final char = CType(
sizeOf<Char>(),
'char',
ffiLoad: (Pointer p) => p.cast<Char>().value,
);
final uchar = CType(
sizeOf<UnsignedChar>(),
'char',
modifier: 'unsigned',
ffiLoad: (Pointer p) => p.cast<UnsignedChar>().value,
);
final schar = CType(
sizeOf<SignedChar>(),
'char',
modifier: 'signed',
ffiLoad: (Pointer p) => p.cast<SignedChar>().value,
);
final short = CType(
sizeOf<Short>(),
'short',
ffiLoad: (Pointer p) => p.cast<Short>().value,
);
final ushort = CType(
sizeOf<UnsignedShort>(),
'short',
modifier: 'unsigned',
ffiLoad: (Pointer p) => p.cast<UnsignedShort>().value,
);
final int_ = CType(
sizeOf<Int>(),
'int',
ffiLoad: (Pointer p) => p.cast<Int>().value,
);
final uint = CType(
sizeOf<UnsignedInt>(),
'int',
modifier: 'unsigned',
ffiLoad: (Pointer p) => p.cast<UnsignedInt>().value,
);
final long = CType(
sizeOf<Long>(),
'long',
);
final ulong = CType(
sizeOf<UnsignedLong>(),
'long',
modifier: 'unsigned',
);
final longlong = CType(
sizeOf<LongLong>(),
'long',
type2: 'long',
);
final ulonglong = CType(
sizeOf<UnsignedLongLong>(),
'long',
type2: 'long',
modifier: 'unsigned',
);
final intptr_t = CType(
sizeOf<IntPtr>(),
'intptr_t',
);
final uintptr_t = CType(
sizeOf<UintPtr>(),
'uintptr_t',
);
final size_t = CType(
sizeOf<Size>(),
'size_t',
);
final wchar_t = CType(
sizeOf<WChar>(),
'wchar_t',
ffiLoad: (Pointer p) => p.cast<WChar>().value,
);
final intptr_t = CType(sizeOf<IntPtr>(), "intptr_t");
final uintptr_t = CType(sizeOf<UintPtr>(), "uintptr_t");
final int_ = CType(sizeOf<Int>(), "int");
final uint = CType(sizeOf<UnsignedInt>(), "int", "unsigned");
final long = CType(sizeOf<Long>(), "long");
final ulong = CType(sizeOf<UnsignedLong>(), "long", "unsigned");
final wchar_t = CType(sizeOf<WChar>(), "wchar_t");
final size_t = CType(sizeOf<Size>(), "size_t");
final ssize_t = CType(sizeOf<SSize>(), "ssize_t");
final off_t = CType(sizeOf<Off>(), "off_t");
final cTypes = [
char,
uchar,
schar,
short,
ushort,
intptr_t,
uintptr_t,
int_,
uint,
long,
ulong,
longlong,
ulonglong,
intptr_t,
uintptr_t,
size_t,
wchar_t,
size_t,
ssize_t,
off_t
];
void printSizes() {
cTypes.forEach((element) {
final cName = element.cRepresentation.padRight(20);
final size = element.size;
final signed = element.isSigned ? 'signed' : 'unsigned';
print('$cName: $size $signed');
print("${element.cRepresentation.padRight(20)}: ${element.size}");
});
}
void testSizes() {
cTypes.forEach((element) {
print(element);
Expect.equals(element.size, element.ffiSize);
final ffiIsSigned = element.ffiIsSigned;
if (ffiIsSigned != null) {
Expect.equals(element.isSigned, ffiIsSigned);
}
});
}
@ -186,6 +86,7 @@ void testIntAssumptions() {
void testSizeTAssumptions() {
Expect.equals(intptr_t.size, size_t.size);
Expect.equals(intptr_t.size, ssize_t.size);
}
void testLongAssumptions() {
@ -198,9 +99,13 @@ void testLongAssumptions() {
}
}
void testOffTAssumptions() {
Expect.equals(long.size, off_t.size);
}
void testWCharTAssumptions() {
final bool isSigned = wchar_t.isSigned;
print('wchar_t isSigned $isSigned');
final bool isSigned = wCharMinValue() != 0;
print("wchar_t isSigned $isSigned");
if (Platform.isWindows) {
Expect.equals(2, wchar_t.size);
if (isSigned) {

View file

@ -16,6 +16,9 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'callback_tests_utils.dart';
import 'dylib_utils.dart';

View file

@ -7,6 +7,9 @@
import 'dart:ffi';
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
class Struct1ByteBool extends Struct {
@Bool()
external bool a0;

View file

@ -16,6 +16,9 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'dylib_utils.dart';
// Reuse the compound classes.

View file

@ -16,6 +16,9 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'dylib_utils.dart';
// Reuse the compound classes.

View file

@ -922,6 +922,8 @@ $dartVersion
import 'dart:ffi';
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
""";
}
@ -965,6 +967,8 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'dylib_utils.dart';
@ -1025,6 +1029,8 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'callback_tests_utils.dart';

View file

@ -10,6 +10,8 @@ import 'dart:io';
import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';
import 'abi_specific_ints.dart';
void main() {
testSizeOf();
testStoreLoad();

View file

@ -0,0 +1,132 @@
// 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.
// @dart = 2.9
import 'dart:ffi';
// TODO(dacoharkes): These should move to `package:ffi`.
/// Represents a native unsigned pointer-sized integer in C.
///
/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint64(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint64(),
})
class UintPtr extends AbiSpecificInteger {
const UintPtr();
}
/// `long` in C.
///
/// [Long] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Int32(),
Abi.androidArm64: Int64(),
Abi.androidIA32: Int32(),
Abi.androidX64: Int64(),
Abi.fuchsiaArm64: Int64(),
Abi.fuchsiaX64: Int64(),
Abi.iosArm: Int32(),
Abi.iosArm64: Int64(),
Abi.iosX64: Int64(),
Abi.linuxArm: Int32(),
Abi.linuxArm64: Int64(),
Abi.linuxIA32: Int32(),
Abi.linuxX64: Int64(),
Abi.linuxRiscv32: Int32(),
Abi.linuxRiscv64: Int64(),
Abi.macosArm64: Int64(),
Abi.macosX64: Int64(),
Abi.windowsArm64: Int32(),
Abi.windowsIA32: Int32(),
Abi.windowsX64: Int32(),
})
class Long extends AbiSpecificInteger {
const Long();
}
/// `unsigned long` in C.
///
/// [UnsignedLong] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint64(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint64(),
Abi.fuchsiaArm64: Uint64(),
Abi.fuchsiaX64: Uint64(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint64(),
Abi.iosX64: Uint64(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint64(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint64(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint64(),
Abi.macosArm64: Uint64(),
Abi.macosX64: Uint64(),
Abi.windowsArm64: Uint32(),
Abi.windowsIA32: Uint32(),
Abi.windowsX64: Uint32(),
})
class UnsignedLong extends AbiSpecificInteger {
const UnsignedLong();
}
/// `wchar_t` in C.
///
/// The signedness of `wchar_t` is undefined in C. Here, it is exposed as an
/// unsigned integer.
///
/// [WChar] is not constructible in the Dart code and serves purely as marker in
/// type signatures.
@AbiSpecificIntegerMapping({
Abi.androidArm: Uint32(),
Abi.androidArm64: Uint32(),
Abi.androidIA32: Uint32(),
Abi.androidX64: Uint32(),
Abi.fuchsiaArm64: Uint32(),
Abi.fuchsiaX64: Uint32(),
Abi.iosArm: Uint32(),
Abi.iosArm64: Uint32(),
Abi.iosX64: Uint32(),
Abi.linuxArm: Uint32(),
Abi.linuxArm64: Uint32(),
Abi.linuxIA32: Uint32(),
Abi.linuxX64: Uint32(),
Abi.linuxRiscv32: Uint32(),
Abi.linuxRiscv64: Uint32(),
Abi.macosArm64: Uint32(),
Abi.macosX64: Uint32(),
Abi.windowsArm64: Uint16(),
Abi.windowsIA32: Uint16(),
Abi.windowsX64: Uint16(),
})
class WChar extends AbiSpecificInteger {
const WChar();
}

View file

@ -9,187 +9,65 @@
// @dart = 2.9
import 'dart:ffi';
import "package:expect/expect.dart";
import 'dart:io' show Platform;
import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';
import 'abi_specific_ints.dart';
import 'ffi_test_helpers.dart';
void main() {
printSizes();
testSizes();
testIntAssumptions();
testSizeTAssumptions();
testLongAssumptions();
testWCharTAssumptions();
}
class CType {
final int ffiSize;
final int Function(Pointer) ffiLoad;
final String modifier;
final String type;
final String type2;
CType(this.ffiSize, this.type,
{this.type2 = '', this.modifier = '', this.ffiLoad});
CType(this.ffiSize, this.type, [this.modifier = ""]);
String get cRepresentation => '$modifier $type $type2'.trim();
String get cRepresentation => "$modifier $type".trim();
String get _getSizeName => 'FfiSizeOf_$modifier\_$type\_$type2';
String get _getSignName => 'FfiSignOf_$modifier\_$type\_$type2';
String get _getSizeName => "FfiSizeOf_$modifier\_$type";
int Function() get sizeFunction => ffiTestFunctions
.lookupFunction<Uint64 Function(), int Function()>(_getSizeName);
int Function() get signFunction => ffiTestFunctions
.lookupFunction<Uint64 Function(), int Function()>(_getSignName);
int get size => sizeFunction();
bool get isSigned => signFunction() != 0;
bool get ffiIsSigned {
final ffiLoad_ = ffiLoad;
if (ffiLoad_ == null) {
return null;
}
assert(size < 8);
return using((Arena arena) {
final p = arena<Int64>()..value = -1;
return ffiLoad_(p) < 0;
});
}
String toString() => cRepresentation;
}
final char = CType(
sizeOf<Char>(),
'char',
ffiLoad: (Pointer p) => p.cast<Char>().value,
);
final uchar = CType(
sizeOf<UnsignedChar>(),
'char',
modifier: 'unsigned',
ffiLoad: (Pointer p) => p.cast<UnsignedChar>().value,
);
final schar = CType(
sizeOf<SignedChar>(),
'char',
modifier: 'signed',
ffiLoad: (Pointer p) => p.cast<SignedChar>().value,
);
final short = CType(
sizeOf<Short>(),
'short',
ffiLoad: (Pointer p) => p.cast<Short>().value,
);
final ushort = CType(
sizeOf<UnsignedShort>(),
'short',
modifier: 'unsigned',
ffiLoad: (Pointer p) => p.cast<UnsignedShort>().value,
);
final int_ = CType(
sizeOf<Int>(),
'int',
ffiLoad: (Pointer p) => p.cast<Int>().value,
);
final uint = CType(
sizeOf<UnsignedInt>(),
'int',
modifier: 'unsigned',
ffiLoad: (Pointer p) => p.cast<UnsignedInt>().value,
);
final long = CType(
sizeOf<Long>(),
'long',
);
final ulong = CType(
sizeOf<UnsignedLong>(),
'long',
modifier: 'unsigned',
);
final longlong = CType(
sizeOf<LongLong>(),
'long',
type2: 'long',
);
final ulonglong = CType(
sizeOf<UnsignedLongLong>(),
'long',
type2: 'long',
modifier: 'unsigned',
);
final intptr_t = CType(
sizeOf<IntPtr>(),
'intptr_t',
);
final uintptr_t = CType(
sizeOf<UintPtr>(),
'uintptr_t',
);
final size_t = CType(
sizeOf<Size>(),
'size_t',
);
final wchar_t = CType(
sizeOf<WChar>(),
'wchar_t',
ffiLoad: (Pointer p) => p.cast<WChar>().value,
);
final intptr_t = CType(sizeOf<IntPtr>(), "intptr_t");
final uintptr_t = CType(sizeOf<UintPtr>(), "uintptr_t");
final long = CType(sizeOf<Long>(), "long");
final ulong = CType(sizeOf<UnsignedLong>(), "long", "unsigned");
final wchar_t = CType(sizeOf<WChar>(), "wchar_t");
final cTypes = [
char,
uchar,
schar,
short,
ushort,
int_,
uint,
long,
ulong,
longlong,
ulonglong,
intptr_t,
uintptr_t,
size_t,
long,
ulong,
wchar_t,
];
void printSizes() {
cTypes.forEach((element) {
final cName = element.cRepresentation.padRight(20);
final size = element.size;
final signed = element.isSigned ? 'signed' : 'unsigned';
print('$cName: $size $signed');
print("${element.cRepresentation.padRight(20)}: ${element.size}");
});
}
void testSizes() {
cTypes.forEach((element) {
print(element);
Expect.equals(element.size, element.ffiSize);
final ffiIsSigned = element.ffiIsSigned;
if (ffiIsSigned != null) {
Expect.equals(element.isSigned, ffiIsSigned);
}
});
}
void testIntAssumptions() {
Expect.equals(4, int_.size);
Expect.equals(4, uint.size);
}
void testSizeTAssumptions() {
Expect.equals(intptr_t.size, size_t.size);
}
void testLongAssumptions() {
if (Platform.isWindows) {
Expect.equals(4, long.size);
@ -201,8 +79,8 @@ void testLongAssumptions() {
}
void testWCharTAssumptions() {
final bool isSigned = wchar_t.isSigned;
print('wchar_t isSigned $isSigned');
final bool isSigned = wCharMinValue() != 0;
print("wchar_t isSigned $isSigned");
if (Platform.isWindows) {
Expect.equals(2, wchar_t.size);
if (isSigned) {

View file

@ -18,6 +18,9 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'callback_tests_utils.dart';
import 'dylib_utils.dart';

View file

@ -9,6 +9,9 @@
import 'dart:ffi';
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
class Struct1ByteBool extends Struct {
@Bool()
bool a0;

View file

@ -18,6 +18,9 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'dylib_utils.dart';
// Reuse the compound classes.

View file

@ -18,6 +18,9 @@ import 'dart:ffi';
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
// Reuse the AbiSpecificInts.
import 'abi_specific_ints.dart';
import 'dylib_utils.dart';
// Reuse the compound classes.