blob: b406a8b0f0d8c593b94bc362ab2e90452bf8ada6 [file] [log] [blame] [edit]
// Copyright (c) 2023, 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.
// Generated by tests/ffi/generator/structs_by_value_tests_generator.dart.
//
// SharedObjects=ffi_test_functions
// VMOptions=
// VMOptions=--deterministic --optimization-counter-threshold=90
// VMOptions=--use-slow-path
// VMOptions=--use-slow-path --stacktrace-every=100
import 'dart:ffi';
import 'package:expect/expect.dart';
// ignore: unused_import
import 'package:ffi/ffi.dart';
import 'dylib_utils.dart';
// Reuse the compound classes.
import 'function_structs_by_value_generated_compounds.dart';
final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
// Force dlopen so @Native lookups in DynamicLibrary.process() succeed.
dlopenGlobalPlatformSpecific('ffi_test_functions');
for (int i = 0; i < 100; ++i) {
testReturnStructArgumentStruct1ByteIntNativeLeaf();
testReturnStructArgumentInt32x8Struct1ByteIntNativeLeaf();
testReturnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf();
testReturnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf();
testReturnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf();
testReturnStructArgumentStruct8BytesInlineArrayIntNativeLeaf();
testReturnStructArgumentStructStruct16BytesHomogeneousNativeLeaf();
testReturnStructArgumentStructStruct32BytesHomogeneousNativeLeaf();
testReturnStructArgumentStructStruct16BytesMixed3NativeLeaf();
testReturnStructAlignmentInt16NativeLeaf();
testReturnStructAlignmentInt32NativeLeaf();
testReturnStructAlignmentInt64NativeLeaf();
testReturnStruct8BytesNestedIntNativeLeaf();
testReturnStruct8BytesNestedFloatNativeLeaf();
testReturnStruct8BytesNestedFloat2NativeLeaf();
testReturnStruct8BytesNestedMixedNativeLeaf();
testReturnStruct16BytesNestedIntNativeLeaf();
testReturnStruct32BytesNestedIntNativeLeaf();
testReturnStructNestedIntStructAlignmentInt16NativeLeaf();
testReturnStructNestedIntStructAlignmentInt32NativeLeaf();
testReturnStructNestedIntStructAlignmentInt64NativeLeaf();
testReturnStructNestedIrregularEvenBiggerNativeLeaf();
}
}
@Native<Struct1ByteInt Function(Struct1ByteInt)>(
symbol: 'ReturnStructArgumentStruct1ByteInt',
isLeaf: true,
)
external Struct1ByteInt returnStructArgumentStruct1ByteIntNativeLeaf(
Struct1ByteInt a0,
);
/// Test that a struct passed in as argument can be returned.
/// Especially for ffi callbacks.
/// Struct is passed in int registers in most ABIs.
void testReturnStructArgumentStruct1ByteIntNativeLeaf() {
final a0Pointer = calloc<Struct1ByteInt>();
final Struct1ByteInt a0 = a0Pointer.ref;
a0.a0 = -1;
final result = returnStructArgumentStruct1ByteIntNativeLeaf(a0);
print("result = $result");
Expect.equals(a0.a0, result.a0);
calloc.free(a0Pointer);
}
@Native<
Struct1ByteInt Function(
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Struct1ByteInt,
)
>(symbol: 'ReturnStructArgumentInt32x8Struct1ByteInt', isLeaf: true)
external Struct1ByteInt returnStructArgumentInt32x8Struct1ByteIntNativeLeaf(
int a0,
int a1,
int a2,
int a3,
int a4,
int a5,
int a6,
int a7,
Struct1ByteInt a8,
);
/// Test that a struct passed in as argument can be returned.
/// Especially for ffi callbacks.
/// Struct is passed on stack on all ABIs.
void testReturnStructArgumentInt32x8Struct1ByteIntNativeLeaf() {
int a0;
int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
int a7;
final a8Pointer = calloc<Struct1ByteInt>();
final Struct1ByteInt a8 = a8Pointer.ref;
a0 = -1;
a1 = 2;
a2 = -3;
a3 = 4;
a4 = -5;
a5 = 6;
a6 = -7;
a7 = 8;
a8.a0 = -9;
final result = returnStructArgumentInt32x8Struct1ByteIntNativeLeaf(
a0,
a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
);
print("result = $result");
Expect.equals(a8.a0, result.a0);
calloc.free(a8Pointer);
}
@Native<Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat)>(
symbol: 'ReturnStructArgumentStruct8BytesHomogeneousFloat',
isLeaf: true,
)
external Struct8BytesHomogeneousFloat
returnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf(
Struct8BytesHomogeneousFloat a0,
);
/// Test that a struct passed in as argument can be returned.
/// Especially for ffi callbacks.
/// Struct is passed in float registers in most ABIs.
void testReturnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf() {
final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
a0.a0 = -1.0;
a0.a1 = 2.0;
final result = returnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf(a0);
print("result = $result");
Expect.approxEquals(a0.a0, result.a0);
Expect.approxEquals(a0.a1, result.a1);
calloc.free(a0Pointer);
}
@Native<Struct20BytesHomogeneousInt32 Function(Struct20BytesHomogeneousInt32)>(
symbol: 'ReturnStructArgumentStruct20BytesHomogeneousInt32',
isLeaf: true,
)
external Struct20BytesHomogeneousInt32
returnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf(
Struct20BytesHomogeneousInt32 a0,
);
/// On arm64, both argument and return value are passed in by pointer.
void testReturnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf() {
final a0Pointer = calloc<Struct20BytesHomogeneousInt32>();
final Struct20BytesHomogeneousInt32 a0 = a0Pointer.ref;
a0.a0 = -1;
a0.a1 = 2;
a0.a2 = -3;
a0.a3 = 4;
a0.a4 = -5;
final result = returnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf(
a0,
);
print("result = $result");
Expect.equals(a0.a0, result.a0);
Expect.equals(a0.a1, result.a1);
Expect.equals(a0.a2, result.a2);
Expect.equals(a0.a3, result.a3);
Expect.equals(a0.a4, result.a4);
calloc.free(a0Pointer);
}
@Native<
Struct20BytesHomogeneousInt32 Function(
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Int32,
Struct20BytesHomogeneousInt32,
)
>(symbol: 'ReturnStructArgumentInt32x8Struct20BytesHomogeneou', isLeaf: true)
external Struct20BytesHomogeneousInt32
returnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf(
int a0,
int a1,
int a2,
int a3,
int a4,
int a5,
int a6,
int a7,
Struct20BytesHomogeneousInt32 a8,
);
/// On arm64, both argument and return value are passed in by pointer.
/// Ints exhaust registers, so that pointer is passed on stack.
void testReturnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf() {
int a0;
int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
int a7;
final a8Pointer = calloc<Struct20BytesHomogeneousInt32>();
final Struct20BytesHomogeneousInt32 a8 = a8Pointer.ref;
a0 = -1;
a1 = 2;
a2 = -3;
a3 = 4;
a4 = -5;
a5 = 6;
a6 = -7;
a7 = 8;
a8.a0 = -9;
a8.a1 = 10;
a8.a2 = -11;
a8.a3 = 12;
a8.a4 = -13;
final result = returnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf(
a0,
a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
);
print("result = $result");
Expect.equals(a8.a0, result.a0);
Expect.equals(a8.a1, result.a1);
Expect.equals(a8.a2, result.a2);
Expect.equals(a8.a3, result.a3);
Expect.equals(a8.a4, result.a4);
calloc.free(a8Pointer);
}
@Native<Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt)>(
symbol: 'ReturnStructArgumentStruct8BytesInlineArrayInt',
isLeaf: true,
)
external Struct8BytesInlineArrayInt
returnStructArgumentStruct8BytesInlineArrayIntNativeLeaf(
Struct8BytesInlineArrayInt a0,
);
/// Test returning struct with inline array.
void testReturnStructArgumentStruct8BytesInlineArrayIntNativeLeaf() {
final a0Pointer = calloc<Struct8BytesInlineArrayInt>();
final Struct8BytesInlineArrayInt a0 = a0Pointer.ref;
a0.a0[0] = 1;
a0.a0[1] = 2;
a0.a0[2] = 3;
a0.a0[3] = 4;
a0.a0[4] = 5;
a0.a0[5] = 6;
a0.a0[6] = 7;
a0.a0[7] = 8;
final result = returnStructArgumentStruct8BytesInlineArrayIntNativeLeaf(a0);
print("result = $result");
for (int i = 0; i < 8; i++) {
Expect.equals(a0.a0[i], result.a0[i]);
}
calloc.free(a0Pointer);
}
@Native<
StructStruct16BytesHomogeneousFloat2 Function(
StructStruct16BytesHomogeneousFloat2,
)
>(symbol: 'ReturnStructArgumentStructStruct16BytesHomogeneous', isLeaf: true)
external StructStruct16BytesHomogeneousFloat2
returnStructArgumentStructStruct16BytesHomogeneousNativeLeaf(
StructStruct16BytesHomogeneousFloat2 a0,
);
/// Return value in FPU registers on arm hardfp and arm64.
void testReturnStructArgumentStructStruct16BytesHomogeneousNativeLeaf() {
final a0Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
final StructStruct16BytesHomogeneousFloat2 a0 = a0Pointer.ref;
a0.a0.a0 = -1.0;
a0.a1[0].a0 = 2.0;
a0.a1[1].a0 = -3.0;
a0.a2 = 4.0;
final result = returnStructArgumentStructStruct16BytesHomogeneousNativeLeaf(
a0,
);
print("result = $result");
Expect.approxEquals(a0.a0.a0, result.a0.a0);
for (int i = 0; i < 2; i++) {
Expect.approxEquals(a0.a1[i].a0, result.a1[i].a0);
}
Expect.approxEquals(a0.a2, result.a2);
calloc.free(a0Pointer);
}
@Native<
StructStruct32BytesHomogeneousDouble2 Function(
StructStruct32BytesHomogeneousDouble2,
)
>(symbol: 'ReturnStructArgumentStructStruct32BytesHomogeneous', isLeaf: true)
external StructStruct32BytesHomogeneousDouble2
returnStructArgumentStructStruct32BytesHomogeneousNativeLeaf(
StructStruct32BytesHomogeneousDouble2 a0,
);
/// Return value in FPU registers on arm64.
void testReturnStructArgumentStructStruct32BytesHomogeneousNativeLeaf() {
final a0Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
final StructStruct32BytesHomogeneousDouble2 a0 = a0Pointer.ref;
a0.a0.a0 = -1.0;
a0.a1[0].a0 = 2.0;
a0.a1[1].a0 = -3.0;
a0.a2 = 4.0;
final result = returnStructArgumentStructStruct32BytesHomogeneousNativeLeaf(
a0,
);
print("result = $result");
Expect.approxEquals(a0.a0.a0, result.a0.a0);
for (int i = 0; i < 2; i++) {
Expect.approxEquals(a0.a1[i].a0, result.a1[i].a0);
}
Expect.approxEquals(a0.a2, result.a2);
calloc.free(a0Pointer);
}
@Native<StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3)>(
symbol: 'ReturnStructArgumentStructStruct16BytesMixed3',
isLeaf: true,
)
external StructStruct16BytesMixed3
returnStructArgumentStructStruct16BytesMixed3NativeLeaf(
StructStruct16BytesMixed3 a0,
);
/// On x64 Linux, return value is split over FP and int registers.
void testReturnStructArgumentStructStruct16BytesMixed3NativeLeaf() {
final a0Pointer = calloc<StructStruct16BytesMixed3>();
final StructStruct16BytesMixed3 a0 = a0Pointer.ref;
a0.a0.a0 = -1.0;
a0.a1[0].a0 = 2.0;
a0.a1[0].a1 = -3;
a0.a1[0].a2 = 4;
a0.a2[0] = -5;
a0.a2[1] = 6;
final result = returnStructArgumentStructStruct16BytesMixed3NativeLeaf(a0);
print("result = $result");
Expect.approxEquals(a0.a0.a0, result.a0.a0);
for (int i = 0; i < 1; i++) {
Expect.approxEquals(a0.a1[i].a0, result.a1[i].a0);
Expect.equals(a0.a1[i].a1, result.a1[i].a1);
Expect.equals(a0.a1[i].a2, result.a1[i].a2);
}
for (int i = 0; i < 2; i++) {
Expect.equals(a0.a2[i], result.a2[i]);
}
calloc.free(a0Pointer);
}
@Native<StructAlignmentInt16 Function(Int8, Int16, Int8)>(
symbol: 'ReturnStructAlignmentInt16',
isLeaf: true,
)
external StructAlignmentInt16 returnStructAlignmentInt16NativeLeaf(
int a0,
int a1,
int a2,
);
/// Test alignment and padding of 16 byte int within struct.
void testReturnStructAlignmentInt16NativeLeaf() {
int a0;
int a1;
int a2;
a0 = -1;
a1 = 2;
a2 = -3;
final result = returnStructAlignmentInt16NativeLeaf(a0, a1, a2);
print("result = $result");
Expect.equals(a0, result.a0);
Expect.equals(a1, result.a1);
Expect.equals(a2, result.a2);
}
@Native<StructAlignmentInt32 Function(Int8, Int32, Int8)>(
symbol: 'ReturnStructAlignmentInt32',
isLeaf: true,
)
external StructAlignmentInt32 returnStructAlignmentInt32NativeLeaf(
int a0,
int a1,
int a2,
);
/// Test alignment and padding of 32 byte int within struct.
void testReturnStructAlignmentInt32NativeLeaf() {
int a0;
int a1;
int a2;
a0 = -1;
a1 = 2;
a2 = -3;
final result = returnStructAlignmentInt32NativeLeaf(a0, a1, a2);
print("result = $result");
Expect.equals(a0, result.a0);
Expect.equals(a1, result.a1);
Expect.equals(a2, result.a2);
}
@Native<StructAlignmentInt64 Function(Int8, Int64, Int8)>(
symbol: 'ReturnStructAlignmentInt64',
isLeaf: true,
)
external StructAlignmentInt64 returnStructAlignmentInt64NativeLeaf(
int a0,
int a1,
int a2,
);
/// Test alignment and padding of 64 byte int within struct.
void testReturnStructAlignmentInt64NativeLeaf() {
int a0;
int a1;
int a2;
a0 = -1;
a1 = 2;
a2 = -3;
final result = returnStructAlignmentInt64NativeLeaf(a0, a1, a2);
print("result = $result");
Expect.equals(a0, result.a0);
Expect.equals(a1, result.a1);
Expect.equals(a2, result.a2);
}
@Native<
Struct8BytesNestedInt Function(
Struct4BytesHomogeneousInt16,
Struct4BytesHomogeneousInt16,
)
>(symbol: 'ReturnStruct8BytesNestedInt', isLeaf: true)
external Struct8BytesNestedInt returnStruct8BytesNestedIntNativeLeaf(
Struct4BytesHomogeneousInt16 a0,
Struct4BytesHomogeneousInt16 a1,
);
/// Simple nested struct.
void testReturnStruct8BytesNestedIntNativeLeaf() {
final a0Pointer = calloc<Struct4BytesHomogeneousInt16>();
final Struct4BytesHomogeneousInt16 a0 = a0Pointer.ref;
final a1Pointer = calloc<Struct4BytesHomogeneousInt16>();
final Struct4BytesHomogeneousInt16 a1 = a1Pointer.ref;
a0.a0 = -1;
a0.a1 = 2;
a1.a0 = -3;
a1.a1 = 4;
final result = returnStruct8BytesNestedIntNativeLeaf(a0, a1);
print("result = $result");
Expect.equals(a0.a0, result.a0.a0);
Expect.equals(a0.a1, result.a0.a1);
Expect.equals(a1.a0, result.a1.a0);
Expect.equals(a1.a1, result.a1.a1);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<Struct8BytesNestedFloat Function(Struct4BytesFloat, Struct4BytesFloat)>(
symbol: 'ReturnStruct8BytesNestedFloat',
isLeaf: true,
)
external Struct8BytesNestedFloat returnStruct8BytesNestedFloatNativeLeaf(
Struct4BytesFloat a0,
Struct4BytesFloat a1,
);
/// Simple nested struct with floats.
void testReturnStruct8BytesNestedFloatNativeLeaf() {
final a0Pointer = calloc<Struct4BytesFloat>();
final Struct4BytesFloat a0 = a0Pointer.ref;
final a1Pointer = calloc<Struct4BytesFloat>();
final Struct4BytesFloat a1 = a1Pointer.ref;
a0.a0 = -1.0;
a1.a0 = 2.0;
final result = returnStruct8BytesNestedFloatNativeLeaf(a0, a1);
print("result = $result");
Expect.approxEquals(a0.a0, result.a0.a0);
Expect.approxEquals(a1.a0, result.a1.a0);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<Struct8BytesNestedFloat2 Function(Struct4BytesFloat, Float)>(
symbol: 'ReturnStruct8BytesNestedFloat2',
isLeaf: true,
)
external Struct8BytesNestedFloat2 returnStruct8BytesNestedFloat2NativeLeaf(
Struct4BytesFloat a0,
double a1,
);
/// The nesting is irregular, testing homogenous float rules on arm and arm64,
/// and the fpu register usage on x64.
void testReturnStruct8BytesNestedFloat2NativeLeaf() {
final a0Pointer = calloc<Struct4BytesFloat>();
final Struct4BytesFloat a0 = a0Pointer.ref;
double a1;
a0.a0 = -1.0;
a1 = 2.0;
final result = returnStruct8BytesNestedFloat2NativeLeaf(a0, a1);
print("result = $result");
Expect.approxEquals(a0.a0, result.a0.a0);
Expect.approxEquals(a1, result.a1);
calloc.free(a0Pointer);
}
@Native<
Struct8BytesNestedMixed Function(
Struct4BytesHomogeneousInt16,
Struct4BytesFloat,
)
>(symbol: 'ReturnStruct8BytesNestedMixed', isLeaf: true)
external Struct8BytesNestedMixed returnStruct8BytesNestedMixedNativeLeaf(
Struct4BytesHomogeneousInt16 a0,
Struct4BytesFloat a1,
);
/// Simple nested struct with mixed members.
void testReturnStruct8BytesNestedMixedNativeLeaf() {
final a0Pointer = calloc<Struct4BytesHomogeneousInt16>();
final Struct4BytesHomogeneousInt16 a0 = a0Pointer.ref;
final a1Pointer = calloc<Struct4BytesFloat>();
final Struct4BytesFloat a1 = a1Pointer.ref;
a0.a0 = -1;
a0.a1 = 2;
a1.a0 = -3.0;
final result = returnStruct8BytesNestedMixedNativeLeaf(a0, a1);
print("result = $result");
Expect.equals(a0.a0, result.a0.a0);
Expect.equals(a0.a1, result.a0.a1);
Expect.approxEquals(a1.a0, result.a1.a0);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<
Struct16BytesNestedInt Function(Struct8BytesNestedInt, Struct8BytesNestedInt)
>(symbol: 'ReturnStruct16BytesNestedInt', isLeaf: true)
external Struct16BytesNestedInt returnStruct16BytesNestedIntNativeLeaf(
Struct8BytesNestedInt a0,
Struct8BytesNestedInt a1,
);
/// Deeper nested struct to test recursive member access.
void testReturnStruct16BytesNestedIntNativeLeaf() {
final a0Pointer = calloc<Struct8BytesNestedInt>();
final Struct8BytesNestedInt a0 = a0Pointer.ref;
final a1Pointer = calloc<Struct8BytesNestedInt>();
final Struct8BytesNestedInt a1 = a1Pointer.ref;
a0.a0.a0 = -1;
a0.a0.a1 = 2;
a0.a1.a0 = -3;
a0.a1.a1 = 4;
a1.a0.a0 = -5;
a1.a0.a1 = 6;
a1.a1.a0 = -7;
a1.a1.a1 = 8;
final result = returnStruct16BytesNestedIntNativeLeaf(a0, a1);
print("result = $result");
Expect.equals(a0.a0.a0, result.a0.a0.a0);
Expect.equals(a0.a0.a1, result.a0.a0.a1);
Expect.equals(a0.a1.a0, result.a0.a1.a0);
Expect.equals(a0.a1.a1, result.a0.a1.a1);
Expect.equals(a1.a0.a0, result.a1.a0.a0);
Expect.equals(a1.a0.a1, result.a1.a0.a1);
Expect.equals(a1.a1.a0, result.a1.a1.a0);
Expect.equals(a1.a1.a1, result.a1.a1.a1);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<
Struct32BytesNestedInt Function(
Struct16BytesNestedInt,
Struct16BytesNestedInt,
)
>(symbol: 'ReturnStruct32BytesNestedInt', isLeaf: true)
external Struct32BytesNestedInt returnStruct32BytesNestedIntNativeLeaf(
Struct16BytesNestedInt a0,
Struct16BytesNestedInt a1,
);
/// Even deeper nested struct to test recursive member access.
void testReturnStruct32BytesNestedIntNativeLeaf() {
final a0Pointer = calloc<Struct16BytesNestedInt>();
final Struct16BytesNestedInt a0 = a0Pointer.ref;
final a1Pointer = calloc<Struct16BytesNestedInt>();
final Struct16BytesNestedInt a1 = a1Pointer.ref;
a0.a0.a0.a0 = -1;
a0.a0.a0.a1 = 2;
a0.a0.a1.a0 = -3;
a0.a0.a1.a1 = 4;
a0.a1.a0.a0 = -5;
a0.a1.a0.a1 = 6;
a0.a1.a1.a0 = -7;
a0.a1.a1.a1 = 8;
a1.a0.a0.a0 = -9;
a1.a0.a0.a1 = 10;
a1.a0.a1.a0 = -11;
a1.a0.a1.a1 = 12;
a1.a1.a0.a0 = -13;
a1.a1.a0.a1 = 14;
a1.a1.a1.a0 = -15;
a1.a1.a1.a1 = 16;
final result = returnStruct32BytesNestedIntNativeLeaf(a0, a1);
print("result = $result");
Expect.equals(a0.a0.a0.a0, result.a0.a0.a0.a0);
Expect.equals(a0.a0.a0.a1, result.a0.a0.a0.a1);
Expect.equals(a0.a0.a1.a0, result.a0.a0.a1.a0);
Expect.equals(a0.a0.a1.a1, result.a0.a0.a1.a1);
Expect.equals(a0.a1.a0.a0, result.a0.a1.a0.a0);
Expect.equals(a0.a1.a0.a1, result.a0.a1.a0.a1);
Expect.equals(a0.a1.a1.a0, result.a0.a1.a1.a0);
Expect.equals(a0.a1.a1.a1, result.a0.a1.a1.a1);
Expect.equals(a1.a0.a0.a0, result.a1.a0.a0.a0);
Expect.equals(a1.a0.a0.a1, result.a1.a0.a0.a1);
Expect.equals(a1.a0.a1.a0, result.a1.a0.a1.a0);
Expect.equals(a1.a0.a1.a1, result.a1.a0.a1.a1);
Expect.equals(a1.a1.a0.a0, result.a1.a1.a0.a0);
Expect.equals(a1.a1.a0.a1, result.a1.a1.a0.a1);
Expect.equals(a1.a1.a1.a0, result.a1.a1.a1.a0);
Expect.equals(a1.a1.a1.a1, result.a1.a1.a1.a1);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<
StructNestedIntStructAlignmentInt16 Function(
StructAlignmentInt16,
StructAlignmentInt16,
)
>(symbol: 'ReturnStructNestedIntStructAlignmentInt16', isLeaf: true)
external StructNestedIntStructAlignmentInt16
returnStructNestedIntStructAlignmentInt16NativeLeaf(
StructAlignmentInt16 a0,
StructAlignmentInt16 a1,
);
/// Test alignment and padding of nested struct with 16 byte int.
void testReturnStructNestedIntStructAlignmentInt16NativeLeaf() {
final a0Pointer = calloc<StructAlignmentInt16>();
final StructAlignmentInt16 a0 = a0Pointer.ref;
final a1Pointer = calloc<StructAlignmentInt16>();
final StructAlignmentInt16 a1 = a1Pointer.ref;
a0.a0 = -1;
a0.a1 = 2;
a0.a2 = -3;
a1.a0 = 4;
a1.a1 = -5;
a1.a2 = 6;
final result = returnStructNestedIntStructAlignmentInt16NativeLeaf(a0, a1);
print("result = $result");
Expect.equals(a0.a0, result.a0.a0);
Expect.equals(a0.a1, result.a0.a1);
Expect.equals(a0.a2, result.a0.a2);
Expect.equals(a1.a0, result.a1.a0);
Expect.equals(a1.a1, result.a1.a1);
Expect.equals(a1.a2, result.a1.a2);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<
StructNestedIntStructAlignmentInt32 Function(
StructAlignmentInt32,
StructAlignmentInt32,
)
>(symbol: 'ReturnStructNestedIntStructAlignmentInt32', isLeaf: true)
external StructNestedIntStructAlignmentInt32
returnStructNestedIntStructAlignmentInt32NativeLeaf(
StructAlignmentInt32 a0,
StructAlignmentInt32 a1,
);
/// Test alignment and padding of nested struct with 32 byte int.
void testReturnStructNestedIntStructAlignmentInt32NativeLeaf() {
final a0Pointer = calloc<StructAlignmentInt32>();
final StructAlignmentInt32 a0 = a0Pointer.ref;
final a1Pointer = calloc<StructAlignmentInt32>();
final StructAlignmentInt32 a1 = a1Pointer.ref;
a0.a0 = -1;
a0.a1 = 2;
a0.a2 = -3;
a1.a0 = 4;
a1.a1 = -5;
a1.a2 = 6;
final result = returnStructNestedIntStructAlignmentInt32NativeLeaf(a0, a1);
print("result = $result");
Expect.equals(a0.a0, result.a0.a0);
Expect.equals(a0.a1, result.a0.a1);
Expect.equals(a0.a2, result.a0.a2);
Expect.equals(a1.a0, result.a1.a0);
Expect.equals(a1.a1, result.a1.a1);
Expect.equals(a1.a2, result.a1.a2);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<
StructNestedIntStructAlignmentInt64 Function(
StructAlignmentInt64,
StructAlignmentInt64,
)
>(symbol: 'ReturnStructNestedIntStructAlignmentInt64', isLeaf: true)
external StructNestedIntStructAlignmentInt64
returnStructNestedIntStructAlignmentInt64NativeLeaf(
StructAlignmentInt64 a0,
StructAlignmentInt64 a1,
);
/// Test alignment and padding of nested struct with 64 byte int.
void testReturnStructNestedIntStructAlignmentInt64NativeLeaf() {
final a0Pointer = calloc<StructAlignmentInt64>();
final StructAlignmentInt64 a0 = a0Pointer.ref;
final a1Pointer = calloc<StructAlignmentInt64>();
final StructAlignmentInt64 a1 = a1Pointer.ref;
a0.a0 = -1;
a0.a1 = 2;
a0.a2 = -3;
a1.a0 = 4;
a1.a1 = -5;
a1.a2 = 6;
final result = returnStructNestedIntStructAlignmentInt64NativeLeaf(a0, a1);
print("result = $result");
Expect.equals(a0.a0, result.a0.a0);
Expect.equals(a0.a1, result.a0.a1);
Expect.equals(a0.a2, result.a0.a2);
Expect.equals(a1.a0, result.a1.a0);
Expect.equals(a1.a1, result.a1.a1);
Expect.equals(a1.a2, result.a1.a2);
calloc.free(a0Pointer);
calloc.free(a1Pointer);
}
@Native<
StructNestedIrregularEvenBigger Function(
Uint64,
StructNestedIrregularBigger,
StructNestedIrregularBigger,
Double,
)
>(symbol: 'ReturnStructNestedIrregularEvenBigger', isLeaf: true)
external StructNestedIrregularEvenBigger
returnStructNestedIrregularEvenBiggerNativeLeaf(
int a0,
StructNestedIrregularBigger a1,
StructNestedIrregularBigger a2,
double a3,
);
/// Return big irregular struct as smoke test.
void testReturnStructNestedIrregularEvenBiggerNativeLeaf() {
int a0;
final a1Pointer = calloc<StructNestedIrregularBigger>();
final StructNestedIrregularBigger a1 = a1Pointer.ref;
final a2Pointer = calloc<StructNestedIrregularBigger>();
final StructNestedIrregularBigger a2 = a2Pointer.ref;
double a3;
a0 = 1;
a1.a0.a0 = 2;
a1.a0.a1.a0.a0 = -3;
a1.a0.a1.a0.a1 = 4;
a1.a0.a1.a1.a0 = -5.0;
a1.a0.a2 = 6;
a1.a0.a3.a0.a0 = -7.0;
a1.a0.a3.a1 = 8.0;
a1.a0.a4 = 9;
a1.a0.a5.a0.a0 = 10.0;
a1.a0.a5.a1.a0 = -11.0;
a1.a0.a6 = 12;
a1.a1.a0.a0 = -13;
a1.a1.a0.a1 = 14;
a1.a1.a1.a0 = -15.0;
a1.a2 = 16.0;
a1.a3 = -17.0;
a2.a0.a0 = 18;
a2.a0.a1.a0.a0 = -19;
a2.a0.a1.a0.a1 = 20;
a2.a0.a1.a1.a0 = -21.0;
a2.a0.a2 = 22;
a2.a0.a3.a0.a0 = -23.0;
a2.a0.a3.a1 = 24.0;
a2.a0.a4 = 25;
a2.a0.a5.a0.a0 = 26.0;
a2.a0.a5.a1.a0 = -27.0;
a2.a0.a6 = 28;
a2.a1.a0.a0 = -29;
a2.a1.a0.a1 = 30;
a2.a1.a1.a0 = -31.0;
a2.a2 = 32.0;
a2.a3 = -33.0;
a3 = 34.0;
final result = returnStructNestedIrregularEvenBiggerNativeLeaf(
a0,
a1,
a2,
a3,
);
print("result = $result");
Expect.equals(a0, result.a0);
Expect.equals(a1.a0.a0, result.a1.a0.a0);
Expect.equals(a1.a0.a1.a0.a0, result.a1.a0.a1.a0.a0);
Expect.equals(a1.a0.a1.a0.a1, result.a1.a0.a1.a0.a1);
Expect.approxEquals(a1.a0.a1.a1.a0, result.a1.a0.a1.a1.a0);
Expect.equals(a1.a0.a2, result.a1.a0.a2);
Expect.approxEquals(a1.a0.a3.a0.a0, result.a1.a0.a3.a0.a0);
Expect.approxEquals(a1.a0.a3.a1, result.a1.a0.a3.a1);
Expect.equals(a1.a0.a4, result.a1.a0.a4);
Expect.approxEquals(a1.a0.a5.a0.a0, result.a1.a0.a5.a0.a0);
Expect.approxEquals(a1.a0.a5.a1.a0, result.a1.a0.a5.a1.a0);
Expect.equals(a1.a0.a6, result.a1.a0.a6);
Expect.equals(a1.a1.a0.a0, result.a1.a1.a0.a0);
Expect.equals(a1.a1.a0.a1, result.a1.a1.a0.a1);
Expect.approxEquals(a1.a1.a1.a0, result.a1.a1.a1.a0);
Expect.approxEquals(a1.a2, result.a1.a2);
Expect.approxEquals(a1.a3, result.a1.a3);
Expect.equals(a2.a0.a0, result.a2.a0.a0);
Expect.equals(a2.a0.a1.a0.a0, result.a2.a0.a1.a0.a0);
Expect.equals(a2.a0.a1.a0.a1, result.a2.a0.a1.a0.a1);
Expect.approxEquals(a2.a0.a1.a1.a0, result.a2.a0.a1.a1.a0);
Expect.equals(a2.a0.a2, result.a2.a0.a2);
Expect.approxEquals(a2.a0.a3.a0.a0, result.a2.a0.a3.a0.a0);
Expect.approxEquals(a2.a0.a3.a1, result.a2.a0.a3.a1);
Expect.equals(a2.a0.a4, result.a2.a0.a4);
Expect.approxEquals(a2.a0.a5.a0.a0, result.a2.a0.a5.a0.a0);
Expect.approxEquals(a2.a0.a5.a1.a0, result.a2.a0.a5.a1.a0);
Expect.equals(a2.a0.a6, result.a2.a0.a6);
Expect.equals(a2.a1.a0.a0, result.a2.a1.a0.a0);
Expect.equals(a2.a1.a0.a1, result.a2.a1.a0.a1);
Expect.approxEquals(a2.a1.a1.a0, result.a2.a1.a1.a0);
Expect.approxEquals(a2.a2, result.a2.a2);
Expect.approxEquals(a2.a3, result.a2.a3);
Expect.approxEquals(a3, result.a3);
calloc.free(a1Pointer);
calloc.free(a2Pointer);
}