// 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.
//
// VMOptions=
// VMOptions=--deterministic --optimization-counter-threshold=90
// VMOptions=--use-slow-path
// SharedObjects=ffi_test_functions
//
// This file tests subtyping relationships (at compile time and at runtime) of
// parameters and return types of ffi trampolines and ffi callback trampolines.

import 'dart:ffi';

import "package:expect/expect.dart";
import "package:ffi/ffi.dart";

import 'dylib_utils.dart';

typedef Int64PointerParamOpDart = void Function(Pointer<Int64>);
typedef Int64PointerParamOp = Void Function(Pointer<Int64>);
typedef NaTyPointerParamOpDart = void Function(Pointer<NativeType>);
typedef NaTyPointerParamOp = Void Function(Pointer<NativeType>);
typedef Int64PointerReturnOp = Pointer<Int64> Function();
typedef NaTyPointerReturnOp = Pointer<NativeType> Function();

final paramOpName = "NativeTypePointerParam";
final returnOpName = "NativeTypePointerReturn";

final DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific(
  "ffi_test_functions",
);

// =============================================
// Tests calls from Dart to native (asFunction).
// =============================================

void paramInvariant1() {
  final fp = ffiTestFunctions.lookup<NativeFunction<Int64PointerParamOp>>(
    paramOpName,
  );
  final f = fp.asFunction<Int64PointerParamOpDart>();
  final arg = calloc<Int64>();
  f(arg);
  calloc.free(arg);
}

void paramInvariant2() {
  final fp = ffiTestFunctions.lookup<NativeFunction<NaTyPointerParamOp>>(
    paramOpName,
  );
  final f = fp.asFunction<NaTyPointerParamOpDart>();
  final arg = calloc<Int64>().cast<NativeType>();
  Expect.type<Pointer<NativeType>>(arg);
  f(arg);
  calloc.free(arg);
}

// Pass a statically and dynamically subtyped argument.
void paramSubtype1() {
  final fp = ffiTestFunctions.lookup<NativeFunction<NaTyPointerParamOp>>(
    paramOpName,
  );
  final f = fp.asFunction<NaTyPointerParamOpDart>();
  final arg = calloc<Int64>();
  Expect.type<Pointer<Int64>>(arg);
  f(arg);
  calloc.free(arg);
}

// Pass a statically subtyped but dynamically invariant argument.
void paramSubtype2() {
  final fp = ffiTestFunctions.lookup<NativeFunction<NaTyPointerParamOp>>(
    paramOpName,
  );
  final f = fp.asFunction<NaTyPointerParamOpDart>();
  final Pointer<NativeType> arg = calloc<Int64>();
  Expect.type<Pointer<Int64>>(arg);
  f(arg);
  calloc.free(arg);
}

void returnInvariant1() {
  final fp = ffiTestFunctions.lookup<NativeFunction<Int64PointerReturnOp>>(
    returnOpName,
  );
  final f = fp.asFunction<Int64PointerReturnOp>();
  final result = f();
  Expect.type<Pointer<Int64>>(result);
}

void returnInvariant2() {
  final fp = ffiTestFunctions.lookup<NativeFunction<NaTyPointerReturnOp>>(
    returnOpName,
  );
  final f = fp.asFunction<NaTyPointerReturnOp>();
  final result = f();
  Expect.type<Pointer<NativeType>>(result);
}

void returnSubtype() {
  final fp = ffiTestFunctions.lookup<NativeFunction<Int64PointerReturnOp>>(
    returnOpName,
  );
  final f = fp.asFunction<Int64PointerReturnOp>();
  final NaTyPointerReturnOp f2 = f;
  Expect.type<Int64PointerReturnOp>(f2);
  final result = f2();
  Expect.type<Pointer<NativeType>>(result);
}

void functionArgumentVariance() {
  final p =
      Pointer<
        NativeFunction<
          Pointer<NativeFunction<Pointer<Int8> Function(Pointer<NativeType>)>>
          Function(
            Pointer<
              NativeFunction<Pointer<NativeType> Function(Pointer<Int8>)>
            >,
          )
        >
      >.fromAddress(0x1234);
  p
      .asFunction<
        Pointer<NativeFunction<Pointer<NativeType> Function(Pointer<Int8>)>>
        Function(
          Pointer<NativeFunction<Pointer<Int8> Function(Pointer<NativeType>)>>,
        )
      >();
}

void asFunctionTests() {
  for (int i = 0; i < 100; ++i) {
    paramInvariant1(); // Parameter invariant: Pointer<Int64>.
    paramInvariant2(); // Parameter invariant: Pointer<NativeType>.
    paramSubtype1(); // Parameter statically and dynamically subtyped.
    paramSubtype2(); // Parameter statically invariant, dynamically subtyped.
    returnInvariant1(); // Return value invariant: Pointer<Int64>.
    returnInvariant2(); // Return value invariant: Pointer<NativeType>.
    returnSubtype(); // Return value static subtyped, dynamically invariant.
    functionArgumentVariance(); // Check nested function signatures.
  }
}

// =======================================================
// Test with callbacks from native to Dart (fromFunction).
// =======================================================

typedef CallbackInt64PointerParamOpDart =
    void Function(Pointer<NativeFunction<Int64PointerParamOp>>);
typedef CallbackInt64PointerParamOp =
    Void Function(Pointer<NativeFunction<Int64PointerParamOp>>);

typedef CallbackNaTyPointerParamOpDart =
    void Function(Pointer<NativeFunction<NaTyPointerParamOp>>);
typedef CallbackNaTyPointerParamOp =
    Void Function(Pointer<NativeFunction<NaTyPointerParamOp>>);

typedef CallbackInt64PointerReturnOpDart =
    void Function(Pointer<NativeFunction<Int64PointerReturnOp>>);
typedef CallbackInt64PointerReturnOp =
    Void Function(Pointer<NativeFunction<Int64PointerReturnOp>>);

typedef CallbackNaTyPointerReturnOpDart =
    void Function(Pointer<NativeFunction<NaTyPointerReturnOp>>);
typedef CallbackNaTyPointerReturnOp =
    Void Function(Pointer<NativeFunction<NaTyPointerReturnOp>>);

final callbackParamOpName = "CallbackNativeTypePointerParam";
final callbackReturnOpName = "CallbackNativeTypePointerReturn";

void int64PointerParamOp(Pointer<Int64> p) {
  p.value = 42;
}

void naTyPointerParamOp(Pointer<NativeType> p) {
  final Pointer<Int8> asInt8 = p.cast();
  asInt8.value = 42;
}

// Pointer to return to C when C calls back into Dart and asks for a Pointer.
Pointer<Int64> data = nullptr;

Pointer<Int64> int64PointerReturnOp() {
  return data;
}

Pointer<NativeType> naTyPointerReturnOp() {
  return data;
}

void callbackParamInvariant1() {
  final callback = ffiTestFunctions
      .lookupFunction<
        CallbackInt64PointerParamOp,
        CallbackInt64PointerParamOpDart
      >(callbackParamOpName);
  final fp = Pointer.fromFunction<Int64PointerParamOp>(int64PointerParamOp);
  callback(fp);
}

void callbackParamInvariant2() {
  final callback = ffiTestFunctions
      .lookupFunction<
        CallbackNaTyPointerParamOp,
        CallbackNaTyPointerParamOpDart
      >(callbackParamOpName);
  final fp = Pointer.fromFunction<NaTyPointerParamOp>(naTyPointerParamOp);
  callback(fp);
}

void callbackParamImplicitDowncast1() {
  final callback = ffiTestFunctions
      .lookupFunction<
        CallbackNaTyPointerParamOp,
        CallbackNaTyPointerParamOpDart
      >(callbackParamOpName);
  final fp = Pointer.fromFunction<Int64PointerParamOp>(int64PointerParamOp);
  // Pointer type arguments are not reified, any cast will succeed.
  callback(fp as Pointer<NativeFunction<NaTyPointerParamOp>>);
}

void callbackParamSubtype1() {
  final callback = ffiTestFunctions
      .lookupFunction<
        CallbackInt64PointerParamOp,
        CallbackInt64PointerParamOpDart
      >(callbackParamOpName);
  final fp = Pointer.fromFunction<Int64PointerParamOp>(naTyPointerParamOp);
  callback(fp);
}

void callbackReturnInvariant1() {
  final callback = ffiTestFunctions
      .lookupFunction<
        CallbackInt64PointerReturnOp,
        CallbackInt64PointerReturnOpDart
      >(callbackReturnOpName);
  final fp = Pointer.fromFunction<Int64PointerReturnOp>(int64PointerReturnOp);
  callback(fp);
}

void callbackReturnInvariant2() {
  final callback = ffiTestFunctions
      .lookupFunction<
        CallbackNaTyPointerReturnOp,
        CallbackNaTyPointerReturnOpDart
      >(callbackReturnOpName);
  final fp = Pointer.fromFunction<NaTyPointerReturnOp>(naTyPointerReturnOp);
  callback(fp);
}

void fromFunctionTests() {
  data = calloc();
  for (int i = 0; i < 100; ++i) {
    callbackParamInvariant1(); // Pointer<Int64> invariant
    callbackParamInvariant2(); // Pointer<NativeType> invariant
    callbackParamImplicitDowncast1(); // static and dynamically supertyped
    callbackParamSubtype1(); // static and dynamically subtyped
    callbackReturnInvariant1(); // Pointer<Int64> invariant
    callbackReturnInvariant2(); // Pointer<NativeType> invariant
  }
  calloc.free(data);
}

void main() {
  asFunctionTests();
  fromFunctionTests();
}
