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