// 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(); 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(); 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(); 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(); 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(); 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(); 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(); final Struct12BytesHomogeneousFloat a9 = a9Pointer.ref; int a10; int a11; final a12Pointer = calloc(); 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(); final Struct20BytesHomogeneousInt32 a3 = a3Pointer.ref; double a4; int a5; int a6; final a7Pointer = calloc(); 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(); 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(); 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); }