// 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";

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",
      NativeCallable<VariadicAt1Int64x2Type>.isolateLocal(variadicAt1Int64x2,
          exceptionalReturn: 0),
      variadicAt1Int64x2AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex2",
      NativeCallable<VariadicAt1Doublex2Type>.isolateLocal(variadicAt1Doublex2,
          exceptionalReturn: 0.0),
      variadicAt1Doublex2AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x5",
      NativeCallable<VariadicAt1Int64x5Type>.isolateLocal(variadicAt1Int64x5,
          exceptionalReturn: 0),
      variadicAt1Int64x5AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex5",
      NativeCallable<VariadicAt1Doublex5Type>.isolateLocal(variadicAt1Doublex5,
          exceptionalReturn: 0.0),
      variadicAt1Doublex5AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x20",
      NativeCallable<VariadicAt1Int64x20Type>.isolateLocal(variadicAt1Int64x20,
          exceptionalReturn: 0),
      variadicAt1Int64x20AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex20",
      NativeCallable<VariadicAt1Doublex20Type>.isolateLocal(
          variadicAt1Doublex20,
          exceptionalReturn: 0.0),
      variadicAt1Doublex20AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x2Struct8BytesIntInt64",
      NativeCallable<VariadicAt1Int64x2Struct8BytesIntInt64Type>.isolateLocal(
          variadicAt1Int64x2Struct8BytesIntInt64,
          exceptionalReturn: 0),
      variadicAt1Int64x2Struct8BytesIntInt64AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD",
      NativeCallable<
              VariadicAt1Doublex2Struct32BytesHomogeneousDoubleDType>.isolateLocal(
          variadicAt1Doublex2Struct32BytesHomogeneousDoubleD,
          exceptionalReturn: 0.0),
      variadicAt1Doublex2Struct32BytesHomogeneousDoubleDAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub",
      NativeCallable<
              VariadicAt1DoubleStruct12BytesHomogeneousFloatDoubType>.isolateLocal(
          variadicAt1DoubleStruct12BytesHomogeneousFloatDoub,
          exceptionalReturn: 0.0),
      variadicAt1DoubleStruct12BytesHomogeneousFloatDoubAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int32Struct20BytesHomogeneousInt32Int32",
      NativeCallable<
              VariadicAt1Int32Struct20BytesHomogeneousInt32Int32Type>.isolateLocal(
          variadicAt1Int32Struct20BytesHomogeneousInt32Int32,
          exceptionalReturn: 0),
      variadicAt1Int32Struct20BytesHomogeneousInt32Int32AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub",
      NativeCallable<
              VariadicAt1DoubleStruct20BytesHomogeneousFloatDoubType>.isolateLocal(
          variadicAt1DoubleStruct20BytesHomogeneousFloatDoub,
          exceptionalReturn: 0.0),
      variadicAt1DoubleStruct20BytesHomogeneousFloatDoubAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt2Int32Int64IntPtr",
      NativeCallable<VariadicAt2Int32Int64IntPtrType>.isolateLocal(
          variadicAt2Int32Int64IntPtr,
          exceptionalReturn: 0),
      variadicAt2Int32Int64IntPtrAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleInt64Int32DoubleInt64Int32",
      NativeCallable<
              VariadicAt1DoubleInt64Int32DoubleInt64Int32Type>.isolateLocal(
          variadicAt1DoubleInt64Int32DoubleInt64Int32,
          exceptionalReturn: 0.0),
      variadicAt1DoubleInt64Int32DoubleInt64Int32AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64Int32Struct12BytesHomogeneousFloat",
      NativeCallable<
              VariadicAt1Int64Int32Struct12BytesHomogeneousFloatType>.isolateLocal(
          variadicAt1Int64Int32Struct12BytesHomogeneousFloat,
          exceptionalReturn: 0.0),
      variadicAt1Int64Int32Struct12BytesHomogeneousFloatAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt11Doublex8FloatStruct12BytesHomogeneousF",
      NativeCallable<
              VariadicAt11Doublex8FloatStruct12BytesHomogeneousFType>.isolateLocal(
          variadicAt11Doublex8FloatStruct12BytesHomogeneousF,
          exceptionalReturn: 0.0),
      variadicAt11Doublex8FloatStruct12BytesHomogeneousFAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou",
      NativeCallable<
              VariadicAt1DoubleInt64Int32Struct20BytesHomogeneouType>.isolateLocal(
          variadicAt1DoubleInt64Int32Struct20BytesHomogeneou,
          exceptionalReturn: 0.0),
      variadicAt1DoubleInt64Int32Struct20BytesHomogeneouAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt5Doublex5",
      NativeCallable<VariadicAt5Doublex5Type>.isolateLocal(variadicAt5Doublex5,
          exceptionalReturn: 0.0),
      variadicAt5Doublex5AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x7Struct12BytesHomogeneousInt32",
      NativeCallable<
              VariadicAt1Int64x7Struct12BytesHomogeneousInt32Type>.isolateLocal(
          variadicAt1Int64x7Struct12BytesHomogeneousInt32,
          exceptionalReturn: 0),
      variadicAt1Int64x7Struct12BytesHomogeneousInt32AfterCallback),
];
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);
}
