// 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) { testVariadicAt1Int64x2(); testVariadicAt1Doublex2(); testVariadicAt1Int64x5(); testVariadicAt1Doublex5(); testVariadicAt1Int64x20(); testVariadicAt1Doublex20(); testVariadicAt1Int64x2Struct8BytesIntInt64(); testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleD(); testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoub(); testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32(); testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoub(); testVariadicAt2Int32Int64IntPtr(); testVariadicAt1DoubleInt64Int32DoubleInt64Int32(); testVariadicAt1Int64Int32Struct12BytesHomogeneousFloat(); testVariadicAt11Doublex8FloatStruct12BytesHomogeneousF(); testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneou(); testVariadicAt5Doublex5(); testVariadicAt1Int64x7Struct12BytesHomogeneousInt32(); testVariadicAt1Struct12BytesHomogeneousInt32Int32x4(); } } final variadicAt1Int64x2 = ffiTestFunctions .lookupFunction< Int64 Function(Int64, VarArgs<(Int64,)>), int Function(int, int) >("VariadicAt1Int64x2"); /// Single variadic argument. void testVariadicAt1Int64x2() { int a0; int a1; a0 = -1; a1 = 2; final result = variadicAt1Int64x2(a0, a1); print("result = $result"); Expect.equals(1, result); } final variadicAt1Doublex2 = ffiTestFunctions .lookupFunction< Double Function(Double, VarArgs<(Double,)>), double Function(double, double) >("VariadicAt1Doublex2"); /// Single variadic argument. void testVariadicAt1Doublex2() { double a0; double a1; a0 = -1.0; a1 = 2.0; final result = variadicAt1Doublex2(a0, a1); print("result = $result"); Expect.approxEquals(1.0, result); } final variadicAt1Int64x5 = ffiTestFunctions .lookupFunction< Int64 Function(Int64, VarArgs<(Int64, Int64, Int64, Int64)>), int Function(int, int, int, int, int) >("VariadicAt1Int64x5"); /// Variadic arguments. void testVariadicAt1Int64x5() { int a0; int a1; int a2; int a3; int a4; a0 = -1; a1 = 2; a2 = -3; a3 = 4; a4 = -5; final result = variadicAt1Int64x5(a0, a1, a2, a3, a4); print("result = $result"); Expect.equals(-3, result); } final variadicAt1Doublex5 = ffiTestFunctions .lookupFunction< Double Function(Double, VarArgs<(Double, Double, Double, Double)>), double Function(double, double, double, double, double) >("VariadicAt1Doublex5"); /// Variadic arguments. void testVariadicAt1Doublex5() { 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 = variadicAt1Doublex5(a0, a1, a2, a3, a4); print("result = $result"); Expect.approxEquals(-3.0, result); } final variadicAt1Int64x20 = 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"); /// Variadic arguments exhaust registers. void testVariadicAt1Int64x20() { 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 = variadicAt1Int64x20( 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 variadicAt1Doublex20 = 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"); /// Variadic arguments exhaust registers. void testVariadicAt1Doublex20() { 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 = variadicAt1Doublex20( 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 variadicAt1Int64x2Struct8BytesIntInt64 = ffiTestFunctions .lookupFunction< Int64 Function(Int64, VarArgs<(Int64, Struct8BytesInt, Int64)>), int Function(int, int, Struct8BytesInt, int) >("VariadicAt1Int64x2Struct8BytesIntInt64"); /// Variadic arguments including struct. void testVariadicAt1Int64x2Struct8BytesIntInt64() { 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 = variadicAt1Int64x2Struct8BytesIntInt64(a0, a1, a2, a3); print("result = $result"); Expect.equals(3, result); calloc.free(a2Pointer); } final variadicAt1Doublex2Struct32BytesHomogeneousDoubleD = ffiTestFunctions .lookupFunction< Double Function( Double, VarArgs<(Double, Struct32BytesHomogeneousDouble, Double)>, ), double Function(double, double, Struct32BytesHomogeneousDouble, double) >("VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD"); /// Variadic arguments including struct. void testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleD() { 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 = variadicAt1Doublex2Struct32BytesHomogeneousDoubleD( a0, a1, a2, a3, ); print("result = $result"); Expect.approxEquals(-4.0, result); calloc.free(a2Pointer); } final variadicAt1DoubleStruct12BytesHomogeneousFloatDoub = ffiTestFunctions .lookupFunction< Double Function(Double, VarArgs<(Struct12BytesHomogeneousFloat, Double)>), double Function(double, Struct12BytesHomogeneousFloat, double) >("VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub"); /// Variadic arguments including struct. void testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoub() { 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 = variadicAt1DoubleStruct12BytesHomogeneousFloatDoub(a0, a1, a2); print("result = $result"); Expect.approxEquals(-3.0, result); calloc.free(a1Pointer); } final variadicAt1Int32Struct20BytesHomogeneousInt32Int32 = ffiTestFunctions .lookupFunction< Int32 Function(Int32, VarArgs<(Struct20BytesHomogeneousInt32, Int32)>), int Function(int, Struct20BytesHomogeneousInt32, int) >("VariadicAt1Int32Struct20BytesHomogeneousInt32Int32"); /// Variadic arguments including struct. void testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32() { 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 = variadicAt1Int32Struct20BytesHomogeneousInt32Int32(a0, a1, a2); print("result = $result"); Expect.equals(-4, result); calloc.free(a1Pointer); } final variadicAt1DoubleStruct20BytesHomogeneousFloatDoub = ffiTestFunctions .lookupFunction< Double Function(Double, VarArgs<(Struct20BytesHomogeneousFloat, Double)>), double Function(double, Struct20BytesHomogeneousFloat, double) >("VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub"); /// Variadic arguments including struct. void testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoub() { 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 = variadicAt1DoubleStruct20BytesHomogeneousFloatDoub(a0, a1, a2); print("result = $result"); Expect.approxEquals(-4.0, result); calloc.free(a1Pointer); } final variadicAt2Int32Int64IntPtr = ffiTestFunctions .lookupFunction< Int32 Function(Int32, Int64, VarArgs<(IntPtr,)>), int Function(int, int, int) >("VariadicAt2Int32Int64IntPtr"); /// Regression test for variadic arguments. /// https://github.com/dart-lang/sdk/issues/49460 void testVariadicAt2Int32Int64IntPtr() { int a0; int a1; int a2; a0 = -1; a1 = 2; a2 = -3; final result = variadicAt2Int32Int64IntPtr(a0, a1, a2); print("result = $result"); Expect.equals(-2, result); } final variadicAt1DoubleInt64Int32DoubleInt64Int32 = ffiTestFunctions .lookupFunction< Double Function(Double, VarArgs<(Int64, Int32, Double, Int64, Int32)>), double Function(double, int, int, double, int, int) >("VariadicAt1DoubleInt64Int32DoubleInt64Int32"); /// Variadic arguments mixed. void testVariadicAt1DoubleInt64Int32DoubleInt64Int32() { 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 = variadicAt1DoubleInt64Int32DoubleInt64Int32( a0, a1, a2, a3, a4, a5, ); print("result = $result"); Expect.approxEquals(3.0, result); } final variadicAt1Int64Int32Struct12BytesHomogeneousFloat = ffiTestFunctions .lookupFunction< Double Function(Int64, VarArgs<(Int32, Struct12BytesHomogeneousFloat)>), double Function(int, int, Struct12BytesHomogeneousFloat) >("VariadicAt1Int64Int32Struct12BytesHomogeneousFloat"); /// Variadic arguments homogenous struct stack alignment on macos_arm64. void testVariadicAt1Int64Int32Struct12BytesHomogeneousFloat() { 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 = variadicAt1Int64Int32Struct12BytesHomogeneousFloat(a0, a1, a2); print("result = $result"); Expect.approxEquals(-3.0, result); calloc.free(a2Pointer); } final variadicAt11Doublex8FloatStruct12BytesHomogeneousF = 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"); /// Variadic arguments homogenous struct stack alignment on macos_arm64. void testVariadicAt11Doublex8FloatStruct12BytesHomogeneousF() { 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 = variadicAt11Doublex8FloatStruct12BytesHomogeneousF( 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 variadicAt1DoubleInt64Int32Struct20BytesHomogeneou = 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"); /// Variadic arguments mixed. void testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneou() { 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 = variadicAt1DoubleInt64Int32Struct20BytesHomogeneou( a0, a1, a2, a3, a4, a5, a6, a7, a8, ); print("result = $result"); Expect.approxEquals(-8.0, result); calloc.free(a3Pointer); calloc.free(a7Pointer); } final variadicAt5Doublex5 = ffiTestFunctions .lookupFunction< Double Function(Double, Double, Double, Double, Double, VarArgs<()>), double Function(double, double, double, double, double) >("VariadicAt5Doublex5"); /// Variadic arguments function definition, but not passing any. void testVariadicAt5Doublex5() { 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 = variadicAt5Doublex5(a0, a1, a2, a3, a4); print("result = $result"); Expect.approxEquals(-3.0, result); } final variadicAt1Int64x7Struct12BytesHomogeneousInt32 = ffiTestFunctions .lookupFunction< Int64 Function( Int64, VarArgs< ( Int64, Int64, Int64, Int64, Int64, Int64, Struct12BytesHomogeneousInt32, ) >, ), int Function( int, int, int, int, int, int, int, Struct12BytesHomogeneousInt32, ) >("VariadicAt1Int64x7Struct12BytesHomogeneousInt32"); /// Struct stradles last argument register, variadic void testVariadicAt1Int64x7Struct12BytesHomogeneousInt32() { 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 = variadicAt1Int64x7Struct12BytesHomogeneousInt32( a0, a1, a2, a3, a4, a5, a6, a7, ); print("result = $result"); Expect.equals(5, result); calloc.free(a7Pointer); } final variadicAt1Struct12BytesHomogeneousInt32Int32x4 = ffiTestFunctions .lookupFunction< Int32 Function( Struct12BytesHomogeneousInt32, VarArgs<(Int32, Int32, Int32, Int32)>, ), int Function(Struct12BytesHomogeneousInt32, int, int, int, int) >("VariadicAt1Struct12BytesHomogeneousInt32Int32x4"); /// Variadic arguments test on macos_arm64. void testVariadicAt1Struct12BytesHomogeneousInt32Int32x4() { 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 = variadicAt1Struct12BytesHomogeneousInt32Int32x4( a0, a1, a2, a3, a4, ); print("result = $result"); Expect.equals(-4, result); calloc.free(a0Pointer); }