// 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=20
// 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 'callback_tests_utils.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() {
  testCases.forEach((t) {
    print("==== Running " + t.name);
    t.run();
  });
}

final testCases = [
  CallbackTest.withCheck(
    "VariadicAt1Int64x2",
    Pointer.fromFunction<VariadicAt1Int64x2Type>(variadicAt1Int64x2, 0),
    variadicAt1Int64x2AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Doublex2",
    Pointer.fromFunction<VariadicAt1Doublex2Type>(variadicAt1Doublex2, 0.0),
    variadicAt1Doublex2AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Int64x5",
    Pointer.fromFunction<VariadicAt1Int64x5Type>(variadicAt1Int64x5, 0),
    variadicAt1Int64x5AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Doublex5",
    Pointer.fromFunction<VariadicAt1Doublex5Type>(variadicAt1Doublex5, 0.0),
    variadicAt1Doublex5AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Int64x20",
    Pointer.fromFunction<VariadicAt1Int64x20Type>(variadicAt1Int64x20, 0),
    variadicAt1Int64x20AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Doublex20",
    Pointer.fromFunction<VariadicAt1Doublex20Type>(variadicAt1Doublex20, 0.0),
    variadicAt1Doublex20AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Int64x2Struct8BytesIntInt64",
    Pointer.fromFunction<VariadicAt1Int64x2Struct8BytesIntInt64Type>(
      variadicAt1Int64x2Struct8BytesIntInt64,
      0,
    ),
    variadicAt1Int64x2Struct8BytesIntInt64AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD",
    Pointer.fromFunction<
      VariadicAt1Doublex2Struct32BytesHomogeneousDoubleDType
    >(variadicAt1Doublex2Struct32BytesHomogeneousDoubleD, 0.0),
    variadicAt1Doublex2Struct32BytesHomogeneousDoubleDAfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub",
    Pointer.fromFunction<
      VariadicAt1DoubleStruct12BytesHomogeneousFloatDoubType
    >(variadicAt1DoubleStruct12BytesHomogeneousFloatDoub, 0.0),
    variadicAt1DoubleStruct12BytesHomogeneousFloatDoubAfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Int32Struct20BytesHomogeneousInt32Int32",
    Pointer.fromFunction<
      VariadicAt1Int32Struct20BytesHomogeneousInt32Int32Type
    >(variadicAt1Int32Struct20BytesHomogeneousInt32Int32, 0),
    variadicAt1Int32Struct20BytesHomogeneousInt32Int32AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub",
    Pointer.fromFunction<
      VariadicAt1DoubleStruct20BytesHomogeneousFloatDoubType
    >(variadicAt1DoubleStruct20BytesHomogeneousFloatDoub, 0.0),
    variadicAt1DoubleStruct20BytesHomogeneousFloatDoubAfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt2Int32Int64IntPtr",
    Pointer.fromFunction<VariadicAt2Int32Int64IntPtrType>(
      variadicAt2Int32Int64IntPtr,
      0,
    ),
    variadicAt2Int32Int64IntPtrAfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1DoubleInt64Int32DoubleInt64Int32",
    Pointer.fromFunction<VariadicAt1DoubleInt64Int32DoubleInt64Int32Type>(
      variadicAt1DoubleInt64Int32DoubleInt64Int32,
      0.0,
    ),
    variadicAt1DoubleInt64Int32DoubleInt64Int32AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Int64Int32Struct12BytesHomogeneousFloat",
    Pointer.fromFunction<
      VariadicAt1Int64Int32Struct12BytesHomogeneousFloatType
    >(variadicAt1Int64Int32Struct12BytesHomogeneousFloat, 0.0),
    variadicAt1Int64Int32Struct12BytesHomogeneousFloatAfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt11Doublex8FloatStruct12BytesHomogeneousF",
    Pointer.fromFunction<
      VariadicAt11Doublex8FloatStruct12BytesHomogeneousFType
    >(variadicAt11Doublex8FloatStruct12BytesHomogeneousF, 0.0),
    variadicAt11Doublex8FloatStruct12BytesHomogeneousFAfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou",
    Pointer.fromFunction<
      VariadicAt1DoubleInt64Int32Struct20BytesHomogeneouType
    >(variadicAt1DoubleInt64Int32Struct20BytesHomogeneou, 0.0),
    variadicAt1DoubleInt64Int32Struct20BytesHomogeneouAfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt5Doublex5",
    Pointer.fromFunction<VariadicAt5Doublex5Type>(variadicAt5Doublex5, 0.0),
    variadicAt5Doublex5AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Int64x7Struct12BytesHomogeneousInt32",
    Pointer.fromFunction<VariadicAt1Int64x7Struct12BytesHomogeneousInt32Type>(
      variadicAt1Int64x7Struct12BytesHomogeneousInt32,
      0,
    ),
    variadicAt1Int64x7Struct12BytesHomogeneousInt32AfterCallback,
  ),
  CallbackTest.withCheck(
    "VariadicAt1Struct12BytesHomogeneousInt32Int32x4",
    Pointer.fromFunction<VariadicAt1Struct12BytesHomogeneousInt32Int32x4Type>(
      variadicAt1Struct12BytesHomogeneousInt32Int32x4,
      0,
    ),
    variadicAt1Struct12BytesHomogeneousInt32Int32x4AfterCallback,
  ),
];
typedef VariadicAt1Int64x2Type = Int64 Function(Int64, VarArgs<(Int64,)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x2_a0 = 0;
int variadicAt1Int64x2_a1 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x2Result = 0;

int variadicAt1Int64x2CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x2_a0;
  result += variadicAt1Int64x2_a1;

  variadicAt1Int64x2Result = result;

  return result;
}

/// Single variadic argument.
int variadicAt1Int64x2(int a0, int a1) {
  print("variadicAt1Int64x2(${a0}, ${a1})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Int64x2 throwing on purpose!");
  }

  variadicAt1Int64x2_a0 = a0;
  variadicAt1Int64x2_a1 = a1;

  final result = variadicAt1Int64x2CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x2AfterCallback() {
  final result = variadicAt1Int64x2CalculateResult();

  print("after callback result = $result");

  Expect.equals(1, result);
}

typedef VariadicAt1Doublex2Type = Double Function(Double, VarArgs<(Double,)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex2_a0 = 0.0;
double variadicAt1Doublex2_a1 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex2Result = 0.0;

double variadicAt1Doublex2CalculateResult() {
  double result = 0;

  result += variadicAt1Doublex2_a0;
  result += variadicAt1Doublex2_a1;

  variadicAt1Doublex2Result = result;

  return result;
}

/// Single variadic argument.
double variadicAt1Doublex2(double a0, double a1) {
  print("variadicAt1Doublex2(${a0}, ${a1})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Doublex2 throwing on purpose!");
  }

  variadicAt1Doublex2_a0 = a0;
  variadicAt1Doublex2_a1 = a1;

  final result = variadicAt1Doublex2CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex2AfterCallback() {
  final result = variadicAt1Doublex2CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(1.0, result);
}

typedef VariadicAt1Int64x5Type =
    Int64 Function(Int64, VarArgs<(Int64, Int64, Int64, Int64)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x5_a0 = 0;
int variadicAt1Int64x5_a1 = 0;
int variadicAt1Int64x5_a2 = 0;
int variadicAt1Int64x5_a3 = 0;
int variadicAt1Int64x5_a4 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x5Result = 0;

int variadicAt1Int64x5CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x5_a0;
  result += variadicAt1Int64x5_a1;
  result += variadicAt1Int64x5_a2;
  result += variadicAt1Int64x5_a3;
  result += variadicAt1Int64x5_a4;

  variadicAt1Int64x5Result = result;

  return result;
}

/// Variadic arguments.
int variadicAt1Int64x5(int a0, int a1, int a2, int a3, int a4) {
  print("variadicAt1Int64x5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Int64x5 throwing on purpose!");
  }

  variadicAt1Int64x5_a0 = a0;
  variadicAt1Int64x5_a1 = a1;
  variadicAt1Int64x5_a2 = a2;
  variadicAt1Int64x5_a3 = a3;
  variadicAt1Int64x5_a4 = a4;

  final result = variadicAt1Int64x5CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x5AfterCallback() {
  final result = variadicAt1Int64x5CalculateResult();

  print("after callback result = $result");

  Expect.equals(-3, result);
}

typedef VariadicAt1Doublex5Type =
    Double Function(Double, VarArgs<(Double, Double, Double, Double)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex5_a0 = 0.0;
double variadicAt1Doublex5_a1 = 0.0;
double variadicAt1Doublex5_a2 = 0.0;
double variadicAt1Doublex5_a3 = 0.0;
double variadicAt1Doublex5_a4 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex5Result = 0.0;

double variadicAt1Doublex5CalculateResult() {
  double result = 0;

  result += variadicAt1Doublex5_a0;
  result += variadicAt1Doublex5_a1;
  result += variadicAt1Doublex5_a2;
  result += variadicAt1Doublex5_a3;
  result += variadicAt1Doublex5_a4;

  variadicAt1Doublex5Result = result;

  return result;
}

/// Variadic arguments.
double variadicAt1Doublex5(
  double a0,
  double a1,
  double a2,
  double a3,
  double a4,
) {
  print("variadicAt1Doublex5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Doublex5 throwing on purpose!");
  }

  variadicAt1Doublex5_a0 = a0;
  variadicAt1Doublex5_a1 = a1;
  variadicAt1Doublex5_a2 = a2;
  variadicAt1Doublex5_a3 = a3;
  variadicAt1Doublex5_a4 = a4;

  final result = variadicAt1Doublex5CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex5AfterCallback() {
  final result = variadicAt1Doublex5CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt1Int64x20Type =
    Int64 Function(
      Int64,
      VarArgs<
        (
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
        )
      >,
    );

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x20_a0 = 0;
int variadicAt1Int64x20_a1 = 0;
int variadicAt1Int64x20_a2 = 0;
int variadicAt1Int64x20_a3 = 0;
int variadicAt1Int64x20_a4 = 0;
int variadicAt1Int64x20_a5 = 0;
int variadicAt1Int64x20_a6 = 0;
int variadicAt1Int64x20_a7 = 0;
int variadicAt1Int64x20_a8 = 0;
int variadicAt1Int64x20_a9 = 0;
int variadicAt1Int64x20_a10 = 0;
int variadicAt1Int64x20_a11 = 0;
int variadicAt1Int64x20_a12 = 0;
int variadicAt1Int64x20_a13 = 0;
int variadicAt1Int64x20_a14 = 0;
int variadicAt1Int64x20_a15 = 0;
int variadicAt1Int64x20_a16 = 0;
int variadicAt1Int64x20_a17 = 0;
int variadicAt1Int64x20_a18 = 0;
int variadicAt1Int64x20_a19 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x20Result = 0;

int variadicAt1Int64x20CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x20_a0;
  result += variadicAt1Int64x20_a1;
  result += variadicAt1Int64x20_a2;
  result += variadicAt1Int64x20_a3;
  result += variadicAt1Int64x20_a4;
  result += variadicAt1Int64x20_a5;
  result += variadicAt1Int64x20_a6;
  result += variadicAt1Int64x20_a7;
  result += variadicAt1Int64x20_a8;
  result += variadicAt1Int64x20_a9;
  result += variadicAt1Int64x20_a10;
  result += variadicAt1Int64x20_a11;
  result += variadicAt1Int64x20_a12;
  result += variadicAt1Int64x20_a13;
  result += variadicAt1Int64x20_a14;
  result += variadicAt1Int64x20_a15;
  result += variadicAt1Int64x20_a16;
  result += variadicAt1Int64x20_a17;
  result += variadicAt1Int64x20_a18;
  result += variadicAt1Int64x20_a19;

  variadicAt1Int64x20Result = result;

  return result;
}

/// Variadic arguments exhaust registers.
int variadicAt1Int64x20(
  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,
) {
  print(
    "variadicAt1Int64x20(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Int64x20 throwing on purpose!");
  }

  variadicAt1Int64x20_a0 = a0;
  variadicAt1Int64x20_a1 = a1;
  variadicAt1Int64x20_a2 = a2;
  variadicAt1Int64x20_a3 = a3;
  variadicAt1Int64x20_a4 = a4;
  variadicAt1Int64x20_a5 = a5;
  variadicAt1Int64x20_a6 = a6;
  variadicAt1Int64x20_a7 = a7;
  variadicAt1Int64x20_a8 = a8;
  variadicAt1Int64x20_a9 = a9;
  variadicAt1Int64x20_a10 = a10;
  variadicAt1Int64x20_a11 = a11;
  variadicAt1Int64x20_a12 = a12;
  variadicAt1Int64x20_a13 = a13;
  variadicAt1Int64x20_a14 = a14;
  variadicAt1Int64x20_a15 = a15;
  variadicAt1Int64x20_a16 = a16;
  variadicAt1Int64x20_a17 = a17;
  variadicAt1Int64x20_a18 = a18;
  variadicAt1Int64x20_a19 = a19;

  final result = variadicAt1Int64x20CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x20AfterCallback() {
  final result = variadicAt1Int64x20CalculateResult();

  print("after callback result = $result");

  Expect.equals(10, result);
}

typedef VariadicAt1Doublex20Type =
    Double Function(
      Double,
      VarArgs<
        (
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
        )
      >,
    );

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex20_a0 = 0.0;
double variadicAt1Doublex20_a1 = 0.0;
double variadicAt1Doublex20_a2 = 0.0;
double variadicAt1Doublex20_a3 = 0.0;
double variadicAt1Doublex20_a4 = 0.0;
double variadicAt1Doublex20_a5 = 0.0;
double variadicAt1Doublex20_a6 = 0.0;
double variadicAt1Doublex20_a7 = 0.0;
double variadicAt1Doublex20_a8 = 0.0;
double variadicAt1Doublex20_a9 = 0.0;
double variadicAt1Doublex20_a10 = 0.0;
double variadicAt1Doublex20_a11 = 0.0;
double variadicAt1Doublex20_a12 = 0.0;
double variadicAt1Doublex20_a13 = 0.0;
double variadicAt1Doublex20_a14 = 0.0;
double variadicAt1Doublex20_a15 = 0.0;
double variadicAt1Doublex20_a16 = 0.0;
double variadicAt1Doublex20_a17 = 0.0;
double variadicAt1Doublex20_a18 = 0.0;
double variadicAt1Doublex20_a19 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex20Result = 0.0;

double variadicAt1Doublex20CalculateResult() {
  double result = 0;

  result += variadicAt1Doublex20_a0;
  result += variadicAt1Doublex20_a1;
  result += variadicAt1Doublex20_a2;
  result += variadicAt1Doublex20_a3;
  result += variadicAt1Doublex20_a4;
  result += variadicAt1Doublex20_a5;
  result += variadicAt1Doublex20_a6;
  result += variadicAt1Doublex20_a7;
  result += variadicAt1Doublex20_a8;
  result += variadicAt1Doublex20_a9;
  result += variadicAt1Doublex20_a10;
  result += variadicAt1Doublex20_a11;
  result += variadicAt1Doublex20_a12;
  result += variadicAt1Doublex20_a13;
  result += variadicAt1Doublex20_a14;
  result += variadicAt1Doublex20_a15;
  result += variadicAt1Doublex20_a16;
  result += variadicAt1Doublex20_a17;
  result += variadicAt1Doublex20_a18;
  result += variadicAt1Doublex20_a19;

  variadicAt1Doublex20Result = result;

  return result;
}

/// Variadic arguments exhaust registers.
double variadicAt1Doublex20(
  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,
) {
  print(
    "variadicAt1Doublex20(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Doublex20 throwing on purpose!");
  }

  variadicAt1Doublex20_a0 = a0;
  variadicAt1Doublex20_a1 = a1;
  variadicAt1Doublex20_a2 = a2;
  variadicAt1Doublex20_a3 = a3;
  variadicAt1Doublex20_a4 = a4;
  variadicAt1Doublex20_a5 = a5;
  variadicAt1Doublex20_a6 = a6;
  variadicAt1Doublex20_a7 = a7;
  variadicAt1Doublex20_a8 = a8;
  variadicAt1Doublex20_a9 = a9;
  variadicAt1Doublex20_a10 = a10;
  variadicAt1Doublex20_a11 = a11;
  variadicAt1Doublex20_a12 = a12;
  variadicAt1Doublex20_a13 = a13;
  variadicAt1Doublex20_a14 = a14;
  variadicAt1Doublex20_a15 = a15;
  variadicAt1Doublex20_a16 = a16;
  variadicAt1Doublex20_a17 = a17;
  variadicAt1Doublex20_a18 = a18;
  variadicAt1Doublex20_a19 = a19;

  final result = variadicAt1Doublex20CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex20AfterCallback() {
  final result = variadicAt1Doublex20CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(10.0, result);
}

typedef VariadicAt1Int64x2Struct8BytesIntInt64Type =
    Int64 Function(Int64, VarArgs<(Int64, Struct8BytesInt, Int64)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x2Struct8BytesIntInt64_a0 = 0;
int variadicAt1Int64x2Struct8BytesIntInt64_a1 = 0;
Struct8BytesInt variadicAt1Int64x2Struct8BytesIntInt64_a2 =
    Pointer<Struct8BytesInt>.fromAddress(0).ref;
int variadicAt1Int64x2Struct8BytesIntInt64_a3 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x2Struct8BytesIntInt64Result = 0;

int variadicAt1Int64x2Struct8BytesIntInt64CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x2Struct8BytesIntInt64_a0;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a1;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a2.a0;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a2.a1;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a2.a2;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a3;

  variadicAt1Int64x2Struct8BytesIntInt64Result = result;

  return result;
}

/// Variadic arguments including struct.
int variadicAt1Int64x2Struct8BytesIntInt64(
  int a0,
  int a1,
  Struct8BytesInt a2,
  int a3,
) {
  print("variadicAt1Int64x2Struct8BytesIntInt64(${a0}, ${a1}, ${a2}, ${a3})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1Int64x2Struct8BytesIntInt64 throwing on purpose!",
    );
  }

  variadicAt1Int64x2Struct8BytesIntInt64_a0 = a0;
  variadicAt1Int64x2Struct8BytesIntInt64_a1 = a1;
  variadicAt1Int64x2Struct8BytesIntInt64_a2 = a2;
  variadicAt1Int64x2Struct8BytesIntInt64_a3 = a3;

  final result = variadicAt1Int64x2Struct8BytesIntInt64CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x2Struct8BytesIntInt64AfterCallback() {
  final result = variadicAt1Int64x2Struct8BytesIntInt64CalculateResult();

  print("after callback result = $result");

  Expect.equals(3, result);
}

typedef VariadicAt1Doublex2Struct32BytesHomogeneousDoubleDType =
    Double Function(
      Double,
      VarArgs<(Double, Struct32BytesHomogeneousDouble, Double)>,
    );

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a0 = 0.0;
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a1 = 0.0;
Struct32BytesHomogeneousDouble
variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2 =
    Pointer<Struct32BytesHomogeneousDouble>.fromAddress(0).ref;
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a3 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleDResult = 0.0;

double variadicAt1Doublex2Struct32BytesHomogeneousDoubleDCalculateResult() {
  double result = 0;

  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a0;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a1;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a0;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a1;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a2;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a3;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a3;

  variadicAt1Doublex2Struct32BytesHomogeneousDoubleDResult = result;

  return result;
}

/// Variadic arguments including struct.
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD(
  double a0,
  double a1,
  Struct32BytesHomogeneousDouble a2,
  double a3,
) {
  print(
    "variadicAt1Doublex2Struct32BytesHomogeneousDoubleD(${a0}, ${a1}, ${a2}, ${a3})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD throwing on purpose!",
    );
  }

  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a0 = a0;
  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a1 = a1;
  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2 = a2;
  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a3 = a3;

  final result =
      variadicAt1Doublex2Struct32BytesHomogeneousDoubleDCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex2Struct32BytesHomogeneousDoubleDAfterCallback() {
  final result =
      variadicAt1Doublex2Struct32BytesHomogeneousDoubleDCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-4.0, result);
}

typedef VariadicAt1DoubleStruct12BytesHomogeneousFloatDoubType =
    Double Function(Double, VarArgs<(Struct12BytesHomogeneousFloat, Double)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a0 = 0.0;
Struct12BytesHomogeneousFloat
variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a2 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoubResult = 0.0;

double variadicAt1DoubleStruct12BytesHomogeneousFloatDoubCalculateResult() {
  double result = 0;

  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a0;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1.a0;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1.a1;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1.a2;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a2;

  variadicAt1DoubleStruct12BytesHomogeneousFloatDoubResult = result;

  return result;
}

/// Variadic arguments including struct.
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoub(
  double a0,
  Struct12BytesHomogeneousFloat a1,
  double a2,
) {
  print(
    "variadicAt1DoubleStruct12BytesHomogeneousFloatDoub(${a0}, ${a1}, ${a2})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub throwing on purpose!",
    );
  }

  variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a0 = a0;
  variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1 = a1;
  variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a2 = a2;

  final result =
      variadicAt1DoubleStruct12BytesHomogeneousFloatDoubCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleStruct12BytesHomogeneousFloatDoubAfterCallback() {
  final result =
      variadicAt1DoubleStruct12BytesHomogeneousFloatDoubCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt1Int32Struct20BytesHomogeneousInt32Int32Type =
    Int32 Function(Int32, VarArgs<(Struct20BytesHomogeneousInt32, Int32)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a0 = 0;
Struct20BytesHomogeneousInt32
variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1 =
    Pointer<Struct20BytesHomogeneousInt32>.fromAddress(0).ref;
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a2 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32Result = 0;

int variadicAt1Int32Struct20BytesHomogeneousInt32Int32CalculateResult() {
  int result = 0;

  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a0;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a0;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a1;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a2;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a3;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a4;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a2;

  variadicAt1Int32Struct20BytesHomogeneousInt32Int32Result = result;

  return result;
}

/// Variadic arguments including struct.
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32(
  int a0,
  Struct20BytesHomogeneousInt32 a1,
  int a2,
) {
  print(
    "variadicAt1Int32Struct20BytesHomogeneousInt32Int32(${a0}, ${a1}, ${a2})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1Int32Struct20BytesHomogeneousInt32Int32 throwing on purpose!",
    );
  }

  variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a0 = a0;
  variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1 = a1;
  variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a2 = a2;

  final result =
      variadicAt1Int32Struct20BytesHomogeneousInt32Int32CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int32Struct20BytesHomogeneousInt32Int32AfterCallback() {
  final result =
      variadicAt1Int32Struct20BytesHomogeneousInt32Int32CalculateResult();

  print("after callback result = $result");

  Expect.equals(-4, result);
}

typedef VariadicAt1DoubleStruct20BytesHomogeneousFloatDoubType =
    Double Function(Double, VarArgs<(Struct20BytesHomogeneousFloat, Double)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a0 = 0.0;
Struct20BytesHomogeneousFloat
variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1 =
    Pointer<Struct20BytesHomogeneousFloat>.fromAddress(0).ref;
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a2 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoubResult = 0.0;

double variadicAt1DoubleStruct20BytesHomogeneousFloatDoubCalculateResult() {
  double result = 0;

  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a0;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a0;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a1;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a2;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a3;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a4;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a2;

  variadicAt1DoubleStruct20BytesHomogeneousFloatDoubResult = result;

  return result;
}

/// Variadic arguments including struct.
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoub(
  double a0,
  Struct20BytesHomogeneousFloat a1,
  double a2,
) {
  print(
    "variadicAt1DoubleStruct20BytesHomogeneousFloatDoub(${a0}, ${a1}, ${a2})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub throwing on purpose!",
    );
  }

  variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a0 = a0;
  variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1 = a1;
  variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a2 = a2;

  final result =
      variadicAt1DoubleStruct20BytesHomogeneousFloatDoubCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleStruct20BytesHomogeneousFloatDoubAfterCallback() {
  final result =
      variadicAt1DoubleStruct20BytesHomogeneousFloatDoubCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-4.0, result);
}

typedef VariadicAt2Int32Int64IntPtrType =
    Int32 Function(Int32, Int64, VarArgs<(IntPtr,)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt2Int32Int64IntPtr_a0 = 0;
int variadicAt2Int32Int64IntPtr_a1 = 0;
int variadicAt2Int32Int64IntPtr_a2 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt2Int32Int64IntPtrResult = 0;

int variadicAt2Int32Int64IntPtrCalculateResult() {
  int result = 0;

  result += variadicAt2Int32Int64IntPtr_a0;
  result += variadicAt2Int32Int64IntPtr_a1;
  result += variadicAt2Int32Int64IntPtr_a2;

  variadicAt2Int32Int64IntPtrResult = result;

  return result;
}

/// Regression test for variadic arguments.
/// https://github.com/dart-lang/sdk/issues/49460
int variadicAt2Int32Int64IntPtr(int a0, int a1, int a2) {
  print("variadicAt2Int32Int64IntPtr(${a0}, ${a1}, ${a2})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt2Int32Int64IntPtr throwing on purpose!");
  }

  variadicAt2Int32Int64IntPtr_a0 = a0;
  variadicAt2Int32Int64IntPtr_a1 = a1;
  variadicAt2Int32Int64IntPtr_a2 = a2;

  final result = variadicAt2Int32Int64IntPtrCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt2Int32Int64IntPtrAfterCallback() {
  final result = variadicAt2Int32Int64IntPtrCalculateResult();

  print("after callback result = $result");

  Expect.equals(-2, result);
}

typedef VariadicAt1DoubleInt64Int32DoubleInt64Int32Type =
    Double Function(Double, VarArgs<(Int64, Int32, Double, Int64, Int32)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleInt64Int32DoubleInt64Int32_a0 = 0.0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a1 = 0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a2 = 0;
double variadicAt1DoubleInt64Int32DoubleInt64Int32_a3 = 0.0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a4 = 0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a5 = 0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleInt64Int32DoubleInt64Int32Result = 0.0;

double variadicAt1DoubleInt64Int32DoubleInt64Int32CalculateResult() {
  double result = 0;

  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a0;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a1;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a2;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a3;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a4;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a5;

  variadicAt1DoubleInt64Int32DoubleInt64Int32Result = result;

  return result;
}

/// Variadic arguments mixed.
double variadicAt1DoubleInt64Int32DoubleInt64Int32(
  double a0,
  int a1,
  int a2,
  double a3,
  int a4,
  int a5,
) {
  print(
    "variadicAt1DoubleInt64Int32DoubleInt64Int32(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1DoubleInt64Int32DoubleInt64Int32 throwing on purpose!",
    );
  }

  variadicAt1DoubleInt64Int32DoubleInt64Int32_a0 = a0;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a1 = a1;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a2 = a2;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a3 = a3;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a4 = a4;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a5 = a5;

  final result = variadicAt1DoubleInt64Int32DoubleInt64Int32CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleInt64Int32DoubleInt64Int32AfterCallback() {
  final result = variadicAt1DoubleInt64Int32DoubleInt64Int32CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(3.0, result);
}

typedef VariadicAt1Int64Int32Struct12BytesHomogeneousFloatType =
    Double Function(Int64, VarArgs<(Int32, Struct12BytesHomogeneousFloat)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a0 = 0;
int variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a1 = 0;
Struct12BytesHomogeneousFloat
variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Int64Int32Struct12BytesHomogeneousFloatResult = 0.0;

double variadicAt1Int64Int32Struct12BytesHomogeneousFloatCalculateResult() {
  double result = 0;

  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a0;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a1;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2.a0;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2.a1;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2.a2;

  variadicAt1Int64Int32Struct12BytesHomogeneousFloatResult = result;

  return result;
}

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
double variadicAt1Int64Int32Struct12BytesHomogeneousFloat(
  int a0,
  int a1,
  Struct12BytesHomogeneousFloat a2,
) {
  print(
    "variadicAt1Int64Int32Struct12BytesHomogeneousFloat(${a0}, ${a1}, ${a2})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1Int64Int32Struct12BytesHomogeneousFloat throwing on purpose!",
    );
  }

  variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a0 = a0;
  variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a1 = a1;
  variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2 = a2;

  final result =
      variadicAt1Int64Int32Struct12BytesHomogeneousFloatCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64Int32Struct12BytesHomogeneousFloatAfterCallback() {
  final result =
      variadicAt1Int64Int32Struct12BytesHomogeneousFloatCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt11Doublex8FloatStruct12BytesHomogeneousFType =
    Double Function(
      Double,
      Double,
      Double,
      Double,
      Double,
      Double,
      Double,
      Double,
      Float,
      Struct12BytesHomogeneousFloat,
      Int64,
      VarArgs<(Int32, Struct12BytesHomogeneousFloat)>,
    );

// Global variables to be able to test inputs after callback returned.
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a0 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a1 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a2 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a3 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a4 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a5 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a6 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a7 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a8 = 0.0;
Struct12BytesHomogeneousFloat
variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;
int variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a10 = 0;
int variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a11 = 0;
Struct12BytesHomogeneousFloat
variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;

// Result variable also global, so we can delete it after the callback.
double variadicAt11Doublex8FloatStruct12BytesHomogeneousFResult = 0.0;

double variadicAt11Doublex8FloatStruct12BytesHomogeneousFCalculateResult() {
  double result = 0;

  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a0;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a1;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a2;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a3;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a4;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a5;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a6;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a7;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a8;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9.a0;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9.a1;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9.a2;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a10;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a11;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12.a0;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12.a1;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12.a2;

  variadicAt11Doublex8FloatStruct12BytesHomogeneousFResult = result;

  return result;
}

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF(
  double a0,
  double a1,
  double a2,
  double a3,
  double a4,
  double a5,
  double a6,
  double a7,
  double a8,
  Struct12BytesHomogeneousFloat a9,
  int a10,
  int a11,
  Struct12BytesHomogeneousFloat a12,
) {
  print(
    "variadicAt11Doublex8FloatStruct12BytesHomogeneousF(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt11Doublex8FloatStruct12BytesHomogeneousF throwing on purpose!",
    );
  }

  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a0 = a0;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a1 = a1;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a2 = a2;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a3 = a3;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a4 = a4;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a5 = a5;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a6 = a6;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a7 = a7;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a8 = a8;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9 = a9;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a10 = a10;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a11 = a11;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12 = a12;

  final result =
      variadicAt11Doublex8FloatStruct12BytesHomogeneousFCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt11Doublex8FloatStruct12BytesHomogeneousFAfterCallback() {
  final result =
      variadicAt11Doublex8FloatStruct12BytesHomogeneousFCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-9.0, result);
}

typedef VariadicAt1DoubleInt64Int32Struct20BytesHomogeneouType =
    Double Function(
      Double,
      VarArgs<
        (
          Int64,
          Int32,
          Struct20BytesHomogeneousInt32,
          Double,
          Int64,
          Int32,
          Struct12BytesHomogeneousFloat,
          Int64,
        )
      >,
    );

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a0 = 0.0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a1 = 0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a2 = 0;
Struct20BytesHomogeneousInt32
variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3 =
    Pointer<Struct20BytesHomogeneousInt32>.fromAddress(0).ref;
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a4 = 0.0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a5 = 0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a6 = 0;
Struct12BytesHomogeneousFloat
variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a8 = 0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneouResult = 0.0;

double variadicAt1DoubleInt64Int32Struct20BytesHomogeneouCalculateResult() {
  double result = 0;

  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a0;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a1;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a2;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a0;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a1;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a2;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a3;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a4;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a4;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a5;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a6;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7.a0;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7.a1;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7.a2;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a8;

  variadicAt1DoubleInt64Int32Struct20BytesHomogeneouResult = result;

  return result;
}

/// Variadic arguments mixed.
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneou(
  double a0,
  int a1,
  int a2,
  Struct20BytesHomogeneousInt32 a3,
  double a4,
  int a5,
  int a6,
  Struct12BytesHomogeneousFloat a7,
  int a8,
) {
  print(
    "variadicAt1DoubleInt64Int32Struct20BytesHomogeneou(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou throwing on purpose!",
    );
  }

  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a0 = a0;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a1 = a1;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a2 = a2;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3 = a3;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a4 = a4;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a5 = a5;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a6 = a6;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7 = a7;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a8 = a8;

  final result =
      variadicAt1DoubleInt64Int32Struct20BytesHomogeneouCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleInt64Int32Struct20BytesHomogeneouAfterCallback() {
  final result =
      variadicAt1DoubleInt64Int32Struct20BytesHomogeneouCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-8.0, result);
}

typedef VariadicAt5Doublex5Type =
    Double Function(Double, Double, Double, Double, Double, VarArgs<()>);

// Global variables to be able to test inputs after callback returned.
double variadicAt5Doublex5_a0 = 0.0;
double variadicAt5Doublex5_a1 = 0.0;
double variadicAt5Doublex5_a2 = 0.0;
double variadicAt5Doublex5_a3 = 0.0;
double variadicAt5Doublex5_a4 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt5Doublex5Result = 0.0;

double variadicAt5Doublex5CalculateResult() {
  double result = 0;

  result += variadicAt5Doublex5_a0;
  result += variadicAt5Doublex5_a1;
  result += variadicAt5Doublex5_a2;
  result += variadicAt5Doublex5_a3;
  result += variadicAt5Doublex5_a4;

  variadicAt5Doublex5Result = result;

  return result;
}

/// Variadic arguments function definition, but not passing any.
double variadicAt5Doublex5(
  double a0,
  double a1,
  double a2,
  double a3,
  double a4,
) {
  print("variadicAt5Doublex5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt5Doublex5 throwing on purpose!");
  }

  variadicAt5Doublex5_a0 = a0;
  variadicAt5Doublex5_a1 = a1;
  variadicAt5Doublex5_a2 = a2;
  variadicAt5Doublex5_a3 = a3;
  variadicAt5Doublex5_a4 = a4;

  final result = variadicAt5Doublex5CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt5Doublex5AfterCallback() {
  final result = variadicAt5Doublex5CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt1Int64x7Struct12BytesHomogeneousInt32Type =
    Int64 Function(
      Int64,
      VarArgs<
        (
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Struct12BytesHomogeneousInt32,
        )
      >,
    );

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a0 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a1 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a2 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a3 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a4 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a5 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a6 = 0;
Struct12BytesHomogeneousInt32
variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7 =
    Pointer<Struct12BytesHomogeneousInt32>.fromAddress(0).ref;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x7Struct12BytesHomogeneousInt32Result = 0;

int variadicAt1Int64x7Struct12BytesHomogeneousInt32CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a0;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a1;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a2;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a3;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a4;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a5;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a6;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7.a0;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7.a1;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7.a2;

  variadicAt1Int64x7Struct12BytesHomogeneousInt32Result = result;

  return result;
}

/// Struct stradles last argument register, variadic
int variadicAt1Int64x7Struct12BytesHomogeneousInt32(
  int a0,
  int a1,
  int a2,
  int a3,
  int a4,
  int a5,
  int a6,
  Struct12BytesHomogeneousInt32 a7,
) {
  print(
    "variadicAt1Int64x7Struct12BytesHomogeneousInt32(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7})",
  );

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1Int64x7Struct12BytesHomogeneousInt32 throwing on purpose!",
    );
  }

  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a0 = a0;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a1 = a1;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a2 = a2;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a3 = a3;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a4 = a4;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a5 = a5;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a6 = a6;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7 = a7;

  final result =
      variadicAt1Int64x7Struct12BytesHomogeneousInt32CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x7Struct12BytesHomogeneousInt32AfterCallback() {
  final result =
      variadicAt1Int64x7Struct12BytesHomogeneousInt32CalculateResult();

  print("after callback result = $result");

  Expect.equals(5, result);
}

typedef VariadicAt1Struct12BytesHomogeneousInt32Int32x4Type =
    Int32 Function(
      Struct12BytesHomogeneousInt32,
      VarArgs<(Int32, Int32, Int32, Int32)>,
    );

// Global variables to be able to test inputs after callback returned.
Struct12BytesHomogeneousInt32
variadicAt1Struct12BytesHomogeneousInt32Int32x4_a0 =
    Pointer<Struct12BytesHomogeneousInt32>.fromAddress(0).ref;
int variadicAt1Struct12BytesHomogeneousInt32Int32x4_a1 = 0;
int variadicAt1Struct12BytesHomogeneousInt32Int32x4_a2 = 0;
int variadicAt1Struct12BytesHomogeneousInt32Int32x4_a3 = 0;
int variadicAt1Struct12BytesHomogeneousInt32Int32x4_a4 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Struct12BytesHomogeneousInt32Int32x4Result = 0;

int variadicAt1Struct12BytesHomogeneousInt32Int32x4CalculateResult() {
  int result = 0;

  result += variadicAt1Struct12BytesHomogeneousInt32Int32x4_a0.a0;
  result += variadicAt1Struct12BytesHomogeneousInt32Int32x4_a0.a1;
  result += variadicAt1Struct12BytesHomogeneousInt32Int32x4_a0.a2;
  result += variadicAt1Struct12BytesHomogeneousInt32Int32x4_a1;
  result += variadicAt1Struct12BytesHomogeneousInt32Int32x4_a2;
  result += variadicAt1Struct12BytesHomogeneousInt32Int32x4_a3;
  result += variadicAt1Struct12BytesHomogeneousInt32Int32x4_a4;

  variadicAt1Struct12BytesHomogeneousInt32Int32x4Result = result;

  return result;
}

/// Variadic arguments test on macos_arm64.
int variadicAt1Struct12BytesHomogeneousInt32Int32x4(
  Struct12BytesHomogeneousInt32 a0,
  int a1,
  int a2,
  int a3,
  int a4,
) {
  print(
    "variadicAt1Struct12BytesHomogeneousInt32Int32x4(${a0}, ${a1}, ${a2}, ${a3}, ${a4})",
  );

  // Possibly throw.
  if (a0.a0 == 42 || a0.a0 == 84) {
    print("throwing!");
    throw Exception(
      "VariadicAt1Struct12BytesHomogeneousInt32Int32x4 throwing on purpose!",
    );
  }

  variadicAt1Struct12BytesHomogeneousInt32Int32x4_a0 = a0;
  variadicAt1Struct12BytesHomogeneousInt32Int32x4_a1 = a1;
  variadicAt1Struct12BytesHomogeneousInt32Int32x4_a2 = a2;
  variadicAt1Struct12BytesHomogeneousInt32Int32x4_a3 = a3;
  variadicAt1Struct12BytesHomogeneousInt32Int32x4_a4 = a4;

  final result =
      variadicAt1Struct12BytesHomogeneousInt32Int32x4CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Struct12BytesHomogeneousInt32Int32x4AfterCallback() {
  final result =
      variadicAt1Struct12BytesHomogeneousInt32Int32x4CalculateResult();

  print("after callback result = $result");

  Expect.equals(-4, result);
}
