// Copyright (c) 2019, 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.
//
// Dart test program for testing dart:ffi struct pointers.
//
// VMOptions=--deterministic
//
// SharedObjects=ffi_test_functions

import 'dart:ffi';

import 'dylib_utils.dart';
import 'ffi_test_helpers.dart';

/// Estimate of how many allocations functions in `functionsToTest` do at most.
const gcAfterNAllocationsMax = 10;

void main() {
  for (Function() f in functionsToTest) {
    f(); // Ensure code is compiled.

    for (int n = 1; n <= gcAfterNAllocationsMax; n++) {
      collectOnNthAllocation(n);
      f();
    }
  }
}

final List<Function()> functionsToTest = [
  // Pointer operations.
  () => highAddressPointer.cast<Double>(),
  () => Pointer.fromAddress(highAddressPointer.address),
  () => highAddressPointer.address,
  () => highAddressPointer.elementAt(1),
  () => highAddressPointer.offsetBy(1),
  () => highAddressPointer.asTypedList(1),

  // DynamicLibrary operations.
  doDlopen,
  doDlsym, // Includes `asFunction`.
  () => ffiTestFunctions.handle,

  // Trampolines.
  () => sumManyIntsOdd(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, mint64bit),
  () => sumManyDoubles(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0),
  minInt64,
  minInt32,
  smallDouble,
  largePointer,

  // Callback trampolines.
  //
  // In regress_37511_callbacks_test.dart because callbacks are not supported
  // in AOT yet.
];

// Pointer operation helpers.
const mint32bit = 0xFFFFFFF0;
const mint64bit = 0x7FFFFFFFFFFFFFF0;

final int highAddress = sizeOf<IntPtr>() == 4 ? mint32bit : mint64bit;

final Pointer<Int64> highAddressPointer = Pointer.fromAddress(highAddress);

// Dynamic library operation helpers.
final doDlopen = () => dlopenPlatformSpecific("ffi_test_functions");

final doDlsym = () => ffiTestFunctions
    .lookupFunction<NativeNullaryOp, NullaryOpVoid>("TriggerGC");

// Trampoline helpers.
typedef NativeUndenaryOp = IntPtr Function(IntPtr, IntPtr, IntPtr, IntPtr,
    IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr);
typedef UndenaryOp = int Function(
    int, int, int, int, int, int, int, int, int, int, int);

final UndenaryOp sumManyIntsOdd = ffiTestFunctions
    .lookupFunction<NativeUndenaryOp, UndenaryOp>("SumManyIntsOdd");

typedef NativeDoubleDecenaryOp = Double Function(Double, Double, Double, Double,
    Double, Double, Double, Double, Double, Double);
typedef DoubleDecenaryOp = double Function(double, double, double, double,
    double, double, double, double, double, double);

final DoubleDecenaryOp sumManyDoubles = ffiTestFunctions
    .lookupFunction<NativeDoubleDecenaryOp, DoubleDecenaryOp>("SumManyDoubles");

typedef NativeNullaryOp64 = Int64 Function();
typedef NativeNullaryOp32 = Int32 Function();
typedef NativeNullaryOpDouble = Double Function();
typedef NullaryOpPtr = Pointer<Void> Function();
typedef NullaryOp = int Function();
typedef NullaryOpDbl = double Function();

final minInt64 =
    ffiTestFunctions.lookupFunction<NativeNullaryOp64, NullaryOp>("MinInt64");

final minInt32 =
    ffiTestFunctions.lookupFunction<NativeNullaryOp32, NullaryOp>("MinInt32");

final smallDouble = ffiTestFunctions
    .lookupFunction<NativeNullaryOpDouble, NullaryOpDbl>("SmallDouble");

final largePointer =
    ffiTestFunctions.lookupFunction<NullaryOpPtr, NullaryOpPtr>("LargePointer");
