| // Copyright (c) 2020, 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. | 
 | // | 
 | // VMOptions= | 
 | // VMOptions=--deterministic --optimization-counter-threshold=90 | 
 | // VMOptions=--stacktrace-every=100 | 
 | // VMOptions=--use-slow-path | 
 | // VMOptions=--use-slow-path  --stacktrace-every=100 | 
 | // SharedObjects=ffi_test_functions | 
 |  | 
 | import 'dart:ffi'; | 
 |  | 
 | import 'callback_tests_utils.dart'; | 
 |  | 
 | final testcases = [ | 
 |   CallbackTest( | 
 |     "SumVeryManySmallInts", | 
 |     Pointer.fromFunction<NativeVeryManyIntsOp>(sumVeryManySmallInts, 0), | 
 |   ), | 
 |   CallbackTest( | 
 |     "SumVeryManyFloatsDoubles", | 
 |     Pointer.fromFunction<NativeVeryManyFloatsDoublesOp>( | 
 |       sumVeryManyDoubles, | 
 |       0.0, | 
 |     ), | 
 |   ), | 
 | ]; | 
 |  | 
 | void main() { | 
 |   for (int i = 0; i < 100; ++i) { | 
 |     testcases.forEach((t) => t.run()); | 
 |   } | 
 | } | 
 |  | 
 | int sumVeryManySmallInts( | 
 |   int _1, | 
 |   int _2, | 
 |   int _3, | 
 |   int _4, | 
 |   int _5, | 
 |   int _6, | 
 |   int _7, | 
 |   int _8, | 
 |   int _9, | 
 |   int _10, | 
 |   int _11, | 
 |   int _12, | 
 |   int _13, | 
 |   int _14, | 
 |   int _15, | 
 |   int _16, | 
 |   int _17, | 
 |   int _18, | 
 |   int _19, | 
 |   int _20, | 
 |   int _21, | 
 |   int _22, | 
 |   int _23, | 
 |   int _24, | 
 |   int _25, | 
 |   int _26, | 
 |   int _27, | 
 |   int _28, | 
 |   int _29, | 
 |   int _30, | 
 |   int _31, | 
 |   int _32, | 
 |   int _33, | 
 |   int _34, | 
 |   int _35, | 
 |   int _36, | 
 |   int _37, | 
 |   int _38, | 
 |   int _39, | 
 |   int _40, | 
 | ) { | 
 |   print( | 
 |     "sumVeryManySmallInts(" + | 
 |         "$_1, $_2, $_3, $_4, $_5, $_6, $_7, $_8, $_9, $_10, " + | 
 |         "$_11, $_12, $_13, $_14, $_15, $_16, $_17, $_18, $_19, $_20, " + | 
 |         "$_21, $_22, $_23, $_24, $_25, $_26, $_27, $_28, $_29, $_30, " + | 
 |         "$_31, $_32, $_33, $_34, $_35, $_36, $_37, $_38, $_39, $_40)", | 
 |   ); | 
 |   return _1 + | 
 |       _2 + | 
 |       _3 + | 
 |       _4 + | 
 |       _5 + | 
 |       _6 + | 
 |       _7 + | 
 |       _8 + | 
 |       _9 + | 
 |       _10 + | 
 |       _11 + | 
 |       _12 + | 
 |       _13 + | 
 |       _14 + | 
 |       _15 + | 
 |       _16 + | 
 |       _17 + | 
 |       _18 + | 
 |       _19 + | 
 |       _20 + | 
 |       _21 + | 
 |       _22 + | 
 |       _23 + | 
 |       _24 + | 
 |       _25 + | 
 |       _26 + | 
 |       _27 + | 
 |       _28 + | 
 |       _29 + | 
 |       _30 + | 
 |       _31 + | 
 |       _32 + | 
 |       _33 + | 
 |       _34 + | 
 |       _35 + | 
 |       _36 + | 
 |       _37 + | 
 |       _38 + | 
 |       _39 + | 
 |       _40; | 
 | } | 
 |  | 
 | double sumVeryManyDoubles( | 
 |   double _1, | 
 |   double _2, | 
 |   double _3, | 
 |   double _4, | 
 |   double _5, | 
 |   double _6, | 
 |   double _7, | 
 |   double _8, | 
 |   double _9, | 
 |   double _10, | 
 |   double _11, | 
 |   double _12, | 
 |   double _13, | 
 |   double _14, | 
 |   double _15, | 
 |   double _16, | 
 |   double _17, | 
 |   double _18, | 
 |   double _19, | 
 |   double _20, | 
 |   double _21, | 
 |   double _22, | 
 |   double _23, | 
 |   double _24, | 
 |   double _25, | 
 |   double _26, | 
 |   double _27, | 
 |   double _28, | 
 |   double _29, | 
 |   double _30, | 
 |   double _31, | 
 |   double _32, | 
 |   double _33, | 
 |   double _34, | 
 |   double _35, | 
 |   double _36, | 
 |   double _37, | 
 |   double _38, | 
 |   double _39, | 
 |   double _40, | 
 | ) { | 
 |   print( | 
 |     "sumVeryManyDoubles(" + | 
 |         "$_1, $_2, $_3, $_4, $_5, $_6, $_7, $_8, $_9, $_10, " + | 
 |         "$_11, $_12, $_13, $_14, $_15, $_16, $_17, $_18, $_19, $_20, " + | 
 |         "$_21, $_22, $_23, $_24, $_25, $_26, $_27, $_28, $_29, $_30, " + | 
 |         "$_31, $_32, $_33, $_34, $_35, $_36, $_37, $_38, $_39, $_40)", | 
 |   ); | 
 |   return _1 + | 
 |       _2 + | 
 |       _3 + | 
 |       _4 + | 
 |       _5 + | 
 |       _6 + | 
 |       _7 + | 
 |       _8 + | 
 |       _9 + | 
 |       _10 + | 
 |       _11 + | 
 |       _12 + | 
 |       _13 + | 
 |       _14 + | 
 |       _15 + | 
 |       _16 + | 
 |       _17 + | 
 |       _18 + | 
 |       _19 + | 
 |       _20 + | 
 |       _21 + | 
 |       _22 + | 
 |       _23 + | 
 |       _24 + | 
 |       _25 + | 
 |       _26 + | 
 |       _27 + | 
 |       _28 + | 
 |       _29 + | 
 |       _30 + | 
 |       _31 + | 
 |       _32 + | 
 |       _33 + | 
 |       _34 + | 
 |       _35 + | 
 |       _36 + | 
 |       _37 + | 
 |       _38 + | 
 |       _39 + | 
 |       _40; | 
 | } | 
 |  | 
 | typedef NativeVeryManyIntsOp = | 
 |     Int16 Function( | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |       Int8, | 
 |       Int16, | 
 |     ); | 
 |  | 
 | typedef NativeVeryManyFloatsDoublesOp = | 
 |     Double Function( | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |       Float, | 
 |       Double, | 
 |     ); |