| // Copyright (c) 2023, 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/structs_by_value_tests_generator.dart. | |
| // | |
| // SharedObjects=ffi_test_functions | |
| // VMOptions= | |
| // VMOptions=--deterministic --optimization-counter-threshold=90 | |
| // VMOptions=--use-slow-path | |
| // VMOptions=--use-slow-path --stacktrace-every=100 | |
| import 'dart:ffi'; | |
| import 'package:expect/expect.dart'; | |
| // ignore: unused_import | |
| import 'package:ffi/ffi.dart'; | |
| import 'dylib_utils.dart'; | |
| // Reuse the compound classes. | |
| import 'function_structs_by_value_generated_compounds.dart'; | |
| final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions"); | |
| void main() { | |
| for (int i = 0; i < 100; ++i) { | |
| testVariadicAt1Int64x2Leaf(); | |
| testVariadicAt1Doublex2Leaf(); | |
| testVariadicAt1Int64x5Leaf(); | |
| testVariadicAt1Doublex5Leaf(); | |
| testVariadicAt1Int64x20Leaf(); | |
| testVariadicAt1Doublex20Leaf(); | |
| testVariadicAt1Int64x2Struct8BytesIntInt64Leaf(); | |
| testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleDLeaf(); | |
| testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoubLeaf(); | |
| testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32Leaf(); | |
| testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoubLeaf(); | |
| testVariadicAt2Int32Int64IntPtrLeaf(); | |
| testVariadicAt1DoubleInt64Int32DoubleInt64Int32Leaf(); | |
| testVariadicAt1Int64Int32Struct12BytesHomogeneousFloatLeaf(); | |
| testVariadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf(); | |
| testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneouLeaf(); | |
| testVariadicAt5Doublex5Leaf(); | |
| testVariadicAt1Int64x7Struct12BytesHomogeneousInt32Leaf(); | |
| testVariadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf(); | |
| } | |
| } | |
| final variadicAt1Int64x2Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int64 Function(Int64, VarArgs<(Int64,)>), | |
| int Function(int, int) | |
| >("VariadicAt1Int64x2", isLeaf: true); | |
| /// Single variadic argument. | |
| void testVariadicAt1Int64x2Leaf() { | |
| int a0; | |
| int a1; | |
| a0 = -1; | |
| a1 = 2; | |
| final result = variadicAt1Int64x2Leaf(a0, a1); | |
| print("result = $result"); | |
| Expect.equals(1, result); | |
| } | |
| final variadicAt1Doublex2Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function(Double, VarArgs<(Double,)>), | |
| double Function(double, double) | |
| >("VariadicAt1Doublex2", isLeaf: true); | |
| /// Single variadic argument. | |
| void testVariadicAt1Doublex2Leaf() { | |
| double a0; | |
| double a1; | |
| a0 = -1.0; | |
| a1 = 2.0; | |
| final result = variadicAt1Doublex2Leaf(a0, a1); | |
| print("result = $result"); | |
| Expect.approxEquals(1.0, result); | |
| } | |
| final variadicAt1Int64x5Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int64 Function(Int64, VarArgs<(Int64, Int64, Int64, Int64)>), | |
| int Function(int, int, int, int, int) | |
| >("VariadicAt1Int64x5", isLeaf: true); | |
| /// Variadic arguments. | |
| void testVariadicAt1Int64x5Leaf() { | |
| int a0; | |
| int a1; | |
| int a2; | |
| int a3; | |
| int a4; | |
| a0 = -1; | |
| a1 = 2; | |
| a2 = -3; | |
| a3 = 4; | |
| a4 = -5; | |
| final result = variadicAt1Int64x5Leaf(a0, a1, a2, a3, a4); | |
| print("result = $result"); | |
| Expect.equals(-3, result); | |
| } | |
| final variadicAt1Doublex5Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function(Double, VarArgs<(Double, Double, Double, Double)>), | |
| double Function(double, double, double, double, double) | |
| >("VariadicAt1Doublex5", isLeaf: true); | |
| /// Variadic arguments. | |
| void testVariadicAt1Doublex5Leaf() { | |
| double a0; | |
| double a1; | |
| double a2; | |
| double a3; | |
| double a4; | |
| a0 = -1.0; | |
| a1 = 2.0; | |
| a2 = -3.0; | |
| a3 = 4.0; | |
| a4 = -5.0; | |
| final result = variadicAt1Doublex5Leaf(a0, a1, a2, a3, a4); | |
| print("result = $result"); | |
| Expect.approxEquals(-3.0, result); | |
| } | |
| final variadicAt1Int64x20Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int64 Function( | |
| Int64, | |
| VarArgs< | |
| ( | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| ) | |
| >, | |
| ), | |
| int Function( | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| ) | |
| >("VariadicAt1Int64x20", isLeaf: true); | |
| /// Variadic arguments exhaust registers. | |
| void testVariadicAt1Int64x20Leaf() { | |
| int a0; | |
| int a1; | |
| int a2; | |
| int a3; | |
| int a4; | |
| int a5; | |
| int a6; | |
| int a7; | |
| int a8; | |
| int a9; | |
| int a10; | |
| int a11; | |
| int a12; | |
| int a13; | |
| int a14; | |
| int a15; | |
| int a16; | |
| int a17; | |
| int a18; | |
| int a19; | |
| a0 = -1; | |
| a1 = 2; | |
| a2 = -3; | |
| a3 = 4; | |
| a4 = -5; | |
| a5 = 6; | |
| a6 = -7; | |
| a7 = 8; | |
| a8 = -9; | |
| a9 = 10; | |
| a10 = -11; | |
| a11 = 12; | |
| a12 = -13; | |
| a13 = 14; | |
| a14 = -15; | |
| a15 = 16; | |
| a16 = -17; | |
| a17 = 18; | |
| a18 = -19; | |
| a19 = 20; | |
| final result = variadicAt1Int64x20Leaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| a4, | |
| a5, | |
| a6, | |
| a7, | |
| a8, | |
| a9, | |
| a10, | |
| a11, | |
| a12, | |
| a13, | |
| a14, | |
| a15, | |
| a16, | |
| a17, | |
| a18, | |
| a19, | |
| ); | |
| print("result = $result"); | |
| Expect.equals(10, result); | |
| } | |
| final variadicAt1Doublex20Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function( | |
| Double, | |
| VarArgs< | |
| ( | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| ) | |
| >, | |
| ), | |
| double Function( | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| ) | |
| >("VariadicAt1Doublex20", isLeaf: true); | |
| /// Variadic arguments exhaust registers. | |
| void testVariadicAt1Doublex20Leaf() { | |
| double a0; | |
| double a1; | |
| double a2; | |
| double a3; | |
| double a4; | |
| double a5; | |
| double a6; | |
| double a7; | |
| double a8; | |
| double a9; | |
| double a10; | |
| double a11; | |
| double a12; | |
| double a13; | |
| double a14; | |
| double a15; | |
| double a16; | |
| double a17; | |
| double a18; | |
| double a19; | |
| a0 = -1.0; | |
| a1 = 2.0; | |
| a2 = -3.0; | |
| a3 = 4.0; | |
| a4 = -5.0; | |
| a5 = 6.0; | |
| a6 = -7.0; | |
| a7 = 8.0; | |
| a8 = -9.0; | |
| a9 = 10.0; | |
| a10 = -11.0; | |
| a11 = 12.0; | |
| a12 = -13.0; | |
| a13 = 14.0; | |
| a14 = -15.0; | |
| a15 = 16.0; | |
| a16 = -17.0; | |
| a17 = 18.0; | |
| a18 = -19.0; | |
| a19 = 20.0; | |
| final result = variadicAt1Doublex20Leaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| a4, | |
| a5, | |
| a6, | |
| a7, | |
| a8, | |
| a9, | |
| a10, | |
| a11, | |
| a12, | |
| a13, | |
| a14, | |
| a15, | |
| a16, | |
| a17, | |
| a18, | |
| a19, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(10.0, result); | |
| } | |
| final variadicAt1Int64x2Struct8BytesIntInt64Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int64 Function(Int64, VarArgs<(Int64, Struct8BytesInt, Int64)>), | |
| int Function(int, int, Struct8BytesInt, int) | |
| >("VariadicAt1Int64x2Struct8BytesIntInt64", isLeaf: true); | |
| /// Variadic arguments including struct. | |
| void testVariadicAt1Int64x2Struct8BytesIntInt64Leaf() { | |
| int a0; | |
| int a1; | |
| final a2Pointer = calloc<Struct8BytesInt>(); | |
| final Struct8BytesInt a2 = a2Pointer.ref; | |
| int a3; | |
| a0 = -1; | |
| a1 = 2; | |
| a2.a0 = -3; | |
| a2.a1 = 4; | |
| a2.a2 = -5; | |
| a3 = 6; | |
| final result = variadicAt1Int64x2Struct8BytesIntInt64Leaf(a0, a1, a2, a3); | |
| print("result = $result"); | |
| Expect.equals(3, result); | |
| calloc.free(a2Pointer); | |
| } | |
| final variadicAt1Doublex2Struct32BytesHomogeneousDoubleDLeaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function( | |
| Double, | |
| VarArgs<(Double, Struct32BytesHomogeneousDouble, Double)>, | |
| ), | |
| double Function(double, double, Struct32BytesHomogeneousDouble, double) | |
| >("VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD", isLeaf: true); | |
| /// Variadic arguments including struct. | |
| void testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleDLeaf() { | |
| double a0; | |
| double a1; | |
| final a2Pointer = calloc<Struct32BytesHomogeneousDouble>(); | |
| final Struct32BytesHomogeneousDouble a2 = a2Pointer.ref; | |
| double a3; | |
| a0 = -1.0; | |
| a1 = 2.0; | |
| a2.a0 = -3.0; | |
| a2.a1 = 4.0; | |
| a2.a2 = -5.0; | |
| a2.a3 = 6.0; | |
| a3 = -7.0; | |
| final result = variadicAt1Doublex2Struct32BytesHomogeneousDoubleDLeaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(-4.0, result); | |
| calloc.free(a2Pointer); | |
| } | |
| final variadicAt1DoubleStruct12BytesHomogeneousFloatDoubLeaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function(Double, VarArgs<(Struct12BytesHomogeneousFloat, Double)>), | |
| double Function(double, Struct12BytesHomogeneousFloat, double) | |
| >("VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub", isLeaf: true); | |
| /// Variadic arguments including struct. | |
| void testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoubLeaf() { | |
| double a0; | |
| final a1Pointer = calloc<Struct12BytesHomogeneousFloat>(); | |
| final Struct12BytesHomogeneousFloat a1 = a1Pointer.ref; | |
| double a2; | |
| a0 = -1.0; | |
| a1.a0 = 2.0; | |
| a1.a1 = -3.0; | |
| a1.a2 = 4.0; | |
| a2 = -5.0; | |
| final result = variadicAt1DoubleStruct12BytesHomogeneousFloatDoubLeaf( | |
| a0, | |
| a1, | |
| a2, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(-3.0, result); | |
| calloc.free(a1Pointer); | |
| } | |
| final variadicAt1Int32Struct20BytesHomogeneousInt32Int32Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int32 Function(Int32, VarArgs<(Struct20BytesHomogeneousInt32, Int32)>), | |
| int Function(int, Struct20BytesHomogeneousInt32, int) | |
| >("VariadicAt1Int32Struct20BytesHomogeneousInt32Int32", isLeaf: true); | |
| /// Variadic arguments including struct. | |
| void testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32Leaf() { | |
| int a0; | |
| final a1Pointer = calloc<Struct20BytesHomogeneousInt32>(); | |
| final Struct20BytesHomogeneousInt32 a1 = a1Pointer.ref; | |
| int a2; | |
| a0 = -1; | |
| a1.a0 = 2; | |
| a1.a1 = -3; | |
| a1.a2 = 4; | |
| a1.a3 = -5; | |
| a1.a4 = 6; | |
| a2 = -7; | |
| final result = variadicAt1Int32Struct20BytesHomogeneousInt32Int32Leaf( | |
| a0, | |
| a1, | |
| a2, | |
| ); | |
| print("result = $result"); | |
| Expect.equals(-4, result); | |
| calloc.free(a1Pointer); | |
| } | |
| final variadicAt1DoubleStruct20BytesHomogeneousFloatDoubLeaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function(Double, VarArgs<(Struct20BytesHomogeneousFloat, Double)>), | |
| double Function(double, Struct20BytesHomogeneousFloat, double) | |
| >("VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub", isLeaf: true); | |
| /// Variadic arguments including struct. | |
| void testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoubLeaf() { | |
| double a0; | |
| final a1Pointer = calloc<Struct20BytesHomogeneousFloat>(); | |
| final Struct20BytesHomogeneousFloat a1 = a1Pointer.ref; | |
| double a2; | |
| a0 = -1.0; | |
| a1.a0 = 2.0; | |
| a1.a1 = -3.0; | |
| a1.a2 = 4.0; | |
| a1.a3 = -5.0; | |
| a1.a4 = 6.0; | |
| a2 = -7.0; | |
| final result = variadicAt1DoubleStruct20BytesHomogeneousFloatDoubLeaf( | |
| a0, | |
| a1, | |
| a2, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(-4.0, result); | |
| calloc.free(a1Pointer); | |
| } | |
| final variadicAt2Int32Int64IntPtrLeaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int32 Function(Int32, Int64, VarArgs<(IntPtr,)>), | |
| int Function(int, int, int) | |
| >("VariadicAt2Int32Int64IntPtr", isLeaf: true); | |
| /// Regression test for variadic arguments. | |
| /// https://github.com/dart-lang/sdk/issues/49460 | |
| void testVariadicAt2Int32Int64IntPtrLeaf() { | |
| int a0; | |
| int a1; | |
| int a2; | |
| a0 = -1; | |
| a1 = 2; | |
| a2 = -3; | |
| final result = variadicAt2Int32Int64IntPtrLeaf(a0, a1, a2); | |
| print("result = $result"); | |
| Expect.equals(-2, result); | |
| } | |
| final variadicAt1DoubleInt64Int32DoubleInt64Int32Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function(Double, VarArgs<(Int64, Int32, Double, Int64, Int32)>), | |
| double Function(double, int, int, double, int, int) | |
| >("VariadicAt1DoubleInt64Int32DoubleInt64Int32", isLeaf: true); | |
| /// Variadic arguments mixed. | |
| void testVariadicAt1DoubleInt64Int32DoubleInt64Int32Leaf() { | |
| double a0; | |
| int a1; | |
| int a2; | |
| double a3; | |
| int a4; | |
| int a5; | |
| a0 = -1.0; | |
| a1 = 2; | |
| a2 = -3; | |
| a3 = 4.0; | |
| a4 = -5; | |
| a5 = 6; | |
| final result = variadicAt1DoubleInt64Int32DoubleInt64Int32Leaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| a4, | |
| a5, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(3.0, result); | |
| } | |
| final variadicAt1Int64Int32Struct12BytesHomogeneousFloatLeaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function(Int64, VarArgs<(Int32, Struct12BytesHomogeneousFloat)>), | |
| double Function(int, int, Struct12BytesHomogeneousFloat) | |
| >("VariadicAt1Int64Int32Struct12BytesHomogeneousFloat", isLeaf: true); | |
| /// Variadic arguments homogenous struct stack alignment on macos_arm64. | |
| void testVariadicAt1Int64Int32Struct12BytesHomogeneousFloatLeaf() { | |
| int a0; | |
| int a1; | |
| final a2Pointer = calloc<Struct12BytesHomogeneousFloat>(); | |
| final Struct12BytesHomogeneousFloat a2 = a2Pointer.ref; | |
| a0 = -1; | |
| a1 = 2; | |
| a2.a0 = -3.0; | |
| a2.a1 = 4.0; | |
| a2.a2 = -5.0; | |
| final result = variadicAt1Int64Int32Struct12BytesHomogeneousFloatLeaf( | |
| a0, | |
| a1, | |
| a2, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(-3.0, result); | |
| calloc.free(a2Pointer); | |
| } | |
| final variadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function( | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Double, | |
| Float, | |
| Struct12BytesHomogeneousFloat, | |
| Int64, | |
| VarArgs<(Int32, Struct12BytesHomogeneousFloat)>, | |
| ), | |
| double Function( | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| double, | |
| Struct12BytesHomogeneousFloat, | |
| int, | |
| int, | |
| Struct12BytesHomogeneousFloat, | |
| ) | |
| >("VariadicAt11Doublex8FloatStruct12BytesHomogeneousF", isLeaf: true); | |
| /// Variadic arguments homogenous struct stack alignment on macos_arm64. | |
| void testVariadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf() { | |
| double a0; | |
| double a1; | |
| double a2; | |
| double a3; | |
| double a4; | |
| double a5; | |
| double a6; | |
| double a7; | |
| double a8; | |
| final a9Pointer = calloc<Struct12BytesHomogeneousFloat>(); | |
| final Struct12BytesHomogeneousFloat a9 = a9Pointer.ref; | |
| int a10; | |
| int a11; | |
| final a12Pointer = calloc<Struct12BytesHomogeneousFloat>(); | |
| final Struct12BytesHomogeneousFloat a12 = a12Pointer.ref; | |
| a0 = -1.0; | |
| a1 = 2.0; | |
| a2 = -3.0; | |
| a3 = 4.0; | |
| a4 = -5.0; | |
| a5 = 6.0; | |
| a6 = -7.0; | |
| a7 = 8.0; | |
| a8 = -9.0; | |
| a9.a0 = 10.0; | |
| a9.a1 = -11.0; | |
| a9.a2 = 12.0; | |
| a10 = -13; | |
| a11 = 14; | |
| a12.a0 = -15.0; | |
| a12.a1 = 16.0; | |
| a12.a2 = -17.0; | |
| final result = variadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| a4, | |
| a5, | |
| a6, | |
| a7, | |
| a8, | |
| a9, | |
| a10, | |
| a11, | |
| a12, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(-9.0, result); | |
| calloc.free(a9Pointer); | |
| calloc.free(a12Pointer); | |
| } | |
| final variadicAt1DoubleInt64Int32Struct20BytesHomogeneouLeaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function( | |
| Double, | |
| VarArgs< | |
| ( | |
| Int64, | |
| Int32, | |
| Struct20BytesHomogeneousInt32, | |
| Double, | |
| Int64, | |
| Int32, | |
| Struct12BytesHomogeneousFloat, | |
| Int64, | |
| ) | |
| >, | |
| ), | |
| double Function( | |
| double, | |
| int, | |
| int, | |
| Struct20BytesHomogeneousInt32, | |
| double, | |
| int, | |
| int, | |
| Struct12BytesHomogeneousFloat, | |
| int, | |
| ) | |
| >("VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou", isLeaf: true); | |
| /// Variadic arguments mixed. | |
| void testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneouLeaf() { | |
| double a0; | |
| int a1; | |
| int a2; | |
| final a3Pointer = calloc<Struct20BytesHomogeneousInt32>(); | |
| final Struct20BytesHomogeneousInt32 a3 = a3Pointer.ref; | |
| double a4; | |
| int a5; | |
| int a6; | |
| final a7Pointer = calloc<Struct12BytesHomogeneousFloat>(); | |
| final Struct12BytesHomogeneousFloat a7 = a7Pointer.ref; | |
| int a8; | |
| a0 = -1.0; | |
| a1 = 2; | |
| a2 = -3; | |
| a3.a0 = 4; | |
| a3.a1 = -5; | |
| a3.a2 = 6; | |
| a3.a3 = -7; | |
| a3.a4 = 8; | |
| a4 = -9.0; | |
| a5 = 10; | |
| a6 = -11; | |
| a7.a0 = 12.0; | |
| a7.a1 = -13.0; | |
| a7.a2 = 14.0; | |
| a8 = -15; | |
| final result = variadicAt1DoubleInt64Int32Struct20BytesHomogeneouLeaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| a4, | |
| a5, | |
| a6, | |
| a7, | |
| a8, | |
| ); | |
| print("result = $result"); | |
| Expect.approxEquals(-8.0, result); | |
| calloc.free(a3Pointer); | |
| calloc.free(a7Pointer); | |
| } | |
| final variadicAt5Doublex5Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Double Function(Double, Double, Double, Double, Double, VarArgs<()>), | |
| double Function(double, double, double, double, double) | |
| >("VariadicAt5Doublex5", isLeaf: true); | |
| /// Variadic arguments function definition, but not passing any. | |
| void testVariadicAt5Doublex5Leaf() { | |
| double a0; | |
| double a1; | |
| double a2; | |
| double a3; | |
| double a4; | |
| a0 = -1.0; | |
| a1 = 2.0; | |
| a2 = -3.0; | |
| a3 = 4.0; | |
| a4 = -5.0; | |
| final result = variadicAt5Doublex5Leaf(a0, a1, a2, a3, a4); | |
| print("result = $result"); | |
| Expect.approxEquals(-3.0, result); | |
| } | |
| final variadicAt1Int64x7Struct12BytesHomogeneousInt32Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int64 Function( | |
| Int64, | |
| VarArgs< | |
| ( | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Int64, | |
| Struct12BytesHomogeneousInt32, | |
| ) | |
| >, | |
| ), | |
| int Function( | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| int, | |
| Struct12BytesHomogeneousInt32, | |
| ) | |
| >("VariadicAt1Int64x7Struct12BytesHomogeneousInt32", isLeaf: true); | |
| /// Struct stradles last argument register, variadic | |
| void testVariadicAt1Int64x7Struct12BytesHomogeneousInt32Leaf() { | |
| int a0; | |
| int a1; | |
| int a2; | |
| int a3; | |
| int a4; | |
| int a5; | |
| int a6; | |
| final a7Pointer = calloc<Struct12BytesHomogeneousInt32>(); | |
| final Struct12BytesHomogeneousInt32 a7 = a7Pointer.ref; | |
| a0 = -1; | |
| a1 = 2; | |
| a2 = -3; | |
| a3 = 4; | |
| a4 = -5; | |
| a5 = 6; | |
| a6 = -7; | |
| a7.a0 = 8; | |
| a7.a1 = -9; | |
| a7.a2 = 10; | |
| final result = variadicAt1Int64x7Struct12BytesHomogeneousInt32Leaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| a4, | |
| a5, | |
| a6, | |
| a7, | |
| ); | |
| print("result = $result"); | |
| Expect.equals(5, result); | |
| calloc.free(a7Pointer); | |
| } | |
| final variadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf = ffiTestFunctions | |
| .lookupFunction< | |
| Int32 Function( | |
| Struct12BytesHomogeneousInt32, | |
| VarArgs<(Int32, Int32, Int32, Int32)>, | |
| ), | |
| int Function(Struct12BytesHomogeneousInt32, int, int, int, int) | |
| >("VariadicAt1Struct12BytesHomogeneousInt32Int32x4", isLeaf: true); | |
| /// Variadic arguments test on macos_arm64. | |
| void testVariadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf() { | |
| final a0Pointer = calloc<Struct12BytesHomogeneousInt32>(); | |
| final Struct12BytesHomogeneousInt32 a0 = a0Pointer.ref; | |
| int a1; | |
| int a2; | |
| int a3; | |
| int a4; | |
| a0.a0 = -1; | |
| a0.a1 = 2; | |
| a0.a2 = -3; | |
| a1 = 4; | |
| a2 = -5; | |
| a3 = 6; | |
| a4 = -7; | |
| final result = variadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf( | |
| a0, | |
| a1, | |
| a2, | |
| a3, | |
| a4, | |
| ); | |
| print("result = $result"); | |
| Expect.equals(-4, result); | |
| calloc.free(a0Pointer); | |
| } |