| // 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 function pointers with callbacks. |
| // |
| // SharedObjects=ffi_test_functions |
| |
| library FfiTest; |
| |
| import 'dart:ffi' as ffi; |
| |
| import 'dylib_utils.dart'; |
| |
| import "package:expect/expect.dart"; |
| |
| import 'coordinate.dart'; |
| |
| typedef NativeCoordinateOp = Coordinate Function(Coordinate); |
| |
| typedef CoordinateTrice = Coordinate Function( |
| ffi.Pointer<ffi.NativeFunction<NativeCoordinateOp>>, Coordinate); |
| |
| void main() { |
| testFunctionWithFunctionPointer(); |
| testNativeFunctionWithFunctionPointer(); |
| } |
| |
| ffi.DynamicLibrary ffiTestFunctions = |
| dlopenPlatformSpecific("ffi_test_functions"); |
| |
| /// pass a pointer to a c function as an argument to a c function |
| void testFunctionWithFunctionPointer() { |
| ffi.Pointer<ffi.NativeFunction<NativeCoordinateOp>> |
| transposeCoordinatePointer = |
| ffiTestFunctions.lookup("TransposeCoordinate"); |
| |
| ffi.Pointer<ffi.NativeFunction<CoordinateTrice>> p2 = |
| ffiTestFunctions.lookup("CoordinateUnOpTrice"); |
| CoordinateTrice coordinateUnOpTrice = p2.asFunction(); |
| |
| Coordinate c1 = Coordinate(10.0, 20.0, null); |
| c1.next = c1; |
| |
| Coordinate result = coordinateUnOpTrice(transposeCoordinatePointer, c1); |
| |
| print(result.runtimeType); |
| print(result.x); |
| print(result.y); |
| |
| c1.free(); |
| } |
| |
| typedef BinaryOp = int Function(int, int); |
| |
| typedef NativeIntptrBinOp = ffi.IntPtr Function(ffi.IntPtr, ffi.IntPtr); |
| |
| typedef NativeIntptrBinOpLookup |
| = ffi.Pointer<ffi.NativeFunction<NativeIntptrBinOp>> Function(); |
| |
| void testNativeFunctionWithFunctionPointer() { |
| ffi.Pointer<ffi.NativeFunction<NativeIntptrBinOpLookup>> p1 = |
| ffiTestFunctions.lookup("IntptrAdditionClosure"); |
| NativeIntptrBinOpLookup intptrAdditionClosure = p1.asFunction(); |
| |
| ffi.Pointer<ffi.NativeFunction<NativeIntptrBinOp>> intptrAdditionPointer = |
| intptrAdditionClosure(); |
| BinaryOp intptrAddition = intptrAdditionPointer.asFunction(); |
| Expect.equals(37, intptrAddition(10, 27)); |
| } |
| |
| int myPlus(int a, int b) => a + b; |
| |
| typedef NativeApplyTo42And74Type = ffi.IntPtr Function( |
| ffi.Pointer<ffi.NativeFunction<NativeIntptrBinOp>>); |
| |
| typedef ApplyTo42And74Type = int Function( |
| ffi.Pointer<ffi.NativeFunction<NativeIntptrBinOp>>); |