|  | // 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 | 
|  | // | 
|  | // TODO(37295): Merge this file with regress_37511_test.dart when callback | 
|  | // support lands. | 
|  |  | 
|  | import 'dart:ffi'; | 
|  |  | 
|  | 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 = [ | 
|  | // Callback trampolines. | 
|  | doFromFunction, | 
|  | () => callbackSmallDouble(dartFunctionPointer), | 
|  | ]; | 
|  |  | 
|  | // Callback trampoline helpers. | 
|  | typedef NativeCallbackTest = Int32 Function(Pointer); | 
|  | typedef NativeCallbackTestFn = int Function(Pointer); | 
|  |  | 
|  | final callbackSmallDouble = ffiTestFunctions | 
|  | .lookupFunction<NativeCallbackTest, NativeCallbackTestFn>( | 
|  | "TestSimpleMultiply", | 
|  | ); | 
|  |  | 
|  | typedef SimpleMultiplyType = Double Function(Double); | 
|  | double simpleMultiply(double x) => x * 1.337; | 
|  |  | 
|  | final doFromFunction = | 
|  | () => Pointer.fromFunction<SimpleMultiplyType>(simpleMultiply, 0.0); | 
|  |  | 
|  | final dartFunctionPointer = doFromFunction(); |