// 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 // @dart = 2.9 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 functionsToTest = [ // Pointer operations. () => highAddressPointer.cast(), () => 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() == 4 ? mint32bit : mint64bit; final Pointer highAddressPointer = Pointer.fromAddress(highAddress); // Dynamic library operation helpers. final doDlopen = () => dlopenPlatformSpecific("ffi_test_functions"); final doDlsym = () => ffiTestFunctions .lookupFunction("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("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("SumManyDoubles"); typedef NativeNullaryOp64 = Int64 Function(); typedef NativeNullaryOp32 = Int32 Function(); typedef NativeNullaryOpDouble = Double Function(); typedef NullaryOpPtr = Pointer Function(); typedef NullaryOp = int Function(); typedef NullaryOpDbl = double Function(); final minInt64 = ffiTestFunctions.lookupFunction("MinInt64"); final minInt32 = ffiTestFunctions.lookupFunction("MinInt32"); final smallDouble = ffiTestFunctions .lookupFunction("SmallDouble"); final largePointer = ffiTestFunctions.lookupFunction("LargePointer");