| // 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. |
| // |
| // This file has been automatically generated. Please do not edit it manually. |
| // |
| // SharedObjects=ffi_test_functions |
| // VMOptions= |
| // VMOptions=--deterministic --optimization-counter-threshold=5 |
| // VMOptions=--use-slow-path |
| // VMOptions=--use-slow-path --stacktrace-every=100 |
| |
| import 'dart:ffi'; |
| |
| import "package:expect/expect.dart"; |
| import "package:ffi/ffi.dart"; |
| |
| import 'dylib_utils.dart'; |
| |
| final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions"); |
| void main() { |
| for (int i = 0; i < 10; ++i) { |
| testPassStruct1ByteIntx10(); |
| testPassStruct3BytesHomogeneousUint8x10(); |
| testPassStruct3BytesInt2ByteAlignedx10(); |
| testPassStruct4BytesHomogeneousInt16x10(); |
| testPassStruct7BytesHomogeneousUint8x10(); |
| testPassStruct7BytesInt4ByteAlignedx10(); |
| testPassStruct8BytesIntx10(); |
| testPassStruct8BytesHomogeneousFloatx10(); |
| testPassStruct8BytesMixedx10(); |
| testPassStruct9BytesHomogeneousUint8x10(); |
| testPassStruct9BytesInt4Or8ByteAlignedx10(); |
| testPassStruct12BytesHomogeneousFloatx6(); |
| testPassStruct16BytesHomogeneousFloatx5(); |
| testPassStruct16BytesMixedx10(); |
| testPassStruct16BytesMixed2x10(); |
| testPassStruct17BytesIntx10(); |
| testPassStruct19BytesHomogeneousUint8x10(); |
| testPassStruct20BytesHomogeneousInt32x10(); |
| testPassStruct20BytesHomogeneousFloat(); |
| testPassStruct32BytesHomogeneousDoublex5(); |
| testPassStruct40BytesHomogeneousDouble(); |
| testPassStruct1024BytesHomogeneousUint64(); |
| testPassFloatStruct16BytesHomogeneousFloatFloatStruct1(); |
| testPassFloatStruct32BytesHomogeneousDoubleFloatStruct(); |
| testPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn(); |
| testPassDoublex6Struct16BytesMixedx4Int32(); |
| testPassInt32x4Struct16BytesMixedx4Double(); |
| testPassStruct40BytesHomogeneousDoubleStruct4BytesHomo(); |
| testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(); |
| testPassStructAlignmentInt16(); |
| testPassStructAlignmentInt32(); |
| testPassStructAlignmentInt64(); |
| testPassStruct8BytesNestedIntx10(); |
| testPassStruct8BytesNestedFloatx10(); |
| testPassStruct8BytesNestedFloat2x10(); |
| testPassStruct8BytesNestedMixedx10(); |
| testPassStruct16BytesNestedIntx2(); |
| testPassStruct32BytesNestedIntx2(); |
| testPassStructNestedIntStructAlignmentInt16(); |
| testPassStructNestedIntStructAlignmentInt32(); |
| testPassStructNestedIntStructAlignmentInt64(); |
| testPassStructNestedIrregularEvenBiggerx4(); |
| testReturnStruct1ByteInt(); |
| testReturnStruct3BytesHomogeneousUint8(); |
| testReturnStruct3BytesInt2ByteAligned(); |
| testReturnStruct4BytesHomogeneousInt16(); |
| testReturnStruct7BytesHomogeneousUint8(); |
| testReturnStruct7BytesInt4ByteAligned(); |
| testReturnStruct8BytesInt(); |
| testReturnStruct8BytesHomogeneousFloat(); |
| testReturnStruct8BytesMixed(); |
| testReturnStruct9BytesHomogeneousUint8(); |
| testReturnStruct9BytesInt4Or8ByteAligned(); |
| testReturnStruct12BytesHomogeneousFloat(); |
| testReturnStruct16BytesHomogeneousFloat(); |
| testReturnStruct16BytesMixed(); |
| testReturnStruct16BytesMixed2(); |
| testReturnStruct17BytesInt(); |
| testReturnStruct19BytesHomogeneousUint8(); |
| testReturnStruct20BytesHomogeneousInt32(); |
| testReturnStruct20BytesHomogeneousFloat(); |
| testReturnStruct32BytesHomogeneousDouble(); |
| testReturnStruct40BytesHomogeneousDouble(); |
| testReturnStruct1024BytesHomogeneousUint64(); |
| testReturnStructArgumentStruct1ByteInt(); |
| testReturnStructArgumentInt32x8Struct1ByteInt(); |
| testReturnStructArgumentStruct8BytesHomogeneousFloat(); |
| testReturnStructArgumentStruct20BytesHomogeneousInt32(); |
| testReturnStructArgumentInt32x8Struct20BytesHomogeneou(); |
| testReturnStructAlignmentInt16(); |
| testReturnStructAlignmentInt32(); |
| testReturnStructAlignmentInt64(); |
| testReturnStruct8BytesNestedInt(); |
| testReturnStruct8BytesNestedFloat(); |
| testReturnStruct8BytesNestedFloat2(); |
| testReturnStruct8BytesNestedMixed(); |
| testReturnStruct16BytesNestedInt(); |
| testReturnStruct32BytesNestedInt(); |
| testReturnStructNestedIntStructAlignmentInt16(); |
| testReturnStructNestedIntStructAlignmentInt32(); |
| testReturnStructNestedIntStructAlignmentInt64(); |
| testReturnStructNestedIrregularEvenBigger(); |
| } |
| } |
| |
| class Struct1ByteInt extends Struct { |
| @Int8() |
| external int a0; |
| |
| String toString() => "(${a0})"; |
| } |
| |
| class Struct3BytesHomogeneousUint8 extends Struct { |
| @Uint8() |
| external int a0; |
| |
| @Uint8() |
| external int a1; |
| |
| @Uint8() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class Struct3BytesInt2ByteAligned extends Struct { |
| @Int16() |
| external int a0; |
| |
| @Int8() |
| external int a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct4BytesHomogeneousInt16 extends Struct { |
| @Int16() |
| external int a0; |
| |
| @Int16() |
| external int a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct4BytesFloat extends Struct { |
| @Float() |
| external double a0; |
| |
| String toString() => "(${a0})"; |
| } |
| |
| class Struct7BytesHomogeneousUint8 extends Struct { |
| @Uint8() |
| external int a0; |
| |
| @Uint8() |
| external int a1; |
| |
| @Uint8() |
| external int a2; |
| |
| @Uint8() |
| external int a3; |
| |
| @Uint8() |
| external int a4; |
| |
| @Uint8() |
| external int a5; |
| |
| @Uint8() |
| external int a6; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})"; |
| } |
| |
| class Struct7BytesInt4ByteAligned extends Struct { |
| @Int32() |
| external int a0; |
| |
| @Int16() |
| external int a1; |
| |
| @Int8() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class Struct8BytesInt extends Struct { |
| @Int16() |
| external int a0; |
| |
| @Int16() |
| external int a1; |
| |
| @Int32() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class Struct8BytesHomogeneousFloat extends Struct { |
| @Float() |
| external double a0; |
| |
| @Float() |
| external double a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct8BytesMixed extends Struct { |
| @Float() |
| external double a0; |
| |
| @Int16() |
| external int a1; |
| |
| @Int16() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class Struct9BytesHomogeneousUint8 extends Struct { |
| @Uint8() |
| external int a0; |
| |
| @Uint8() |
| external int a1; |
| |
| @Uint8() |
| external int a2; |
| |
| @Uint8() |
| external int a3; |
| |
| @Uint8() |
| external int a4; |
| |
| @Uint8() |
| external int a5; |
| |
| @Uint8() |
| external int a6; |
| |
| @Uint8() |
| external int a7; |
| |
| @Uint8() |
| external int a8; |
| |
| String toString() => |
| "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})"; |
| } |
| |
| class Struct9BytesInt4Or8ByteAligned extends Struct { |
| @Int64() |
| external int a0; |
| |
| @Int8() |
| external int a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct12BytesHomogeneousFloat extends Struct { |
| @Float() |
| external double a0; |
| |
| @Float() |
| external double a1; |
| |
| @Float() |
| external double a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class Struct16BytesHomogeneousFloat extends Struct { |
| @Float() |
| external double a0; |
| |
| @Float() |
| external double a1; |
| |
| @Float() |
| external double a2; |
| |
| @Float() |
| external double a3; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3})"; |
| } |
| |
| class Struct16BytesMixed extends Struct { |
| @Double() |
| external double a0; |
| |
| @Int64() |
| external int a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct16BytesMixed2 extends Struct { |
| @Float() |
| external double a0; |
| |
| @Float() |
| external double a1; |
| |
| @Float() |
| external double a2; |
| |
| @Int32() |
| external int a3; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3})"; |
| } |
| |
| class Struct17BytesInt extends Struct { |
| @Int64() |
| external int a0; |
| |
| @Int64() |
| external int a1; |
| |
| @Int8() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class Struct19BytesHomogeneousUint8 extends Struct { |
| @Uint8() |
| external int a0; |
| |
| @Uint8() |
| external int a1; |
| |
| @Uint8() |
| external int a2; |
| |
| @Uint8() |
| external int a3; |
| |
| @Uint8() |
| external int a4; |
| |
| @Uint8() |
| external int a5; |
| |
| @Uint8() |
| external int a6; |
| |
| @Uint8() |
| external int a7; |
| |
| @Uint8() |
| external int a8; |
| |
| @Uint8() |
| external int a9; |
| |
| @Uint8() |
| external int a10; |
| |
| @Uint8() |
| external int a11; |
| |
| @Uint8() |
| external int a12; |
| |
| @Uint8() |
| external int a13; |
| |
| @Uint8() |
| external int a14; |
| |
| @Uint8() |
| external int a15; |
| |
| @Uint8() |
| external int a16; |
| |
| @Uint8() |
| external int a17; |
| |
| @Uint8() |
| external int a18; |
| |
| String toString() => |
| "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18})"; |
| } |
| |
| class Struct20BytesHomogeneousInt32 extends Struct { |
| @Int32() |
| external int a0; |
| |
| @Int32() |
| external int a1; |
| |
| @Int32() |
| external int a2; |
| |
| @Int32() |
| external int a3; |
| |
| @Int32() |
| external int a4; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})"; |
| } |
| |
| class Struct20BytesHomogeneousFloat extends Struct { |
| @Float() |
| external double a0; |
| |
| @Float() |
| external double a1; |
| |
| @Float() |
| external double a2; |
| |
| @Float() |
| external double a3; |
| |
| @Float() |
| external double a4; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})"; |
| } |
| |
| class Struct32BytesHomogeneousDouble extends Struct { |
| @Double() |
| external double a0; |
| |
| @Double() |
| external double a1; |
| |
| @Double() |
| external double a2; |
| |
| @Double() |
| external double a3; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3})"; |
| } |
| |
| class Struct40BytesHomogeneousDouble extends Struct { |
| @Double() |
| external double a0; |
| |
| @Double() |
| external double a1; |
| |
| @Double() |
| external double a2; |
| |
| @Double() |
| external double a3; |
| |
| @Double() |
| external double a4; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})"; |
| } |
| |
| class Struct1024BytesHomogeneousUint64 extends Struct { |
| @Uint64() |
| external int a0; |
| |
| @Uint64() |
| external int a1; |
| |
| @Uint64() |
| external int a2; |
| |
| @Uint64() |
| external int a3; |
| |
| @Uint64() |
| external int a4; |
| |
| @Uint64() |
| external int a5; |
| |
| @Uint64() |
| external int a6; |
| |
| @Uint64() |
| external int a7; |
| |
| @Uint64() |
| external int a8; |
| |
| @Uint64() |
| external int a9; |
| |
| @Uint64() |
| external int a10; |
| |
| @Uint64() |
| external int a11; |
| |
| @Uint64() |
| external int a12; |
| |
| @Uint64() |
| external int a13; |
| |
| @Uint64() |
| external int a14; |
| |
| @Uint64() |
| external int a15; |
| |
| @Uint64() |
| external int a16; |
| |
| @Uint64() |
| external int a17; |
| |
| @Uint64() |
| external int a18; |
| |
| @Uint64() |
| external int a19; |
| |
| @Uint64() |
| external int a20; |
| |
| @Uint64() |
| external int a21; |
| |
| @Uint64() |
| external int a22; |
| |
| @Uint64() |
| external int a23; |
| |
| @Uint64() |
| external int a24; |
| |
| @Uint64() |
| external int a25; |
| |
| @Uint64() |
| external int a26; |
| |
| @Uint64() |
| external int a27; |
| |
| @Uint64() |
| external int a28; |
| |
| @Uint64() |
| external int a29; |
| |
| @Uint64() |
| external int a30; |
| |
| @Uint64() |
| external int a31; |
| |
| @Uint64() |
| external int a32; |
| |
| @Uint64() |
| external int a33; |
| |
| @Uint64() |
| external int a34; |
| |
| @Uint64() |
| external int a35; |
| |
| @Uint64() |
| external int a36; |
| |
| @Uint64() |
| external int a37; |
| |
| @Uint64() |
| external int a38; |
| |
| @Uint64() |
| external int a39; |
| |
| @Uint64() |
| external int a40; |
| |
| @Uint64() |
| external int a41; |
| |
| @Uint64() |
| external int a42; |
| |
| @Uint64() |
| external int a43; |
| |
| @Uint64() |
| external int a44; |
| |
| @Uint64() |
| external int a45; |
| |
| @Uint64() |
| external int a46; |
| |
| @Uint64() |
| external int a47; |
| |
| @Uint64() |
| external int a48; |
| |
| @Uint64() |
| external int a49; |
| |
| @Uint64() |
| external int a50; |
| |
| @Uint64() |
| external int a51; |
| |
| @Uint64() |
| external int a52; |
| |
| @Uint64() |
| external int a53; |
| |
| @Uint64() |
| external int a54; |
| |
| @Uint64() |
| external int a55; |
| |
| @Uint64() |
| external int a56; |
| |
| @Uint64() |
| external int a57; |
| |
| @Uint64() |
| external int a58; |
| |
| @Uint64() |
| external int a59; |
| |
| @Uint64() |
| external int a60; |
| |
| @Uint64() |
| external int a61; |
| |
| @Uint64() |
| external int a62; |
| |
| @Uint64() |
| external int a63; |
| |
| @Uint64() |
| external int a64; |
| |
| @Uint64() |
| external int a65; |
| |
| @Uint64() |
| external int a66; |
| |
| @Uint64() |
| external int a67; |
| |
| @Uint64() |
| external int a68; |
| |
| @Uint64() |
| external int a69; |
| |
| @Uint64() |
| external int a70; |
| |
| @Uint64() |
| external int a71; |
| |
| @Uint64() |
| external int a72; |
| |
| @Uint64() |
| external int a73; |
| |
| @Uint64() |
| external int a74; |
| |
| @Uint64() |
| external int a75; |
| |
| @Uint64() |
| external int a76; |
| |
| @Uint64() |
| external int a77; |
| |
| @Uint64() |
| external int a78; |
| |
| @Uint64() |
| external int a79; |
| |
| @Uint64() |
| external int a80; |
| |
| @Uint64() |
| external int a81; |
| |
| @Uint64() |
| external int a82; |
| |
| @Uint64() |
| external int a83; |
| |
| @Uint64() |
| external int a84; |
| |
| @Uint64() |
| external int a85; |
| |
| @Uint64() |
| external int a86; |
| |
| @Uint64() |
| external int a87; |
| |
| @Uint64() |
| external int a88; |
| |
| @Uint64() |
| external int a89; |
| |
| @Uint64() |
| external int a90; |
| |
| @Uint64() |
| external int a91; |
| |
| @Uint64() |
| external int a92; |
| |
| @Uint64() |
| external int a93; |
| |
| @Uint64() |
| external int a94; |
| |
| @Uint64() |
| external int a95; |
| |
| @Uint64() |
| external int a96; |
| |
| @Uint64() |
| external int a97; |
| |
| @Uint64() |
| external int a98; |
| |
| @Uint64() |
| external int a99; |
| |
| @Uint64() |
| external int a100; |
| |
| @Uint64() |
| external int a101; |
| |
| @Uint64() |
| external int a102; |
| |
| @Uint64() |
| external int a103; |
| |
| @Uint64() |
| external int a104; |
| |
| @Uint64() |
| external int a105; |
| |
| @Uint64() |
| external int a106; |
| |
| @Uint64() |
| external int a107; |
| |
| @Uint64() |
| external int a108; |
| |
| @Uint64() |
| external int a109; |
| |
| @Uint64() |
| external int a110; |
| |
| @Uint64() |
| external int a111; |
| |
| @Uint64() |
| external int a112; |
| |
| @Uint64() |
| external int a113; |
| |
| @Uint64() |
| external int a114; |
| |
| @Uint64() |
| external int a115; |
| |
| @Uint64() |
| external int a116; |
| |
| @Uint64() |
| external int a117; |
| |
| @Uint64() |
| external int a118; |
| |
| @Uint64() |
| external int a119; |
| |
| @Uint64() |
| external int a120; |
| |
| @Uint64() |
| external int a121; |
| |
| @Uint64() |
| external int a122; |
| |
| @Uint64() |
| external int a123; |
| |
| @Uint64() |
| external int a124; |
| |
| @Uint64() |
| external int a125; |
| |
| @Uint64() |
| external int a126; |
| |
| @Uint64() |
| external int a127; |
| |
| String toString() => |
| "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19}, ${a20}, ${a21}, ${a22}, ${a23}, ${a24}, ${a25}, ${a26}, ${a27}, ${a28}, ${a29}, ${a30}, ${a31}, ${a32}, ${a33}, ${a34}, ${a35}, ${a36}, ${a37}, ${a38}, ${a39}, ${a40}, ${a41}, ${a42}, ${a43}, ${a44}, ${a45}, ${a46}, ${a47}, ${a48}, ${a49}, ${a50}, ${a51}, ${a52}, ${a53}, ${a54}, ${a55}, ${a56}, ${a57}, ${a58}, ${a59}, ${a60}, ${a61}, ${a62}, ${a63}, ${a64}, ${a65}, ${a66}, ${a67}, ${a68}, ${a69}, ${a70}, ${a71}, ${a72}, ${a73}, ${a74}, ${a75}, ${a76}, ${a77}, ${a78}, ${a79}, ${a80}, ${a81}, ${a82}, ${a83}, ${a84}, ${a85}, ${a86}, ${a87}, ${a88}, ${a89}, ${a90}, ${a91}, ${a92}, ${a93}, ${a94}, ${a95}, ${a96}, ${a97}, ${a98}, ${a99}, ${a100}, ${a101}, ${a102}, ${a103}, ${a104}, ${a105}, ${a106}, ${a107}, ${a108}, ${a109}, ${a110}, ${a111}, ${a112}, ${a113}, ${a114}, ${a115}, ${a116}, ${a117}, ${a118}, ${a119}, ${a120}, ${a121}, ${a122}, ${a123}, ${a124}, ${a125}, ${a126}, ${a127})"; |
| } |
| |
| class StructAlignmentInt16 extends Struct { |
| @Int8() |
| external int a0; |
| |
| @Int16() |
| external int a1; |
| |
| @Int8() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class StructAlignmentInt32 extends Struct { |
| @Int8() |
| external int a0; |
| |
| @Int32() |
| external int a1; |
| |
| @Int8() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class StructAlignmentInt64 extends Struct { |
| @Int8() |
| external int a0; |
| |
| @Int64() |
| external int a1; |
| |
| @Int8() |
| external int a2; |
| |
| String toString() => "(${a0}, ${a1}, ${a2})"; |
| } |
| |
| class Struct8BytesNestedInt extends Struct { |
| external Struct4BytesHomogeneousInt16 a0; |
| |
| external Struct4BytesHomogeneousInt16 a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct8BytesNestedFloat extends Struct { |
| external Struct4BytesFloat a0; |
| |
| external Struct4BytesFloat a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct8BytesNestedFloat2 extends Struct { |
| external Struct4BytesFloat a0; |
| |
| @Float() |
| external double a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct8BytesNestedMixed extends Struct { |
| external Struct4BytesHomogeneousInt16 a0; |
| |
| external Struct4BytesFloat a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct16BytesNestedInt extends Struct { |
| external Struct8BytesNestedInt a0; |
| |
| external Struct8BytesNestedInt a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class Struct32BytesNestedInt extends Struct { |
| external Struct16BytesNestedInt a0; |
| |
| external Struct16BytesNestedInt a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class StructNestedIntStructAlignmentInt16 extends Struct { |
| external StructAlignmentInt16 a0; |
| |
| external StructAlignmentInt16 a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class StructNestedIntStructAlignmentInt32 extends Struct { |
| external StructAlignmentInt32 a0; |
| |
| external StructAlignmentInt32 a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class StructNestedIntStructAlignmentInt64 extends Struct { |
| external StructAlignmentInt64 a0; |
| |
| external StructAlignmentInt64 a1; |
| |
| String toString() => "(${a0}, ${a1})"; |
| } |
| |
| class StructNestedIrregularBig extends Struct { |
| @Uint16() |
| external int a0; |
| |
| external Struct8BytesNestedMixed a1; |
| |
| @Uint16() |
| external int a2; |
| |
| external Struct8BytesNestedFloat2 a3; |
| |
| @Uint16() |
| external int a4; |
| |
| external Struct8BytesNestedFloat a5; |
| |
| @Uint16() |
| external int a6; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})"; |
| } |
| |
| class StructNestedIrregularBigger extends Struct { |
| external StructNestedIrregularBig a0; |
| |
| external Struct8BytesNestedMixed a1; |
| |
| @Float() |
| external double a2; |
| |
| @Double() |
| external double a3; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3})"; |
| } |
| |
| class StructNestedIrregularEvenBigger extends Struct { |
| @Uint64() |
| external int a0; |
| |
| external StructNestedIrregularBigger a1; |
| |
| external StructNestedIrregularBigger a2; |
| |
| @Double() |
| external double a3; |
| |
| String toString() => "(${a0}, ${a1}, ${a2}, ${a3})"; |
| } |
| |
| final passStruct1ByteIntx10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt), |
| int Function( |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt, |
| Struct1ByteInt)>("PassStruct1ByteIntx10"); |
| |
| /// Smallest struct with data. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct1ByteIntx10() { |
| final a0Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct1ByteInt>(); |
| final Struct1ByteInt a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a1.a0 = 2; |
| a2.a0 = -3; |
| a3.a0 = 4; |
| a4.a0 = -5; |
| a5.a0 = 6; |
| a6.a0 = -7; |
| a7.a0 = 8; |
| a8.a0 = -9; |
| a9.a0 = 10; |
| |
| final result = passStruct1ByteIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(5, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct3BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8), |
| int Function( |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8, |
| Struct3BytesHomogeneousUint8)>("PassStruct3BytesHomogeneousUint8x10"); |
| |
| /// Not a multiple of word size, not a power of two. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct3BytesHomogeneousUint8x10() { |
| final a0Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct3BytesHomogeneousUint8>(); |
| final Struct3BytesHomogeneousUint8 a9 = a9Pointer.ref; |
| |
| a0.a0 = 1; |
| a0.a1 = 2; |
| a0.a2 = 3; |
| a1.a0 = 4; |
| a1.a1 = 5; |
| a1.a2 = 6; |
| a2.a0 = 7; |
| a2.a1 = 8; |
| a2.a2 = 9; |
| a3.a0 = 10; |
| a3.a1 = 11; |
| a3.a2 = 12; |
| a4.a0 = 13; |
| a4.a1 = 14; |
| a4.a2 = 15; |
| a5.a0 = 16; |
| a5.a1 = 17; |
| a5.a2 = 18; |
| a6.a0 = 19; |
| a6.a1 = 20; |
| a6.a2 = 21; |
| a7.a0 = 22; |
| a7.a1 = 23; |
| a7.a2 = 24; |
| a8.a0 = 25; |
| a8.a1 = 26; |
| a8.a2 = 27; |
| a9.a0 = 28; |
| a9.a1 = 29; |
| a9.a2 = 30; |
| |
| final result = passStruct3BytesHomogeneousUint8x10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(465, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct3BytesInt2ByteAlignedx10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned), |
| int Function( |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned, |
| Struct3BytesInt2ByteAligned)>("PassStruct3BytesInt2ByteAlignedx10"); |
| |
| /// Not a multiple of word size, not a power of two. |
| /// With alignment rules taken into account size is 4 bytes. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct3BytesInt2ByteAlignedx10() { |
| final a0Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct3BytesInt2ByteAligned>(); |
| final Struct3BytesInt2ByteAligned a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a0.a1 = 2; |
| a1.a0 = -3; |
| a1.a1 = 4; |
| a2.a0 = -5; |
| a2.a1 = 6; |
| a3.a0 = -7; |
| a3.a1 = 8; |
| a4.a0 = -9; |
| a4.a1 = 10; |
| a5.a0 = -11; |
| a5.a1 = 12; |
| a6.a0 = -13; |
| a6.a1 = 14; |
| a7.a0 = -15; |
| a7.a1 = 16; |
| a8.a0 = -17; |
| a8.a1 = 18; |
| a9.a0 = -19; |
| a9.a1 = 20; |
| |
| final result = passStruct3BytesInt2ByteAlignedx10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(10, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct4BytesHomogeneousInt16x10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16), |
| int Function( |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16, |
| Struct4BytesHomogeneousInt16)>("PassStruct4BytesHomogeneousInt16x10"); |
| |
| /// Exactly word size on 32-bit architectures. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct4BytesHomogeneousInt16x10() { |
| final a0Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct4BytesHomogeneousInt16>(); |
| final Struct4BytesHomogeneousInt16 a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a0.a1 = 2; |
| a1.a0 = -3; |
| a1.a1 = 4; |
| a2.a0 = -5; |
| a2.a1 = 6; |
| a3.a0 = -7; |
| a3.a1 = 8; |
| a4.a0 = -9; |
| a4.a1 = 10; |
| a5.a0 = -11; |
| a5.a1 = 12; |
| a6.a0 = -13; |
| a6.a1 = 14; |
| a7.a0 = -15; |
| a7.a1 = 16; |
| a8.a0 = -17; |
| a8.a1 = 18; |
| a9.a0 = -19; |
| a9.a1 = 20; |
| |
| final result = passStruct4BytesHomogeneousInt16x10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(10, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct7BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8), |
| int Function( |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8, |
| Struct7BytesHomogeneousUint8)>("PassStruct7BytesHomogeneousUint8x10"); |
| |
| /// Sub word size on 64 bit architectures. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct7BytesHomogeneousUint8x10() { |
| final a0Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct7BytesHomogeneousUint8>(); |
| final Struct7BytesHomogeneousUint8 a9 = a9Pointer.ref; |
| |
| a0.a0 = 1; |
| a0.a1 = 2; |
| a0.a2 = 3; |
| a0.a3 = 4; |
| a0.a4 = 5; |
| a0.a5 = 6; |
| a0.a6 = 7; |
| a1.a0 = 8; |
| a1.a1 = 9; |
| a1.a2 = 10; |
| a1.a3 = 11; |
| a1.a4 = 12; |
| a1.a5 = 13; |
| a1.a6 = 14; |
| a2.a0 = 15; |
| a2.a1 = 16; |
| a2.a2 = 17; |
| a2.a3 = 18; |
| a2.a4 = 19; |
| a2.a5 = 20; |
| a2.a6 = 21; |
| a3.a0 = 22; |
| a3.a1 = 23; |
| a3.a2 = 24; |
| a3.a3 = 25; |
| a3.a4 = 26; |
| a3.a5 = 27; |
| a3.a6 = 28; |
| a4.a0 = 29; |
| a4.a1 = 30; |
| a4.a2 = 31; |
| a4.a3 = 32; |
| a4.a4 = 33; |
| a4.a5 = 34; |
| a4.a6 = 35; |
| a5.a0 = 36; |
| a5.a1 = 37; |
| a5.a2 = 38; |
| a5.a3 = 39; |
| a5.a4 = 40; |
| a5.a5 = 41; |
| a5.a6 = 42; |
| a6.a0 = 43; |
| a6.a1 = 44; |
| a6.a2 = 45; |
| a6.a3 = 46; |
| a6.a4 = 47; |
| a6.a5 = 48; |
| a6.a6 = 49; |
| a7.a0 = 50; |
| a7.a1 = 51; |
| a7.a2 = 52; |
| a7.a3 = 53; |
| a7.a4 = 54; |
| a7.a5 = 55; |
| a7.a6 = 56; |
| a8.a0 = 57; |
| a8.a1 = 58; |
| a8.a2 = 59; |
| a8.a3 = 60; |
| a8.a4 = 61; |
| a8.a5 = 62; |
| a8.a6 = 63; |
| a9.a0 = 64; |
| a9.a1 = 65; |
| a9.a2 = 66; |
| a9.a3 = 67; |
| a9.a4 = 68; |
| a9.a5 = 69; |
| a9.a6 = 70; |
| |
| final result = passStruct7BytesHomogeneousUint8x10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(2485, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct7BytesInt4ByteAlignedx10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned), |
| int Function( |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned, |
| Struct7BytesInt4ByteAligned)>("PassStruct7BytesInt4ByteAlignedx10"); |
| |
| /// Sub word size on 64 bit architectures. |
| /// With alignment rules taken into account size is 8 bytes. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct7BytesInt4ByteAlignedx10() { |
| final a0Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct7BytesInt4ByteAligned>(); |
| final Struct7BytesInt4ByteAligned a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a0.a1 = 2; |
| a0.a2 = -3; |
| a1.a0 = 4; |
| a1.a1 = -5; |
| a1.a2 = 6; |
| a2.a0 = -7; |
| a2.a1 = 8; |
| a2.a2 = -9; |
| a3.a0 = 10; |
| a3.a1 = -11; |
| a3.a2 = 12; |
| a4.a0 = -13; |
| a4.a1 = 14; |
| a4.a2 = -15; |
| a5.a0 = 16; |
| a5.a1 = -17; |
| a5.a2 = 18; |
| a6.a0 = -19; |
| a6.a1 = 20; |
| a6.a2 = -21; |
| a7.a0 = 22; |
| a7.a1 = -23; |
| a7.a2 = 24; |
| a8.a0 = -25; |
| a8.a1 = 26; |
| a8.a2 = -27; |
| a9.a0 = 28; |
| a9.a1 = -29; |
| a9.a2 = 30; |
| |
| final result = passStruct7BytesInt4ByteAlignedx10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(15, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct8BytesIntx10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt), |
| int Function( |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt, |
| Struct8BytesInt)>("PassStruct8BytesIntx10"); |
| |
| /// Exactly word size struct on 64bit architectures. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct8BytesIntx10() { |
| final a0Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct8BytesInt>(); |
| final Struct8BytesInt a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a0.a1 = 2; |
| a0.a2 = -3; |
| a1.a0 = 4; |
| a1.a1 = -5; |
| a1.a2 = 6; |
| a2.a0 = -7; |
| a2.a1 = 8; |
| a2.a2 = -9; |
| a3.a0 = 10; |
| a3.a1 = -11; |
| a3.a2 = 12; |
| a4.a0 = -13; |
| a4.a1 = 14; |
| a4.a2 = -15; |
| a5.a0 = 16; |
| a5.a1 = -17; |
| a5.a2 = 18; |
| a6.a0 = -19; |
| a6.a1 = 20; |
| a6.a2 = -21; |
| a7.a0 = 22; |
| a7.a1 = -23; |
| a7.a2 = 24; |
| a8.a0 = -25; |
| a8.a1 = 26; |
| a8.a2 = -27; |
| a9.a0 = 28; |
| a9.a1 = -29; |
| a9.a2 = 30; |
| |
| final result = passStruct8BytesIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(15, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct8BytesHomogeneousFloatx10 = ffiTestFunctions.lookupFunction< |
| Float Function( |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat), |
| double Function( |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat, |
| Struct8BytesHomogeneousFloat)>("PassStruct8BytesHomogeneousFloatx10"); |
| |
| /// Arguments passed in FP registers as long as they fit. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct8BytesHomogeneousFloatx10() { |
| final a0Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct8BytesHomogeneousFloat>(); |
| final Struct8BytesHomogeneousFloat a9 = a9Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2.0; |
| a1.a0 = -3.0; |
| a1.a1 = 4.0; |
| a2.a0 = -5.0; |
| a2.a1 = 6.0; |
| a3.a0 = -7.0; |
| a3.a1 = 8.0; |
| a4.a0 = -9.0; |
| a4.a1 = 10.0; |
| a5.a0 = -11.0; |
| a5.a1 = 12.0; |
| a6.a0 = -13.0; |
| a6.a1 = 14.0; |
| a7.a0 = -15.0; |
| a7.a1 = 16.0; |
| a8.a0 = -17.0; |
| a8.a1 = 18.0; |
| a9.a0 = -19.0; |
| a9.a1 = 20.0; |
| |
| final result = passStruct8BytesHomogeneousFloatx10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(10.0, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct8BytesMixedx10 = ffiTestFunctions.lookupFunction< |
| Float Function( |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed), |
| double Function( |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed, |
| Struct8BytesMixed)>("PassStruct8BytesMixedx10"); |
| |
| /// On x64, arguments go in int registers because it is not only float. |
| /// 10 struct arguments will exhaust available registers. |
| void testPassStruct8BytesMixedx10() { |
| final a0Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct8BytesMixed>(); |
| final Struct8BytesMixed a9 = a9Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2; |
| a0.a2 = -3; |
| a1.a0 = 4.0; |
| a1.a1 = -5; |
| a1.a2 = 6; |
| a2.a0 = -7.0; |
| a2.a1 = 8; |
| a2.a2 = -9; |
| a3.a0 = 10.0; |
| a3.a1 = -11; |
| a3.a2 = 12; |
| a4.a0 = -13.0; |
| a4.a1 = 14; |
| a4.a2 = -15; |
| a5.a0 = 16.0; |
| a5.a1 = -17; |
| a5.a2 = 18; |
| a6.a0 = -19.0; |
| a6.a1 = 20; |
| a6.a2 = -21; |
| a7.a0 = 22.0; |
| a7.a1 = -23; |
| a7.a2 = 24; |
| a8.a0 = -25.0; |
| a8.a1 = 26; |
| a8.a2 = -27; |
| a9.a0 = 28.0; |
| a9.a1 = -29; |
| a9.a2 = 30; |
| |
| final result = |
| passStruct8BytesMixedx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(15.0, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct9BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8), |
| int Function( |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8, |
| Struct9BytesHomogeneousUint8)>("PassStruct9BytesHomogeneousUint8x10"); |
| |
| /// Argument is a single byte over a multiple of word size. |
| /// 10 struct arguments will exhaust available registers. |
| /// Struct only has 1-byte aligned fields to test struct alignment itself. |
| /// Tests upper bytes in the integer registers that are partly filled. |
| /// Tests stack alignment of non word size stack arguments. |
| void testPassStruct9BytesHomogeneousUint8x10() { |
| final a0Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct9BytesHomogeneousUint8>(); |
| final Struct9BytesHomogeneousUint8 a9 = a9Pointer.ref; |
| |
| a0.a0 = 1; |
| a0.a1 = 2; |
| a0.a2 = 3; |
| a0.a3 = 4; |
| a0.a4 = 5; |
| a0.a5 = 6; |
| a0.a6 = 7; |
| a0.a7 = 8; |
| a0.a8 = 9; |
| a1.a0 = 10; |
| a1.a1 = 11; |
| a1.a2 = 12; |
| a1.a3 = 13; |
| a1.a4 = 14; |
| a1.a5 = 15; |
| a1.a6 = 16; |
| a1.a7 = 17; |
| a1.a8 = 18; |
| a2.a0 = 19; |
| a2.a1 = 20; |
| a2.a2 = 21; |
| a2.a3 = 22; |
| a2.a4 = 23; |
| a2.a5 = 24; |
| a2.a6 = 25; |
| a2.a7 = 26; |
| a2.a8 = 27; |
| a3.a0 = 28; |
| a3.a1 = 29; |
| a3.a2 = 30; |
| a3.a3 = 31; |
| a3.a4 = 32; |
| a3.a5 = 33; |
| a3.a6 = 34; |
| a3.a7 = 35; |
| a3.a8 = 36; |
| a4.a0 = 37; |
| a4.a1 = 38; |
| a4.a2 = 39; |
| a4.a3 = 40; |
| a4.a4 = 41; |
| a4.a5 = 42; |
| a4.a6 = 43; |
| a4.a7 = 44; |
| a4.a8 = 45; |
| a5.a0 = 46; |
| a5.a1 = 47; |
| a5.a2 = 48; |
| a5.a3 = 49; |
| a5.a4 = 50; |
| a5.a5 = 51; |
| a5.a6 = 52; |
| a5.a7 = 53; |
| a5.a8 = 54; |
| a6.a0 = 55; |
| a6.a1 = 56; |
| a6.a2 = 57; |
| a6.a3 = 58; |
| a6.a4 = 59; |
| a6.a5 = 60; |
| a6.a6 = 61; |
| a6.a7 = 62; |
| a6.a8 = 63; |
| a7.a0 = 64; |
| a7.a1 = 65; |
| a7.a2 = 66; |
| a7.a3 = 67; |
| a7.a4 = 68; |
| a7.a5 = 69; |
| a7.a6 = 70; |
| a7.a7 = 71; |
| a7.a8 = 72; |
| a8.a0 = 73; |
| a8.a1 = 74; |
| a8.a2 = 75; |
| a8.a3 = 76; |
| a8.a4 = 77; |
| a8.a5 = 78; |
| a8.a6 = 79; |
| a8.a7 = 80; |
| a8.a8 = 81; |
| a9.a0 = 82; |
| a9.a1 = 83; |
| a9.a2 = 84; |
| a9.a3 = 85; |
| a9.a4 = 86; |
| a9.a5 = 87; |
| a9.a6 = 88; |
| a9.a7 = 89; |
| a9.a8 = 90; |
| |
| final result = passStruct9BytesHomogeneousUint8x10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(4095, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct9BytesInt4Or8ByteAlignedx10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned), |
| int Function( |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned, |
| Struct9BytesInt4Or8ByteAligned)>( |
| "PassStruct9BytesInt4Or8ByteAlignedx10"); |
| |
| /// Argument is a single byte over a multiple of word size. |
| /// With alignment rules taken into account size is 12 or 16 bytes. |
| /// 10 struct arguments will exhaust available registers. |
| /// |
| void testPassStruct9BytesInt4Or8ByteAlignedx10() { |
| final a0Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct9BytesInt4Or8ByteAligned>(); |
| final Struct9BytesInt4Or8ByteAligned a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a0.a1 = 2; |
| a1.a0 = -3; |
| a1.a1 = 4; |
| a2.a0 = -5; |
| a2.a1 = 6; |
| a3.a0 = -7; |
| a3.a1 = 8; |
| a4.a0 = -9; |
| a4.a1 = 10; |
| a5.a0 = -11; |
| a5.a1 = 12; |
| a6.a0 = -13; |
| a6.a1 = 14; |
| a7.a0 = -15; |
| a7.a1 = 16; |
| a8.a0 = -17; |
| a8.a1 = 18; |
| a9.a0 = -19; |
| a9.a1 = 20; |
| |
| final result = passStruct9BytesInt4Or8ByteAlignedx10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(10, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct12BytesHomogeneousFloatx6 = ffiTestFunctions.lookupFunction< |
| Float Function( |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat), |
| double Function( |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat, |
| Struct12BytesHomogeneousFloat)>("PassStruct12BytesHomogeneousFloatx6"); |
| |
| /// Arguments in FPU registers on arm hardfp and arm64. |
| /// Struct arguments will exhaust available registers, and leave some empty. |
| /// The last argument is to test whether arguments are backfilled. |
| void testPassStruct12BytesHomogeneousFloatx6() { |
| final a0Pointer = calloc<Struct12BytesHomogeneousFloat>(); |
| final Struct12BytesHomogeneousFloat a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct12BytesHomogeneousFloat>(); |
| final Struct12BytesHomogeneousFloat a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct12BytesHomogeneousFloat>(); |
| final Struct12BytesHomogeneousFloat a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct12BytesHomogeneousFloat>(); |
| final Struct12BytesHomogeneousFloat a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct12BytesHomogeneousFloat>(); |
| final Struct12BytesHomogeneousFloat a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct12BytesHomogeneousFloat>(); |
| final Struct12BytesHomogeneousFloat a5 = a5Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2.0; |
| a0.a2 = -3.0; |
| a1.a0 = 4.0; |
| a1.a1 = -5.0; |
| a1.a2 = 6.0; |
| a2.a0 = -7.0; |
| a2.a1 = 8.0; |
| a2.a2 = -9.0; |
| a3.a0 = 10.0; |
| a3.a1 = -11.0; |
| a3.a2 = 12.0; |
| a4.a0 = -13.0; |
| a4.a1 = 14.0; |
| a4.a2 = -15.0; |
| a5.a0 = 16.0; |
| a5.a1 = -17.0; |
| a5.a2 = 18.0; |
| |
| final result = passStruct12BytesHomogeneousFloatx6(a0, a1, a2, a3, a4, a5); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(9.0, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| } |
| |
| final passStruct16BytesHomogeneousFloatx5 = ffiTestFunctions.lookupFunction< |
| Float Function( |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat), |
| double Function( |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat, |
| Struct16BytesHomogeneousFloat)>("PassStruct16BytesHomogeneousFloatx5"); |
| |
| /// On Linux x64 argument is transferred on stack because it is over 16 bytes. |
| /// Arguments in FPU registers on arm hardfp and arm64. |
| /// 5 struct arguments will exhaust available registers. |
| void testPassStruct16BytesHomogeneousFloatx5() { |
| final a0Pointer = calloc<Struct16BytesHomogeneousFloat>(); |
| final Struct16BytesHomogeneousFloat a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct16BytesHomogeneousFloat>(); |
| final Struct16BytesHomogeneousFloat a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct16BytesHomogeneousFloat>(); |
| final Struct16BytesHomogeneousFloat a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct16BytesHomogeneousFloat>(); |
| final Struct16BytesHomogeneousFloat a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct16BytesHomogeneousFloat>(); |
| final Struct16BytesHomogeneousFloat a4 = a4Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2.0; |
| a0.a2 = -3.0; |
| a0.a3 = 4.0; |
| a1.a0 = -5.0; |
| a1.a1 = 6.0; |
| a1.a2 = -7.0; |
| a1.a3 = 8.0; |
| a2.a0 = -9.0; |
| a2.a1 = 10.0; |
| a2.a2 = -11.0; |
| a2.a3 = 12.0; |
| a3.a0 = -13.0; |
| a3.a1 = 14.0; |
| a3.a2 = -15.0; |
| a3.a3 = 16.0; |
| a4.a0 = -17.0; |
| a4.a1 = 18.0; |
| a4.a2 = -19.0; |
| a4.a3 = 20.0; |
| |
| final result = passStruct16BytesHomogeneousFloatx5(a0, a1, a2, a3, a4); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(10.0, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| } |
| |
| final passStruct16BytesMixedx10 = ffiTestFunctions.lookupFunction< |
| Double Function( |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed), |
| double Function( |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed, |
| Struct16BytesMixed)>("PassStruct16BytesMixedx10"); |
| |
| /// On x64, arguments are split over FP and int registers. |
| /// On x64, it will exhaust the integer registers with the 6th argument. |
| /// The rest goes on the stack. |
| /// On arm, arguments are 8 byte aligned. |
| void testPassStruct16BytesMixedx10() { |
| final a0Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct16BytesMixed>(); |
| final Struct16BytesMixed a9 = a9Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2; |
| a1.a0 = -3.0; |
| a1.a1 = 4; |
| a2.a0 = -5.0; |
| a2.a1 = 6; |
| a3.a0 = -7.0; |
| a3.a1 = 8; |
| a4.a0 = -9.0; |
| a4.a1 = 10; |
| a5.a0 = -11.0; |
| a5.a1 = 12; |
| a6.a0 = -13.0; |
| a6.a1 = 14; |
| a7.a0 = -15.0; |
| a7.a1 = 16; |
| a8.a0 = -17.0; |
| a8.a1 = 18; |
| a9.a0 = -19.0; |
| a9.a1 = 20; |
| |
| final result = |
| passStruct16BytesMixedx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(10.0, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct16BytesMixed2x10 = ffiTestFunctions.lookupFunction< |
| Float Function( |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2), |
| double Function( |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2, |
| Struct16BytesMixed2)>("PassStruct16BytesMixed2x10"); |
| |
| /// On x64, arguments are split over FP and int registers. |
| /// On x64, it will exhaust the integer registers with the 6th argument. |
| /// The rest goes on the stack. |
| /// On arm, arguments are 4 byte aligned. |
| void testPassStruct16BytesMixed2x10() { |
| final a0Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct16BytesMixed2>(); |
| final Struct16BytesMixed2 a9 = a9Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2.0; |
| a0.a2 = -3.0; |
| a0.a3 = 4; |
| a1.a0 = -5.0; |
| a1.a1 = 6.0; |
| a1.a2 = -7.0; |
| a1.a3 = 8; |
| a2.a0 = -9.0; |
| a2.a1 = 10.0; |
| a2.a2 = -11.0; |
| a2.a3 = 12; |
| a3.a0 = -13.0; |
| a3.a1 = 14.0; |
| a3.a2 = -15.0; |
| a3.a3 = 16; |
| a4.a0 = -17.0; |
| a4.a1 = 18.0; |
| a4.a2 = -19.0; |
| a4.a3 = 20; |
| a5.a0 = -21.0; |
| a5.a1 = 22.0; |
| a5.a2 = -23.0; |
| a5.a3 = 24; |
| a6.a0 = -25.0; |
| a6.a1 = 26.0; |
| a6.a2 = -27.0; |
| a6.a3 = 28; |
| a7.a0 = -29.0; |
| a7.a1 = 30.0; |
| a7.a2 = -31.0; |
| a7.a3 = 32; |
| a8.a0 = -33.0; |
| a8.a1 = 34.0; |
| a8.a2 = -35.0; |
| a8.a3 = 36; |
| a9.a0 = -37.0; |
| a9.a1 = 38.0; |
| a9.a2 = -39.0; |
| a9.a3 = 40; |
| |
| final result = |
| passStruct16BytesMixed2x10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(20.0, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct17BytesIntx10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt), |
| int Function( |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt, |
| Struct17BytesInt)>("PassStruct17BytesIntx10"); |
| |
| /// Arguments are passed as pointer to copy on arm64. |
| /// Tests that the memory allocated for copies are rounded up to word size. |
| void testPassStruct17BytesIntx10() { |
| final a0Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct17BytesInt>(); |
| final Struct17BytesInt a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a0.a1 = 2; |
| a0.a2 = -3; |
| a1.a0 = 4; |
| a1.a1 = -5; |
| a1.a2 = 6; |
| a2.a0 = -7; |
| a2.a1 = 8; |
| a2.a2 = -9; |
| a3.a0 = 10; |
| a3.a1 = -11; |
| a3.a2 = 12; |
| a4.a0 = -13; |
| a4.a1 = 14; |
| a4.a2 = -15; |
| a5.a0 = 16; |
| a5.a1 = -17; |
| a5.a2 = 18; |
| a6.a0 = -19; |
| a6.a1 = 20; |
| a6.a2 = -21; |
| a7.a0 = 22; |
| a7.a1 = -23; |
| a7.a2 = 24; |
| a8.a0 = -25; |
| a8.a1 = 26; |
| a8.a2 = -27; |
| a9.a0 = 28; |
| a9.a1 = -29; |
| a9.a2 = 30; |
| |
| final result = |
| passStruct17BytesIntx10(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(15, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct19BytesHomogeneousUint8x10 = ffiTestFunctions.lookupFunction< |
| Int64 Function( |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8), |
| int Function( |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8, |
| Struct19BytesHomogeneousUint8)>("PassStruct19BytesHomogeneousUint8x10"); |
| |
| /// The minimum alignment of this struct is only 1 byte based on its fields. |
| /// Test that the memory backing these structs is extended to the right size. |
| /// |
| void testPassStruct19BytesHomogeneousUint8x10() { |
| final a0Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct19BytesHomogeneousUint8>(); |
| final Struct19BytesHomogeneousUint8 a9 = a9Pointer.ref; |
| |
| a0.a0 = 1; |
| a0.a1 = 2; |
| a0.a2 = 3; |
| a0.a3 = 4; |
| a0.a4 = 5; |
| a0.a5 = 6; |
| a0.a6 = 7; |
| a0.a7 = 8; |
| a0.a8 = 9; |
| a0.a9 = 10; |
| a0.a10 = 11; |
| a0.a11 = 12; |
| a0.a12 = 13; |
| a0.a13 = 14; |
| a0.a14 = 15; |
| a0.a15 = 16; |
| a0.a16 = 17; |
| a0.a17 = 18; |
| a0.a18 = 19; |
| a1.a0 = 20; |
| a1.a1 = 21; |
| a1.a2 = 22; |
| a1.a3 = 23; |
| a1.a4 = 24; |
| a1.a5 = 25; |
| a1.a6 = 26; |
| a1.a7 = 27; |
| a1.a8 = 28; |
| a1.a9 = 29; |
| a1.a10 = 30; |
| a1.a11 = 31; |
| a1.a12 = 32; |
| a1.a13 = 33; |
| a1.a14 = 34; |
| a1.a15 = 35; |
| a1.a16 = 36; |
| a1.a17 = 37; |
| a1.a18 = 38; |
| a2.a0 = 39; |
| a2.a1 = 40; |
| a2.a2 = 41; |
| a2.a3 = 42; |
| a2.a4 = 43; |
| a2.a5 = 44; |
| a2.a6 = 45; |
| a2.a7 = 46; |
| a2.a8 = 47; |
| a2.a9 = 48; |
| a2.a10 = 49; |
| a2.a11 = 50; |
| a2.a12 = 51; |
| a2.a13 = 52; |
| a2.a14 = 53; |
| a2.a15 = 54; |
| a2.a16 = 55; |
| a2.a17 = 56; |
| a2.a18 = 57; |
| a3.a0 = 58; |
| a3.a1 = 59; |
| a3.a2 = 60; |
| a3.a3 = 61; |
| a3.a4 = 62; |
| a3.a5 = 63; |
| a3.a6 = 64; |
| a3.a7 = 65; |
| a3.a8 = 66; |
| a3.a9 = 67; |
| a3.a10 = 68; |
| a3.a11 = 69; |
| a3.a12 = 70; |
| a3.a13 = 71; |
| a3.a14 = 72; |
| a3.a15 = 73; |
| a3.a16 = 74; |
| a3.a17 = 75; |
| a3.a18 = 76; |
| a4.a0 = 77; |
| a4.a1 = 78; |
| a4.a2 = 79; |
| a4.a3 = 80; |
| a4.a4 = 81; |
| a4.a5 = 82; |
| a4.a6 = 83; |
| a4.a7 = 84; |
| a4.a8 = 85; |
| a4.a9 = 86; |
| a4.a10 = 87; |
| a4.a11 = 88; |
| a4.a12 = 89; |
| a4.a13 = 90; |
| a4.a14 = 91; |
| a4.a15 = 92; |
| a4.a16 = 93; |
| a4.a17 = 94; |
| a4.a18 = 95; |
| a5.a0 = 96; |
| a5.a1 = 97; |
| a5.a2 = 98; |
| a5.a3 = 99; |
| a5.a4 = 100; |
| a5.a5 = 101; |
| a5.a6 = 102; |
| a5.a7 = 103; |
| a5.a8 = 104; |
| a5.a9 = 105; |
| a5.a10 = 106; |
| a5.a11 = 107; |
| a5.a12 = 108; |
| a5.a13 = 109; |
| a5.a14 = 110; |
| a5.a15 = 111; |
| a5.a16 = 112; |
| a5.a17 = 113; |
| a5.a18 = 114; |
| a6.a0 = 115; |
| a6.a1 = 116; |
| a6.a2 = 117; |
| a6.a3 = 118; |
| a6.a4 = 119; |
| a6.a5 = 120; |
| a6.a6 = 121; |
| a6.a7 = 122; |
| a6.a8 = 123; |
| a6.a9 = 124; |
| a6.a10 = 125; |
| a6.a11 = 126; |
| a6.a12 = 127; |
| a6.a13 = 128; |
| a6.a14 = 129; |
| a6.a15 = 130; |
| a6.a16 = 131; |
| a6.a17 = 132; |
| a6.a18 = 133; |
| a7.a0 = 134; |
| a7.a1 = 135; |
| a7.a2 = 136; |
| a7.a3 = 137; |
| a7.a4 = 138; |
| a7.a5 = 139; |
| a7.a6 = 140; |
| a7.a7 = 141; |
| a7.a8 = 142; |
| a7.a9 = 143; |
| a7.a10 = 144; |
| a7.a11 = 145; |
| a7.a12 = 146; |
| a7.a13 = 147; |
| a7.a14 = 148; |
| a7.a15 = 149; |
| a7.a16 = 150; |
| a7.a17 = 151; |
| a7.a18 = 152; |
| a8.a0 = 153; |
| a8.a1 = 154; |
| a8.a2 = 155; |
| a8.a3 = 156; |
| a8.a4 = 157; |
| a8.a5 = 158; |
| a8.a6 = 159; |
| a8.a7 = 160; |
| a8.a8 = 161; |
| a8.a9 = 162; |
| a8.a10 = 163; |
| a8.a11 = 164; |
| a8.a12 = 165; |
| a8.a13 = 166; |
| a8.a14 = 167; |
| a8.a15 = 168; |
| a8.a16 = 169; |
| a8.a17 = 170; |
| a8.a18 = 171; |
| a9.a0 = 172; |
| a9.a1 = 173; |
| a9.a2 = 174; |
| a9.a3 = 175; |
| a9.a4 = 176; |
| a9.a5 = 177; |
| a9.a6 = 178; |
| a9.a7 = 179; |
| a9.a8 = 180; |
| a9.a9 = 181; |
| a9.a10 = 182; |
| a9.a11 = 183; |
| a9.a12 = 184; |
| a9.a13 = 185; |
| a9.a14 = 186; |
| a9.a15 = 187; |
| a9.a16 = 188; |
| a9.a17 = 189; |
| a9.a18 = 190; |
| |
| final result = passStruct19BytesHomogeneousUint8x10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(18145, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct20BytesHomogeneousInt32x10 = ffiTestFunctions.lookupFunction< |
| Int32 Function( |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32), |
| int Function( |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32, |
| Struct20BytesHomogeneousInt32)>("PassStruct20BytesHomogeneousInt32x10"); |
| |
| /// Argument too big to go into integer registers on arm64. |
| /// The arguments are passed as pointers to copies. |
| /// The amount of arguments exhausts the number of integer registers, such that |
| /// pointers to copies are also passed on the stack. |
| void testPassStruct20BytesHomogeneousInt32x10() { |
| final a0Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a4 = a4Pointer.ref; |
| final a5Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a5 = a5Pointer.ref; |
| final a6Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a6 = a6Pointer.ref; |
| final a7Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a7 = a7Pointer.ref; |
| final a8Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a8 = a8Pointer.ref; |
| final a9Pointer = calloc<Struct20BytesHomogeneousInt32>(); |
| final Struct20BytesHomogeneousInt32 a9 = a9Pointer.ref; |
| |
| a0.a0 = -1; |
| a0.a1 = 2; |
| a0.a2 = -3; |
| a0.a3 = 4; |
| a0.a4 = -5; |
| a1.a0 = 6; |
| a1.a1 = -7; |
| a1.a2 = 8; |
| a1.a3 = -9; |
| a1.a4 = 10; |
| a2.a0 = -11; |
| a2.a1 = 12; |
| a2.a2 = -13; |
| a2.a3 = 14; |
| a2.a4 = -15; |
| a3.a0 = 16; |
| a3.a1 = -17; |
| a3.a2 = 18; |
| a3.a3 = -19; |
| a3.a4 = 20; |
| a4.a0 = -21; |
| a4.a1 = 22; |
| a4.a2 = -23; |
| a4.a3 = 24; |
| a4.a4 = -25; |
| a5.a0 = 26; |
| a5.a1 = -27; |
| a5.a2 = 28; |
| a5.a3 = -29; |
| a5.a4 = 30; |
| a6.a0 = -31; |
| a6.a1 = 32; |
| a6.a2 = -33; |
| a6.a3 = 34; |
| a6.a4 = -35; |
| a7.a0 = 36; |
| a7.a1 = -37; |
| a7.a2 = 38; |
| a7.a3 = -39; |
| a7.a4 = 40; |
| a8.a0 = -41; |
| a8.a1 = 42; |
| a8.a2 = -43; |
| a8.a3 = 44; |
| a8.a4 = -45; |
| a9.a0 = 46; |
| a9.a1 = -47; |
| a9.a2 = 48; |
| a9.a3 = -49; |
| a9.a4 = 50; |
| |
| final result = passStruct20BytesHomogeneousInt32x10( |
| a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); |
| |
| print("result = $result"); |
| |
| Expect.equals(25, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| calloc.free(a5Pointer); |
| calloc.free(a6Pointer); |
| calloc.free(a7Pointer); |
| calloc.free(a8Pointer); |
| calloc.free(a9Pointer); |
| } |
| |
| final passStruct20BytesHomogeneousFloat = ffiTestFunctions.lookupFunction< |
| Float Function(Struct20BytesHomogeneousFloat), |
| double Function( |
| Struct20BytesHomogeneousFloat)>("PassStruct20BytesHomogeneousFloat"); |
| |
| /// Argument too big to go into FPU registers in hardfp and arm64. |
| void testPassStruct20BytesHomogeneousFloat() { |
| final a0Pointer = calloc<Struct20BytesHomogeneousFloat>(); |
| final Struct20BytesHomogeneousFloat a0 = a0Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2.0; |
| a0.a2 = -3.0; |
| a0.a3 = 4.0; |
| a0.a4 = -5.0; |
| |
| final result = passStruct20BytesHomogeneousFloat(a0); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(-3.0, result); |
| |
| calloc.free(a0Pointer); |
| } |
| |
| final passStruct32BytesHomogeneousDoublex5 = ffiTestFunctions.lookupFunction< |
| Double Function( |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble), |
| double Function( |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble, |
| Struct32BytesHomogeneousDouble)>( |
| "PassStruct32BytesHomogeneousDoublex5"); |
| |
| /// Arguments in FPU registers on arm64. |
| /// 5 struct arguments will exhaust available registers. |
| void testPassStruct32BytesHomogeneousDoublex5() { |
| final a0Pointer = calloc<Struct32BytesHomogeneousDouble>(); |
| final Struct32BytesHomogeneousDouble a0 = a0Pointer.ref; |
| final a1Pointer = calloc<Struct32BytesHomogeneousDouble>(); |
| final Struct32BytesHomogeneousDouble a1 = a1Pointer.ref; |
| final a2Pointer = calloc<Struct32BytesHomogeneousDouble>(); |
| final Struct32BytesHomogeneousDouble a2 = a2Pointer.ref; |
| final a3Pointer = calloc<Struct32BytesHomogeneousDouble>(); |
| final Struct32BytesHomogeneousDouble a3 = a3Pointer.ref; |
| final a4Pointer = calloc<Struct32BytesHomogeneousDouble>(); |
| final Struct32BytesHomogeneousDouble a4 = a4Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2.0; |
| a0.a2 = -3.0; |
| a0.a3 = 4.0; |
| a1.a0 = -5.0; |
| a1.a1 = 6.0; |
| a1.a2 = -7.0; |
| a1.a3 = 8.0; |
| a2.a0 = -9.0; |
| a2.a1 = 10.0; |
| a2.a2 = -11.0; |
| a2.a3 = 12.0; |
| a3.a0 = -13.0; |
| a3.a1 = 14.0; |
| a3.a2 = -15.0; |
| a3.a3 = 16.0; |
| a4.a0 = -17.0; |
| a4.a1 = 18.0; |
| a4.a2 = -19.0; |
| a4.a3 = 20.0; |
| |
| final result = passStruct32BytesHomogeneousDoublex5(a0, a1, a2, a3, a4); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(10.0, result); |
| |
| calloc.free(a0Pointer); |
| calloc.free(a1Pointer); |
| calloc.free(a2Pointer); |
| calloc.free(a3Pointer); |
| calloc.free(a4Pointer); |
| } |
| |
| final passStruct40BytesHomogeneousDouble = ffiTestFunctions.lookupFunction< |
| Double Function(Struct40BytesHomogeneousDouble), |
| double Function( |
| Struct40BytesHomogeneousDouble)>("PassStruct40BytesHomogeneousDouble"); |
| |
| /// Argument too big to go into FPU registers in arm64. |
| void testPassStruct40BytesHomogeneousDouble() { |
| final a0Pointer = calloc<Struct40BytesHomogeneousDouble>(); |
| final Struct40BytesHomogeneousDouble a0 = a0Pointer.ref; |
| |
| a0.a0 = -1.0; |
| a0.a1 = 2.0; |
| a0.a2 = -3.0; |
| a0.a3 = 4.0; |
| a0.a4 = -5.0; |
| |
| final result = passStruct40BytesHomogeneousDouble(a0); |
| |
| print("result = $result"); |
| |
| Expect.approxEquals(-3.0, result); |
| |
| calloc.free(a0Pointer); |
| } |
| |
| final passStruct1024BytesHomogeneousUint64 = ffiTestFunctions.lookupFunction< |
| Uint64 Function(Struct1024BytesHomogeneousUint64), |
| int Function(Struct1024BytesHomogeneousUint64)>( |
| "PassStruct1024BytesHomogeneousUint64"); |
| |
| /// Test 1kb struct. |
| void testPassStruct1024BytesHomogeneousUint64() { |
| final a0Pointer = calloc<Struct1024BytesHomogeneousUint64>(); |
| final Struct1024BytesHomogeneousUint64 a0 = a0Pointer.ref; |
| |
| a0.a0 = 1; |
| a0.a1 = 2; |
| a0.a2 = 3; |
| a0.a3 = 4; |
| a0.a4 = 5; |
| a0.a5 = 6; |
| a0.a6 = 7; |
| a0.a7 = 8; |
| a0.a8 = 9; |
| a0.a9 = 10; |
| a0.a10 = 11; |
| a0.a11 = 12; |
| a0.a12 = 13; |
| a0.a13 = 14; |
| a0.a14 = 15; |
| a0.a15 = 16; |
| a0.a16 = 17; |
| a0.a17 = 18; |
| a0.a18 = 19; |
| a0.a19 = 20; |
| a0.a20 = 21; |
| a0.a21 = 22; |
| a0.a22 = 23; |
| a0.a23 = 24; |
| a0.a24 = 25; |
| a0.a25 = 26; |
| a0.a26 = 27; |
| a0.a27 = 28; |
| a0.a28 = 29; |
| a0.a29 = 30; |
| a0.a30 = 31; |
| a0.a31 = 32; |
| a0.a32 = 33; |
| a0.a33 = 34; |
| a0.a34 = 35; |
| a0.a35 = 36; |
| a0.a36 = 37; |
| a0.a37 = 38; |
| a0.a38 = 39; |
| a0.a39 = 40; |
| a0.a40 = 41; |
| a0.a41 = 42; |
| a0.a42 = 43; |
| a0.a43 = 44; |
| a0.a44 = 45; |
| a0.a45 = 46; |
| a0.a46 = 47; |
| a0.a47 = 48; |
| a0.a48 = 49; |
| a0.a49 = 50; |
| a0.a50 = 51; |
| a0.a51 = 52; |
| a0.a52 = 53; |
| a0.a53 = 54; |
| a0.a54 = 55; |
| a0.a55 = 56; |
| a0.a56 = 57; |
| a0.a57 = 58; |
| a0.a58 = 59; |
| a0.a59 = 60; |
| a0.a60 = 61; |
| a0.a61 = 62; |
| a0.a62 = 63; |
| a0.a63 = 64; |
| a0.a64 = 65; |
| a0.a65 = 66; |
| a0.a66 = 67; |
| a0.a67 = 68; |
| a0.a68 = 69; |
| a0.a69 = 70; |
| a0.a70 = 71; |
| a0.a71 = 72; |
| a0.a72 = 73; |
| a0.a73 = 74; |
| a0.a74 = 75; |
| a0.a75 = 76; |
| a0.a76 = 77; |
| a0.a77 = 78; |
| a0.a78 = 79; |
| a0.a79 = 80; |
| a0.a80 = 81; |
| a0.a81 = 82; |
| a0.a82 = 83; |
| a0.a83 = 84; |
| a0.a84 = 85; |
| a0.a85 = 86; |
| a0.a86 = 87; |
| a0.a87 = 88; |
| a0.a88 = 89; |
| a0.a89 = 90; |
| a0.a90 = 91; |
| a0.a91 = 92; |
| a0.a92 = 93; |
| a0.a93 = 94; |
| a0.a94 = 95; |
| a0.a95 = 96; |
| a0.a96 = 97; |
| a0.a97 = 98; |
| a0.a98 = 99; |
| a0.a99 = 100; |
| a0.a100 = 101; |
| a0.a101 = 102; |
| a0.a102 = 103; |
| a0.a103 = 104; |
| a0.a104 = 105; |
| a0.a105 = 106; |
| a0.a106 = 107; |
| a0.a107 = 108; |
| a0.a108 = 109; |
| a0.a109 = 110; |
| a0.a110 = 111; |
| a0.a111 = 112; |
| a0.a112 = 113; |
| a0.a113 = 114; |
| a0.a114 = 115; |
| a0.a115 = 116; |
| a0.a116 = 117; |
| a0.a117 = 118; |
| a0.a118 = 119; |
| a0.a119 = 120; |
| a0.a120 = 121; |
| a0.a121 = 122; |
| a0.a122 = 123; |
| a0.a123 = 124 |