mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 09:58:32 +00:00
4b66657b98
During FFI leaf calls, the Dart GC will not run. This means that we can pass pointers into `TypedData` to FFI calls that take `Pointer` arguments. After this CL, we have three types of arguments that can flow into `Pointer` argument in an FFI call: * `Pointer`. * `TypedData`: Any typed data including views. * `_Compound`: A TypedData/Pointer and an offset in bytes. The is only possible for `@Native external` functions, `asFunction` does not support passing in `TypedData`. (See related GitHub issues for discussion. TLDR: FFIgen should generate bindings without config.) `.address` expressions on `TypedData` and `Array` elements do _not_ introduce bounds checks, even though `TypedData` and `Array` have bounds information. E.g. `ffiNative(Uint8List(10)[20].address)` does not throw. Implementation details: The CFE analyzes call-sites to `@Native external` functions. If the arguments are `.address` expressions, it transforms the call site to pass the compound or `TypedData`. If an additional offset needs to be applied, the CFE constructs a new `_Compound` with the correct offset in bytes. The CFE then also creates a new `@Native external` function which have `TypedData`s and `_Compound`s parameters. To avoid name clashes, these functions are postfixed with `#` and `P`, `T`, or `C` for each Pointer parameter. TEST=pkg/vm/testcases/transformations/ffi/address_of_* In the VM, `TypedData` arguments are passed as tagged values, and the address is loaded inside the `FfiCallInstr`. `_Compound` arguments turn into two IL definitions, one for the `TypedDataBase` (tagged), and one for the offset in bytes (unboxed). The address is then loaded inside the `FfiCallInstr` and the offset in bytes is applied. Adding the offset in bytes required an extra temp register for ia32. Also, it uncovered that the temp register in arm32 was conflicting with the argument registers. However, TMP should suffice instead. TEST=tests/ffi/address_of_array_generated_test.dart TEST=tests/ffi/address_of_struct_generated_test.dart TEST=tests/ffi/address_of_typeddata_generated_test.dart Closes: https://github.com/dart-lang/sdk/issues/44589 Closes: https://github.com/dart-lang/sdk/issues/54771 CoreLibraryReviewExempt: VM only, unsupported in dart2wasm Change-Id: I01fb428cfd6f9096a34689c2819c124a8003cb6b Cq-Include-Trybots: dart/try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64c-try,vm-aot-win-release-x64-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-arm64-try,vm-win-debug-x64-try,vm-win-debug-x64c-try,vm-win-release-ia32-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/360882 Reviewed-by: Jens Johansen <jensj@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Tess Strickland <sstrickl@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com>
756 lines
19 KiB
Dart
756 lines
19 KiB
Dart
// Copyright (c) 2024, 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 file has been automatically generated. Please do not edit it manually.
|
|
// Generated by tests/ffi/generator/address_of_test_generator.dart.
|
|
//
|
|
// SharedObjects=ffi_test_functions
|
|
// VMOptions=
|
|
// VMOptions=--deterministic --optimization-counter-threshold=90
|
|
// VMOptions=--use-slow-path
|
|
// VMOptions=--use-slow-path --stacktrace-every=100
|
|
|
|
// ignore_for_file: unused_import
|
|
|
|
import 'dart:ffi';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:expect/expect.dart';
|
|
|
|
import 'address_of_generated_shared.dart';
|
|
import 'address_of_shared.dart';
|
|
import 'dylib_utils.dart';
|
|
|
|
final ffiTestFunctions = dlopenPlatformSpecific('ffi_test_functions');
|
|
|
|
@Native<Int8 Function(Pointer<Int8>, Size)>(
|
|
symbol: 'TakeInt8Pointer', isLeaf: true)
|
|
external int takeInt8Pointer(Pointer<Int8> pointer, int length);
|
|
|
|
@Native<
|
|
Int8 Function(
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
Pointer<Int8>,
|
|
)>(symbol: 'TakeInt8PointerMany', isLeaf: true)
|
|
external int takeInt8PointerMany(
|
|
Pointer<Int8> pointer0,
|
|
Pointer<Int8> pointer1,
|
|
Pointer<Int8> pointer2,
|
|
Pointer<Int8> pointer3,
|
|
Pointer<Int8> pointer4,
|
|
Pointer<Int8> pointer5,
|
|
Pointer<Int8> pointer6,
|
|
Pointer<Int8> pointer7,
|
|
Pointer<Int8> pointer8,
|
|
Pointer<Int8> pointer9,
|
|
Pointer<Int8> pointer10,
|
|
Pointer<Int8> pointer11,
|
|
Pointer<Int8> pointer12,
|
|
Pointer<Int8> pointer13,
|
|
Pointer<Int8> pointer14,
|
|
Pointer<Int8> pointer15,
|
|
Pointer<Int8> pointer16,
|
|
Pointer<Int8> pointer17,
|
|
Pointer<Int8> pointer18,
|
|
Pointer<Int8> pointer19,
|
|
);
|
|
|
|
Int8List makeInt8List(int length) {
|
|
final typedData = Int8List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultInt8(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Int16 Function(Pointer<Int16>, Size)>(
|
|
symbol: 'TakeInt16Pointer', isLeaf: true)
|
|
external int takeInt16Pointer(Pointer<Int16> pointer, int length);
|
|
|
|
@Native<
|
|
Int16 Function(
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
Pointer<Int16>,
|
|
)>(symbol: 'TakeInt16PointerMany', isLeaf: true)
|
|
external int takeInt16PointerMany(
|
|
Pointer<Int16> pointer0,
|
|
Pointer<Int16> pointer1,
|
|
Pointer<Int16> pointer2,
|
|
Pointer<Int16> pointer3,
|
|
Pointer<Int16> pointer4,
|
|
Pointer<Int16> pointer5,
|
|
Pointer<Int16> pointer6,
|
|
Pointer<Int16> pointer7,
|
|
Pointer<Int16> pointer8,
|
|
Pointer<Int16> pointer9,
|
|
Pointer<Int16> pointer10,
|
|
Pointer<Int16> pointer11,
|
|
Pointer<Int16> pointer12,
|
|
Pointer<Int16> pointer13,
|
|
Pointer<Int16> pointer14,
|
|
Pointer<Int16> pointer15,
|
|
Pointer<Int16> pointer16,
|
|
Pointer<Int16> pointer17,
|
|
Pointer<Int16> pointer18,
|
|
Pointer<Int16> pointer19,
|
|
);
|
|
|
|
Int16List makeInt16List(int length) {
|
|
final typedData = Int16List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultInt16(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Int32 Function(Pointer<Int32>, Size)>(
|
|
symbol: 'TakeInt32Pointer', isLeaf: true)
|
|
external int takeInt32Pointer(Pointer<Int32> pointer, int length);
|
|
|
|
@Native<
|
|
Int32 Function(
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
Pointer<Int32>,
|
|
)>(symbol: 'TakeInt32PointerMany', isLeaf: true)
|
|
external int takeInt32PointerMany(
|
|
Pointer<Int32> pointer0,
|
|
Pointer<Int32> pointer1,
|
|
Pointer<Int32> pointer2,
|
|
Pointer<Int32> pointer3,
|
|
Pointer<Int32> pointer4,
|
|
Pointer<Int32> pointer5,
|
|
Pointer<Int32> pointer6,
|
|
Pointer<Int32> pointer7,
|
|
Pointer<Int32> pointer8,
|
|
Pointer<Int32> pointer9,
|
|
Pointer<Int32> pointer10,
|
|
Pointer<Int32> pointer11,
|
|
Pointer<Int32> pointer12,
|
|
Pointer<Int32> pointer13,
|
|
Pointer<Int32> pointer14,
|
|
Pointer<Int32> pointer15,
|
|
Pointer<Int32> pointer16,
|
|
Pointer<Int32> pointer17,
|
|
Pointer<Int32> pointer18,
|
|
Pointer<Int32> pointer19,
|
|
);
|
|
|
|
Int32List makeInt32List(int length) {
|
|
final typedData = Int32List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultInt32(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Int64 Function(Pointer<Int64>, Size)>(
|
|
symbol: 'TakeInt64Pointer', isLeaf: true)
|
|
external int takeInt64Pointer(Pointer<Int64> pointer, int length);
|
|
|
|
@Native<
|
|
Int64 Function(
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
Pointer<Int64>,
|
|
)>(symbol: 'TakeInt64PointerMany', isLeaf: true)
|
|
external int takeInt64PointerMany(
|
|
Pointer<Int64> pointer0,
|
|
Pointer<Int64> pointer1,
|
|
Pointer<Int64> pointer2,
|
|
Pointer<Int64> pointer3,
|
|
Pointer<Int64> pointer4,
|
|
Pointer<Int64> pointer5,
|
|
Pointer<Int64> pointer6,
|
|
Pointer<Int64> pointer7,
|
|
Pointer<Int64> pointer8,
|
|
Pointer<Int64> pointer9,
|
|
Pointer<Int64> pointer10,
|
|
Pointer<Int64> pointer11,
|
|
Pointer<Int64> pointer12,
|
|
Pointer<Int64> pointer13,
|
|
Pointer<Int64> pointer14,
|
|
Pointer<Int64> pointer15,
|
|
Pointer<Int64> pointer16,
|
|
Pointer<Int64> pointer17,
|
|
Pointer<Int64> pointer18,
|
|
Pointer<Int64> pointer19,
|
|
);
|
|
|
|
Int64List makeInt64List(int length) {
|
|
final typedData = Int64List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultInt64(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i % 2 == 0 ? i : -i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Uint8 Function(Pointer<Uint8>, Size)>(
|
|
symbol: 'TakeUint8Pointer', isLeaf: true)
|
|
external int takeUint8Pointer(Pointer<Uint8> pointer, int length);
|
|
|
|
@Native<
|
|
Uint8 Function(
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
Pointer<Uint8>,
|
|
)>(symbol: 'TakeUint8PointerMany', isLeaf: true)
|
|
external int takeUint8PointerMany(
|
|
Pointer<Uint8> pointer0,
|
|
Pointer<Uint8> pointer1,
|
|
Pointer<Uint8> pointer2,
|
|
Pointer<Uint8> pointer3,
|
|
Pointer<Uint8> pointer4,
|
|
Pointer<Uint8> pointer5,
|
|
Pointer<Uint8> pointer6,
|
|
Pointer<Uint8> pointer7,
|
|
Pointer<Uint8> pointer8,
|
|
Pointer<Uint8> pointer9,
|
|
Pointer<Uint8> pointer10,
|
|
Pointer<Uint8> pointer11,
|
|
Pointer<Uint8> pointer12,
|
|
Pointer<Uint8> pointer13,
|
|
Pointer<Uint8> pointer14,
|
|
Pointer<Uint8> pointer15,
|
|
Pointer<Uint8> pointer16,
|
|
Pointer<Uint8> pointer17,
|
|
Pointer<Uint8> pointer18,
|
|
Pointer<Uint8> pointer19,
|
|
);
|
|
|
|
Uint8List makeUint8List(int length) {
|
|
final typedData = Uint8List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultUint8(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Uint16 Function(Pointer<Uint16>, Size)>(
|
|
symbol: 'TakeUint16Pointer', isLeaf: true)
|
|
external int takeUint16Pointer(Pointer<Uint16> pointer, int length);
|
|
|
|
@Native<
|
|
Uint16 Function(
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
Pointer<Uint16>,
|
|
)>(symbol: 'TakeUint16PointerMany', isLeaf: true)
|
|
external int takeUint16PointerMany(
|
|
Pointer<Uint16> pointer0,
|
|
Pointer<Uint16> pointer1,
|
|
Pointer<Uint16> pointer2,
|
|
Pointer<Uint16> pointer3,
|
|
Pointer<Uint16> pointer4,
|
|
Pointer<Uint16> pointer5,
|
|
Pointer<Uint16> pointer6,
|
|
Pointer<Uint16> pointer7,
|
|
Pointer<Uint16> pointer8,
|
|
Pointer<Uint16> pointer9,
|
|
Pointer<Uint16> pointer10,
|
|
Pointer<Uint16> pointer11,
|
|
Pointer<Uint16> pointer12,
|
|
Pointer<Uint16> pointer13,
|
|
Pointer<Uint16> pointer14,
|
|
Pointer<Uint16> pointer15,
|
|
Pointer<Uint16> pointer16,
|
|
Pointer<Uint16> pointer17,
|
|
Pointer<Uint16> pointer18,
|
|
Pointer<Uint16> pointer19,
|
|
);
|
|
|
|
Uint16List makeUint16List(int length) {
|
|
final typedData = Uint16List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultUint16(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Uint32 Function(Pointer<Uint32>, Size)>(
|
|
symbol: 'TakeUint32Pointer', isLeaf: true)
|
|
external int takeUint32Pointer(Pointer<Uint32> pointer, int length);
|
|
|
|
@Native<
|
|
Uint32 Function(
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
Pointer<Uint32>,
|
|
)>(symbol: 'TakeUint32PointerMany', isLeaf: true)
|
|
external int takeUint32PointerMany(
|
|
Pointer<Uint32> pointer0,
|
|
Pointer<Uint32> pointer1,
|
|
Pointer<Uint32> pointer2,
|
|
Pointer<Uint32> pointer3,
|
|
Pointer<Uint32> pointer4,
|
|
Pointer<Uint32> pointer5,
|
|
Pointer<Uint32> pointer6,
|
|
Pointer<Uint32> pointer7,
|
|
Pointer<Uint32> pointer8,
|
|
Pointer<Uint32> pointer9,
|
|
Pointer<Uint32> pointer10,
|
|
Pointer<Uint32> pointer11,
|
|
Pointer<Uint32> pointer12,
|
|
Pointer<Uint32> pointer13,
|
|
Pointer<Uint32> pointer14,
|
|
Pointer<Uint32> pointer15,
|
|
Pointer<Uint32> pointer16,
|
|
Pointer<Uint32> pointer17,
|
|
Pointer<Uint32> pointer18,
|
|
Pointer<Uint32> pointer19,
|
|
);
|
|
|
|
Uint32List makeUint32List(int length) {
|
|
final typedData = Uint32List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultUint32(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Uint64 Function(Pointer<Uint64>, Size)>(
|
|
symbol: 'TakeUint64Pointer', isLeaf: true)
|
|
external int takeUint64Pointer(Pointer<Uint64> pointer, int length);
|
|
|
|
@Native<
|
|
Uint64 Function(
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
Pointer<Uint64>,
|
|
)>(symbol: 'TakeUint64PointerMany', isLeaf: true)
|
|
external int takeUint64PointerMany(
|
|
Pointer<Uint64> pointer0,
|
|
Pointer<Uint64> pointer1,
|
|
Pointer<Uint64> pointer2,
|
|
Pointer<Uint64> pointer3,
|
|
Pointer<Uint64> pointer4,
|
|
Pointer<Uint64> pointer5,
|
|
Pointer<Uint64> pointer6,
|
|
Pointer<Uint64> pointer7,
|
|
Pointer<Uint64> pointer8,
|
|
Pointer<Uint64> pointer9,
|
|
Pointer<Uint64> pointer10,
|
|
Pointer<Uint64> pointer11,
|
|
Pointer<Uint64> pointer12,
|
|
Pointer<Uint64> pointer13,
|
|
Pointer<Uint64> pointer14,
|
|
Pointer<Uint64> pointer15,
|
|
Pointer<Uint64> pointer16,
|
|
Pointer<Uint64> pointer17,
|
|
Pointer<Uint64> pointer18,
|
|
Pointer<Uint64> pointer19,
|
|
);
|
|
|
|
Uint64List makeUint64List(int length) {
|
|
final typedData = Uint64List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = i;
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
int makeExpectedResultUint64(int start, int end) {
|
|
int expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = i;
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Float Function(Pointer<Float>, Size)>(
|
|
symbol: 'TakeFloatPointer', isLeaf: true)
|
|
external double takeFloatPointer(Pointer<Float> pointer, int length);
|
|
|
|
@Native<
|
|
Float Function(
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
Pointer<Float>,
|
|
)>(symbol: 'TakeFloatPointerMany', isLeaf: true)
|
|
external double takeFloatPointerMany(
|
|
Pointer<Float> pointer0,
|
|
Pointer<Float> pointer1,
|
|
Pointer<Float> pointer2,
|
|
Pointer<Float> pointer3,
|
|
Pointer<Float> pointer4,
|
|
Pointer<Float> pointer5,
|
|
Pointer<Float> pointer6,
|
|
Pointer<Float> pointer7,
|
|
Pointer<Float> pointer8,
|
|
Pointer<Float> pointer9,
|
|
Pointer<Float> pointer10,
|
|
Pointer<Float> pointer11,
|
|
Pointer<Float> pointer12,
|
|
Pointer<Float> pointer13,
|
|
Pointer<Float> pointer14,
|
|
Pointer<Float> pointer15,
|
|
Pointer<Float> pointer16,
|
|
Pointer<Float> pointer17,
|
|
Pointer<Float> pointer18,
|
|
Pointer<Float> pointer19,
|
|
);
|
|
|
|
Float32List makeFloat32List(int length) {
|
|
final typedData = Float32List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = (i % 2 == 0 ? i : -i).toDouble();
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
double makeExpectedResultFloat(int start, int end) {
|
|
double expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = (i % 2 == 0 ? i : -i).toDouble();
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Double Function(Pointer<Double>, Size)>(
|
|
symbol: 'TakeDoublePointer', isLeaf: true)
|
|
external double takeDoublePointer(Pointer<Double> pointer, int length);
|
|
|
|
@Native<
|
|
Double Function(
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
Pointer<Double>,
|
|
)>(symbol: 'TakeDoublePointerMany', isLeaf: true)
|
|
external double takeDoublePointerMany(
|
|
Pointer<Double> pointer0,
|
|
Pointer<Double> pointer1,
|
|
Pointer<Double> pointer2,
|
|
Pointer<Double> pointer3,
|
|
Pointer<Double> pointer4,
|
|
Pointer<Double> pointer5,
|
|
Pointer<Double> pointer6,
|
|
Pointer<Double> pointer7,
|
|
Pointer<Double> pointer8,
|
|
Pointer<Double> pointer9,
|
|
Pointer<Double> pointer10,
|
|
Pointer<Double> pointer11,
|
|
Pointer<Double> pointer12,
|
|
Pointer<Double> pointer13,
|
|
Pointer<Double> pointer14,
|
|
Pointer<Double> pointer15,
|
|
Pointer<Double> pointer16,
|
|
Pointer<Double> pointer17,
|
|
Pointer<Double> pointer18,
|
|
Pointer<Double> pointer19,
|
|
);
|
|
|
|
Float64List makeFloat64List(int length) {
|
|
final typedData = Float64List(length);
|
|
for (int i = 0; i < length; i++) {
|
|
final value = (i % 2 == 0 ? i : -i).toDouble();
|
|
typedData[i] = value;
|
|
}
|
|
return typedData;
|
|
}
|
|
|
|
double makeExpectedResultDouble(int start, int end) {
|
|
double expectedResult = 0;
|
|
for (int i = start; i < end; i++) {
|
|
final value = (i % 2 == 0 ? i : -i).toDouble();
|
|
expectedResult += value;
|
|
}
|
|
return expectedResult;
|
|
}
|
|
|
|
@Native<Bool Function(Pointer<Bool>, Size)>(
|
|
symbol: 'TakeBoolPointer', isLeaf: true)
|
|
external bool takeBoolPointer(Pointer<Bool> pointer, int length);
|
|
|
|
@Native<
|
|
Bool Function(
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
Pointer<Bool>,
|
|
)>(symbol: 'TakeBoolPointerMany', isLeaf: true)
|
|
external bool takeBoolPointerMany(
|
|
Pointer<Bool> pointer0,
|
|
Pointer<Bool> pointer1,
|
|
Pointer<Bool> pointer2,
|
|
Pointer<Bool> pointer3,
|
|
Pointer<Bool> pointer4,
|
|
Pointer<Bool> pointer5,
|
|
Pointer<Bool> pointer6,
|
|
Pointer<Bool> pointer7,
|
|
Pointer<Bool> pointer8,
|
|
Pointer<Bool> pointer9,
|
|
Pointer<Bool> pointer10,
|
|
Pointer<Bool> pointer11,
|
|
Pointer<Bool> pointer12,
|
|
Pointer<Bool> pointer13,
|
|
Pointer<Bool> pointer14,
|
|
Pointer<Bool> pointer15,
|
|
Pointer<Bool> pointer16,
|
|
Pointer<Bool> pointer17,
|
|
Pointer<Bool> pointer18,
|
|
Pointer<Bool> pointer19,
|
|
);
|