Version 2.15.0-221.0.dev
Merge commit 'c9a7ed43d18bf474babc23f3722b7a1a61222a69' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2680c55..1ed45f0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -469,7 +469,12 @@
#### Linter
-Updated the Linter to `1.12.0`, which includes changes that
+Updated the Linter to `1.13.0`, which includes changes that
+- allow `while (true) { ... }` in `literal_only_boolean_expressions`.
+- fix `file_names` to report at the start of the file (not the entire
+ compilation unit).
+- fix `prefer_collection_literals` named typed parameter false positives.
+- improve control flow analysis for `use_build_context_synchronously`.
- update `avoid_print` to allow `kDebugMode`-wrapped print calls.
- fix handling of initializing formals in `prefer_final_parameters`.
- fix `unnecessary_parenthesis` false positive with function expressions.
diff --git a/DEPS b/DEPS
index ec82ec1..3c180ca 100644
--- a/DEPS
+++ b/DEPS
@@ -122,7 +122,7 @@
"intl_tag": "0.17.0-nullsafety",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"json_rpc_2_rev": "7e00f893440a72de0637970325e4ea44bd1e8c8e",
- "linter_tag": "1.12.0",
+ "linter_tag": "1.13.0",
"lints_tag": "f9670df2a66e0ec12eb51554e70c1cbf56c8f5d0",
"logging_rev": "575781ef196e4fed4fb737e38fb4b73d62727187",
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
@@ -163,7 +163,7 @@
"test_reflective_loader_rev": "fcfce37666672edac849d2af6dffc0f8df236a94",
"test_rev": "099dcc4d052a30c6921489cfbefa1c8531d12975",
"typed_data_rev": "29ce5a92b03326d0b8035916ac04f528874994bd",
- "usage_rev": "e0780cd8b2f8af69a28dc52678ffe8492da27d06",
+ "usage_rev": "f0cb8f7cce8b675255c81488dbab8cf9f2f56404",
"vector_math_rev": "0c9f5d68c047813a6dcdeb88ba7a42daddf25025",
"watcher_rev": "3924194385fb215cef483193ed2879a618a3d69c",
"webdriver_rev": "ff5ccb1522edf4bed578ead4d65e0cbc1f2c4f02",
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index 896bede..0f466bf 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -6446,7 +6446,6 @@
assert(optional('(', begin));
listener.beginArguments(begin);
int argumentCount = 0;
- bool hasSeenNamedArgument = false;
bool old = mayParseFunctionExpressions;
mayParseFunctionExpressions = true;
while (true) {
@@ -6461,10 +6460,6 @@
ensureIdentifier(token, IdentifierContext.namedArgumentReference)
.next!;
colon = token;
- hasSeenNamedArgument = true;
- } else if (hasSeenNamedArgument) {
- // Positional argument after named argument.
- reportRecoverableError(next, codes.messagePositionalAfterNamedArgument);
}
token = parseExpression(token);
next = token.next!;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index 722a3f4..1dd0f73 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -652,6 +652,16 @@
}
@override
+ DartType? visitConstructorName(ConstructorName node) {
+ return _visitParent(node);
+ }
+
+ @override
+ DartType? visitConstructorReference(ConstructorReference node) {
+ return _visitParent(node);
+ }
+
+ @override
DartType? visitDefaultFormalParameter(DefaultFormalParameter node) {
var separator = node.separator;
if (separator != null && separator.end <= offset) {
diff --git a/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart b/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart
index 6e27b10..bfa63e0 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/feature_computer_test.dart
@@ -438,6 +438,30 @@
''', 'num');
}
+ Future<void> test_className_period() async {
+ await assertContextType('''
+int x = List.^;
+''', 'int');
+ }
+
+ Future<void> test_className_period_identifier() async {
+ await assertContextType('''
+int x = List.^;
+''', 'int');
+ }
+
+ Future<void> test_className_typeArguments_period() async {
+ await assertContextType('''
+int x = List<double>.^;
+''', 'int');
+ }
+
+ Future<void> test_className_typeArguments_period_identifier() async {
+ await assertContextType('''
+int x = List<double>.foo^;
+''', 'int');
+ }
+
Future<void> test_fieldDeclaration_int() async {
await assertContextType('''
class Foo {
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
index 7c2429b..1243762 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
@@ -22,7 +22,7 @@
final int hashCode;
ClassMemberReference(this.target, this.name)
- : hashCode = Object.hash(target.hashCode, name.hashCode);
+ : hashCode = Object.hash(target, name);
@override
bool operator ==(Object other) {
@@ -120,7 +120,7 @@
factory LibraryQualifiedName(Uri libraryUri, String name) {
var isPrivate = name.startsWith('_');
- var hashCode = Object.hash(libraryUri.hashCode, name.hashCode);
+ var hashCode = Object.hash(libraryUri, name);
return LibraryQualifiedName._internal(
libraryUri, name, isPrivate, hashCode);
}
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 3540b01..4d344ed 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
class AnalysisDriver implements AnalysisDriverGeneric {
/// The version of data format, should be incremented on every format change.
- static const int DATA_VERSION = 187;
+ static const int DATA_VERSION = 188;
/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index f6dab0b..e4c3cc4 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -17,9 +17,12 @@
EnableString.constructor_tearoffs: ExperimentalFeatures.constructor_tearoffs,
EnableString.control_flow_collections:
ExperimentalFeatures.control_flow_collections,
+ EnableString.enhanced_enums: ExperimentalFeatures.enhanced_enums,
EnableString.extension_methods: ExperimentalFeatures.extension_methods,
EnableString.extension_types: ExperimentalFeatures.extension_types,
EnableString.generic_metadata: ExperimentalFeatures.generic_metadata,
+ EnableString.named_arguments_anywhere:
+ ExperimentalFeatures.named_arguments_anywhere,
EnableString.non_nullable: ExperimentalFeatures.non_nullable,
EnableString.nonfunction_type_aliases:
ExperimentalFeatures.nonfunction_type_aliases,
@@ -46,6 +49,9 @@
/// String to enable the experiment "control-flow-collections"
static const String control_flow_collections = 'control-flow-collections';
+ /// String to enable the experiment "enhanced-enums"
+ static const String enhanced_enums = 'enhanced-enums';
+
/// String to enable the experiment "extension-methods"
static const String extension_methods = 'extension-methods';
@@ -55,6 +61,9 @@
/// String to enable the experiment "generic-metadata"
static const String generic_metadata = 'generic-metadata';
+ /// String to enable the experiment "named-arguments-anywhere"
+ static const String named_arguments_anywhere = 'named-arguments-anywhere';
+
/// String to enable the experiment "non-nullable"
static const String non_nullable = 'non-nullable';
@@ -123,8 +132,18 @@
releaseVersion: Version.parse('2.0.0'),
);
- static final extension_methods = ExperimentalFeature(
+ static final enhanced_enums = ExperimentalFeature(
index: 4,
+ enableString: EnableString.enhanced_enums,
+ isEnabledByDefault: IsEnabledByDefault.enhanced_enums,
+ isExpired: IsExpired.enhanced_enums,
+ documentation: 'Enhanced Enums',
+ experimentalReleaseVersion: null,
+ releaseVersion: null,
+ );
+
+ static final extension_methods = ExperimentalFeature(
+ index: 5,
enableString: EnableString.extension_methods,
isEnabledByDefault: IsEnabledByDefault.extension_methods,
isExpired: IsExpired.extension_methods,
@@ -134,7 +153,7 @@
);
static final extension_types = ExperimentalFeature(
- index: 5,
+ index: 6,
enableString: EnableString.extension_types,
isEnabledByDefault: IsEnabledByDefault.extension_types,
isExpired: IsExpired.extension_types,
@@ -144,7 +163,7 @@
);
static final generic_metadata = ExperimentalFeature(
- index: 6,
+ index: 7,
enableString: EnableString.generic_metadata,
isEnabledByDefault: IsEnabledByDefault.generic_metadata,
isExpired: IsExpired.generic_metadata,
@@ -154,8 +173,18 @@
releaseVersion: Version.parse('2.14.0'),
);
+ static final named_arguments_anywhere = ExperimentalFeature(
+ index: 8,
+ enableString: EnableString.named_arguments_anywhere,
+ isEnabledByDefault: IsEnabledByDefault.named_arguments_anywhere,
+ isExpired: IsExpired.named_arguments_anywhere,
+ documentation: 'Named Arguments Anywhere',
+ experimentalReleaseVersion: null,
+ releaseVersion: null,
+ );
+
static final non_nullable = ExperimentalFeature(
- index: 7,
+ index: 9,
enableString: EnableString.non_nullable,
isEnabledByDefault: IsEnabledByDefault.non_nullable,
isExpired: IsExpired.non_nullable,
@@ -165,7 +194,7 @@
);
static final nonfunction_type_aliases = ExperimentalFeature(
- index: 8,
+ index: 10,
enableString: EnableString.nonfunction_type_aliases,
isEnabledByDefault: IsEnabledByDefault.nonfunction_type_aliases,
isExpired: IsExpired.nonfunction_type_aliases,
@@ -175,7 +204,7 @@
);
static final set_literals = ExperimentalFeature(
- index: 9,
+ index: 11,
enableString: EnableString.set_literals,
isEnabledByDefault: IsEnabledByDefault.set_literals,
isExpired: IsExpired.set_literals,
@@ -185,7 +214,7 @@
);
static final spread_collections = ExperimentalFeature(
- index: 10,
+ index: 12,
enableString: EnableString.spread_collections,
isEnabledByDefault: IsEnabledByDefault.spread_collections,
isExpired: IsExpired.spread_collections,
@@ -195,7 +224,7 @@
);
static final test_experiment = ExperimentalFeature(
- index: 11,
+ index: 13,
enableString: EnableString.test_experiment,
isEnabledByDefault: IsEnabledByDefault.test_experiment,
isExpired: IsExpired.test_experiment,
@@ -206,7 +235,7 @@
);
static final triple_shift = ExperimentalFeature(
- index: 12,
+ index: 14,
enableString: EnableString.triple_shift,
isEnabledByDefault: IsEnabledByDefault.triple_shift,
isExpired: IsExpired.triple_shift,
@@ -216,7 +245,7 @@
);
static final value_class = ExperimentalFeature(
- index: 13,
+ index: 15,
enableString: EnableString.value_class,
isEnabledByDefault: IsEnabledByDefault.value_class,
isExpired: IsExpired.value_class,
@@ -226,7 +255,7 @@
);
static final variance = ExperimentalFeature(
- index: 14,
+ index: 16,
enableString: EnableString.variance,
isEnabledByDefault: IsEnabledByDefault.variance,
isExpired: IsExpired.variance,
@@ -251,6 +280,9 @@
/// Default state of the experiment "control-flow-collections"
static const bool control_flow_collections = true;
+ /// Default state of the experiment "enhanced-enums"
+ static const bool enhanced_enums = false;
+
/// Default state of the experiment "extension-methods"
static const bool extension_methods = true;
@@ -260,6 +292,9 @@
/// Default state of the experiment "generic-metadata"
static const bool generic_metadata = true;
+ /// Default state of the experiment "named-arguments-anywhere"
+ static const bool named_arguments_anywhere = false;
+
/// Default state of the experiment "non-nullable"
static const bool non_nullable = true;
@@ -301,6 +336,9 @@
/// Expiration status of the experiment "control-flow-collections"
static const bool control_flow_collections = true;
+ /// Expiration status of the experiment "enhanced-enums"
+ static const bool enhanced_enums = false;
+
/// Expiration status of the experiment "extension-methods"
static const bool extension_methods = false;
@@ -310,6 +348,9 @@
/// Expiration status of the experiment "generic-metadata"
static const bool generic_metadata = false;
+ /// Expiration status of the experiment "named-arguments-anywhere"
+ static const bool named_arguments_anywhere = false;
+
/// Expiration status of the experiment "non-nullable"
static const bool non_nullable = false;
@@ -351,6 +392,9 @@
bool get control_flow_collections =>
isEnabled(ExperimentalFeatures.control_flow_collections);
+ /// Current state for the flag "enhanced-enums"
+ bool get enhanced_enums => isEnabled(ExperimentalFeatures.enhanced_enums);
+
/// Current state for the flag "extension-methods"
bool get extension_methods =>
isEnabled(ExperimentalFeatures.extension_methods);
@@ -361,6 +405,10 @@
/// Current state for the flag "generic-metadata"
bool get generic_metadata => isEnabled(ExperimentalFeatures.generic_metadata);
+ /// Current state for the flag "named-arguments-anywhere"
+ bool get named_arguments_anywhere =>
+ isEnabled(ExperimentalFeatures.named_arguments_anywhere);
+
/// Current state for the flag "non-nullable"
bool get non_nullable => isEnabled(ExperimentalFeatures.non_nullable);
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 6d3ec97..7f85d1e 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -184,7 +184,7 @@
Map<String, DartObjectImpl>? get fields => _state.fields;
@override
- int get hashCode => Object.hash(type.hashCode, _state.hashCode);
+ int get hashCode => Object.hash(type, _state);
@override
bool get hasKnownValue => !_state.isUnknown;
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 1be5afd..063ff95 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -884,7 +884,7 @@
factory Name(Uri? libraryUri, String name) {
if (name.startsWith('_')) {
- var hashCode = Object.hash(libraryUri.hashCode, name.hashCode);
+ var hashCode = Object.hash(libraryUri, name);
return Name._internal(libraryUri, name, false, hashCode);
} else {
return Name._internal(null, name, true, name.hashCode);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 95ab07b..4951088 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -26,6 +26,7 @@
messageMissingAssignableSelector,
messageNativeClauseShouldBeAnnotation,
messageOperatorWithTypeParameters,
+ messagePositionalAfterNamedArgument,
templateDuplicateLabelInSwitchStatement,
templateExpectedButGot,
templateExpectedIdentifier,
@@ -577,6 +578,18 @@
var expressions = popTypedList2<Expression>(count);
ArgumentList arguments =
ast.argumentList(leftParenthesis, expressions, rightParenthesis);
+
+ bool hasSeenNamedArgument = false;
+ for (Expression expression in expressions) {
+ if (expression is NamedExpression) {
+ hasSeenNamedArgument = true;
+ } else if (hasSeenNamedArgument) {
+ // Positional argument after named argument.
+ handleRecoverableError(messagePositionalAfterNamedArgument,
+ expression.beginToken, expression.endToken);
+ }
+ }
+
push(ast.methodInvocation(
null, null, _tmpSimpleIdentifier(), null, arguments));
}
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index ca19764..82414c9 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -15,9 +15,11 @@
constantUpdate2018,
constructorTearoffs,
controlFlowCollections,
+ enhancedEnums,
extensionMethods,
extensionTypes,
genericMetadata,
+ namedArgumentsAnywhere,
nonNullable,
nonfunctionTypeAliases,
setLiterals,
@@ -34,9 +36,11 @@
const Version enableConstantUpdate2018Version = const Version(2, 0);
const Version enableConstructorTearoffsVersion = const Version(2, 15);
const Version enableControlFlowCollectionsVersion = const Version(2, 0);
+const Version enableEnhancedEnumsVersion = const Version(2, 15);
const Version enableExtensionMethodsVersion = const Version(2, 6);
const Version enableExtensionTypesVersion = const Version(2, 15);
const Version enableGenericMetadataVersion = const Version(2, 14);
+const Version enableNamedArgumentsAnywhereVersion = const Version(2, 15);
const Version enableNonNullableVersion = const Version(2, 12);
const Version enableNonfunctionTypeAliasesVersion = const Version(2, 13);
const Version enableSetLiteralsVersion = const Version(2, 0);
@@ -58,12 +62,16 @@
return ExperimentalFlag.constructorTearoffs;
case "control-flow-collections":
return ExperimentalFlag.controlFlowCollections;
+ case "enhanced-enums":
+ return ExperimentalFlag.enhancedEnums;
case "extension-methods":
return ExperimentalFlag.extensionMethods;
case "extension-types":
return ExperimentalFlag.extensionTypes;
case "generic-metadata":
return ExperimentalFlag.genericMetadata;
+ case "named-arguments-anywhere":
+ return ExperimentalFlag.namedArgumentsAnywhere;
case "non-nullable":
return ExperimentalFlag.nonNullable;
case "nonfunction-type-aliases":
@@ -90,9 +98,11 @@
ExperimentalFlag.constantUpdate2018: true,
ExperimentalFlag.constructorTearoffs: true,
ExperimentalFlag.controlFlowCollections: true,
+ ExperimentalFlag.enhancedEnums: false,
ExperimentalFlag.extensionMethods: true,
ExperimentalFlag.extensionTypes: false,
ExperimentalFlag.genericMetadata: true,
+ ExperimentalFlag.namedArgumentsAnywhere: false,
ExperimentalFlag.nonNullable: true,
ExperimentalFlag.nonfunctionTypeAliases: true,
ExperimentalFlag.setLiterals: true,
@@ -109,9 +119,11 @@
ExperimentalFlag.constantUpdate2018: true,
ExperimentalFlag.constructorTearoffs: false,
ExperimentalFlag.controlFlowCollections: true,
+ ExperimentalFlag.enhancedEnums: false,
ExperimentalFlag.extensionMethods: false,
ExperimentalFlag.extensionTypes: false,
ExperimentalFlag.genericMetadata: false,
+ ExperimentalFlag.namedArgumentsAnywhere: false,
ExperimentalFlag.nonNullable: false,
ExperimentalFlag.nonfunctionTypeAliases: false,
ExperimentalFlag.setLiterals: true,
@@ -128,9 +140,11 @@
ExperimentalFlag.constantUpdate2018: const Version(2, 0),
ExperimentalFlag.constructorTearoffs: const Version(2, 15),
ExperimentalFlag.controlFlowCollections: const Version(2, 0),
+ ExperimentalFlag.enhancedEnums: const Version(2, 15),
ExperimentalFlag.extensionMethods: const Version(2, 6),
ExperimentalFlag.extensionTypes: const Version(2, 15),
ExperimentalFlag.genericMetadata: const Version(2, 14),
+ ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 15),
ExperimentalFlag.nonNullable: const Version(2, 12),
ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 13),
ExperimentalFlag.setLiterals: const Version(2, 0),
@@ -147,9 +161,11 @@
ExperimentalFlag.constantUpdate2018: const Version(2, 0),
ExperimentalFlag.constructorTearoffs: const Version(2, 15),
ExperimentalFlag.controlFlowCollections: const Version(2, 0),
+ ExperimentalFlag.enhancedEnums: const Version(2, 15),
ExperimentalFlag.extensionMethods: const Version(2, 6),
ExperimentalFlag.extensionTypes: const Version(2, 15),
ExperimentalFlag.genericMetadata: const Version(2, 14),
+ ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 15),
ExperimentalFlag.nonNullable: const Version(2, 10),
ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 13),
ExperimentalFlag.setLiterals: const Version(2, 0),
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
index c15e3f8..fbbb63a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
@@ -1,17 +1,5 @@
Problems reported:
-parser/error_recovery/bracket_mismatch_01:25:11: Place positional arguments before named arguments.
- D(),
- ^
-
-parser/error_recovery/bracket_mismatch_01:26:11: Place positional arguments before named arguments.
- D(),
- ^
-
-parser/error_recovery/bracket_mismatch_01:27:9: Place positional arguments before named arguments.
- ]),
- ^
-
parser/error_recovery/bracket_mismatch_01:27:9: Expected an identifier, but got ']'.
]),
^
@@ -186,19 +174,16 @@
endArguments(0, (, ))
handleSend(D, ,)
handleNamedArgument(:)
- handleRecoverableError(PositionalAfterNamedArgument, D, D)
handleIdentifier(D, expression)
handleNoTypeArguments(()
beginArguments(()
endArguments(0, (, ))
handleSend(D, ,)
- handleRecoverableError(PositionalAfterNamedArgument, D, D)
handleIdentifier(D, expression)
handleNoTypeArguments(()
beginArguments(()
endArguments(0, (, ))
handleSend(D, ,)
- handleRecoverableError(PositionalAfterNamedArgument, ], ])
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ']'., Try inserting an identifier before ']'., {lexeme: ]}], ], ])
handleIdentifier(, expression)
handleNoTypeArguments(])
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
index ea9535d..594b6db 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
@@ -414,8 +414,6 @@
listener: endArguments(0, (, ))
listener: handleSend(D, ,)
listener: handleNamedArgument(:)
- reportRecoverableError(D, PositionalAfterNamedArgument)
- listener: handleRecoverableError(PositionalAfterNamedArgument, D, D)
parseExpression(,)
parsePrecedenceExpression(,, 1, true)
parseUnaryExpression(,, true)
@@ -433,8 +431,6 @@
listener: beginArguments(()
listener: endArguments(0, (, ))
listener: handleSend(D, ,)
- reportRecoverableError(D, PositionalAfterNamedArgument)
- listener: handleRecoverableError(PositionalAfterNamedArgument, D, D)
parseExpression(,)
parsePrecedenceExpression(,, 1, true)
parseUnaryExpression(,, true)
@@ -452,8 +448,6 @@
listener: beginArguments(()
listener: endArguments(0, (, ))
listener: handleSend(D, ,)
- reportRecoverableError(], PositionalAfterNamedArgument)
- listener: handleRecoverableError(PositionalAfterNamedArgument, ], ])
parseExpression(,)
parsePrecedenceExpression(,, 1, true)
parseUnaryExpression(,, true)
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect
index c92d158..2f58211 100644
--- a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect
@@ -1,177 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// method2(foo: 1, 2); // This call.
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
index 82faf76..4cfee0f 100644
--- a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
@@ -1,177 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// method2(foo: 1, 2); // This call.
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect
index c92d158..2f58211 100644
--- a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect
@@ -1,177 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// method2(foo: 1, 2); // This call.
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
index 82faf76..4cfee0f 100644
--- a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
@@ -1,177 +1,4 @@
library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// method2(foo: 1, 2); // This call.
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B.foo(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new A(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// new B(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// d(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// f(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.property(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// a.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// local(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(1, z: 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
-// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
-// Try moving the positional argument before the named arguments, or add a name to the argument.
-// super.bar(z: 1, 2, 3);
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/nnbd_migration/lib/fix_reason_target.dart b/pkg/nnbd_migration/lib/fix_reason_target.dart
index c9c876b..43d1b3f 100644
--- a/pkg/nnbd_migration/lib/fix_reason_target.dart
+++ b/pkg/nnbd_migration/lib/fix_reason_target.dart
@@ -51,7 +51,7 @@
: super(inner);
@override
- int get hashCode => Object.hash(2, inner.hashCode, name.hashCode);
+ int get hashCode => Object.hash(2, inner, name);
@override
bool operator ==(Object other) =>
@@ -80,7 +80,7 @@
: super(inner);
@override
- int get hashCode => Object.hash(1, inner.hashCode, index);
+ int get hashCode => Object.hash(1, inner, index);
@override
bool operator ==(Object other) =>
@@ -98,7 +98,7 @@
_FixReasonTarget_ReturnType(FixReasonTarget inner) : super(inner);
@override
- int get hashCode => Object.hash(3, inner.hashCode);
+ int get hashCode => Object.hash(3, inner);
@override
bool operator ==(Object other) =>
@@ -131,7 +131,7 @@
: super(inner);
@override
- int get hashCode => Object.hash(5, inner.hashCode, index);
+ int get hashCode => Object.hash(5, inner, index);
@override
bool operator ==(Object other) =>
@@ -162,7 +162,7 @@
_FixReasonTarget_YieldedType(FixReasonTarget inner) : super(inner);
@override
- int get hashCode => Object.hash(4, inner.hashCode);
+ int get hashCode => Object.hash(4, inner);
@override
bool operator ==(Object other) =>
diff --git a/pkg/nnbd_migration/lib/src/front_end/migration_info.dart b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
index 02ea5e1..bde8b46 100644
--- a/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/migration_info.dart
@@ -142,7 +142,7 @@
: super(offset, line, length);
@override
- int get hashCode => Object.hash(filePath.hashCode, offset, length);
+ int get hashCode => Object.hash(filePath, offset, length);
@override
bool operator ==(Object other) {
diff --git a/runtime/bin/ffi_test/ffi_test_functions_generated.cc b/runtime/bin/ffi_test/ffi_test_functions_generated.cc
index 246c329..647c2ae 100644
--- a/runtime/bin/ffi_test/ffi_test_functions_generated.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions_generated.cc
@@ -3,6 +3,7 @@
// 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.
#include <stddef.h>
#include <stdlib.h>
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index df0363d..de5aa6f 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -41,7 +41,7 @@
///
/// stream.transform(utf8.decoder)
/// .transform(const LineSplitter())
-/// .listen((line) {
+/// .forEach((line) {
/// if (showLineNumbers) {
/// stdout.write('${lineNumber++} ');
/// }
diff --git a/sdk/lib/core/bigint.dart b/sdk/lib/core/bigint.dart
index 6683bfc..63f9198 100644
--- a/sdk/lib/core/bigint.dart
+++ b/sdk/lib/core/bigint.dart
@@ -4,10 +4,18 @@
part of dart.core;
-/// An arbitrarily large integer.
+/// An arbitrarily large integer value.
+///
+/// Big integers are signed and can have an arbitrary number of
+/// significant digits, only limited by memory.
abstract class BigInt implements Comparable<BigInt> {
+ /// A big integer with the numerical value 0.
external static BigInt get zero;
+
+ /// A big integer with the numerical value 1.
external static BigInt get one;
+
+ /// A big integer with the numerical value 2.
external static BigInt get two;
/// Parses [source] as a, possibly signed, integer literal and returns its
@@ -54,19 +62,31 @@
/// for zero, which is its own negation.
BigInt operator -();
- /// Addition operator.
+ /// Adds [other] to this big integer.
+ ///
+ /// The result is again a big integer.
BigInt operator +(BigInt other);
- /// Subtraction operator.
+ /// Subtracts [other] from this big integer.
+ ///
+ /// The result is again a big integer.
BigInt operator -(BigInt other);
- /// Multiplication operator.
+ /// Multiplies [other] by this big integer.
+ ///
+ /// The result is again a big integer.
BigInt operator *(BigInt other);
- /// Division operator.
+ /// Double division operator.
+ ///
+ /// Matching the similar operator on [int],
+ /// this operation first performs [toDouble] on both this big integer
+ /// and [other], then does [double.operator/] on those values and
+ /// returns the result.
+ /// The initial [toDouble] conversion may lose precision.
double operator /(BigInt other);
- /// Truncating division operator.
+ /// Truncating integer division operator.
///
/// Performs a truncating integer division, where the remainder is discarded.
///
@@ -162,16 +182,16 @@
/// This maps any integer `x` to `-x - 1`.
BigInt operator ~();
- /// Relational less than operator.
+ /// Whether this big integer is numerically smaller than [other].
bool operator <(BigInt other);
- /// Relational less than or equal operator.
+ /// Whether [other] is numerically greater than this big integer.
bool operator <=(BigInt other);
- /// Relational greater than operator.
+ /// Whether this big integer is numerically greater than [other].
bool operator >(BigInt other);
- /// Relational greater than or equal operator.
+ /// Whether [other] is numerically smaller than this big integer.
bool operator >=(BigInt other);
/// Compares this to `other`.
diff --git a/tests/ffi/function_callbacks_structs_by_value_generated_test.dart b/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
index a7c9590..c0521d7 100644
--- a/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
+++ b/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
@@ -3,6 +3,7 @@
// 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=
@@ -17,8 +18,12 @@
import 'callback_tests_utils.dart';
-// Reuse the struct classes.
-import 'function_structs_by_value_generated_test.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() {
testCases.forEach((t) {
diff --git a/tests/ffi/function_callbacks_structs_by_value_test.dart b/tests/ffi/function_callbacks_structs_by_value_test.dart
index be78dc5..f14ce1f 100644
--- a/tests/ffi/function_callbacks_structs_by_value_test.dart
+++ b/tests/ffi/function_callbacks_structs_by_value_test.dart
@@ -11,8 +11,12 @@
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
+import 'dylib_utils.dart';
+
// Reuse the struct classes.
-import 'function_structs_by_value_generated_test.dart';
+import 'function_structs_by_value_generated_compounds.dart';
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
for (int i = 0; i < 10; i++) {
diff --git a/tests/ffi/function_structs_by_value_generated_compounds.dart b/tests/ffi/function_structs_by_value_generated_compounds.dart
new file mode 100644
index 0000000..2c411cf
--- /dev/null
+++ b/tests/ffi/function_structs_by_value_generated_compounds.dart
@@ -0,0 +1,1210 @@
+// Copyright (c) 2021, 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.
+
+import 'dart:ffi';
+
+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 Struct8BytesFloat extends Struct {
+ @Double()
+ external double a0;
+
+ String toString() => "(${a0})";
+}
+
+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})";
+}
+
+class Struct8BytesInlineArrayInt extends Struct {
+ @Array(8)
+ external Array<Uint8> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 8; i0 += 1) a0[i0]]})";
+}
+
+class StructInlineArrayIrregular extends Struct {
+ @Array(2)
+ external Array<Struct3BytesInt2ByteAligned> a0;
+
+ @Uint8()
+ external int a1;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]}, ${a1})";
+}
+
+class StructInlineArray100Bytes extends Struct {
+ @Array(100)
+ external Array<Uint8> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 100; i0 += 1) a0[i0]]})";
+}
+
+class StructInlineArrayBig extends Struct {
+ @Uint32()
+ external int a0;
+
+ @Uint32()
+ external int a1;
+
+ @Array(4000)
+ external Array<Uint8> a2;
+
+ String toString() =>
+ "(${a0}, ${a1}, ${[for (var i0 = 0; i0 < 4000; i0 += 1) a2[i0]]})";
+}
+
+class StructStruct16BytesHomogeneousFloat2 extends Struct {
+ external Struct4BytesFloat a0;
+
+ @Array(2)
+ external Array<Struct4BytesFloat> a1;
+
+ @Float()
+ external double a2;
+
+ String toString() =>
+ "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
+}
+
+class StructStruct32BytesHomogeneousDouble2 extends Struct {
+ external Struct8BytesFloat a0;
+
+ @Array(2)
+ external Array<Struct8BytesFloat> a1;
+
+ @Double()
+ external double a2;
+
+ String toString() =>
+ "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
+}
+
+class StructStruct16BytesMixed3 extends Struct {
+ external Struct4BytesFloat a0;
+
+ @Array(1)
+ external Array<Struct8BytesMixed> a1;
+
+ @Array(2)
+ external Array<Int16> a2;
+
+ String toString() => "(${a0}, ${[
+ for (var i0 = 0; i0 < 1; i0 += 1) a1[i0]
+ ]}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a2[i0]]})";
+}
+
+class Struct8BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array(2, 2, 2)
+ external Array<Array<Array<Uint8>>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [
+ for (var i1 = 0; i1 < 2; i1 += 1)
+ [for (var i2 = 0; i2 < 2; i2 += 1) a0[i0][i1][i2]]
+ ]
+ ]})";
+}
+
+class Struct32BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array(2, 2, 2, 2, 2)
+ external Array<Array<Array<Array<Array<Uint8>>>>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [
+ for (var i1 = 0; i1 < 2; i1 += 1)
+ [
+ for (var i2 = 0; i2 < 2; i2 += 1)
+ [
+ for (var i3 = 0; i3 < 2; i3 += 1)
+ [for (var i4 = 0; i4 < 2; i4 += 1) a0[i0][i1][i2][i3][i4]]
+ ]
+ ]
+ ]
+ ]})";
+}
+
+class Struct64BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array.multi([2, 2, 2, 2, 2, 2])
+ external Array<Array<Array<Array<Array<Array<Uint8>>>>>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [
+ for (var i1 = 0; i1 < 2; i1 += 1)
+ [
+ for (var i2 = 0; i2 < 2; i2 += 1)
+ [
+ for (var i3 = 0; i3 < 2; i3 += 1)
+ [
+ for (var i4 = 0; i4 < 2; i4 += 1)
+ [
+ for (var i5 = 0; i5 < 2; i5 += 1)
+ a0[i0][i1][i2][i3][i4][i5]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]})";
+}
+
+class Struct4BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array(2, 2)
+ external Array<Array<Struct1ByteInt>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [for (var i1 = 0; i1 < 2; i1 += 1) a0[i0][i1]]
+ ]})";
+}
+
+@Packed(1)
+class Struct3BytesPackedInt extends Struct {
+ @Int8()
+ external int a0;
+
+ @Int16()
+ external int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+@Packed(1)
+class Struct3BytesPackedIntMembersAligned extends Struct {
+ @Int8()
+ external int a0;
+
+ @Int16()
+ external int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+@Packed(1)
+class Struct5BytesPackedMixed extends Struct {
+ @Float()
+ external double a0;
+
+ @Uint8()
+ external int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class StructNestedAlignmentStruct5BytesPackedMixed extends Struct {
+ @Uint8()
+ external int a0;
+
+ external Struct5BytesPackedMixed a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct6BytesInlineArrayInt extends Struct {
+ @Array(2)
+ external Array<Struct3BytesPackedIntMembersAligned> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]})";
+}
+
+@Packed(1)
+class Struct8BytesPackedInt extends Struct {
+ @Uint8()
+ external int a0;
+
+ @Uint32()
+ external int a1;
+
+ @Uint8()
+ external int a2;
+
+ @Uint8()
+ external int a3;
+
+ @Uint8()
+ external int a4;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+@Packed(1)
+class Struct9BytesPackedMixed extends Struct {
+ @Uint8()
+ external int a0;
+
+ @Double()
+ external double a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct15BytesInlineArrayMixed extends Struct {
+ @Array(3)
+ external Array<Struct5BytesPackedMixed> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 3; i0 += 1) a0[i0]]})";
+}
+
+class Union4BytesMixed extends Union {
+ @Uint32()
+ external int a0;
+
+ @Float()
+ external double a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Union8BytesNestedFloat extends Union {
+ @Double()
+ external double a0;
+
+ external Struct8BytesHomogeneousFloat a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Union9BytesNestedInt extends Union {
+ external Struct8BytesInt a0;
+
+ external Struct9BytesHomogeneousUint8 a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Union16BytesNestedInlineArrayFloat extends Union {
+ @Array(4)
+ external Array<Float> a0;
+
+ external Struct16BytesHomogeneousFloat a1;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 4; i0 += 1) a0[i0]]}, ${a1})";
+}
+
+class Union16BytesNestedFloat extends Union {
+ external Struct8BytesHomogeneousFloat a0;
+
+ external Struct12BytesHomogeneousFloat a1;
+
+ external Struct16BytesHomogeneousFloat a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
diff --git a/tests/ffi/function_structs_by_value_generated_leaf_test.dart b/tests/ffi/function_structs_by_value_generated_leaf_test.dart
new file mode 100644
index 0000000..9efc77b
--- /dev/null
+++ b/tests/ffi/function_structs_by_value_generated_leaf_test.dart
@@ -0,0 +1,7683 @@
+// Copyright (c) 2021, 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=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';
+
+// Reuse the compound classes.
+import 'function_structs_by_value_generated_compounds.dart';
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+void main() {
+ for (int i = 0; i < 10; ++i) {
+ testPassStruct1ByteIntx10Leaf();
+ testPassStruct3BytesHomogeneousUint8x10Leaf();
+ testPassStruct3BytesInt2ByteAlignedx10Leaf();
+ testPassStruct4BytesHomogeneousInt16x10Leaf();
+ testPassStruct7BytesHomogeneousUint8x10Leaf();
+ testPassStruct7BytesInt4ByteAlignedx10Leaf();
+ testPassStruct8BytesIntx10Leaf();
+ testPassStruct8BytesHomogeneousFloatx10Leaf();
+ testPassStruct8BytesMixedx10Leaf();
+ testPassStruct9BytesHomogeneousUint8x10Leaf();
+ testPassStruct9BytesInt4Or8ByteAlignedx10Leaf();
+ testPassStruct12BytesHomogeneousFloatx6Leaf();
+ testPassStruct16BytesHomogeneousFloatx5Leaf();
+ testPassStruct16BytesMixedx10Leaf();
+ testPassStruct16BytesMixed2x10Leaf();
+ testPassStruct17BytesIntx10Leaf();
+ testPassStruct19BytesHomogeneousUint8x10Leaf();
+ testPassStruct20BytesHomogeneousInt32x10Leaf();
+ testPassStruct20BytesHomogeneousFloatLeaf();
+ testPassStruct32BytesHomogeneousDoublex5Leaf();
+ testPassStruct40BytesHomogeneousDoubleLeaf();
+ testPassStruct1024BytesHomogeneousUint64Leaf();
+ testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf();
+ testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf();
+ testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf();
+ testPassDoublex6Struct16BytesMixedx4Int32Leaf();
+ testPassInt32x4Struct16BytesMixedx4DoubleLeaf();
+ testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf();
+ testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf();
+ testPassStructAlignmentInt16Leaf();
+ testPassStructAlignmentInt32Leaf();
+ testPassStructAlignmentInt64Leaf();
+ testPassStruct8BytesNestedIntx10Leaf();
+ testPassStruct8BytesNestedFloatx10Leaf();
+ testPassStruct8BytesNestedFloat2x10Leaf();
+ testPassStruct8BytesNestedMixedx10Leaf();
+ testPassStruct16BytesNestedIntx2Leaf();
+ testPassStruct32BytesNestedIntx2Leaf();
+ testPassStructNestedIntStructAlignmentInt16Leaf();
+ testPassStructNestedIntStructAlignmentInt32Leaf();
+ testPassStructNestedIntStructAlignmentInt64Leaf();
+ testPassStructNestedIrregularEvenBiggerx4Leaf();
+ testPassStruct8BytesInlineArrayIntx4Leaf();
+ testPassStructInlineArrayIrregularx4Leaf();
+ testPassStructInlineArray100BytesLeaf();
+ testPassStructStruct16BytesHomogeneousFloat2x5Leaf();
+ testPassStructStruct32BytesHomogeneousDouble2x5Leaf();
+ testPassStructStruct16BytesMixed3x10Leaf();
+ testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf();
+ testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf();
+ testPassStruct3BytesPackedIntx10Leaf();
+ testPassStruct8BytesPackedIntx10Leaf();
+ testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf();
+ testPassStruct5BytesPackedMixedLeaf();
+ testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf();
+ testPassStruct6BytesInlineArrayIntLeaf();
+ testPassStruct15BytesInlineArrayMixedLeaf();
+ testPassUnion4BytesMixedx10Leaf();
+ testPassUnion8BytesNestedFloatx10Leaf();
+ testPassUnion9BytesNestedIntx10Leaf();
+ testPassUnion16BytesNestedInlineArrayFloatx10Leaf();
+ testPassUnion16BytesNestedFloatx10Leaf();
+ testReturnStruct1ByteIntLeaf();
+ testReturnStruct3BytesHomogeneousUint8Leaf();
+ testReturnStruct3BytesInt2ByteAlignedLeaf();
+ testReturnStruct4BytesHomogeneousInt16Leaf();
+ testReturnStruct7BytesHomogeneousUint8Leaf();
+ testReturnStruct7BytesInt4ByteAlignedLeaf();
+ testReturnStruct8BytesIntLeaf();
+ testReturnStruct8BytesHomogeneousFloatLeaf();
+ testReturnStruct8BytesMixedLeaf();
+ testReturnStruct9BytesHomogeneousUint8Leaf();
+ testReturnStruct9BytesInt4Or8ByteAlignedLeaf();
+ testReturnStruct12BytesHomogeneousFloatLeaf();
+ testReturnStruct16BytesHomogeneousFloatLeaf();
+ testReturnStruct16BytesMixedLeaf();
+ testReturnStruct16BytesMixed2Leaf();
+ testReturnStruct17BytesIntLeaf();
+ testReturnStruct19BytesHomogeneousUint8Leaf();
+ testReturnStruct20BytesHomogeneousInt32Leaf();
+ testReturnStruct20BytesHomogeneousFloatLeaf();
+ testReturnStruct32BytesHomogeneousDoubleLeaf();
+ testReturnStruct40BytesHomogeneousDoubleLeaf();
+ testReturnStruct1024BytesHomogeneousUint64Leaf();
+ testReturnStruct3BytesPackedIntLeaf();
+ testReturnStruct8BytesPackedIntLeaf();
+ testReturnStruct9BytesPackedMixedLeaf();
+ testReturnUnion4BytesMixedLeaf();
+ testReturnUnion8BytesNestedFloatLeaf();
+ testReturnUnion9BytesNestedIntLeaf();
+ testReturnUnion16BytesNestedFloatLeaf();
+ testReturnStructArgumentStruct1ByteIntLeaf();
+ testReturnStructArgumentInt32x8Struct1ByteIntLeaf();
+ testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf();
+ testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf();
+ testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf();
+ testReturnStructArgumentStruct8BytesInlineArrayIntLeaf();
+ testReturnStructArgumentStructStruct16BytesHomogeneousLeaf();
+ testReturnStructArgumentStructStruct32BytesHomogeneousLeaf();
+ testReturnStructArgumentStructStruct16BytesMixed3Leaf();
+ testReturnStructAlignmentInt16Leaf();
+ testReturnStructAlignmentInt32Leaf();
+ testReturnStructAlignmentInt64Leaf();
+ testReturnStruct8BytesNestedIntLeaf();
+ testReturnStruct8BytesNestedFloatLeaf();
+ testReturnStruct8BytesNestedFloat2Leaf();
+ testReturnStruct8BytesNestedMixedLeaf();
+ testReturnStruct16BytesNestedIntLeaf();
+ testReturnStruct32BytesNestedIntLeaf();
+ testReturnStructNestedIntStructAlignmentInt16Leaf();
+ testReturnStructNestedIntStructAlignmentInt32Leaf();
+ testReturnStructNestedIntStructAlignmentInt64Leaf();
+ testReturnStructNestedIrregularEvenBiggerLeaf();
+ }
+}
+
+final passStruct1ByteIntx10Leaf = 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", isLeaf: true);
+
+/// Smallest struct with data.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct1ByteIntx10Leaf() {
+ 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 =
+ passStruct1ByteIntx10Leaf(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 passStruct3BytesHomogeneousUint8x10Leaf = 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",
+ isLeaf: true);
+
+/// Not a multiple of word size, not a power of two.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct3BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct3BytesHomogeneousUint8x10Leaf(
+ 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 passStruct3BytesInt2ByteAlignedx10Leaf = 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",
+ isLeaf: true);
+
+/// 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 testPassStruct3BytesInt2ByteAlignedx10Leaf() {
+ 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 = passStruct3BytesInt2ByteAlignedx10Leaf(
+ 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 passStruct4BytesHomogeneousInt16x10Leaf = 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",
+ isLeaf: true);
+
+/// Exactly word size on 32-bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct4BytesHomogeneousInt16x10Leaf() {
+ 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 = passStruct4BytesHomogeneousInt16x10Leaf(
+ 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 passStruct7BytesHomogeneousUint8x10Leaf = 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",
+ isLeaf: true);
+
+/// Sub word size on 64 bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct7BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct7BytesHomogeneousUint8x10Leaf(
+ 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 passStruct7BytesInt4ByteAlignedx10Leaf = 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",
+ isLeaf: true);
+
+/// 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 testPassStruct7BytesInt4ByteAlignedx10Leaf() {
+ 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 = passStruct7BytesInt4ByteAlignedx10Leaf(
+ 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 passStruct8BytesIntx10Leaf = 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", isLeaf: true);
+
+/// Exactly word size struct on 64bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesIntx10Leaf() {
+ 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 =
+ passStruct8BytesIntx10Leaf(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 passStruct8BytesHomogeneousFloatx10Leaf = 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",
+ isLeaf: true);
+
+/// Arguments passed in FP registers as long as they fit.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesHomogeneousFloatx10Leaf() {
+ 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 = passStruct8BytesHomogeneousFloatx10Leaf(
+ 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 passStruct8BytesMixedx10Leaf = 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", isLeaf: true);
+
+/// On x64, arguments go in int registers because it is not only float.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesMixedx10Leaf() {
+ 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 =
+ passStruct8BytesMixedx10Leaf(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 passStruct9BytesHomogeneousUint8x10Leaf = 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",
+ isLeaf: true);
+
+/// 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 testPassStruct9BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct9BytesHomogeneousUint8x10Leaf(
+ 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 passStruct9BytesInt4Or8ByteAlignedx10Leaf =
+ 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",
+ isLeaf: true);
+
+/// 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 testPassStruct9BytesInt4Or8ByteAlignedx10Leaf() {
+ 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 = passStruct9BytesInt4Or8ByteAlignedx10Leaf(
+ 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 passStruct12BytesHomogeneousFloatx6Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat),
+ double Function(
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat)>(
+ "PassStruct12BytesHomogeneousFloatx6",
+ isLeaf: true);
+
+/// 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 testPassStruct12BytesHomogeneousFloatx6Leaf() {
+ 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 =
+ passStruct12BytesHomogeneousFloatx6Leaf(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 passStruct16BytesHomogeneousFloatx5Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat),
+ double Function(
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat)>(
+ "PassStruct16BytesHomogeneousFloatx5",
+ isLeaf: true);
+
+/// 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 testPassStruct16BytesHomogeneousFloatx5Leaf() {
+ 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 = passStruct16BytesHomogeneousFloatx5Leaf(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 passStruct16BytesMixedx10Leaf = 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", isLeaf: true);
+
+/// 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 testPassStruct16BytesMixedx10Leaf() {
+ 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 =
+ passStruct16BytesMixedx10Leaf(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 passStruct16BytesMixed2x10Leaf = 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", isLeaf: true);
+
+/// 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 testPassStruct16BytesMixed2x10Leaf() {
+ 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 =
+ passStruct16BytesMixed2x10Leaf(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 passStruct17BytesIntx10Leaf = 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", isLeaf: true);
+
+/// Arguments are passed as pointer to copy on arm64.
+/// Tests that the memory allocated for copies are rounded up to word size.
+void testPassStruct17BytesIntx10Leaf() {
+ 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 =
+ passStruct17BytesIntx10Leaf(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 passStruct19BytesHomogeneousUint8x10Leaf =
+ 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",
+ isLeaf: true);
+
+/// 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 testPassStruct19BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct19BytesHomogeneousUint8x10Leaf(
+ 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 passStruct20BytesHomogeneousInt32x10Leaf =
+ 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",
+ isLeaf: true);
+
+/// 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 testPassStruct20BytesHomogeneousInt32x10Leaf() {
+ 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 = passStruct20BytesHomogeneousInt32x10Leaf(
+ 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 passStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Float Function(Struct20BytesHomogeneousFloat),
+ double Function(Struct20BytesHomogeneousFloat)>(
+ "PassStruct20BytesHomogeneousFloat",
+ isLeaf: true);
+
+/// Argument too big to go into FPU registers in hardfp and arm64.
+void testPassStruct20BytesHomogeneousFloatLeaf() {
+ 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 = passStruct20BytesHomogeneousFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(-3.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct32BytesHomogeneousDoublex5Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble),
+ double Function(
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble)>(
+ "PassStruct32BytesHomogeneousDoublex5",
+ isLeaf: true);
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStruct32BytesHomogeneousDoublex5Leaf() {
+ 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 = passStruct32BytesHomogeneousDoublex5Leaf(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 passStruct40BytesHomogeneousDoubleLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct40BytesHomogeneousDouble),
+ double Function(Struct40BytesHomogeneousDouble)>(
+ "PassStruct40BytesHomogeneousDouble",
+ isLeaf: true);
+
+/// Argument too big to go into FPU registers in arm64.
+void testPassStruct40BytesHomogeneousDoubleLeaf() {
+ 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 = passStruct40BytesHomogeneousDoubleLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(-3.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct1024BytesHomogeneousUint64Leaf =
+ ffiTestFunctions.lookupFunction<
+ Uint64 Function(Struct1024BytesHomogeneousUint64),
+ int Function(Struct1024BytesHomogeneousUint64)>(
+ "PassStruct1024BytesHomogeneousUint64",
+ isLeaf: true);
+
+/// Test 1kb struct.
+void testPassStruct1024BytesHomogeneousUint64Leaf() {
+ 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;
+ a0.a124 = 125;
+ a0.a125 = 126;
+ a0.a126 = 127;
+ a0.a127 = 128;
+
+ final result = passStruct1024BytesHomogeneousUint64Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(8256, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf =
+ ffiTestFunctions.lookupFunction<
+ Float Function(
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float),
+ double Function(
+ double,
+ Struct16BytesHomogeneousFloat,
+ double,
+ Struct16BytesHomogeneousFloat,
+ double,
+ Struct16BytesHomogeneousFloat,
+ double,
+ Struct16BytesHomogeneousFloat,
+ double)>("PassFloatStruct16BytesHomogeneousFloatFloatStruct1",
+ isLeaf: true);
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf() {
+ double a0;
+ final a1Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a1 = a1Pointer.ref;
+ double a2;
+ final a3Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a3 = a3Pointer.ref;
+ double a4;
+ final a5Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a5 = a5Pointer.ref;
+ double a6;
+ final a7Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a7 = a7Pointer.ref;
+ double a8;
+
+ a0 = -1.0;
+ a1.a0 = 2.0;
+ a1.a1 = -3.0;
+ a1.a2 = 4.0;
+ a1.a3 = -5.0;
+ a2 = 6.0;
+ a3.a0 = -7.0;
+ a3.a1 = 8.0;
+ a3.a2 = -9.0;
+ a3.a3 = 10.0;
+ a4 = -11.0;
+ a5.a0 = 12.0;
+ a5.a1 = -13.0;
+ a5.a2 = 14.0;
+ a5.a3 = -15.0;
+ a6 = 16.0;
+ a7.a0 = -17.0;
+ a7.a1 = 18.0;
+ a7.a2 = -19.0;
+ a7.a3 = 20.0;
+ a8 = -21.0;
+
+ final result = passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-11.0, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float),
+ double Function(
+ double,
+ Struct32BytesHomogeneousDouble,
+ double,
+ Struct32BytesHomogeneousDouble,
+ double,
+ Struct32BytesHomogeneousDouble,
+ double,
+ Struct32BytesHomogeneousDouble,
+ double)>("PassFloatStruct32BytesHomogeneousDoubleFloatStruct",
+ isLeaf: true);
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf() {
+ double a0;
+ final a1Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a1 = a1Pointer.ref;
+ double a2;
+ final a3Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a3 = a3Pointer.ref;
+ double a4;
+ final a5Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a5 = a5Pointer.ref;
+ double a6;
+ final a7Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a7 = a7Pointer.ref;
+ double a8;
+
+ a0 = -1.0;
+ a1.a0 = 2.0;
+ a1.a1 = -3.0;
+ a1.a2 = 4.0;
+ a1.a3 = -5.0;
+ a2 = 6.0;
+ a3.a0 = -7.0;
+ a3.a1 = 8.0;
+ a3.a2 = -9.0;
+ a3.a3 = 10.0;
+ a4 = -11.0;
+ a5.a0 = 12.0;
+ a5.a1 = -13.0;
+ a5.a2 = 14.0;
+ a5.a3 = -15.0;
+ a6 = 16.0;
+ a7.a0 = -17.0;
+ a7.a1 = 18.0;
+ a7.a2 = -19.0;
+ a7.a3 = 20.0;
+ a8 = -21.0;
+
+ final result = passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-11.0, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed,
+ Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8),
+ double Function(
+ int,
+ Struct16BytesMixed,
+ int,
+ Struct16BytesMixed,
+ int,
+ Struct16BytesMixed,
+ int,
+ Struct16BytesMixed,
+ int)>("PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn",
+ isLeaf: true);
+
+/// Tests the alignment of structs in integers registers and on the stack.
+/// Arm32 aligns this struct at 8.
+/// Also, arm32 allocates the second struct partially in registers, partially
+/// on stack.
+/// Test backfilling of integer registers.
+void testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf() {
+ int a0;
+ final a1Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a1 = a1Pointer.ref;
+ int a2;
+ final a3Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a3 = a3Pointer.ref;
+ int a4;
+ final a5Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a5 = a5Pointer.ref;
+ int a6;
+ final a7Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a7 = a7Pointer.ref;
+ int a8;
+
+ a0 = -1;
+ a1.a0 = 2.0;
+ a1.a1 = -3;
+ a2 = 4;
+ a3.a0 = -5.0;
+ a3.a1 = 6;
+ a4 = -7;
+ a5.a0 = 8.0;
+ a5.a1 = -9;
+ a6 = 10;
+ a7.a0 = -11.0;
+ a7.a1 = 12;
+ a8 = -13;
+
+ final result = passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-7.0, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passDoublex6Struct16BytesMixedx4Int32Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Int32),
+ double Function(
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ int)>("PassDoublex6Struct16BytesMixedx4Int32", isLeaf: true);
+
+/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+/// structs. The rest of the structs will go on the stack.
+/// The int will be backfilled into the int register.
+void testPassDoublex6Struct16BytesMixedx4Int32Leaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+ double a4;
+ double a5;
+ 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;
+ int a10;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+ a4 = -5.0;
+ a5 = 6.0;
+ a6.a0 = -7.0;
+ a6.a1 = 8;
+ a7.a0 = -9.0;
+ a7.a1 = 10;
+ a8.a0 = -11.0;
+ a8.a1 = 12;
+ a9.a0 = -13.0;
+ a9.a1 = 14;
+ a10 = -15;
+
+ final result = passDoublex6Struct16BytesMixedx4Int32Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+
+ print("result = $result");
+
+ Expect.approxEquals(-8.0, result);
+
+ calloc.free(a6Pointer);
+ calloc.free(a7Pointer);
+ calloc.free(a8Pointer);
+ calloc.free(a9Pointer);
+}
+
+final passInt32x4Struct16BytesMixedx4DoubleLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(Int32, Int32, Int32, Int32, Struct16BytesMixed,
+ Struct16BytesMixed, Struct16BytesMixed, Struct16BytesMixed, Double),
+ double Function(
+ int,
+ int,
+ int,
+ int,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ double)>("PassInt32x4Struct16BytesMixedx4Double", isLeaf: true);
+
+/// On Linux x64, it will exhaust int registers first.
+/// The rest of the structs will go on the stack.
+/// The double will be backfilled into the xmm register.
+void testPassInt32x4Struct16BytesMixedx4DoubleLeaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ 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;
+ double a8;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+ a3 = 4;
+ a4.a0 = -5.0;
+ a4.a1 = 6;
+ a5.a0 = -7.0;
+ a5.a1 = 8;
+ a6.a0 = -9.0;
+ a6.a1 = 10;
+ a7.a0 = -11.0;
+ a7.a1 = 12;
+ a8 = -13.0;
+
+ final result = passInt32x4Struct16BytesMixedx4DoubleLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-7.0, result);
+
+ calloc.free(a4Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a6Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(Struct40BytesHomogeneousDouble,
+ Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat),
+ double Function(Struct40BytesHomogeneousDouble,
+ Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat)>(
+ "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo",
+ isLeaf: true);
+
+/// On various architectures, first struct is allocated on stack.
+/// Check that the other two arguments are allocated on registers.
+void testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf() {
+ final a0Pointer = calloc<Struct40BytesHomogeneousDouble>();
+ final Struct40BytesHomogeneousDouble a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct4BytesHomogeneousInt16>();
+ final Struct4BytesHomogeneousInt16 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a2 = a2Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2.0;
+ a0.a2 = -3.0;
+ a0.a3 = 4.0;
+ a0.a4 = -5.0;
+ a1.a0 = 6;
+ a1.a1 = -7;
+ a2.a0 = 8.0;
+ a2.a1 = -9.0;
+
+ final result =
+ passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.approxEquals(-5.0, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+}
+
+final passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Int64,
+ Int8,
+ Struct1ByteInt,
+ Int64,
+ Int8,
+ Struct4BytesHomogeneousInt16,
+ Int64,
+ Int8,
+ Struct8BytesInt,
+ Int64,
+ Int8,
+ Struct8BytesHomogeneousFloat,
+ Int64,
+ Int8,
+ Struct8BytesMixed,
+ Int64,
+ Int8,
+ StructAlignmentInt16,
+ Int64,
+ Int8,
+ StructAlignmentInt32,
+ Int64,
+ Int8,
+ StructAlignmentInt64),
+ double Function(
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ int,
+ int,
+ Struct1ByteInt,
+ int,
+ int,
+ Struct4BytesHomogeneousInt16,
+ int,
+ int,
+ Struct8BytesInt,
+ int,
+ int,
+ Struct8BytesHomogeneousFloat,
+ int,
+ int,
+ Struct8BytesMixed,
+ int,
+ int,
+ StructAlignmentInt16,
+ int,
+ int,
+ StructAlignmentInt32,
+ int,
+ int,
+ StructAlignmentInt64)>("PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int", isLeaf: true);
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ double a8;
+ double a9;
+ double a10;
+ double a11;
+ double a12;
+ double a13;
+ double a14;
+ double a15;
+ int a16;
+ int a17;
+ final a18Pointer = calloc<Struct1ByteInt>();
+ final Struct1ByteInt a18 = a18Pointer.ref;
+ int a19;
+ int a20;
+ final a21Pointer = calloc<Struct4BytesHomogeneousInt16>();
+ final Struct4BytesHomogeneousInt16 a21 = a21Pointer.ref;
+ int a22;
+ int a23;
+ final a24Pointer = calloc<Struct8BytesInt>();
+ final Struct8BytesInt a24 = a24Pointer.ref;
+ int a25;
+ int a26;
+ final a27Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a27 = a27Pointer.ref;
+ int a28;
+ int a29;
+ final a30Pointer = calloc<Struct8BytesMixed>();
+ final Struct8BytesMixed a30 = a30Pointer.ref;
+ int a31;
+ int a32;
+ final a33Pointer = calloc<StructAlignmentInt16>();
+ final StructAlignmentInt16 a33 = a33Pointer.ref;
+ int a34;
+ int a35;
+ final a36Pointer = calloc<StructAlignmentInt32>();
+ final StructAlignmentInt32 a36 = a36Pointer.ref;
+ int a37;
+ int a38;
+ final a39Pointer = calloc<StructAlignmentInt64>();
+ final StructAlignmentInt64 a39 = a39Pointer.ref;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+ a3 = 4;
+ a4 = -5;
+ a5 = 6;
+ a6 = -7;
+ a7 = 8;
+ a8 = -9.0;
+ a9 = 10.0;
+ a10 = -11.0;
+ a11 = 12.0;
+ a12 = -13.0;
+ a13 = 14.0;
+ a14 = -15.0;
+ a15 = 16.0;
+ a16 = -17;
+ a17 = 18;
+ a18.a0 = -19;
+ a19 = 20;
+ a20 = -21;
+ a21.a0 = 22;
+ a21.a1 = -23;
+ a22 = 24;
+ a23 = -25;
+ a24.a0 = 26;
+ a24.a1 = -27;
+ a24.a2 = 28;
+ a25 = -29;
+ a26 = 30;
+ a27.a0 = -31.0;
+ a27.a1 = 32.0;
+ a28 = -33;
+ a29 = 34;
+ a30.a0 = -35.0;
+ a30.a1 = 36;
+ a30.a2 = -37;
+ a31 = 38;
+ a32 = -39;
+ a33.a0 = 40;
+ a33.a1 = -41;
+ a33.a2 = 42;
+ a34 = -43;
+ a35 = 44;
+ a36.a0 = -45;
+ a36.a1 = 46;
+ a36.a2 = -47;
+ a37 = 48;
+ a38 = -49;
+ a39.a0 = 50;
+ a39.a1 = -51;
+ a39.a2 = 52;
+
+ final result = passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf(
+ 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);
+
+ print("result = $result");
+
+ Expect.approxEquals(26.0, result);
+
+ calloc.free(a18Pointer);
+ calloc.free(a21Pointer);
+ calloc.free(a24Pointer);
+ calloc.free(a27Pointer);
+ calloc.free(a30Pointer);
+ calloc.free(a33Pointer);
+ calloc.free(a36Pointer);
+ calloc.free(a39Pointer);
+}
+
+final passStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(StructAlignmentInt16),
+ int Function(
+ StructAlignmentInt16)>("PassStructAlignmentInt16", isLeaf: true);
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassStructAlignmentInt16Leaf() {
+ final a0Pointer = calloc<StructAlignmentInt16>();
+ final StructAlignmentInt16 a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = passStructAlignmentInt16Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(-2, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(StructAlignmentInt32),
+ int Function(
+ StructAlignmentInt32)>("PassStructAlignmentInt32", isLeaf: true);
+
+/// Test alignment and padding of 32 byte int within struct.
+void testPassStructAlignmentInt32Leaf() {
+ final a0Pointer = calloc<StructAlignmentInt32>();
+ final StructAlignmentInt32 a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = passStructAlignmentInt32Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(-2, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(StructAlignmentInt64),
+ int Function(
+ StructAlignmentInt64)>("PassStructAlignmentInt64", isLeaf: true);
+
+/// Test alignment and padding of 64 byte int within struct.
+void testPassStructAlignmentInt64Leaf() {
+ final a0Pointer = calloc<StructAlignmentInt64>();
+ final StructAlignmentInt64 a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = passStructAlignmentInt64Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(-2, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct8BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt),
+ int Function(
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt)>("PassStruct8BytesNestedIntx10", isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust registers on all platforms.
+void testPassStruct8BytesNestedIntx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a9 = a9Pointer.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;
+ a2.a0.a0 = -9;
+ a2.a0.a1 = 10;
+ a2.a1.a0 = -11;
+ a2.a1.a1 = 12;
+ a3.a0.a0 = -13;
+ a3.a0.a1 = 14;
+ a3.a1.a0 = -15;
+ a3.a1.a1 = 16;
+ a4.a0.a0 = -17;
+ a4.a0.a1 = 18;
+ a4.a1.a0 = -19;
+ a4.a1.a1 = 20;
+ a5.a0.a0 = -21;
+ a5.a0.a1 = 22;
+ a5.a1.a0 = -23;
+ a5.a1.a1 = 24;
+ a6.a0.a0 = -25;
+ a6.a0.a1 = 26;
+ a6.a1.a0 = -27;
+ a6.a1.a1 = 28;
+ a7.a0.a0 = -29;
+ a7.a0.a1 = 30;
+ a7.a1.a0 = -31;
+ a7.a1.a1 = 32;
+ a8.a0.a0 = -33;
+ a8.a0.a1 = 34;
+ a8.a1.a0 = -35;
+ a8.a1.a1 = 36;
+ a9.a0.a0 = -37;
+ a9.a0.a1 = 38;
+ a9.a1.a0 = -39;
+ a9.a1.a1 = 40;
+
+ final result =
+ passStruct8BytesNestedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.equals(20, 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 passStruct8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat),
+ double Function(
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat)>("PassStruct8BytesNestedFloatx10",
+ isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust fpu registers on all platforms.
+void testPassStruct8BytesNestedFloatx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1.a0 = 2.0;
+ a1.a0.a0 = -3.0;
+ a1.a1.a0 = 4.0;
+ a2.a0.a0 = -5.0;
+ a2.a1.a0 = 6.0;
+ a3.a0.a0 = -7.0;
+ a3.a1.a0 = 8.0;
+ a4.a0.a0 = -9.0;
+ a4.a1.a0 = 10.0;
+ a5.a0.a0 = -11.0;
+ a5.a1.a0 = 12.0;
+ a6.a0.a0 = -13.0;
+ a6.a1.a0 = 14.0;
+ a7.a0.a0 = -15.0;
+ a7.a1.a0 = 16.0;
+ a8.a0.a0 = -17.0;
+ a8.a1.a0 = 18.0;
+ a9.a0.a0 = -19.0;
+ a9.a1.a0 = 20.0;
+
+ final result = passStruct8BytesNestedFloatx10Leaf(
+ 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 passStruct8BytesNestedFloat2x10Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2),
+ double Function(
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2)>("PassStruct8BytesNestedFloat2x10",
+ isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust fpu registers on all platforms.
+/// The nesting is irregular, testing homogenous float rules on arm and arm64,
+/// and the fpu register usage on x64.
+void testPassStruct8BytesNestedFloat2x10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1 = 2.0;
+ a1.a0.a0 = -3.0;
+ a1.a1 = 4.0;
+ a2.a0.a0 = -5.0;
+ a2.a1 = 6.0;
+ a3.a0.a0 = -7.0;
+ a3.a1 = 8.0;
+ a4.a0.a0 = -9.0;
+ a4.a1 = 10.0;
+ a5.a0.a0 = -11.0;
+ a5.a1 = 12.0;
+ a6.a0.a0 = -13.0;
+ a6.a1 = 14.0;
+ a7.a0.a0 = -15.0;
+ a7.a1 = 16.0;
+ a8.a0.a0 = -17.0;
+ a8.a1 = 18.0;
+ a9.a0.a0 = -19.0;
+ a9.a1 = 20.0;
+
+ final result = passStruct8BytesNestedFloat2x10Leaf(
+ 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 passStruct8BytesNestedMixedx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed),
+ double Function(
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed)>("PassStruct8BytesNestedMixedx10",
+ isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust all registers on all platforms.
+void testPassStruct8BytesNestedMixedx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a1.a0 = -3.0;
+ a1.a0.a0 = 4;
+ a1.a0.a1 = -5;
+ a1.a1.a0 = 6.0;
+ a2.a0.a0 = -7;
+ a2.a0.a1 = 8;
+ a2.a1.a0 = -9.0;
+ a3.a0.a0 = 10;
+ a3.a0.a1 = -11;
+ a3.a1.a0 = 12.0;
+ a4.a0.a0 = -13;
+ a4.a0.a1 = 14;
+ a4.a1.a0 = -15.0;
+ a5.a0.a0 = 16;
+ a5.a0.a1 = -17;
+ a5.a1.a0 = 18.0;
+ a6.a0.a0 = -19;
+ a6.a0.a1 = 20;
+ a6.a1.a0 = -21.0;
+ a7.a0.a0 = 22;
+ a7.a0.a1 = -23;
+ a7.a1.a0 = 24.0;
+ a8.a0.a0 = -25;
+ a8.a0.a1 = 26;
+ a8.a1.a0 = -27.0;
+ a9.a0.a0 = 28;
+ a9.a0.a1 = -29;
+ a9.a1.a0 = 30.0;
+
+ final result = passStruct8BytesNestedMixedx10Leaf(
+ 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 passStruct16BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(Struct16BytesNestedInt, Struct16BytesNestedInt),
+ int Function(Struct16BytesNestedInt,
+ Struct16BytesNestedInt)>("PassStruct16BytesNestedIntx2", isLeaf: true);
+
+/// Deeper nested struct to test recursive member access.
+void testPassStruct16BytesNestedIntx2Leaf() {
+ 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 = passStruct16BytesNestedIntx2Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(8, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+}
+
+final passStruct32BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(Struct32BytesNestedInt, Struct32BytesNestedInt),
+ int Function(Struct32BytesNestedInt,
+ Struct32BytesNestedInt)>("PassStruct32BytesNestedIntx2", isLeaf: true);
+
+/// Even deeper nested struct to test recursive member access.
+void testPassStruct32BytesNestedIntx2Leaf() {
+ final a0Pointer = calloc<Struct32BytesNestedInt>();
+ final Struct32BytesNestedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct32BytesNestedInt>();
+ final Struct32BytesNestedInt a1 = a1Pointer.ref;
+
+ a0.a0.a0.a0.a0 = -1;
+ a0.a0.a0.a0.a1 = 2;
+ a0.a0.a0.a1.a0 = -3;
+ a0.a0.a0.a1.a1 = 4;
+ a0.a0.a1.a0.a0 = -5;
+ a0.a0.a1.a0.a1 = 6;
+ a0.a0.a1.a1.a0 = -7;
+ a0.a0.a1.a1.a1 = 8;
+ a0.a1.a0.a0.a0 = -9;
+ a0.a1.a0.a0.a1 = 10;
+ a0.a1.a0.a1.a0 = -11;
+ a0.a1.a0.a1.a1 = 12;
+ a0.a1.a1.a0.a0 = -13;
+ a0.a1.a1.a0.a1 = 14;
+ a0.a1.a1.a1.a0 = -15;
+ a0.a1.a1.a1.a1 = 16;
+ a1.a0.a0.a0.a0 = -17;
+ a1.a0.a0.a0.a1 = 18;
+ a1.a0.a0.a1.a0 = -19;
+ a1.a0.a0.a1.a1 = 20;
+ a1.a0.a1.a0.a0 = -21;
+ a1.a0.a1.a0.a1 = 22;
+ a1.a0.a1.a1.a0 = -23;
+ a1.a0.a1.a1.a1 = 24;
+ a1.a1.a0.a0.a0 = -25;
+ a1.a1.a0.a0.a1 = 26;
+ a1.a1.a0.a1.a0 = -27;
+ a1.a1.a0.a1.a1 = 28;
+ a1.a1.a1.a0.a0 = -29;
+ a1.a1.a1.a0.a1 = 30;
+ a1.a1.a1.a1.a0 = -31;
+ a1.a1.a1.a1.a1 = 32;
+
+ final result = passStruct32BytesNestedIntx2Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(16, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+}
+
+final passStructNestedIntStructAlignmentInt16Leaf =
+ ffiTestFunctions.lookupFunction<
+ Int64 Function(StructNestedIntStructAlignmentInt16),
+ int Function(StructNestedIntStructAlignmentInt16)>(
+ "PassStructNestedIntStructAlignmentInt16",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 16 byte int.
+void testPassStructNestedIntStructAlignmentInt16Leaf() {
+ final a0Pointer = calloc<StructNestedIntStructAlignmentInt16>();
+ final StructNestedIntStructAlignmentInt16 a0 = a0Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a0.a1.a0 = 4;
+ a0.a1.a1 = -5;
+ a0.a1.a2 = 6;
+
+ final result = passStructNestedIntStructAlignmentInt16Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(3, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedIntStructAlignmentInt32Leaf =
+ ffiTestFunctions.lookupFunction<
+ Int64 Function(StructNestedIntStructAlignmentInt32),
+ int Function(StructNestedIntStructAlignmentInt32)>(
+ "PassStructNestedIntStructAlignmentInt32",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 32 byte int.
+void testPassStructNestedIntStructAlignmentInt32Leaf() {
+ final a0Pointer = calloc<StructNestedIntStructAlignmentInt32>();
+ final StructNestedIntStructAlignmentInt32 a0 = a0Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a0.a1.a0 = 4;
+ a0.a1.a1 = -5;
+ a0.a1.a2 = 6;
+
+ final result = passStructNestedIntStructAlignmentInt32Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(3, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedIntStructAlignmentInt64Leaf =
+ ffiTestFunctions.lookupFunction<
+ Int64 Function(StructNestedIntStructAlignmentInt64),
+ int Function(StructNestedIntStructAlignmentInt64)>(
+ "PassStructNestedIntStructAlignmentInt64",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 64 byte int.
+void testPassStructNestedIntStructAlignmentInt64Leaf() {
+ final a0Pointer = calloc<StructNestedIntStructAlignmentInt64>();
+ final StructNestedIntStructAlignmentInt64 a0 = a0Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a0.a1.a0 = 4;
+ a0.a1.a1 = -5;
+ a0.a1.a2 = 6;
+
+ final result = passStructNestedIntStructAlignmentInt64Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(3, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedIrregularEvenBiggerx4Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger),
+ double Function(
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger)>(
+ "PassStructNestedIrregularEvenBiggerx4",
+ isLeaf: true);
+
+/// Return big irregular struct as smoke test.
+void testPassStructNestedIrregularEvenBiggerx4Leaf() {
+ final a0Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a3 = a3Pointer.ref;
+
+ a0.a0 = 1;
+ a0.a1.a0.a0 = 2;
+ a0.a1.a0.a1.a0.a0 = -3;
+ a0.a1.a0.a1.a0.a1 = 4;
+ a0.a1.a0.a1.a1.a0 = -5.0;
+ a0.a1.a0.a2 = 6;
+ a0.a1.a0.a3.a0.a0 = -7.0;
+ a0.a1.a0.a3.a1 = 8.0;
+ a0.a1.a0.a4 = 9;
+ a0.a1.a0.a5.a0.a0 = 10.0;
+ a0.a1.a0.a5.a1.a0 = -11.0;
+ a0.a1.a0.a6 = 12;
+ a0.a1.a1.a0.a0 = -13;
+ a0.a1.a1.a0.a1 = 14;
+ a0.a1.a1.a1.a0 = -15.0;
+ a0.a1.a2 = 16.0;
+ a0.a1.a3 = -17.0;
+ a0.a2.a0.a0 = 18;
+ a0.a2.a0.a1.a0.a0 = -19;
+ a0.a2.a0.a1.a0.a1 = 20;
+ a0.a2.a0.a1.a1.a0 = -21.0;
+ a0.a2.a0.a2 = 22;
+ a0.a2.a0.a3.a0.a0 = -23.0;
+ a0.a2.a0.a3.a1 = 24.0;
+ a0.a2.a0.a4 = 25;
+ a0.a2.a0.a5.a0.a0 = 26.0;
+ a0.a2.a0.a5.a1.a0 = -27.0;
+ a0.a2.a0.a6 = 28;
+ a0.a2.a1.a0.a0 = -29;
+ a0.a2.a1.a0.a1 = 30;
+ a0.a2.a1.a1.a0 = -31.0;
+ a0.a2.a2 = 32.0;
+ a0.a2.a3 = -33.0;
+ a0.a3 = 34.0;
+ a1.a0 = 35;
+ a1.a1.a0.a0 = 36;
+ a1.a1.a0.a1.a0.a0 = -37;
+ a1.a1.a0.a1.a0.a1 = 38;
+ a1.a1.a0.a1.a1.a0 = -39.0;
+ a1.a1.a0.a2 = 40;
+ a1.a1.a0.a3.a0.a0 = -41.0;
+ a1.a1.a0.a3.a1 = 42.0;
+ a1.a1.a0.a4 = 43;
+ a1.a1.a0.a5.a0.a0 = 44.0;
+ a1.a1.a0.a5.a1.a0 = -45.0;
+ a1.a1.a0.a6 = 46;
+ a1.a1.a1.a0.a0 = -47;
+ a1.a1.a1.a0.a1 = 48;
+ a1.a1.a1.a1.a0 = -49.0;
+ a1.a1.a2 = 50.0;
+ a1.a1.a3 = -51.0;
+ a1.a2.a0.a0 = 52;
+ a1.a2.a0.a1.a0.a0 = -53;
+ a1.a2.a0.a1.a0.a1 = 54;
+ a1.a2.a0.a1.a1.a0 = -55.0;
+ a1.a2.a0.a2 = 56;
+ a1.a2.a0.a3.a0.a0 = -57.0;
+ a1.a2.a0.a3.a1 = 58.0;
+ a1.a2.a0.a4 = 59;
+ a1.a2.a0.a5.a0.a0 = 60.0;
+ a1.a2.a0.a5.a1.a0 = -61.0;
+ a1.a2.a0.a6 = 62;
+ a1.a2.a1.a0.a0 = -63;
+ a1.a2.a1.a0.a1 = 64;
+ a1.a2.a1.a1.a0 = -65.0;
+ a1.a2.a2 = 66.0;
+ a1.a2.a3 = -67.0;
+ a1.a3 = 68.0;
+ a2.a0 = 69;
+ a2.a1.a0.a0 = 70;
+ a2.a1.a0.a1.a0.a0 = -71;
+ a2.a1.a0.a1.a0.a1 = 72;
+ a2.a1.a0.a1.a1.a0 = -73.0;
+ a2.a1.a0.a2 = 74;
+ a2.a1.a0.a3.a0.a0 = -75.0;
+ a2.a1.a0.a3.a1 = 76.0;
+ a2.a1.a0.a4 = 77;
+ a2.a1.a0.a5.a0.a0 = 78.0;
+ a2.a1.a0.a5.a1.a0 = -79.0;
+ a2.a1.a0.a6 = 80;
+ a2.a1.a1.a0.a0 = -81;
+ a2.a1.a1.a0.a1 = 82;
+ a2.a1.a1.a1.a0 = -83.0;
+ a2.a1.a2 = 84.0;
+ a2.a1.a3 = -85.0;
+ a2.a2.a0.a0 = 86;
+ a2.a2.a0.a1.a0.a0 = -87;
+ a2.a2.a0.a1.a0.a1 = 88;
+ a2.a2.a0.a1.a1.a0 = -89.0;
+ a2.a2.a0.a2 = 90;
+ a2.a2.a0.a3.a0.a0 = -91.0;
+ a2.a2.a0.a3.a1 = 92.0;
+ a2.a2.a0.a4 = 93;
+ a2.a2.a0.a5.a0.a0 = 94.0;
+ a2.a2.a0.a5.a1.a0 = -95.0;
+ a2.a2.a0.a6 = 96;
+ a2.a2.a1.a0.a0 = -97;
+ a2.a2.a1.a0.a1 = 98;
+ a2.a2.a1.a1.a0 = -99.0;
+ a2.a2.a2 = 100.0;
+ a2.a2.a3 = -101.0;
+ a2.a3 = 102.0;
+ a3.a0 = 103;
+ a3.a1.a0.a0 = 104;
+ a3.a1.a0.a1.a0.a0 = -105;
+ a3.a1.a0.a1.a0.a1 = 106;
+ a3.a1.a0.a1.a1.a0 = -107.0;
+ a3.a1.a0.a2 = 108;
+ a3.a1.a0.a3.a0.a0 = -109.0;
+ a3.a1.a0.a3.a1 = 110.0;
+ a3.a1.a0.a4 = 111;
+ a3.a1.a0.a5.a0.a0 = 112.0;
+ a3.a1.a0.a5.a1.a0 = -113.0;
+ a3.a1.a0.a6 = 114;
+ a3.a1.a1.a0.a0 = -115;
+ a3.a1.a1.a0.a1 = 116;
+ a3.a1.a1.a1.a0 = -117.0;
+ a3.a1.a2 = 118.0;
+ a3.a1.a3 = -119.0;
+ a3.a2.a0.a0 = 120;
+ a3.a2.a0.a1.a0.a0 = -121;
+ a3.a2.a0.a1.a0.a1 = 122;
+ a3.a2.a0.a1.a1.a0 = -123.0;
+ a3.a2.a0.a2 = 124;
+ a3.a2.a0.a3.a0.a0 = -125.0;
+ a3.a2.a0.a3.a1 = 126.0;
+ a3.a2.a0.a4 = 127;
+ a3.a2.a0.a5.a0.a0 = 128.0;
+ a3.a2.a0.a5.a1.a0 = -129.0;
+ a3.a2.a0.a6 = 130;
+ a3.a2.a1.a0.a0 = -131;
+ a3.a2.a1.a0.a1 = 132;
+ a3.a2.a1.a1.a0 = -133.0;
+ a3.a2.a2 = 134.0;
+ a3.a2.a3 = -135.0;
+ a3.a3 = 136.0;
+
+ final result = passStructNestedIrregularEvenBiggerx4Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(1572.0, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+ calloc.free(a3Pointer);
+}
+
+final passStruct8BytesInlineArrayIntx4Leaf = ffiTestFunctions.lookupFunction<
+ Int32 Function(Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt),
+ int Function(
+ Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt)>("PassStruct8BytesInlineArrayIntx4",
+ isLeaf: true);
+
+/// Simple struct with inline array.
+void testPassStruct8BytesInlineArrayIntx4Leaf() {
+ final a0Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a3 = a3Pointer.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;
+ a1.a0[0] = 9;
+ a1.a0[1] = 10;
+ a1.a0[2] = 11;
+ a1.a0[3] = 12;
+ a1.a0[4] = 13;
+ a1.a0[5] = 14;
+ a1.a0[6] = 15;
+ a1.a0[7] = 16;
+ a2.a0[0] = 17;
+ a2.a0[1] = 18;
+ a2.a0[2] = 19;
+ a2.a0[3] = 20;
+ a2.a0[4] = 21;
+ a2.a0[5] = 22;
+ a2.a0[6] = 23;
+ a2.a0[7] = 24;
+ a3.a0[0] = 25;
+ a3.a0[1] = 26;
+ a3.a0[2] = 27;
+ a3.a0[3] = 28;
+ a3.a0[4] = 29;
+ a3.a0[5] = 30;
+ a3.a0[6] = 31;
+ a3.a0[7] = 32;
+
+ final result = passStruct8BytesInlineArrayIntx4Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.equals(528, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+ calloc.free(a3Pointer);
+}
+
+final passStructInlineArrayIrregularx4Leaf = ffiTestFunctions.lookupFunction<
+ Int32 Function(StructInlineArrayIrregular, StructInlineArrayIrregular,
+ StructInlineArrayIrregular, StructInlineArrayIrregular),
+ int Function(
+ StructInlineArrayIrregular,
+ StructInlineArrayIrregular,
+ StructInlineArrayIrregular,
+ StructInlineArrayIrregular)>("PassStructInlineArrayIrregularx4",
+ isLeaf: true);
+
+/// Irregular struct with inline array.
+void testPassStructInlineArrayIrregularx4Leaf() {
+ final a0Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a3 = a3Pointer.ref;
+
+ a0.a0[0].a0 = -1;
+ a0.a0[0].a1 = 2;
+ a0.a0[1].a0 = -3;
+ a0.a0[1].a1 = 4;
+ a0.a1 = 5;
+ a1.a0[0].a0 = 6;
+ a1.a0[0].a1 = -7;
+ a1.a0[1].a0 = 8;
+ a1.a0[1].a1 = -9;
+ a1.a1 = 10;
+ a2.a0[0].a0 = -11;
+ a2.a0[0].a1 = 12;
+ a2.a0[1].a0 = -13;
+ a2.a0[1].a1 = 14;
+ a2.a1 = 15;
+ a3.a0[0].a0 = 16;
+ a3.a0[0].a1 = -17;
+ a3.a0[1].a0 = 18;
+ a3.a0[1].a1 = -19;
+ a3.a1 = 20;
+
+ final result = passStructInlineArrayIrregularx4Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.equals(50, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+ calloc.free(a3Pointer);
+}
+
+final passStructInlineArray100BytesLeaf = ffiTestFunctions.lookupFunction<
+ Int32 Function(StructInlineArray100Bytes),
+ int Function(StructInlineArray100Bytes)>(
+ "PassStructInlineArray100Bytes",
+ isLeaf: true);
+
+/// Regular larger struct with inline array.
+void testPassStructInlineArray100BytesLeaf() {
+ final a0Pointer = calloc<StructInlineArray100Bytes>();
+ final StructInlineArray100Bytes 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;
+ a0.a0[8] = 9;
+ a0.a0[9] = 10;
+ a0.a0[10] = 11;
+ a0.a0[11] = 12;
+ a0.a0[12] = 13;
+ a0.a0[13] = 14;
+ a0.a0[14] = 15;
+ a0.a0[15] = 16;
+ a0.a0[16] = 17;
+ a0.a0[17] = 18;
+ a0.a0[18] = 19;
+ a0.a0[19] = 20;
+ a0.a0[20] = 21;
+ a0.a0[21] = 22;
+ a0.a0[22] = 23;
+ a0.a0[23] = 24;
+ a0.a0[24] = 25;
+ a0.a0[25] = 26;
+ a0.a0[26] = 27;
+ a0.a0[27] = 28;
+ a0.a0[28] = 29;
+ a0.a0[29] = 30;
+ a0.a0[30] = 31;
+ a0.a0[31] = 32;
+ a0.a0[32] = 33;
+ a0.a0[33] = 34;
+ a0.a0[34] = 35;
+ a0.a0[35] = 36;
+ a0.a0[36] = 37;
+ a0.a0[37] = 38;
+ a0.a0[38] = 39;
+ a0.a0[39] = 40;
+ a0.a0[40] = 41;
+ a0.a0[41] = 42;
+ a0.a0[42] = 43;
+ a0.a0[43] = 44;
+ a0.a0[44] = 45;
+ a0.a0[45] = 46;
+ a0.a0[46] = 47;
+ a0.a0[47] = 48;
+ a0.a0[48] = 49;
+ a0.a0[49] = 50;
+ a0.a0[50] = 51;
+ a0.a0[51] = 52;
+ a0.a0[52] = 53;
+ a0.a0[53] = 54;
+ a0.a0[54] = 55;
+ a0.a0[55] = 56;
+ a0.a0[56] = 57;
+ a0.a0[57] = 58;
+ a0.a0[58] = 59;
+ a0.a0[59] = 60;
+ a0.a0[60] = 61;
+ a0.a0[61] = 62;
+ a0.a0[62] = 63;
+ a0.a0[63] = 64;
+ a0.a0[64] = 65;
+ a0.a0[65] = 66;
+ a0.a0[66] = 67;
+ a0.a0[67] = 68;
+ a0.a0[68] = 69;
+ a0.a0[69] = 70;
+ a0.a0[70] = 71;
+ a0.a0[71] = 72;
+ a0.a0[72] = 73;
+ a0.a0[73] = 74;
+ a0.a0[74] = 75;
+ a0.a0[75] = 76;
+ a0.a0[76] = 77;
+ a0.a0[77] = 78;
+ a0.a0[78] = 79;
+ a0.a0[79] = 80;
+ a0.a0[80] = 81;
+ a0.a0[81] = 82;
+ a0.a0[82] = 83;
+ a0.a0[83] = 84;
+ a0.a0[84] = 85;
+ a0.a0[85] = 86;
+ a0.a0[86] = 87;
+ a0.a0[87] = 88;
+ a0.a0[88] = 89;
+ a0.a0[89] = 90;
+ a0.a0[90] = 91;
+ a0.a0[91] = 92;
+ a0.a0[92] = 93;
+ a0.a0[93] = 94;
+ a0.a0[94] = 95;
+ a0.a0[95] = 96;
+ a0.a0[96] = 97;
+ a0.a0[97] = 98;
+ a0.a0[98] = 99;
+ a0.a0[99] = 100;
+
+ final result = passStructInlineArray100BytesLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(5050, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructStruct16BytesHomogeneousFloat2x5Leaf =
+ ffiTestFunctions.lookupFunction<
+ Float Function(
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2),
+ double Function(
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2)>(
+ "PassStructStruct16BytesHomogeneousFloat2x5",
+ isLeaf: true);
+
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStructStruct16BytesHomogeneousFloat2x5Leaf() {
+ final a0Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a4 = a4Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1[0].a0 = 2.0;
+ a0.a1[1].a0 = -3.0;
+ a0.a2 = 4.0;
+ a1.a0.a0 = -5.0;
+ a1.a1[0].a0 = 6.0;
+ a1.a1[1].a0 = -7.0;
+ a1.a2 = 8.0;
+ a2.a0.a0 = -9.0;
+ a2.a1[0].a0 = 10.0;
+ a2.a1[1].a0 = -11.0;
+ a2.a2 = 12.0;
+ a3.a0.a0 = -13.0;
+ a3.a1[0].a0 = 14.0;
+ a3.a1[1].a0 = -15.0;
+ a3.a2 = 16.0;
+ a4.a0.a0 = -17.0;
+ a4.a1[0].a0 = 18.0;
+ a4.a1[1].a0 = -19.0;
+ a4.a2 = 20.0;
+
+ final result =
+ passStructStruct16BytesHomogeneousFloat2x5Leaf(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 passStructStruct32BytesHomogeneousDouble2x5Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2),
+ double Function(
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2)>(
+ "PassStructStruct32BytesHomogeneousDouble2x5",
+ isLeaf: true);
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStructStruct32BytesHomogeneousDouble2x5Leaf() {
+ final a0Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a4 = a4Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1[0].a0 = 2.0;
+ a0.a1[1].a0 = -3.0;
+ a0.a2 = 4.0;
+ a1.a0.a0 = -5.0;
+ a1.a1[0].a0 = 6.0;
+ a1.a1[1].a0 = -7.0;
+ a1.a2 = 8.0;
+ a2.a0.a0 = -9.0;
+ a2.a1[0].a0 = 10.0;
+ a2.a1[1].a0 = -11.0;
+ a2.a2 = 12.0;
+ a3.a0.a0 = -13.0;
+ a3.a1[0].a0 = 14.0;
+ a3.a1[1].a0 = -15.0;
+ a3.a2 = 16.0;
+ a4.a0.a0 = -17.0;
+ a4.a1[0].a0 = 18.0;
+ a4.a1[1].a0 = -19.0;
+ a4.a2 = 20.0;
+
+ final result =
+ passStructStruct32BytesHomogeneousDouble2x5Leaf(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 passStructStruct16BytesMixed3x10Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3),
+ double Function(
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3)>("PassStructStruct16BytesMixed3x10",
+ isLeaf: true);
+
+/// 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 testPassStructStruct16BytesMixed3x10Leaf() {
+ final a0Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a4 = a4Pointer.ref;
+ final a5Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a5 = a5Pointer.ref;
+ final a6Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a6 = a6Pointer.ref;
+ final a7Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a7 = a7Pointer.ref;
+ final a8Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a8 = a8Pointer.ref;
+ final a9Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a9 = a9Pointer.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;
+ a1.a0.a0 = -7.0;
+ a1.a1[0].a0 = 8.0;
+ a1.a1[0].a1 = -9;
+ a1.a1[0].a2 = 10;
+ a1.a2[0] = -11;
+ a1.a2[1] = 12;
+ a2.a0.a0 = -13.0;
+ a2.a1[0].a0 = 14.0;
+ a2.a1[0].a1 = -15;
+ a2.a1[0].a2 = 16;
+ a2.a2[0] = -17;
+ a2.a2[1] = 18;
+ a3.a0.a0 = -19.0;
+ a3.a1[0].a0 = 20.0;
+ a3.a1[0].a1 = -21;
+ a3.a1[0].a2 = 22;
+ a3.a2[0] = -23;
+ a3.a2[1] = 24;
+ a4.a0.a0 = -25.0;
+ a4.a1[0].a0 = 26.0;
+ a4.a1[0].a1 = -27;
+ a4.a1[0].a2 = 28;
+ a4.a2[0] = -29;
+ a4.a2[1] = 30;
+ a5.a0.a0 = -31.0;
+ a5.a1[0].a0 = 32.0;
+ a5.a1[0].a1 = -33;
+ a5.a1[0].a2 = 34;
+ a5.a2[0] = -35;
+ a5.a2[1] = 36;
+ a6.a0.a0 = -37.0;
+ a6.a1[0].a0 = 38.0;
+ a6.a1[0].a1 = -39;
+ a6.a1[0].a2 = 40;
+ a6.a2[0] = -41;
+ a6.a2[1] = 42;
+ a7.a0.a0 = -43.0;
+ a7.a1[0].a0 = 44.0;
+ a7.a1[0].a1 = -45;
+ a7.a1[0].a2 = 46;
+ a7.a2[0] = -47;
+ a7.a2[1] = 48;
+ a8.a0.a0 = -49.0;
+ a8.a1[0].a0 = 50.0;
+ a8.a1[0].a1 = -51;
+ a8.a1[0].a2 = 52;
+ a8.a2[0] = -53;
+ a8.a2[1] = 54;
+ a9.a0.a0 = -55.0;
+ a9.a1[0].a0 = 56.0;
+ a9.a1[0].a1 = -57;
+ a9.a1[0].a2 = 58;
+ a9.a2[0] = -59;
+ a9.a2[1] = 60;
+
+ final result = passStructStruct16BytesMixed3x10Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.approxEquals(30.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 passUint8Struct32BytesInlineArrayMultiDimensionalILeaf =
+ ffiTestFunctions.lookupFunction<
+ Uint32 Function(
+ Uint8,
+ Struct32BytesInlineArrayMultiDimensionalInt,
+ Uint8,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ Uint8,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ Uint8),
+ int Function(
+ int,
+ Struct32BytesInlineArrayMultiDimensionalInt,
+ int,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ int,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ int)>("PassUint8Struct32BytesInlineArrayMultiDimensionalI",
+ isLeaf: true);
+
+/// Test multi dimensional inline array struct as argument.
+void testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf() {
+ int a0;
+ final a1Pointer = calloc<Struct32BytesInlineArrayMultiDimensionalInt>();
+ final Struct32BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
+ int a2;
+ final a3Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
+ final Struct8BytesInlineArrayMultiDimensionalInt a3 = a3Pointer.ref;
+ int a4;
+ final a5Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
+ final Struct8BytesInlineArrayMultiDimensionalInt a5 = a5Pointer.ref;
+ int a6;
+
+ a0 = 1;
+ a1.a0[0][0][0][0][0] = 2;
+ a1.a0[0][0][0][0][1] = 3;
+ a1.a0[0][0][0][1][0] = 4;
+ a1.a0[0][0][0][1][1] = 5;
+ a1.a0[0][0][1][0][0] = 6;
+ a1.a0[0][0][1][0][1] = 7;
+ a1.a0[0][0][1][1][0] = 8;
+ a1.a0[0][0][1][1][1] = 9;
+ a1.a0[0][1][0][0][0] = 10;
+ a1.a0[0][1][0][0][1] = 11;
+ a1.a0[0][1][0][1][0] = 12;
+ a1.a0[0][1][0][1][1] = 13;
+ a1.a0[0][1][1][0][0] = 14;
+ a1.a0[0][1][1][0][1] = 15;
+ a1.a0[0][1][1][1][0] = 16;
+ a1.a0[0][1][1][1][1] = 17;
+ a1.a0[1][0][0][0][0] = 18;
+ a1.a0[1][0][0][0][1] = 19;
+ a1.a0[1][0][0][1][0] = 20;
+ a1.a0[1][0][0][1][1] = 21;
+ a1.a0[1][0][1][0][0] = 22;
+ a1.a0[1][0][1][0][1] = 23;
+ a1.a0[1][0][1][1][0] = 24;
+ a1.a0[1][0][1][1][1] = 25;
+ a1.a0[1][1][0][0][0] = 26;
+ a1.a0[1][1][0][0][1] = 27;
+ a1.a0[1][1][0][1][0] = 28;
+ a1.a0[1][1][0][1][1] = 29;
+ a1.a0[1][1][1][0][0] = 30;
+ a1.a0[1][1][1][0][1] = 31;
+ a1.a0[1][1][1][1][0] = 32;
+ a1.a0[1][1][1][1][1] = 33;
+ a2 = 34;
+ a3.a0[0][0][0] = 35;
+ a3.a0[0][0][1] = 36;
+ a3.a0[0][1][0] = 37;
+ a3.a0[0][1][1] = 38;
+ a3.a0[1][0][0] = 39;
+ a3.a0[1][0][1] = 40;
+ a3.a0[1][1][0] = 41;
+ a3.a0[1][1][1] = 42;
+ a4 = 43;
+ a5.a0[0][0][0] = 44;
+ a5.a0[0][0][1] = 45;
+ a5.a0[0][1][0] = 46;
+ a5.a0[0][1][1] = 47;
+ a5.a0[1][0][0] = 48;
+ a5.a0[1][0][1] = 49;
+ a5.a0[1][1][0] = 50;
+ a5.a0[1][1][1] = 51;
+ a6 = 52;
+
+ final result = passUint8Struct32BytesInlineArrayMultiDimensionalILeaf(
+ a0, a1, a2, a3, a4, a5, a6);
+
+ print("result = $result");
+
+ Expect.equals(1378, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+}
+
+final passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf =
+ ffiTestFunctions.lookupFunction<
+ Uint32 Function(
+ Uint8, Struct4BytesInlineArrayMultiDimensionalInt, Uint8),
+ int Function(int, Struct4BytesInlineArrayMultiDimensionalInt, int)>(
+ "PassUint8Struct4BytesInlineArrayMultiDimensionalIn",
+ isLeaf: true);
+
+/// Test struct in multi dimensional inline array.
+void testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf() {
+ int a0;
+ final a1Pointer = calloc<Struct4BytesInlineArrayMultiDimensionalInt>();
+ final Struct4BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
+ int a2;
+
+ a0 = 1;
+ a1.a0[0][0].a0 = 2;
+ a1.a0[0][1].a0 = -3;
+ a1.a0[1][0].a0 = 4;
+ a1.a0[1][1].a0 = -5;
+ a2 = 6;
+
+ final result =
+ passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(5, result);
+
+ calloc.free(a1Pointer);
+}
+
+final passStruct3BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt),
+ int Function(
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt)>("PassStruct3BytesPackedIntx10", isLeaf: true);
+
+/// Small struct with mis-aligned member.
+void testPassStruct3BytesPackedIntx10Leaf() {
+ final a0Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt 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 =
+ passStruct3BytesPackedIntx10Leaf(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 passStruct8BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt),
+ int Function(
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt)>("PassStruct8BytesPackedIntx10", isLeaf: true);
+
+/// Struct with mis-aligned member.
+void testPassStruct8BytesPackedIntx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt 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 =
+ passStruct8BytesPackedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.equals(1275, 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 passStruct9BytesPackedMixedx10DoubleInt32x2Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Double,
+ Int32,
+ Int32),
+ double Function(
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ double,
+ int,
+ int)>("PassStruct9BytesPackedMixedx10DoubleInt32x2", isLeaf: true);
+
+/// Struct with mis-aligned member.
+/// Tests backfilling of CPU and FPU registers.
+void testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf() {
+ final a0Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a9 = a9Pointer.ref;
+ double a10;
+ int a11;
+ int a12;
+
+ a0.a0 = 1;
+ a0.a1 = 2.0;
+ a1.a0 = 3;
+ a1.a1 = 4.0;
+ a2.a0 = 5;
+ a2.a1 = 6.0;
+ a3.a0 = 7;
+ a3.a1 = 8.0;
+ a4.a0 = 9;
+ a4.a1 = 10.0;
+ a5.a0 = 11;
+ a5.a1 = 12.0;
+ a6.a0 = 13;
+ a6.a1 = 14.0;
+ a7.a0 = 15;
+ a7.a1 = 16.0;
+ a8.a0 = 17;
+ a8.a1 = 18.0;
+ a9.a0 = 19;
+ a9.a1 = 20.0;
+ a10 = -21.0;
+ a11 = 22;
+ a12 = -23;
+
+ final result = passStruct9BytesPackedMixedx10DoubleInt32x2Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
+
+ print("result = $result");
+
+ Expect.approxEquals(188.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 passStruct5BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct5BytesPackedMixed),
+ double Function(
+ Struct5BytesPackedMixed)>("PassStruct5BytesPackedMixed", isLeaf: true);
+
+/// This packed struct happens to have only aligned members.
+void testPassStruct5BytesPackedMixedLeaf() {
+ final a0Pointer = calloc<Struct5BytesPackedMixed>();
+ final Struct5BytesPackedMixed a0 = a0Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2;
+
+ final result = passStruct5BytesPackedMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(1.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedAlignmentStruct5BytesPackedMixedLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(StructNestedAlignmentStruct5BytesPackedMixed),
+ double Function(StructNestedAlignmentStruct5BytesPackedMixed)>(
+ "PassStructNestedAlignmentStruct5BytesPackedMixed",
+ isLeaf: true);
+
+/// Check alignment of packed struct in non-packed struct.
+void testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf() {
+ final a0Pointer = calloc<StructNestedAlignmentStruct5BytesPackedMixed>();
+ final StructNestedAlignmentStruct5BytesPackedMixed a0 = a0Pointer.ref;
+
+ a0.a0 = 1;
+ a0.a1.a0 = 2.0;
+ a0.a1.a1 = 3;
+
+ final result = passStructNestedAlignmentStruct5BytesPackedMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(6.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct6BytesInlineArrayIntLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct6BytesInlineArrayInt),
+ double Function(Struct6BytesInlineArrayInt)>(
+ "PassStruct6BytesInlineArrayInt",
+ isLeaf: true);
+
+/// Check alignment of packed struct array in non-packed struct.
+void testPassStruct6BytesInlineArrayIntLeaf() {
+ final a0Pointer = calloc<Struct6BytesInlineArrayInt>();
+ final Struct6BytesInlineArrayInt a0 = a0Pointer.ref;
+
+ a0.a0[0].a0 = -1;
+ a0.a0[0].a1 = 2;
+ a0.a0[1].a0 = -3;
+ a0.a0[1].a1 = 4;
+
+ final result = passStruct6BytesInlineArrayIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(2.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct15BytesInlineArrayMixedLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct15BytesInlineArrayMixed),
+ double Function(Struct15BytesInlineArrayMixed)>(
+ "PassStruct15BytesInlineArrayMixed",
+ isLeaf: true);
+
+/// Check alignment of packed struct array in non-packed struct.
+void testPassStruct15BytesInlineArrayMixedLeaf() {
+ final a0Pointer = calloc<Struct15BytesInlineArrayMixed>();
+ final Struct15BytesInlineArrayMixed a0 = a0Pointer.ref;
+
+ a0.a0[0].a0 = -1.0;
+ a0.a0[0].a1 = 2;
+ a0.a0[1].a0 = -3.0;
+ a0.a0[1].a1 = 4;
+ a0.a0[2].a0 = -5.0;
+ a0.a0[2].a1 = 6;
+
+ final result = passStruct15BytesInlineArrayMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(3.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passUnion4BytesMixedx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed),
+ double Function(
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed)>("PassUnion4BytesMixedx10", isLeaf: true);
+
+/// Check placement of mixed integer/float union.
+void testPassUnion4BytesMixedx10Leaf() {
+ final a0Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed 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 =
+ passUnion4BytesMixedx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.approxEquals(55.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 passUnion8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat),
+ double Function(
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat)>("PassUnion8BytesNestedFloatx10", isLeaf: true);
+
+/// Check placement of mixed floats union.
+void testPassUnion8BytesNestedFloatx10Leaf() {
+ final a0Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a9 = a9Pointer.ref;
+
+ a0.a0 = -1.0;
+ a1.a0 = 2.0;
+ a2.a0 = -3.0;
+ a3.a0 = 4.0;
+ a4.a0 = -5.0;
+ a5.a0 = 6.0;
+ a6.a0 = -7.0;
+ a7.a0 = 8.0;
+ a8.a0 = -9.0;
+ a9.a0 = 10.0;
+
+ final result =
+ passUnion8BytesNestedFloatx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.approxEquals(5.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 passUnion9BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt),
+ double Function(
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt)>("PassUnion9BytesNestedIntx10", isLeaf: true);
+
+/// Mixed-size union argument.
+void testPassUnion9BytesNestedIntx10Leaf() {
+ final a0Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a1.a0.a0 = 4;
+ a1.a0.a1 = -5;
+ a1.a0.a2 = 6;
+ a2.a0.a0 = -7;
+ a2.a0.a1 = 8;
+ a2.a0.a2 = -9;
+ a3.a0.a0 = 10;
+ a3.a0.a1 = -11;
+ a3.a0.a2 = 12;
+ a4.a0.a0 = -13;
+ a4.a0.a1 = 14;
+ a4.a0.a2 = -15;
+ a5.a0.a0 = 16;
+ a5.a0.a1 = -17;
+ a5.a0.a2 = 18;
+ a6.a0.a0 = -19;
+ a6.a0.a1 = 20;
+ a6.a0.a2 = -21;
+ a7.a0.a0 = 22;
+ a7.a0.a1 = -23;
+ a7.a0.a2 = 24;
+ a8.a0.a0 = -25;
+ a8.a0.a1 = 26;
+ a8.a0.a2 = -27;
+ a9.a0.a0 = 28;
+ a9.a0.a1 = -29;
+ a9.a0.a2 = 30;
+
+ final result =
+ passUnion9BytesNestedIntx10Leaf(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 passUnion16BytesNestedInlineArrayFloatx10Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat),
+ double Function(
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat)>(
+ "PassUnion16BytesNestedInlineArrayFloatx10",
+ isLeaf: true);
+
+/// Union with homogenous floats.
+void testPassUnion16BytesNestedInlineArrayFloatx10Leaf() {
+ final a0Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a9 = a9Pointer.ref;
+
+ a0.a0[0] = -1.0;
+ a0.a0[1] = 2.0;
+ a0.a0[2] = -3.0;
+ a0.a0[3] = 4.0;
+ a1.a0[0] = -5.0;
+ a1.a0[1] = 6.0;
+ a1.a0[2] = -7.0;
+ a1.a0[3] = 8.0;
+ a2.a0[0] = -9.0;
+ a2.a0[1] = 10.0;
+ a2.a0[2] = -11.0;
+ a2.a0[3] = 12.0;
+ a3.a0[0] = -13.0;
+ a3.a0[1] = 14.0;
+ a3.a0[2] = -15.0;
+ a3.a0[3] = 16.0;
+ a4.a0[0] = -17.0;
+ a4.a0[1] = 18.0;
+ a4.a0[2] = -19.0;
+ a4.a0[3] = 20.0;
+ a5.a0[0] = -21.0;
+ a5.a0[1] = 22.0;
+ a5.a0[2] = -23.0;
+ a5.a0[3] = 24.0;
+ a6.a0[0] = -25.0;
+ a6.a0[1] = 26.0;
+ a6.a0[2] = -27.0;
+ a6.a0[3] = 28.0;
+ a7.a0[0] = -29.0;
+ a7.a0[1] = 30.0;
+ a7.a0[2] = -31.0;
+ a7.a0[3] = 32.0;
+ a8.a0[0] = -33.0;
+ a8.a0[1] = 34.0;
+ a8.a0[2] = -35.0;
+ a8.a0[3] = 36.0;
+ a9.a0[0] = -37.0;
+ a9.a0[1] = 38.0;
+ a9.a0[2] = -39.0;
+ a9.a0[3] = 40.0;
+
+ final result = passUnion16BytesNestedInlineArrayFloatx10Leaf(
+ 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 passUnion16BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat),
+ double Function(
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat)>("PassUnion16BytesNestedFloatx10",
+ isLeaf: true);
+
+/// Union with homogenous floats.
+void testPassUnion16BytesNestedFloatx10Leaf() {
+ final a0Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a0.a1 = 2.0;
+ a1.a0.a0 = -3.0;
+ a1.a0.a1 = 4.0;
+ a2.a0.a0 = -5.0;
+ a2.a0.a1 = 6.0;
+ a3.a0.a0 = -7.0;
+ a3.a0.a1 = 8.0;
+ a4.a0.a0 = -9.0;
+ a4.a0.a1 = 10.0;
+ a5.a0.a0 = -11.0;
+ a5.a0.a1 = 12.0;
+ a6.a0.a0 = -13.0;
+ a6.a0.a1 = 14.0;
+ a7.a0.a0 = -15.0;
+ a7.a0.a1 = 16.0;
+ a8.a0.a0 = -17.0;
+ a8.a0.a1 = 18.0;
+ a9.a0.a0 = -19.0;
+ a9.a0.a1 = 20.0;
+
+ final result = passUnion16BytesNestedFloatx10Leaf(
+ 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 returnStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct1ByteInt Function(Int8),
+ Struct1ByteInt Function(int)>("ReturnStruct1ByteInt", isLeaf: true);
+
+/// Smallest struct with data.
+void testReturnStruct1ByteIntLeaf() {
+ int a0;
+
+ a0 = -1;
+
+ final result = returnStruct1ByteIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+}
+
+final returnStruct3BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct3BytesHomogeneousUint8 Function(Uint8, Uint8, Uint8),
+ Struct3BytesHomogeneousUint8 Function(
+ int, int, int)>("ReturnStruct3BytesHomogeneousUint8", isLeaf: true);
+
+/// Smaller than word size return value on all architectures.
+void testReturnStruct3BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+
+ final result = returnStruct3BytesHomogeneousUint8Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct3BytesInt2ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
+ Struct3BytesInt2ByteAligned Function(Int16, Int8),
+ Struct3BytesInt2ByteAligned Function(
+ int, int)>("ReturnStruct3BytesInt2ByteAligned", isLeaf: true);
+
+/// Smaller than word size return value on all architectures.
+/// With alignment rules taken into account size is 4 bytes.
+void testReturnStruct3BytesInt2ByteAlignedLeaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct3BytesInt2ByteAlignedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct4BytesHomogeneousInt16Leaf = ffiTestFunctions.lookupFunction<
+ Struct4BytesHomogeneousInt16 Function(Int16, Int16),
+ Struct4BytesHomogeneousInt16 Function(
+ int, int)>("ReturnStruct4BytesHomogeneousInt16", isLeaf: true);
+
+/// Word size return value on 32 bit architectures..
+void testReturnStruct4BytesHomogeneousInt16Leaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct4BytesHomogeneousInt16Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct7BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct7BytesHomogeneousUint8 Function(
+ Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+ Struct7BytesHomogeneousUint8 Function(int, int, int, int, int, int,
+ int)>("ReturnStruct7BytesHomogeneousUint8", isLeaf: true);
+
+/// Non-wordsize return value.
+void testReturnStruct7BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+
+ final result =
+ returnStruct7BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5, a6);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+}
+
+final returnStruct7BytesInt4ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
+ Struct7BytesInt4ByteAligned Function(Int32, Int16, Int8),
+ Struct7BytesInt4ByteAligned Function(
+ int, int, int)>("ReturnStruct7BytesInt4ByteAligned", isLeaf: true);
+
+/// Non-wordsize return value.
+/// With alignment rules taken into account size is 8 bytes.
+void testReturnStruct7BytesInt4ByteAlignedLeaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct7BytesInt4ByteAlignedLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesInt Function(Int16, Int16, Int32),
+ Struct8BytesInt Function(
+ int, int, int)>("ReturnStruct8BytesInt", isLeaf: true);
+
+/// Return value in integer registers on many architectures.
+void testReturnStruct8BytesIntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct8BytesIntLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesHomogeneousFloat Function(Float, Float),
+ Struct8BytesHomogeneousFloat Function(
+ double, double)>("ReturnStruct8BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value in FP registers on many architectures.
+void testReturnStruct8BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+
+ a0 = -1.0;
+ a1 = 2.0;
+
+ final result = returnStruct8BytesHomogeneousFloatLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+}
+
+final returnStruct8BytesMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesMixed Function(Float, Int16, Int16),
+ Struct8BytesMixed Function(
+ double, int, int)>("ReturnStruct8BytesMixed", isLeaf: true);
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct8BytesMixedLeaf() {
+ double a0;
+ int a1;
+ int a2;
+
+ a0 = -1.0;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct8BytesMixedLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct9BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct9BytesHomogeneousUint8 Function(
+ Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+ Struct9BytesHomogeneousUint8 Function(int, int, int, int, int, int, int,
+ int, int)>("ReturnStruct9BytesHomogeneousUint8", isLeaf: true);
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct9BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ int a8;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+ a7 = 8;
+ a8 = 9;
+
+ final result = returnStruct9BytesHomogeneousUint8Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+ Expect.equals(a7, result.a7);
+ Expect.equals(a8, result.a8);
+}
+
+final returnStruct9BytesInt4Or8ByteAlignedLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct9BytesInt4Or8ByteAligned Function(Int64, Int8),
+ Struct9BytesInt4Or8ByteAligned Function(
+ int, int)>("ReturnStruct9BytesInt4Or8ByteAligned", isLeaf: true);
+
+/// Return value in two integer registers on x64.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+void testReturnStruct9BytesInt4Or8ByteAlignedLeaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct9BytesInt4Or8ByteAlignedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct12BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct12BytesHomogeneousFloat Function(Float, Float, Float),
+ Struct12BytesHomogeneousFloat Function(double, double,
+ double)>("ReturnStruct12BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value in FPU registers, but does not use all registers on arm hardfp
+/// and arm64.
+void testReturnStruct12BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+ double a2;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+
+ final result = returnStruct12BytesHomogeneousFloatLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+}
+
+final returnStruct16BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesHomogeneousFloat Function(Float, Float, Float, Float),
+ Struct16BytesHomogeneousFloat Function(double, double, double,
+ double)>("ReturnStruct16BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value in FPU registers on arm hardfp and arm64.
+void testReturnStruct16BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+
+ final result = returnStruct16BytesHomogeneousFloatLeaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct16BytesMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesMixed Function(Double, Int64),
+ Struct16BytesMixed Function(
+ double, int)>("ReturnStruct16BytesMixed", isLeaf: true);
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct16BytesMixedLeaf() {
+ double a0;
+ int a1;
+
+ a0 = -1.0;
+ a1 = 2;
+
+ final result = returnStruct16BytesMixedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct16BytesMixed2Leaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesMixed2 Function(Float, Float, Float, Int32),
+ Struct16BytesMixed2 Function(double, double, double,
+ int)>("ReturnStruct16BytesMixed2", isLeaf: true);
+
+/// Return value split over FP and integer register in x64.
+/// The integer register contains half float half int.
+void testReturnStruct16BytesMixed2Leaf() {
+ double a0;
+ double a1;
+ double a2;
+ int a3;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4;
+
+ final result = returnStruct16BytesMixed2Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+}
+
+final returnStruct17BytesIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct17BytesInt Function(Int64, Int64, Int8),
+ Struct17BytesInt Function(
+ int, int, int)>("ReturnStruct17BytesInt", isLeaf: true);
+
+/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+/// Is non word size on purpose, to test that structs are rounded up to word size
+/// on all ABIs.
+void testReturnStruct17BytesIntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct17BytesIntLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct19BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct19BytesHomogeneousUint8 Function(
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8),
+ Struct19BytesHomogeneousUint8 Function(
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int)>("ReturnStruct19BytesHomogeneousUint8", isLeaf: true);
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct19BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ int a8;
+ int a9;
+ int a10;
+ int a11;
+ int a12;
+ int a13;
+ int a14;
+ int a15;
+ int a16;
+ int a17;
+ int a18;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+ a7 = 8;
+ a8 = 9;
+ a9 = 10;
+ a10 = 11;
+ a11 = 12;
+ a12 = 13;
+ a13 = 14;
+ a14 = 15;
+ a15 = 16;
+ a16 = 17;
+ a17 = 18;
+ a18 = 19;
+
+ final result = returnStruct19BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5,
+ a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+ Expect.equals(a7, result.a7);
+ Expect.equals(a8, result.a8);
+ Expect.equals(a9, result.a9);
+ Expect.equals(a10, result.a10);
+ Expect.equals(a11, result.a11);
+ Expect.equals(a12, result.a12);
+ Expect.equals(a13, result.a13);
+ Expect.equals(a14, result.a14);
+ Expect.equals(a15, result.a15);
+ Expect.equals(a16, result.a16);
+ Expect.equals(a17, result.a17);
+ Expect.equals(a18, result.a18);
+}
+
+final returnStruct20BytesHomogeneousInt32Leaf = ffiTestFunctions.lookupFunction<
+ Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32),
+ Struct20BytesHomogeneousInt32 Function(int, int, int, int,
+ int)>("ReturnStruct20BytesHomogeneousInt32", isLeaf: true);
+
+/// Return value too big to go in cpu registers on arm64.
+void testReturnStruct20BytesHomogeneousInt32Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+ a3 = 4;
+ a4 = -5;
+
+ final result = returnStruct20BytesHomogeneousInt32Leaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+}
+
+final returnStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct20BytesHomogeneousFloat Function(Float, Float, Float, Float, Float),
+ Struct20BytesHomogeneousFloat Function(double, double, double, double,
+ double)>("ReturnStruct20BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+void testReturnStruct20BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+ double a4;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+ a4 = -5.0;
+
+ final result = returnStruct20BytesHomogeneousFloatLeaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+ Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct32BytesHomogeneousDoubleLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double),
+ Struct32BytesHomogeneousDouble Function(double, double, double,
+ double)>("ReturnStruct32BytesHomogeneousDouble", isLeaf: true);
+
+/// Return value in FPU registers on arm64.
+void testReturnStruct32BytesHomogeneousDoubleLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+
+ final result = returnStruct32BytesHomogeneousDoubleLeaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct40BytesHomogeneousDoubleLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct40BytesHomogeneousDouble Function(
+ Double, Double, Double, Double, Double),
+ Struct40BytesHomogeneousDouble Function(double, double, double, double,
+ double)>("ReturnStruct40BytesHomogeneousDouble", isLeaf: true);
+
+/// Return value too big to go in FPU registers on arm64.
+void testReturnStruct40BytesHomogeneousDoubleLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+ double a4;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+ a4 = -5.0;
+
+ final result = returnStruct40BytesHomogeneousDoubleLeaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+ Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct1024BytesHomogeneousUint64Leaf =
+ ffiTestFunctions.lookupFunction<
+ Struct1024BytesHomogeneousUint64 Function(
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64),
+ Struct1024BytesHomogeneousUint64 Function(
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int)>("ReturnStruct1024BytesHomogeneousUint64", isLeaf: true);
+
+/// Test 1kb struct.
+void testReturnStruct1024BytesHomogeneousUint64Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ int a8;
+ int a9;
+ int a10;
+ int a11;
+ int a12;
+ int a13;
+ int a14;
+ int a15;
+ int a16;
+ int a17;
+ int a18;
+ int a19;
+ int a20;
+ int a21;
+ int a22;
+ int a23;
+ int a24;
+ int a25;
+ int a26;
+ int a27;
+ int a28;
+ int a29;
+ int a30;
+ int a31;
+ int a32;
+ int a33;
+ int a34;
+ int a35;
+ int a36;
+ int a37;
+ int a38;
+ int a39;
+ int a40;
+ int a41;
+ int a42;
+ int a43;
+ int a44;
+ int a45;
+ int a46;
+ int a47;
+ int a48;
+ int a49;
+ int a50;
+ int a51;
+ int a52;
+ int a53;
+ int a54;
+ int a55;
+ int a56;
+ int a57;
+ int a58;
+ int a59;
+ int a60;
+ int a61;
+ int a62;
+ int a63;
+ int a64;
+ int a65;
+ int a66;
+ int a67;
+ int a68;
+ int a69;
+ int a70;
+ int a71;
+ int a72;
+ int a73;
+ int a74;
+ int a75;
+ int a76;
+ int a77;
+ int a78;
+ int a79;
+ int a80;
+ int a81;
+ int a82;
+ int a83;
+ int a84;
+ int a85;
+ int a86;
+ int a87;
+ int a88;
+ int a89;
+ int a90;
+ int a91;
+ int a92;
+ int a93;
+ int a94;
+ int a95;
+ int a96;
+ int a97;
+ int a98;
+ int a99;
+ int a100;
+ int a101;
+ int a102;
+ int a103;
+ int a104;
+ int a105;
+ int a106;
+ int a107;
+ int a108;
+ int a109;
+ int a110;
+ int a111;
+ int a112;
+ int a113;
+ int a114;
+ int a115;
+ int a116;
+ int a117;
+ int a118;
+ int a119;
+ int a120;
+ int a121;
+ int a122;
+ int a123;
+ int a124;
+ int a125;
+ int a126;
+ int a127;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+ a7 = 8;
+ a8 = 9;
+ a9 = 10;
+ a10 = 11;
+ a11 = 12;
+ a12 = 13;
+ a13 = 14;
+ a14 = 15;
+ a15 = 16;
+ a16 = 17;
+ a17 = 18;
+ a18 = 19;
+ a19 = 20;
+ a20 = 21;
+ a21 = 22;
+ a22 = 23;
+ a23 = 24;
+ a24 = 25;
+ a25 = 26;
+ a26 = 27;
+ a27 = 28;
+ a28 = 29;
+ a29 = 30;
+ a30 = 31;
+ a31 = 32;
+ a32 = 33;
+ a33 = 34;
+ a34 = 35;
+ a35 = 36;
+ a36 = 37;
+ a37 = 38;
+ a38 = 39;
+ a39 = 40;
+ a40 = 41;
+ a41 = 42;
+ a42 = 43;
+ a43 = 44;
+ a44 = 45;
+ a45 = 46;
+ a46 = 47;
+ a47 = 48;
+ a48 = 49;
+ a49 = 50;
+ a50 = 51;
+ a51 = 52;
+ a52 = 53;
+ a53 = 54;
+ a54 = 55;
+ a55 = 56;
+ a56 = 57;
+ a57 = 58;
+ a58 = 59;
+ a59 = 60;
+ a60 = 61;
+ a61 = 62;
+ a62 = 63;
+ a63 = 64;
+ a64 = 65;
+ a65 = 66;
+ a66 = 67;
+ a67 = 68;
+ a68 = 69;
+ a69 = 70;
+ a70 = 71;
+ a71 = 72;
+ a72 = 73;
+ a73 = 74;
+ a74 = 75;
+ a75 = 76;
+ a76 = 77;
+ a77 = 78;
+ a78 = 79;
+ a79 = 80;
+ a80 = 81;
+ a81 = 82;
+ a82 = 83;
+ a83 = 84;
+ a84 = 85;
+ a85 = 86;
+ a86 = 87;
+ a87 = 88;
+ a88 = 89;
+ a89 = 90;
+ a90 = 91;
+ a91 = 92;
+ a92 = 93;
+ a93 = 94;
+ a94 = 95;
+ a95 = 96;
+ a96 = 97;
+ a97 = 98;
+ a98 = 99;
+ a99 = 100;
+ a100 = 101;
+ a101 = 102;
+ a102 = 103;
+ a103 = 104;
+ a104 = 105;
+ a105 = 106;
+ a106 = 107;
+ a107 = 108;
+ a108 = 109;
+ a109 = 110;
+ a110 = 111;
+ a111 = 112;
+ a112 = 113;
+ a113 = 114;
+ a114 = 115;
+ a115 = 116;
+ a116 = 117;
+ a117 = 118;
+ a118 = 119;
+ a119 = 120;
+ a120 = 121;
+ a121 = 122;
+ a122 = 123;
+ a123 = 124;
+ a124 = 125;
+ a125 = 126;
+ a126 = 127;
+ a127 = 128;
+
+ final result = returnStruct1024BytesHomogeneousUint64Leaf(
+ 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);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+ Expect.equals(a7, result.a7);
+ Expect.equals(a8, result.a8);
+ Expect.equals(a9, result.a9);
+ Expect.equals(a10, result.a10);
+ Expect.equals(a11, result.a11);
+ Expect.equals(a12, result.a12);
+ Expect.equals(a13, result.a13);
+ Expect.equals(a14, result.a14);
+ Expect.equals(a15, result.a15);
+ Expect.equals(a16, result.a16);
+ Expect.equals(a17, result.a17);
+ Expect.equals(a18, result.a18);
+ Expect.equals(a19, result.a19);
+ Expect.equals(a20, result.a20);
+ Expect.equals(a21, result.a21);
+ Expect.equals(a22, result.a22);
+ Expect.equals(a23, result.a23);
+ Expect.equals(a24, result.a24);
+ Expect.equals(a25, result.a25);
+ Expect.equals(a26, result.a26);
+ Expect.equals(a27, result.a27);
+ Expect.equals(a28, result.a28);
+ Expect.equals(a29, result.a29);
+ Expect.equals(a30, result.a30);
+ Expect.equals(a31, result.a31);
+ Expect.equals(a32, result.a32);
+ Expect.equals(a33, result.a33);
+ Expect.equals(a34, result.a34);
+ Expect.equals(a35, result.a35);
+ Expect.equals(a36, result.a36);
+ Expect.equals(a37, result.a37);
+ Expect.equals(a38, result.a38);
+ Expect.equals(a39, result.a39);
+ Expect.equals(a40, result.a40);
+ Expect.equals(a41, result.a41);
+ Expect.equals(a42, result.a42);
+ Expect.equals(a43, result.a43);
+ Expect.equals(a44, result.a44);
+ Expect.equals(a45, result.a45);
+ Expect.equals(a46, result.a46);
+ Expect.equals(a47, result.a47);
+ Expect.equals(a48, result.a48);
+ Expect.equals(a49, result.a49);
+ Expect.equals(a50, result.a50);
+ Expect.equals(a51, result.a51);
+ Expect.equals(a52, result.a52);
+ Expect.equals(a53, result.a53);
+ Expect.equals(a54, result.a54);
+ Expect.equals(a55, result.a55);
+ Expect.equals(a56, result.a56);
+ Expect.equals(a57, result.a57);
+ Expect.equals(a58, result.a58);
+ Expect.equals(a59, result.a59);
+ Expect.equals(a60, result.a60);
+ Expect.equals(a61, result.a61);
+ Expect.equals(a62, result.a62);
+ Expect.equals(a63, result.a63);
+ Expect.equals(a64, result.a64);
+ Expect.equals(a65, result.a65);
+ Expect.equals(a66, result.a66);
+ Expect.equals(a67, result.a67);
+ Expect.equals(a68, result.a68);
+ Expect.equals(a69, result.a69);
+ Expect.equals(a70, result.a70);
+ Expect.equals(a71, result.a71);
+ Expect.equals(a72, result.a72);
+ Expect.equals(a73, result.a73);
+ Expect.equals(a74, result.a74);
+ Expect.equals(a75, result.a75);
+ Expect.equals(a76, result.a76);
+ Expect.equals(a77, result.a77);
+ Expect.equals(a78, result.a78);
+ Expect.equals(a79, result.a79);
+ Expect.equals(a80, result.a80);
+ Expect.equals(a81, result.a81);
+ Expect.equals(a82, result.a82);
+ Expect.equals(a83, result.a83);
+ Expect.equals(a84, result.a84);
+ Expect.equals(a85, result.a85);
+ Expect.equals(a86, result.a86);
+ Expect.equals(a87, result.a87);
+ Expect.equals(a88, result.a88);
+ Expect.equals(a89, result.a89);
+ Expect.equals(a90, result.a90);
+ Expect.equals(a91, result.a91);
+ Expect.equals(a92, result.a92);
+ Expect.equals(a93, result.a93);
+ Expect.equals(a94, result.a94);
+ Expect.equals(a95, result.a95);
+ Expect.equals(a96, result.a96);
+ Expect.equals(a97, result.a97);
+ Expect.equals(a98, result.a98);
+ Expect.equals(a99, result.a99);
+ Expect.equals(a100, result.a100);
+ Expect.equals(a101, result.a101);
+ Expect.equals(a102, result.a102);
+ Expect.equals(a103, result.a103);
+ Expect.equals(a104, result.a104);
+ Expect.equals(a105, result.a105);
+ Expect.equals(a106, result.a106);
+ Expect.equals(a107, result.a107);
+ Expect.equals(a108, result.a108);
+ Expect.equals(a109, result.a109);
+ Expect.equals(a110, result.a110);
+ Expect.equals(a111, result.a111);
+ Expect.equals(a112, result.a112);
+ Expect.equals(a113, result.a113);
+ Expect.equals(a114, result.a114);
+ Expect.equals(a115, result.a115);
+ Expect.equals(a116, result.a116);
+ Expect.equals(a117, result.a117);
+ Expect.equals(a118, result.a118);
+ Expect.equals(a119, result.a119);
+ Expect.equals(a120, result.a120);
+ Expect.equals(a121, result.a121);
+ Expect.equals(a122, result.a122);
+ Expect.equals(a123, result.a123);
+ Expect.equals(a124, result.a124);
+ Expect.equals(a125, result.a125);
+ Expect.equals(a126, result.a126);
+ Expect.equals(a127, result.a127);
+}
+
+final returnStruct3BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct3BytesPackedInt Function(Int8, Int16),
+ Struct3BytesPackedInt Function(
+ int, int)>("ReturnStruct3BytesPackedInt", isLeaf: true);
+
+/// Small struct with mis-aligned member.
+void testReturnStruct3BytesPackedIntLeaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct3BytesPackedIntLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct8BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesPackedInt Function(Uint8, Uint32, Uint8, Uint8, Uint8),
+ Struct8BytesPackedInt Function(
+ int, int, int, int, int)>("ReturnStruct8BytesPackedInt", isLeaf: true);
+
+/// Struct with mis-aligned member.
+void testReturnStruct8BytesPackedIntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+
+ final result = returnStruct8BytesPackedIntLeaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+}
+
+final returnStruct9BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct9BytesPackedMixed Function(Uint8, Double),
+ Struct9BytesPackedMixed Function(
+ int, double)>("ReturnStruct9BytesPackedMixed", isLeaf: true);
+
+/// Struct with mis-aligned member.
+/// Tests backfilling of CPU and FPU registers.
+void testReturnStruct9BytesPackedMixedLeaf() {
+ int a0;
+ double a1;
+
+ a0 = 1;
+ a1 = 2.0;
+
+ final result = returnStruct9BytesPackedMixedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+}
+
+final returnUnion4BytesMixedLeaf = ffiTestFunctions.lookupFunction<
+ Union4BytesMixed Function(Uint32),
+ Union4BytesMixed Function(int)>("ReturnUnion4BytesMixed", isLeaf: true);
+
+/// Returning a mixed integer/float union.
+void testReturnUnion4BytesMixedLeaf() {
+ int a0;
+
+ a0 = 1;
+
+ final result = returnUnion4BytesMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+}
+
+final returnUnion8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
+ Union8BytesNestedFloat Function(Double),
+ Union8BytesNestedFloat Function(
+ double)>("ReturnUnion8BytesNestedFloat", isLeaf: true);
+
+/// Returning a floating point only union.
+void testReturnUnion8BytesNestedFloatLeaf() {
+ double a0;
+
+ a0 = -1.0;
+
+ final result = returnUnion8BytesNestedFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+}
+
+final returnUnion9BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Union9BytesNestedInt Function(Struct8BytesInt),
+ Union9BytesNestedInt Function(
+ Struct8BytesInt)>("ReturnUnion9BytesNestedInt", isLeaf: true);
+
+/// Returning a mixed-size union.
+void testReturnUnion9BytesNestedIntLeaf() {
+ final a0Pointer = calloc<Struct8BytesInt>();
+ final Struct8BytesInt a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = returnUnion9BytesNestedIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0.a0, result.a0.a0);
+ Expect.equals(a0.a1, result.a0.a1);
+ Expect.equals(a0.a2, result.a0.a2);
+
+ calloc.free(a0Pointer);
+}
+
+final returnUnion16BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
+ Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat),
+ Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat)>(
+ "ReturnUnion16BytesNestedFloat",
+ isLeaf: true);
+
+/// Returning union with homogenous floats.
+void testReturnUnion16BytesNestedFloatLeaf() {
+ final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2.0;
+
+ final result = returnUnion16BytesNestedFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0.a0, result.a0.a0);
+ Expect.approxEquals(a0.a1, result.a0.a1);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct1ByteInt Function(Struct1ByteInt),
+ Struct1ByteInt Function(
+ Struct1ByteInt)>("ReturnStructArgumentStruct1ByteInt", isLeaf: true);
+
+/// 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 testReturnStructArgumentStruct1ByteIntLeaf() {
+ final a0Pointer = calloc<Struct1ByteInt>();
+ final Struct1ByteInt a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+
+ final result = returnStructArgumentStruct1ByteIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0.a0, result.a0);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentInt32x8Struct1ByteIntLeaf =
+ ffiTestFunctions
+ .lookupFunction<
+ Struct1ByteInt Function(Int32, Int32, Int32, Int32, Int32, Int32,
+ Int32, Int32, Struct1ByteInt),
+ Struct1ByteInt Function(
+ int, int, int, int, int, int, int, int, Struct1ByteInt)>(
+ "ReturnStructArgumentInt32x8Struct1ByteInt",
+ isLeaf: true);
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed on stack on all ABIs.
+void testReturnStructArgumentInt32x8Struct1ByteIntLeaf() {
+ 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 = returnStructArgumentInt32x8Struct1ByteIntLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.equals(a8.a0, result.a0);
+
+ calloc.free(a8Pointer);
+}
+
+final returnStructArgumentStruct8BytesHomogeneousFloatLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat),
+ Struct8BytesHomogeneousFloat Function(
+ Struct8BytesHomogeneousFloat)>(
+ "ReturnStructArgumentStruct8BytesHomogeneousFloat",
+ isLeaf: true);
+
+/// 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 testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf() {
+ final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2.0;
+
+ final result = returnStructArgumentStruct8BytesHomogeneousFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0.a0, result.a0);
+ Expect.approxEquals(a0.a1, result.a1);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentStruct20BytesHomogeneousInt32Leaf =
+ ffiTestFunctions
+ .lookupFunction<
+ Struct20BytesHomogeneousInt32 Function(
+ Struct20BytesHomogeneousInt32),
+ Struct20BytesHomogeneousInt32 Function(
+ Struct20BytesHomogeneousInt32)>(
+ "ReturnStructArgumentStruct20BytesHomogeneousInt32",
+ isLeaf: true);
+
+/// On arm64, both argument and return value are passed in by pointer.
+void testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf() {
+ 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 = returnStructArgumentStruct20BytesHomogeneousInt32Leaf(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);
+}
+
+final returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32,
+ Int32, Int32, Int32, Int32, Struct20BytesHomogeneousInt32),
+ Struct20BytesHomogeneousInt32 Function(int, int, int, int, int, int,
+ int, int, Struct20BytesHomogeneousInt32)>(
+ "ReturnStructArgumentInt32x8Struct20BytesHomogeneou",
+ isLeaf: true);
+
+/// On arm64, both argument and return value are passed in by pointer.
+/// Ints exhaust registers, so that pointer is passed on stack.
+void testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf() {
+ 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 = returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf(
+ 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);
+}
+
+final returnStructArgumentStruct8BytesInlineArrayIntLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt),
+ Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt)>(
+ "ReturnStructArgumentStruct8BytesInlineArrayInt",
+ isLeaf: true);
+
+/// Test returning struct with inline array.
+void testReturnStructArgumentStruct8BytesInlineArrayIntLeaf() {
+ 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 = returnStructArgumentStruct8BytesInlineArrayIntLeaf(a0);
+
+ print("result = $result");
+
+ for (int i = 0; i < 8; i++) {
+ Expect.equals(a0.a0[i], result.a0[i]);
+ }
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentStructStruct16BytesHomogeneousLeaf =
+ ffiTestFunctions.lookupFunction<
+ StructStruct16BytesHomogeneousFloat2 Function(
+ StructStruct16BytesHomogeneousFloat2),
+ StructStruct16BytesHomogeneousFloat2 Function(
+ StructStruct16BytesHomogeneousFloat2)>(
+ "ReturnStructArgumentStructStruct16BytesHomogeneous",
+ isLeaf: true);
+
+/// Return value in FPU registers on arm hardfp and arm64.
+void testReturnStructArgumentStructStruct16BytesHomogeneousLeaf() {
+ 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 = returnStructArgumentStructStruct16BytesHomogeneousLeaf(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);
+}
+
+final returnStructArgumentStructStruct32BytesHomogeneousLeaf =
+ ffiTestFunctions.lookupFunction<
+ StructStruct32BytesHomogeneousDouble2 Function(
+ StructStruct32BytesHomogeneousDouble2),
+ StructStruct32BytesHomogeneousDouble2 Function(
+ StructStruct32BytesHomogeneousDouble2)>(
+ "ReturnStructArgumentStructStruct32BytesHomogeneous",
+ isLeaf: true);
+
+/// Return value in FPU registers on arm64.
+void testReturnStructArgumentStructStruct32BytesHomogeneousLeaf() {
+ 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 = returnStructArgumentStructStruct32BytesHomogeneousLeaf(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);
+}
+
+final returnStructArgumentStructStruct16BytesMixed3Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3),
+ StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3)>(
+ "ReturnStructArgumentStructStruct16BytesMixed3",
+ isLeaf: true);
+
+/// On x64 Linux, return value is split over FP and int registers.
+void testReturnStructArgumentStructStruct16BytesMixed3Leaf() {
+ 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 = returnStructArgumentStructStruct16BytesMixed3Leaf(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);
+}
+
+final returnStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
+ StructAlignmentInt16 Function(Int8, Int16, Int8),
+ StructAlignmentInt16 Function(
+ int, int, int)>("ReturnStructAlignmentInt16", isLeaf: true);
+
+/// Test alignment and padding of 16 byte int within struct.
+void testReturnStructAlignmentInt16Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStructAlignmentInt16Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
+ StructAlignmentInt32 Function(Int8, Int32, Int8),
+ StructAlignmentInt32 Function(
+ int, int, int)>("ReturnStructAlignmentInt32", isLeaf: true);
+
+/// Test alignment and padding of 32 byte int within struct.
+void testReturnStructAlignmentInt32Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStructAlignmentInt32Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
+ StructAlignmentInt64 Function(Int8, Int64, Int8),
+ StructAlignmentInt64 Function(
+ int, int, int)>("ReturnStructAlignmentInt64", isLeaf: true);
+
+/// Test alignment and padding of 64 byte int within struct.
+void testReturnStructAlignmentInt64Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStructAlignmentInt64Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedInt Function(
+ Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16),
+ Struct8BytesNestedInt Function(
+ Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16)>(
+ "ReturnStruct8BytesNestedInt",
+ isLeaf: true);
+
+/// Simple nested struct.
+void testReturnStruct8BytesNestedIntLeaf() {
+ 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 = returnStruct8BytesNestedIntLeaf(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);
+}
+
+final returnStruct8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedFloat Function(Struct4BytesFloat, Struct4BytesFloat),
+ Struct8BytesNestedFloat Function(Struct4BytesFloat,
+ Struct4BytesFloat)>("ReturnStruct8BytesNestedFloat", isLeaf: true);
+
+/// Simple nested struct with floats.
+void testReturnStruct8BytesNestedFloatLeaf() {
+ 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 = returnStruct8BytesNestedFloatLeaf(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);
+}
+
+final returnStruct8BytesNestedFloat2Leaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedFloat2 Function(Struct4BytesFloat, Float),
+ Struct8BytesNestedFloat2 Function(Struct4BytesFloat,
+ double)>("ReturnStruct8BytesNestedFloat2", isLeaf: true);
+
+/// The nesting is irregular, testing homogenous float rules on arm and arm64,
+/// and the fpu register usage on x64.
+void testReturnStruct8BytesNestedFloat2Leaf() {
+ final a0Pointer = calloc<Struct4BytesFloat>();
+ final Struct4BytesFloat a0 = a0Pointer.ref;
+ double a1;
+
+ a0.a0 = -1.0;
+ a1 = 2.0;
+
+ final result = returnStruct8BytesNestedFloat2Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0.a0, result.a0.a0);
+ Expect.approxEquals(a1, result.a1);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStruct8BytesNestedMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedMixed Function(
+ Struct4BytesHomogeneousInt16, Struct4BytesFloat),
+ Struct8BytesNestedMixed Function(Struct4BytesHomogeneousInt16,
+ Struct4BytesFloat)>("ReturnStruct8BytesNestedMixed", isLeaf: true);
+
+/// Simple nested struct with mixed members.
+void testReturnStruct8BytesNestedMixedLeaf() {
+ 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 = returnStruct8BytesNestedMixedLeaf(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);
+}
+
+final returnStruct16BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesNestedInt Function(
+ Struct8BytesNestedInt, Struct8BytesNestedInt),
+ Struct16BytesNestedInt Function(Struct8BytesNestedInt,
+ Struct8BytesNestedInt)>("ReturnStruct16BytesNestedInt", isLeaf: true);
+
+/// Deeper nested struct to test recursive member access.
+void testReturnStruct16BytesNestedIntLeaf() {
+ 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 = returnStruct16BytesNestedIntLeaf(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);
+}
+
+final returnStruct32BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct32BytesNestedInt Function(
+ Struct16BytesNestedInt, Struct16BytesNestedInt),
+ Struct32BytesNestedInt Function(Struct16BytesNestedInt,
+ Struct16BytesNestedInt)>("ReturnStruct32BytesNestedInt", isLeaf: true);
+
+/// Even deeper nested struct to test recursive member access.
+void testReturnStruct32BytesNestedIntLeaf() {
+ 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 = returnStruct32BytesNestedIntLeaf(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);
+}
+
+final returnStructNestedIntStructAlignmentInt16Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIntStructAlignmentInt16 Function(
+ StructAlignmentInt16, StructAlignmentInt16),
+ StructNestedIntStructAlignmentInt16 Function(
+ StructAlignmentInt16, StructAlignmentInt16)>(
+ "ReturnStructNestedIntStructAlignmentInt16",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 16 byte int.
+void testReturnStructNestedIntStructAlignmentInt16Leaf() {
+ 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 = returnStructNestedIntStructAlignmentInt16Leaf(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);
+}
+
+final returnStructNestedIntStructAlignmentInt32Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIntStructAlignmentInt32 Function(
+ StructAlignmentInt32, StructAlignmentInt32),
+ StructNestedIntStructAlignmentInt32 Function(
+ StructAlignmentInt32, StructAlignmentInt32)>(
+ "ReturnStructNestedIntStructAlignmentInt32",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 32 byte int.
+void testReturnStructNestedIntStructAlignmentInt32Leaf() {
+ 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 = returnStructNestedIntStructAlignmentInt32Leaf(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);
+}
+
+final returnStructNestedIntStructAlignmentInt64Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIntStructAlignmentInt64 Function(
+ StructAlignmentInt64, StructAlignmentInt64),
+ StructNestedIntStructAlignmentInt64 Function(
+ StructAlignmentInt64, StructAlignmentInt64)>(
+ "ReturnStructNestedIntStructAlignmentInt64",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 64 byte int.
+void testReturnStructNestedIntStructAlignmentInt64Leaf() {
+ 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 = returnStructNestedIntStructAlignmentInt64Leaf(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);
+}
+
+final returnStructNestedIrregularEvenBiggerLeaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIrregularEvenBigger Function(Uint64,
+ StructNestedIrregularBigger, StructNestedIrregularBigger, Double),
+ StructNestedIrregularEvenBigger Function(
+ int,
+ StructNestedIrregularBigger,
+ StructNestedIrregularBigger,
+ double)>("ReturnStructNestedIrregularEvenBigger", isLeaf: true);
+
+/// Return big irregular struct as smoke test.
+void testReturnStructNestedIrregularEvenBiggerLeaf() {
+ 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 = returnStructNestedIrregularEvenBiggerLeaf(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);
+}
diff --git a/tests/ffi/function_structs_by_value_generated_test.dart b/tests/ffi/function_structs_by_value_generated_test.dart
index 9504081..14557da 100644
--- a/tests/ffi/function_structs_by_value_generated_test.dart
+++ b/tests/ffi/function_structs_by_value_generated_test.dart
@@ -3,6 +3,7 @@
// 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=
@@ -17,6 +18,9 @@
import 'dylib_utils.dart';
+// Reuse the compound classes.
+import 'function_structs_by_value_generated_compounds.dart';
+
final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
for (int i = 0; i < 10; ++i) {
@@ -133,1324 +137,9 @@
testReturnStructNestedIntStructAlignmentInt32();
testReturnStructNestedIntStructAlignmentInt64();
testReturnStructNestedIrregularEvenBigger();
- testPassStruct1ByteIntx10Leaf();
- testPassStruct3BytesHomogeneousUint8x10Leaf();
- testPassStruct3BytesInt2ByteAlignedx10Leaf();
- testPassStruct4BytesHomogeneousInt16x10Leaf();
- testPassStruct7BytesHomogeneousUint8x10Leaf();
- testPassStruct7BytesInt4ByteAlignedx10Leaf();
- testPassStruct8BytesIntx10Leaf();
- testPassStruct8BytesHomogeneousFloatx10Leaf();
- testPassStruct8BytesMixedx10Leaf();
- testPassStruct9BytesHomogeneousUint8x10Leaf();
- testPassStruct9BytesInt4Or8ByteAlignedx10Leaf();
- testPassStruct12BytesHomogeneousFloatx6Leaf();
- testPassStruct16BytesHomogeneousFloatx5Leaf();
- testPassStruct16BytesMixedx10Leaf();
- testPassStruct16BytesMixed2x10Leaf();
- testPassStruct17BytesIntx10Leaf();
- testPassStruct19BytesHomogeneousUint8x10Leaf();
- testPassStruct20BytesHomogeneousInt32x10Leaf();
- testPassStruct20BytesHomogeneousFloatLeaf();
- testPassStruct32BytesHomogeneousDoublex5Leaf();
- testPassStruct40BytesHomogeneousDoubleLeaf();
- testPassStruct1024BytesHomogeneousUint64Leaf();
- testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf();
- testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf();
- testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf();
- testPassDoublex6Struct16BytesMixedx4Int32Leaf();
- testPassInt32x4Struct16BytesMixedx4DoubleLeaf();
- testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf();
- testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf();
- testPassStructAlignmentInt16Leaf();
- testPassStructAlignmentInt32Leaf();
- testPassStructAlignmentInt64Leaf();
- testPassStruct8BytesNestedIntx10Leaf();
- testPassStruct8BytesNestedFloatx10Leaf();
- testPassStruct8BytesNestedFloat2x10Leaf();
- testPassStruct8BytesNestedMixedx10Leaf();
- testPassStruct16BytesNestedIntx2Leaf();
- testPassStruct32BytesNestedIntx2Leaf();
- testPassStructNestedIntStructAlignmentInt16Leaf();
- testPassStructNestedIntStructAlignmentInt32Leaf();
- testPassStructNestedIntStructAlignmentInt64Leaf();
- testPassStructNestedIrregularEvenBiggerx4Leaf();
- testPassStruct8BytesInlineArrayIntx4Leaf();
- testPassStructInlineArrayIrregularx4Leaf();
- testPassStructInlineArray100BytesLeaf();
- testPassStructStruct16BytesHomogeneousFloat2x5Leaf();
- testPassStructStruct32BytesHomogeneousDouble2x5Leaf();
- testPassStructStruct16BytesMixed3x10Leaf();
- testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf();
- testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf();
- testPassStruct3BytesPackedIntx10Leaf();
- testPassStruct8BytesPackedIntx10Leaf();
- testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf();
- testPassStruct5BytesPackedMixedLeaf();
- testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf();
- testPassStruct6BytesInlineArrayIntLeaf();
- testPassStruct15BytesInlineArrayMixedLeaf();
- testPassUnion4BytesMixedx10Leaf();
- testPassUnion8BytesNestedFloatx10Leaf();
- testPassUnion9BytesNestedIntx10Leaf();
- testPassUnion16BytesNestedInlineArrayFloatx10Leaf();
- testPassUnion16BytesNestedFloatx10Leaf();
- testReturnStruct1ByteIntLeaf();
- testReturnStruct3BytesHomogeneousUint8Leaf();
- testReturnStruct3BytesInt2ByteAlignedLeaf();
- testReturnStruct4BytesHomogeneousInt16Leaf();
- testReturnStruct7BytesHomogeneousUint8Leaf();
- testReturnStruct7BytesInt4ByteAlignedLeaf();
- testReturnStruct8BytesIntLeaf();
- testReturnStruct8BytesHomogeneousFloatLeaf();
- testReturnStruct8BytesMixedLeaf();
- testReturnStruct9BytesHomogeneousUint8Leaf();
- testReturnStruct9BytesInt4Or8ByteAlignedLeaf();
- testReturnStruct12BytesHomogeneousFloatLeaf();
- testReturnStruct16BytesHomogeneousFloatLeaf();
- testReturnStruct16BytesMixedLeaf();
- testReturnStruct16BytesMixed2Leaf();
- testReturnStruct17BytesIntLeaf();
- testReturnStruct19BytesHomogeneousUint8Leaf();
- testReturnStruct20BytesHomogeneousInt32Leaf();
- testReturnStruct20BytesHomogeneousFloatLeaf();
- testReturnStruct32BytesHomogeneousDoubleLeaf();
- testReturnStruct40BytesHomogeneousDoubleLeaf();
- testReturnStruct1024BytesHomogeneousUint64Leaf();
- testReturnStruct3BytesPackedIntLeaf();
- testReturnStruct8BytesPackedIntLeaf();
- testReturnStruct9BytesPackedMixedLeaf();
- testReturnUnion4BytesMixedLeaf();
- testReturnUnion8BytesNestedFloatLeaf();
- testReturnUnion9BytesNestedIntLeaf();
- testReturnUnion16BytesNestedFloatLeaf();
- testReturnStructArgumentStruct1ByteIntLeaf();
- testReturnStructArgumentInt32x8Struct1ByteIntLeaf();
- testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf();
- testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf();
- testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf();
- testReturnStructArgumentStruct8BytesInlineArrayIntLeaf();
- testReturnStructArgumentStructStruct16BytesHomogeneousLeaf();
- testReturnStructArgumentStructStruct32BytesHomogeneousLeaf();
- testReturnStructArgumentStructStruct16BytesMixed3Leaf();
- testReturnStructAlignmentInt16Leaf();
- testReturnStructAlignmentInt32Leaf();
- testReturnStructAlignmentInt64Leaf();
- testReturnStruct8BytesNestedIntLeaf();
- testReturnStruct8BytesNestedFloatLeaf();
- testReturnStruct8BytesNestedFloat2Leaf();
- testReturnStruct8BytesNestedMixedLeaf();
- testReturnStruct16BytesNestedIntLeaf();
- testReturnStruct32BytesNestedIntLeaf();
- testReturnStructNestedIntStructAlignmentInt16Leaf();
- testReturnStructNestedIntStructAlignmentInt32Leaf();
- testReturnStructNestedIntStructAlignmentInt64Leaf();
- testReturnStructNestedIrregularEvenBiggerLeaf();
}
}
-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 Struct8BytesFloat extends Struct {
- @Double()
- external double a0;
-
- String toString() => "(${a0})";
-}
-
-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})";
-}
-
-class Struct8BytesInlineArrayInt extends Struct {
- @Array(8)
- external Array<Uint8> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 8; i0 += 1) a0[i0]]})";
-}
-
-class StructInlineArrayIrregular extends Struct {
- @Array(2)
- external Array<Struct3BytesInt2ByteAligned> a0;
-
- @Uint8()
- external int a1;
-
- String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]}, ${a1})";
-}
-
-class StructInlineArray100Bytes extends Struct {
- @Array(100)
- external Array<Uint8> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 100; i0 += 1) a0[i0]]})";
-}
-
-class StructInlineArrayBig extends Struct {
- @Uint32()
- external int a0;
-
- @Uint32()
- external int a1;
-
- @Array(4000)
- external Array<Uint8> a2;
-
- String toString() =>
- "(${a0}, ${a1}, ${[for (var i0 = 0; i0 < 4000; i0 += 1) a2[i0]]})";
-}
-
-class StructStruct16BytesHomogeneousFloat2 extends Struct {
- external Struct4BytesFloat a0;
-
- @Array(2)
- external Array<Struct4BytesFloat> a1;
-
- @Float()
- external double a2;
-
- String toString() =>
- "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
-}
-
-class StructStruct32BytesHomogeneousDouble2 extends Struct {
- external Struct8BytesFloat a0;
-
- @Array(2)
- external Array<Struct8BytesFloat> a1;
-
- @Double()
- external double a2;
-
- String toString() =>
- "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
-}
-
-class StructStruct16BytesMixed3 extends Struct {
- external Struct4BytesFloat a0;
-
- @Array(1)
- external Array<Struct8BytesMixed> a1;
-
- @Array(2)
- external Array<Int16> a2;
-
- String toString() => "(${a0}, ${[
- for (var i0 = 0; i0 < 1; i0 += 1) a1[i0]
- ]}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a2[i0]]})";
-}
-
-class Struct8BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array(2, 2, 2)
- external Array<Array<Array<Uint8>>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [
- for (var i1 = 0; i1 < 2; i1 += 1)
- [for (var i2 = 0; i2 < 2; i2 += 1) a0[i0][i1][i2]]
- ]
- ]})";
-}
-
-class Struct32BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array(2, 2, 2, 2, 2)
- external Array<Array<Array<Array<Array<Uint8>>>>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [
- for (var i1 = 0; i1 < 2; i1 += 1)
- [
- for (var i2 = 0; i2 < 2; i2 += 1)
- [
- for (var i3 = 0; i3 < 2; i3 += 1)
- [for (var i4 = 0; i4 < 2; i4 += 1) a0[i0][i1][i2][i3][i4]]
- ]
- ]
- ]
- ]})";
-}
-
-class Struct64BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array.multi([2, 2, 2, 2, 2, 2])
- external Array<Array<Array<Array<Array<Array<Uint8>>>>>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [
- for (var i1 = 0; i1 < 2; i1 += 1)
- [
- for (var i2 = 0; i2 < 2; i2 += 1)
- [
- for (var i3 = 0; i3 < 2; i3 += 1)
- [
- for (var i4 = 0; i4 < 2; i4 += 1)
- [
- for (var i5 = 0; i5 < 2; i5 += 1)
- a0[i0][i1][i2][i3][i4][i5]
- ]
- ]
- ]
- ]
- ]
- ]})";
-}
-
-class Struct4BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array(2, 2)
- external Array<Array<Struct1ByteInt>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [for (var i1 = 0; i1 < 2; i1 += 1) a0[i0][i1]]
- ]})";
-}
-
-@Packed(1)
-class Struct3BytesPackedInt extends Struct {
- @Int8()
- external int a0;
-
- @Int16()
- external int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-@Packed(1)
-class Struct3BytesPackedIntMembersAligned extends Struct {
- @Int8()
- external int a0;
-
- @Int16()
- external int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-@Packed(1)
-class Struct5BytesPackedMixed extends Struct {
- @Float()
- external double a0;
-
- @Uint8()
- external int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class StructNestedAlignmentStruct5BytesPackedMixed extends Struct {
- @Uint8()
- external int a0;
-
- external Struct5BytesPackedMixed a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct6BytesInlineArrayInt extends Struct {
- @Array(2)
- external Array<Struct3BytesPackedIntMembersAligned> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]})";
-}
-
-@Packed(1)
-class Struct8BytesPackedInt extends Struct {
- @Uint8()
- external int a0;
-
- @Uint32()
- external int a1;
-
- @Uint8()
- external int a2;
-
- @Uint8()
- external int a3;
-
- @Uint8()
- external int a4;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
-}
-
-@Packed(1)
-class Struct9BytesPackedMixed extends Struct {
- @Uint8()
- external int a0;
-
- @Double()
- external double a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct15BytesInlineArrayMixed extends Struct {
- @Array(3)
- external Array<Struct5BytesPackedMixed> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 3; i0 += 1) a0[i0]]})";
-}
-
-class Union4BytesMixed extends Union {
- @Uint32()
- external int a0;
-
- @Float()
- external double a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Union8BytesNestedFloat extends Union {
- @Double()
- external double a0;
-
- external Struct8BytesHomogeneousFloat a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Union9BytesNestedInt extends Union {
- external Struct8BytesInt a0;
-
- external Struct9BytesHomogeneousUint8 a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Union16BytesNestedInlineArrayFloat extends Union {
- @Array(4)
- external Array<Float> a0;
-
- external Struct16BytesHomogeneousFloat a1;
-
- String toString() => "(${[for (var i0 = 0; i0 < 4; i0 += 1) a0[i0]]}, ${a1})";
-}
-
-class Union16BytesNestedFloat extends Union {
- external Struct8BytesHomogeneousFloat a0;
-
- external Struct12BytesHomogeneousFloat a1;
-
- external Struct16BytesHomogeneousFloat a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
final passStruct1ByteIntx10 = ffiTestFunctions.lookupFunction<
Int64 Function(
Struct1ByteInt,
@@ -8887,7545 +7576,3 @@
calloc.free(a1Pointer);
calloc.free(a2Pointer);
}
-
-final passStruct1ByteIntx10Leaf = 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", isLeaf: true);
-
-/// Smallest struct with data.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct1ByteIntx10Leaf() {
- 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 =
- passStruct1ByteIntx10Leaf(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 passStruct3BytesHomogeneousUint8x10Leaf = 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",
- isLeaf: true);
-
-/// Not a multiple of word size, not a power of two.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct3BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct3BytesHomogeneousUint8x10Leaf(
- 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 passStruct3BytesInt2ByteAlignedx10Leaf = 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",
- isLeaf: true);
-
-/// 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 testPassStruct3BytesInt2ByteAlignedx10Leaf() {
- 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 = passStruct3BytesInt2ByteAlignedx10Leaf(
- 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 passStruct4BytesHomogeneousInt16x10Leaf = 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",
- isLeaf: true);
-
-/// Exactly word size on 32-bit architectures.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct4BytesHomogeneousInt16x10Leaf() {
- 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 = passStruct4BytesHomogeneousInt16x10Leaf(
- 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 passStruct7BytesHomogeneousUint8x10Leaf = 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",
- isLeaf: true);
-
-/// Sub word size on 64 bit architectures.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct7BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct7BytesHomogeneousUint8x10Leaf(
- 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 passStruct7BytesInt4ByteAlignedx10Leaf = 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",
- isLeaf: true);
-
-/// 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 testPassStruct7BytesInt4ByteAlignedx10Leaf() {
- 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 = passStruct7BytesInt4ByteAlignedx10Leaf(
- 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 passStruct8BytesIntx10Leaf = 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", isLeaf: true);
-
-/// Exactly word size struct on 64bit architectures.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct8BytesIntx10Leaf() {
- 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 =
- passStruct8BytesIntx10Leaf(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 passStruct8BytesHomogeneousFloatx10Leaf = 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",
- isLeaf: true);
-
-/// Arguments passed in FP registers as long as they fit.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct8BytesHomogeneousFloatx10Leaf() {
- 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 = passStruct8BytesHomogeneousFloatx10Leaf(
- 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 passStruct8BytesMixedx10Leaf = 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", isLeaf: true);
-
-/// On x64, arguments go in int registers because it is not only float.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct8BytesMixedx10Leaf() {
- 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 =
- passStruct8BytesMixedx10Leaf(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 passStruct9BytesHomogeneousUint8x10Leaf = 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",
- isLeaf: true);
-
-/// 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 testPassStruct9BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct9BytesHomogeneousUint8x10Leaf(
- 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 passStruct9BytesInt4Or8ByteAlignedx10Leaf =
- 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",
- isLeaf: true);
-
-/// 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 testPassStruct9BytesInt4Or8ByteAlignedx10Leaf() {
- 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 = passStruct9BytesInt4Or8ByteAlignedx10Leaf(
- 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 passStruct12BytesHomogeneousFloatx6Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat),
- double Function(
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat)>(
- "PassStruct12BytesHomogeneousFloatx6",
- isLeaf: true);
-
-/// 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 testPassStruct12BytesHomogeneousFloatx6Leaf() {
- 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 =
- passStruct12BytesHomogeneousFloatx6Leaf(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 passStruct16BytesHomogeneousFloatx5Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat),
- double Function(
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat)>(
- "PassStruct16BytesHomogeneousFloatx5",
- isLeaf: true);
-
-/// 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 testPassStruct16BytesHomogeneousFloatx5Leaf() {
- 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 = passStruct16BytesHomogeneousFloatx5Leaf(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 passStruct16BytesMixedx10Leaf = 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", isLeaf: true);
-
-/// 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 testPassStruct16BytesMixedx10Leaf() {
- 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 =
- passStruct16BytesMixedx10Leaf(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 passStruct16BytesMixed2x10Leaf = 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", isLeaf: true);
-
-/// 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 testPassStruct16BytesMixed2x10Leaf() {
- 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 =
- passStruct16BytesMixed2x10Leaf(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 passStruct17BytesIntx10Leaf = 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", isLeaf: true);
-
-/// Arguments are passed as pointer to copy on arm64.
-/// Tests that the memory allocated for copies are rounded up to word size.
-void testPassStruct17BytesIntx10Leaf() {
- 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 =
- passStruct17BytesIntx10Leaf(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 passStruct19BytesHomogeneousUint8x10Leaf =
- 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",
- isLeaf: true);
-
-/// 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 testPassStruct19BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct19BytesHomogeneousUint8x10Leaf(
- 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 passStruct20BytesHomogeneousInt32x10Leaf =
- 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",
- isLeaf: true);
-
-/// 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 testPassStruct20BytesHomogeneousInt32x10Leaf() {
- 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 = passStruct20BytesHomogeneousInt32x10Leaf(
- 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 passStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Float Function(Struct20BytesHomogeneousFloat),
- double Function(Struct20BytesHomogeneousFloat)>(
- "PassStruct20BytesHomogeneousFloat",
- isLeaf: true);
-
-/// Argument too big to go into FPU registers in hardfp and arm64.
-void testPassStruct20BytesHomogeneousFloatLeaf() {
- 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 = passStruct20BytesHomogeneousFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(-3.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct32BytesHomogeneousDoublex5Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble),
- double Function(
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble)>(
- "PassStruct32BytesHomogeneousDoublex5",
- isLeaf: true);
-
-/// Arguments in FPU registers on arm64.
-/// 5 struct arguments will exhaust available registers.
-void testPassStruct32BytesHomogeneousDoublex5Leaf() {
- 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 = passStruct32BytesHomogeneousDoublex5Leaf(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 passStruct40BytesHomogeneousDoubleLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct40BytesHomogeneousDouble),
- double Function(Struct40BytesHomogeneousDouble)>(
- "PassStruct40BytesHomogeneousDouble",
- isLeaf: true);
-
-/// Argument too big to go into FPU registers in arm64.
-void testPassStruct40BytesHomogeneousDoubleLeaf() {
- 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 = passStruct40BytesHomogeneousDoubleLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(-3.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct1024BytesHomogeneousUint64Leaf =
- ffiTestFunctions.lookupFunction<
- Uint64 Function(Struct1024BytesHomogeneousUint64),
- int Function(Struct1024BytesHomogeneousUint64)>(
- "PassStruct1024BytesHomogeneousUint64",
- isLeaf: true);
-
-/// Test 1kb struct.
-void testPassStruct1024BytesHomogeneousUint64Leaf() {
- 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;
- a0.a124 = 125;
- a0.a125 = 126;
- a0.a126 = 127;
- a0.a127 = 128;
-
- final result = passStruct1024BytesHomogeneousUint64Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(8256, result);
-
- calloc.free(a0Pointer);
-}
-
-final passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf =
- ffiTestFunctions.lookupFunction<
- Float Function(
- Float,
- Struct16BytesHomogeneousFloat,
- Float,
- Struct16BytesHomogeneousFloat,
- Float,
- Struct16BytesHomogeneousFloat,
- Float,
- Struct16BytesHomogeneousFloat,
- Float),
- double Function(
- double,
- Struct16BytesHomogeneousFloat,
- double,
- Struct16BytesHomogeneousFloat,
- double,
- Struct16BytesHomogeneousFloat,
- double,
- Struct16BytesHomogeneousFloat,
- double)>("PassFloatStruct16BytesHomogeneousFloatFloatStruct1",
- isLeaf: true);
-
-/// Tests the alignment of structs in FPU registers and backfilling.
-void testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf() {
- double a0;
- final a1Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a1 = a1Pointer.ref;
- double a2;
- final a3Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a3 = a3Pointer.ref;
- double a4;
- final a5Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a5 = a5Pointer.ref;
- double a6;
- final a7Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a7 = a7Pointer.ref;
- double a8;
-
- a0 = -1.0;
- a1.a0 = 2.0;
- a1.a1 = -3.0;
- a1.a2 = 4.0;
- a1.a3 = -5.0;
- a2 = 6.0;
- a3.a0 = -7.0;
- a3.a1 = 8.0;
- a3.a2 = -9.0;
- a3.a3 = 10.0;
- a4 = -11.0;
- a5.a0 = 12.0;
- a5.a1 = -13.0;
- a5.a2 = 14.0;
- a5.a3 = -15.0;
- a6 = 16.0;
- a7.a0 = -17.0;
- a7.a1 = 18.0;
- a7.a2 = -19.0;
- a7.a3 = 20.0;
- a8 = -21.0;
-
- final result = passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-11.0, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
- calloc.free(a7Pointer);
-}
-
-final passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Float,
- Struct32BytesHomogeneousDouble,
- Float,
- Struct32BytesHomogeneousDouble,
- Float,
- Struct32BytesHomogeneousDouble,
- Float,
- Struct32BytesHomogeneousDouble,
- Float),
- double Function(
- double,
- Struct32BytesHomogeneousDouble,
- double,
- Struct32BytesHomogeneousDouble,
- double,
- Struct32BytesHomogeneousDouble,
- double,
- Struct32BytesHomogeneousDouble,
- double)>("PassFloatStruct32BytesHomogeneousDoubleFloatStruct",
- isLeaf: true);
-
-/// Tests the alignment of structs in FPU registers and backfilling.
-void testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf() {
- double a0;
- final a1Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a1 = a1Pointer.ref;
- double a2;
- final a3Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a3 = a3Pointer.ref;
- double a4;
- final a5Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a5 = a5Pointer.ref;
- double a6;
- final a7Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a7 = a7Pointer.ref;
- double a8;
-
- a0 = -1.0;
- a1.a0 = 2.0;
- a1.a1 = -3.0;
- a1.a2 = 4.0;
- a1.a3 = -5.0;
- a2 = 6.0;
- a3.a0 = -7.0;
- a3.a1 = 8.0;
- a3.a2 = -9.0;
- a3.a3 = 10.0;
- a4 = -11.0;
- a5.a0 = 12.0;
- a5.a1 = -13.0;
- a5.a2 = 14.0;
- a5.a3 = -15.0;
- a6 = 16.0;
- a7.a0 = -17.0;
- a7.a1 = 18.0;
- a7.a2 = -19.0;
- a7.a3 = 20.0;
- a8 = -21.0;
-
- final result = passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-11.0, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
- calloc.free(a7Pointer);
-}
-
-final passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed,
- Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8),
- double Function(
- int,
- Struct16BytesMixed,
- int,
- Struct16BytesMixed,
- int,
- Struct16BytesMixed,
- int,
- Struct16BytesMixed,
- int)>("PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn",
- isLeaf: true);
-
-/// Tests the alignment of structs in integers registers and on the stack.
-/// Arm32 aligns this struct at 8.
-/// Also, arm32 allocates the second struct partially in registers, partially
-/// on stack.
-/// Test backfilling of integer registers.
-void testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf() {
- int a0;
- final a1Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a1 = a1Pointer.ref;
- int a2;
- final a3Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a3 = a3Pointer.ref;
- int a4;
- final a5Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a5 = a5Pointer.ref;
- int a6;
- final a7Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a7 = a7Pointer.ref;
- int a8;
-
- a0 = -1;
- a1.a0 = 2.0;
- a1.a1 = -3;
- a2 = 4;
- a3.a0 = -5.0;
- a3.a1 = 6;
- a4 = -7;
- a5.a0 = 8.0;
- a5.a1 = -9;
- a6 = 10;
- a7.a0 = -11.0;
- a7.a1 = 12;
- a8 = -13;
-
- final result = passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-7.0, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
- calloc.free(a7Pointer);
-}
-
-final passDoublex6Struct16BytesMixedx4Int32Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Int32),
- double Function(
- double,
- double,
- double,
- double,
- double,
- double,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- int)>("PassDoublex6Struct16BytesMixedx4Int32", isLeaf: true);
-
-/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
-/// structs. The rest of the structs will go on the stack.
-/// The int will be backfilled into the int register.
-void testPassDoublex6Struct16BytesMixedx4Int32Leaf() {
- double a0;
- double a1;
- double a2;
- double a3;
- double a4;
- double a5;
- 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;
- int a10;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
- a4 = -5.0;
- a5 = 6.0;
- a6.a0 = -7.0;
- a6.a1 = 8;
- a7.a0 = -9.0;
- a7.a1 = 10;
- a8.a0 = -11.0;
- a8.a1 = 12;
- a9.a0 = -13.0;
- a9.a1 = 14;
- a10 = -15;
-
- final result = passDoublex6Struct16BytesMixedx4Int32Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
-
- print("result = $result");
-
- Expect.approxEquals(-8.0, result);
-
- calloc.free(a6Pointer);
- calloc.free(a7Pointer);
- calloc.free(a8Pointer);
- calloc.free(a9Pointer);
-}
-
-final passInt32x4Struct16BytesMixedx4DoubleLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(Int32, Int32, Int32, Int32, Struct16BytesMixed,
- Struct16BytesMixed, Struct16BytesMixed, Struct16BytesMixed, Double),
- double Function(
- int,
- int,
- int,
- int,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- double)>("PassInt32x4Struct16BytesMixedx4Double", isLeaf: true);
-
-/// On Linux x64, it will exhaust int registers first.
-/// The rest of the structs will go on the stack.
-/// The double will be backfilled into the xmm register.
-void testPassInt32x4Struct16BytesMixedx4DoubleLeaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- 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;
- double a8;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
- a3 = 4;
- a4.a0 = -5.0;
- a4.a1 = 6;
- a5.a0 = -7.0;
- a5.a1 = 8;
- a6.a0 = -9.0;
- a6.a1 = 10;
- a7.a0 = -11.0;
- a7.a1 = 12;
- a8 = -13.0;
-
- final result = passInt32x4Struct16BytesMixedx4DoubleLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-7.0, result);
-
- calloc.free(a4Pointer);
- calloc.free(a5Pointer);
- calloc.free(a6Pointer);
- calloc.free(a7Pointer);
-}
-
-final passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(Struct40BytesHomogeneousDouble,
- Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat),
- double Function(Struct40BytesHomogeneousDouble,
- Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat)>(
- "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo",
- isLeaf: true);
-
-/// On various architectures, first struct is allocated on stack.
-/// Check that the other two arguments are allocated on registers.
-void testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf() {
- final a0Pointer = calloc<Struct40BytesHomogeneousDouble>();
- final Struct40BytesHomogeneousDouble a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct4BytesHomogeneousInt16>();
- final Struct4BytesHomogeneousInt16 a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a2 = a2Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2.0;
- a0.a2 = -3.0;
- a0.a3 = 4.0;
- a0.a4 = -5.0;
- a1.a0 = 6;
- a1.a1 = -7;
- a2.a0 = 8.0;
- a2.a1 = -9.0;
-
- final result =
- passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.approxEquals(-5.0, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
-}
-
-final passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Int64,
- Int8,
- Struct1ByteInt,
- Int64,
- Int8,
- Struct4BytesHomogeneousInt16,
- Int64,
- Int8,
- Struct8BytesInt,
- Int64,
- Int8,
- Struct8BytesHomogeneousFloat,
- Int64,
- Int8,
- Struct8BytesMixed,
- Int64,
- Int8,
- StructAlignmentInt16,
- Int64,
- Int8,
- StructAlignmentInt32,
- Int64,
- Int8,
- StructAlignmentInt64),
- double Function(
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- double,
- double,
- double,
- double,
- double,
- double,
- double,
- double,
- int,
- int,
- Struct1ByteInt,
- int,
- int,
- Struct4BytesHomogeneousInt16,
- int,
- int,
- Struct8BytesInt,
- int,
- int,
- Struct8BytesHomogeneousFloat,
- int,
- int,
- Struct8BytesMixed,
- int,
- int,
- StructAlignmentInt16,
- int,
- int,
- StructAlignmentInt32,
- int,
- int,
- StructAlignmentInt64)>("PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int", isLeaf: true);
-
-/// Test alignment and padding of 16 byte int within struct.
-void testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- double a8;
- double a9;
- double a10;
- double a11;
- double a12;
- double a13;
- double a14;
- double a15;
- int a16;
- int a17;
- final a18Pointer = calloc<Struct1ByteInt>();
- final Struct1ByteInt a18 = a18Pointer.ref;
- int a19;
- int a20;
- final a21Pointer = calloc<Struct4BytesHomogeneousInt16>();
- final Struct4BytesHomogeneousInt16 a21 = a21Pointer.ref;
- int a22;
- int a23;
- final a24Pointer = calloc<Struct8BytesInt>();
- final Struct8BytesInt a24 = a24Pointer.ref;
- int a25;
- int a26;
- final a27Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a27 = a27Pointer.ref;
- int a28;
- int a29;
- final a30Pointer = calloc<Struct8BytesMixed>();
- final Struct8BytesMixed a30 = a30Pointer.ref;
- int a31;
- int a32;
- final a33Pointer = calloc<StructAlignmentInt16>();
- final StructAlignmentInt16 a33 = a33Pointer.ref;
- int a34;
- int a35;
- final a36Pointer = calloc<StructAlignmentInt32>();
- final StructAlignmentInt32 a36 = a36Pointer.ref;
- int a37;
- int a38;
- final a39Pointer = calloc<StructAlignmentInt64>();
- final StructAlignmentInt64 a39 = a39Pointer.ref;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
- a3 = 4;
- a4 = -5;
- a5 = 6;
- a6 = -7;
- a7 = 8;
- a8 = -9.0;
- a9 = 10.0;
- a10 = -11.0;
- a11 = 12.0;
- a12 = -13.0;
- a13 = 14.0;
- a14 = -15.0;
- a15 = 16.0;
- a16 = -17;
- a17 = 18;
- a18.a0 = -19;
- a19 = 20;
- a20 = -21;
- a21.a0 = 22;
- a21.a1 = -23;
- a22 = 24;
- a23 = -25;
- a24.a0 = 26;
- a24.a1 = -27;
- a24.a2 = 28;
- a25 = -29;
- a26 = 30;
- a27.a0 = -31.0;
- a27.a1 = 32.0;
- a28 = -33;
- a29 = 34;
- a30.a0 = -35.0;
- a30.a1 = 36;
- a30.a2 = -37;
- a31 = 38;
- a32 = -39;
- a33.a0 = 40;
- a33.a1 = -41;
- a33.a2 = 42;
- a34 = -43;
- a35 = 44;
- a36.a0 = -45;
- a36.a1 = 46;
- a36.a2 = -47;
- a37 = 48;
- a38 = -49;
- a39.a0 = 50;
- a39.a1 = -51;
- a39.a2 = 52;
-
- final result = passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf(
- 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);
-
- print("result = $result");
-
- Expect.approxEquals(26.0, result);
-
- calloc.free(a18Pointer);
- calloc.free(a21Pointer);
- calloc.free(a24Pointer);
- calloc.free(a27Pointer);
- calloc.free(a30Pointer);
- calloc.free(a33Pointer);
- calloc.free(a36Pointer);
- calloc.free(a39Pointer);
-}
-
-final passStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(StructAlignmentInt16),
- int Function(
- StructAlignmentInt16)>("PassStructAlignmentInt16", isLeaf: true);
-
-/// Test alignment and padding of 16 byte int within struct.
-void testPassStructAlignmentInt16Leaf() {
- final a0Pointer = calloc<StructAlignmentInt16>();
- final StructAlignmentInt16 a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = passStructAlignmentInt16Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(-2, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(StructAlignmentInt32),
- int Function(
- StructAlignmentInt32)>("PassStructAlignmentInt32", isLeaf: true);
-
-/// Test alignment and padding of 32 byte int within struct.
-void testPassStructAlignmentInt32Leaf() {
- final a0Pointer = calloc<StructAlignmentInt32>();
- final StructAlignmentInt32 a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = passStructAlignmentInt32Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(-2, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(StructAlignmentInt64),
- int Function(
- StructAlignmentInt64)>("PassStructAlignmentInt64", isLeaf: true);
-
-/// Test alignment and padding of 64 byte int within struct.
-void testPassStructAlignmentInt64Leaf() {
- final a0Pointer = calloc<StructAlignmentInt64>();
- final StructAlignmentInt64 a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = passStructAlignmentInt64Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(-2, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct8BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt),
- int Function(
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt)>("PassStruct8BytesNestedIntx10", isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust registers on all platforms.
-void testPassStruct8BytesNestedIntx10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a9 = a9Pointer.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;
- a2.a0.a0 = -9;
- a2.a0.a1 = 10;
- a2.a1.a0 = -11;
- a2.a1.a1 = 12;
- a3.a0.a0 = -13;
- a3.a0.a1 = 14;
- a3.a1.a0 = -15;
- a3.a1.a1 = 16;
- a4.a0.a0 = -17;
- a4.a0.a1 = 18;
- a4.a1.a0 = -19;
- a4.a1.a1 = 20;
- a5.a0.a0 = -21;
- a5.a0.a1 = 22;
- a5.a1.a0 = -23;
- a5.a1.a1 = 24;
- a6.a0.a0 = -25;
- a6.a0.a1 = 26;
- a6.a1.a0 = -27;
- a6.a1.a1 = 28;
- a7.a0.a0 = -29;
- a7.a0.a1 = 30;
- a7.a1.a0 = -31;
- a7.a1.a1 = 32;
- a8.a0.a0 = -33;
- a8.a0.a1 = 34;
- a8.a1.a0 = -35;
- a8.a1.a1 = 36;
- a9.a0.a0 = -37;
- a9.a0.a1 = 38;
- a9.a1.a0 = -39;
- a9.a1.a1 = 40;
-
- final result =
- passStruct8BytesNestedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.equals(20, 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 passStruct8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat),
- double Function(
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat)>("PassStruct8BytesNestedFloatx10",
- isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust fpu registers on all platforms.
-void testPassStruct8BytesNestedFloatx10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1.a0 = 2.0;
- a1.a0.a0 = -3.0;
- a1.a1.a0 = 4.0;
- a2.a0.a0 = -5.0;
- a2.a1.a0 = 6.0;
- a3.a0.a0 = -7.0;
- a3.a1.a0 = 8.0;
- a4.a0.a0 = -9.0;
- a4.a1.a0 = 10.0;
- a5.a0.a0 = -11.0;
- a5.a1.a0 = 12.0;
- a6.a0.a0 = -13.0;
- a6.a1.a0 = 14.0;
- a7.a0.a0 = -15.0;
- a7.a1.a0 = 16.0;
- a8.a0.a0 = -17.0;
- a8.a1.a0 = 18.0;
- a9.a0.a0 = -19.0;
- a9.a1.a0 = 20.0;
-
- final result = passStruct8BytesNestedFloatx10Leaf(
- 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 passStruct8BytesNestedFloat2x10Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2),
- double Function(
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2)>("PassStruct8BytesNestedFloat2x10",
- isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust fpu registers on all platforms.
-/// The nesting is irregular, testing homogenous float rules on arm and arm64,
-/// and the fpu register usage on x64.
-void testPassStruct8BytesNestedFloat2x10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1 = 2.0;
- a1.a0.a0 = -3.0;
- a1.a1 = 4.0;
- a2.a0.a0 = -5.0;
- a2.a1 = 6.0;
- a3.a0.a0 = -7.0;
- a3.a1 = 8.0;
- a4.a0.a0 = -9.0;
- a4.a1 = 10.0;
- a5.a0.a0 = -11.0;
- a5.a1 = 12.0;
- a6.a0.a0 = -13.0;
- a6.a1 = 14.0;
- a7.a0.a0 = -15.0;
- a7.a1 = 16.0;
- a8.a0.a0 = -17.0;
- a8.a1 = 18.0;
- a9.a0.a0 = -19.0;
- a9.a1 = 20.0;
-
- final result = passStruct8BytesNestedFloat2x10Leaf(
- 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 passStruct8BytesNestedMixedx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed),
- double Function(
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed)>("PassStruct8BytesNestedMixedx10",
- isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust all registers on all platforms.
-void testPassStruct8BytesNestedMixedx10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a1.a0 = -3.0;
- a1.a0.a0 = 4;
- a1.a0.a1 = -5;
- a1.a1.a0 = 6.0;
- a2.a0.a0 = -7;
- a2.a0.a1 = 8;
- a2.a1.a0 = -9.0;
- a3.a0.a0 = 10;
- a3.a0.a1 = -11;
- a3.a1.a0 = 12.0;
- a4.a0.a0 = -13;
- a4.a0.a1 = 14;
- a4.a1.a0 = -15.0;
- a5.a0.a0 = 16;
- a5.a0.a1 = -17;
- a5.a1.a0 = 18.0;
- a6.a0.a0 = -19;
- a6.a0.a1 = 20;
- a6.a1.a0 = -21.0;
- a7.a0.a0 = 22;
- a7.a0.a1 = -23;
- a7.a1.a0 = 24.0;
- a8.a0.a0 = -25;
- a8.a0.a1 = 26;
- a8.a1.a0 = -27.0;
- a9.a0.a0 = 28;
- a9.a0.a1 = -29;
- a9.a1.a0 = 30.0;
-
- final result = passStruct8BytesNestedMixedx10Leaf(
- 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 passStruct16BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(Struct16BytesNestedInt, Struct16BytesNestedInt),
- int Function(Struct16BytesNestedInt,
- Struct16BytesNestedInt)>("PassStruct16BytesNestedIntx2", isLeaf: true);
-
-/// Deeper nested struct to test recursive member access.
-void testPassStruct16BytesNestedIntx2Leaf() {
- 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 = passStruct16BytesNestedIntx2Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(8, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
-}
-
-final passStruct32BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(Struct32BytesNestedInt, Struct32BytesNestedInt),
- int Function(Struct32BytesNestedInt,
- Struct32BytesNestedInt)>("PassStruct32BytesNestedIntx2", isLeaf: true);
-
-/// Even deeper nested struct to test recursive member access.
-void testPassStruct32BytesNestedIntx2Leaf() {
- final a0Pointer = calloc<Struct32BytesNestedInt>();
- final Struct32BytesNestedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct32BytesNestedInt>();
- final Struct32BytesNestedInt a1 = a1Pointer.ref;
-
- a0.a0.a0.a0.a0 = -1;
- a0.a0.a0.a0.a1 = 2;
- a0.a0.a0.a1.a0 = -3;
- a0.a0.a0.a1.a1 = 4;
- a0.a0.a1.a0.a0 = -5;
- a0.a0.a1.a0.a1 = 6;
- a0.a0.a1.a1.a0 = -7;
- a0.a0.a1.a1.a1 = 8;
- a0.a1.a0.a0.a0 = -9;
- a0.a1.a0.a0.a1 = 10;
- a0.a1.a0.a1.a0 = -11;
- a0.a1.a0.a1.a1 = 12;
- a0.a1.a1.a0.a0 = -13;
- a0.a1.a1.a0.a1 = 14;
- a0.a1.a1.a1.a0 = -15;
- a0.a1.a1.a1.a1 = 16;
- a1.a0.a0.a0.a0 = -17;
- a1.a0.a0.a0.a1 = 18;
- a1.a0.a0.a1.a0 = -19;
- a1.a0.a0.a1.a1 = 20;
- a1.a0.a1.a0.a0 = -21;
- a1.a0.a1.a0.a1 = 22;
- a1.a0.a1.a1.a0 = -23;
- a1.a0.a1.a1.a1 = 24;
- a1.a1.a0.a0.a0 = -25;
- a1.a1.a0.a0.a1 = 26;
- a1.a1.a0.a1.a0 = -27;
- a1.a1.a0.a1.a1 = 28;
- a1.a1.a1.a0.a0 = -29;
- a1.a1.a1.a0.a1 = 30;
- a1.a1.a1.a1.a0 = -31;
- a1.a1.a1.a1.a1 = 32;
-
- final result = passStruct32BytesNestedIntx2Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(16, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
-}
-
-final passStructNestedIntStructAlignmentInt16Leaf =
- ffiTestFunctions.lookupFunction<
- Int64 Function(StructNestedIntStructAlignmentInt16),
- int Function(StructNestedIntStructAlignmentInt16)>(
- "PassStructNestedIntStructAlignmentInt16",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 16 byte int.
-void testPassStructNestedIntStructAlignmentInt16Leaf() {
- final a0Pointer = calloc<StructNestedIntStructAlignmentInt16>();
- final StructNestedIntStructAlignmentInt16 a0 = a0Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a0.a1.a0 = 4;
- a0.a1.a1 = -5;
- a0.a1.a2 = 6;
-
- final result = passStructNestedIntStructAlignmentInt16Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(3, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedIntStructAlignmentInt32Leaf =
- ffiTestFunctions.lookupFunction<
- Int64 Function(StructNestedIntStructAlignmentInt32),
- int Function(StructNestedIntStructAlignmentInt32)>(
- "PassStructNestedIntStructAlignmentInt32",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 32 byte int.
-void testPassStructNestedIntStructAlignmentInt32Leaf() {
- final a0Pointer = calloc<StructNestedIntStructAlignmentInt32>();
- final StructNestedIntStructAlignmentInt32 a0 = a0Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a0.a1.a0 = 4;
- a0.a1.a1 = -5;
- a0.a1.a2 = 6;
-
- final result = passStructNestedIntStructAlignmentInt32Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(3, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedIntStructAlignmentInt64Leaf =
- ffiTestFunctions.lookupFunction<
- Int64 Function(StructNestedIntStructAlignmentInt64),
- int Function(StructNestedIntStructAlignmentInt64)>(
- "PassStructNestedIntStructAlignmentInt64",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 64 byte int.
-void testPassStructNestedIntStructAlignmentInt64Leaf() {
- final a0Pointer = calloc<StructNestedIntStructAlignmentInt64>();
- final StructNestedIntStructAlignmentInt64 a0 = a0Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a0.a1.a0 = 4;
- a0.a1.a1 = -5;
- a0.a1.a2 = 6;
-
- final result = passStructNestedIntStructAlignmentInt64Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(3, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedIrregularEvenBiggerx4Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger),
- double Function(
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger)>(
- "PassStructNestedIrregularEvenBiggerx4",
- isLeaf: true);
-
-/// Return big irregular struct as smoke test.
-void testPassStructNestedIrregularEvenBiggerx4Leaf() {
- final a0Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a3 = a3Pointer.ref;
-
- a0.a0 = 1;
- a0.a1.a0.a0 = 2;
- a0.a1.a0.a1.a0.a0 = -3;
- a0.a1.a0.a1.a0.a1 = 4;
- a0.a1.a0.a1.a1.a0 = -5.0;
- a0.a1.a0.a2 = 6;
- a0.a1.a0.a3.a0.a0 = -7.0;
- a0.a1.a0.a3.a1 = 8.0;
- a0.a1.a0.a4 = 9;
- a0.a1.a0.a5.a0.a0 = 10.0;
- a0.a1.a0.a5.a1.a0 = -11.0;
- a0.a1.a0.a6 = 12;
- a0.a1.a1.a0.a0 = -13;
- a0.a1.a1.a0.a1 = 14;
- a0.a1.a1.a1.a0 = -15.0;
- a0.a1.a2 = 16.0;
- a0.a1.a3 = -17.0;
- a0.a2.a0.a0 = 18;
- a0.a2.a0.a1.a0.a0 = -19;
- a0.a2.a0.a1.a0.a1 = 20;
- a0.a2.a0.a1.a1.a0 = -21.0;
- a0.a2.a0.a2 = 22;
- a0.a2.a0.a3.a0.a0 = -23.0;
- a0.a2.a0.a3.a1 = 24.0;
- a0.a2.a0.a4 = 25;
- a0.a2.a0.a5.a0.a0 = 26.0;
- a0.a2.a0.a5.a1.a0 = -27.0;
- a0.a2.a0.a6 = 28;
- a0.a2.a1.a0.a0 = -29;
- a0.a2.a1.a0.a1 = 30;
- a0.a2.a1.a1.a0 = -31.0;
- a0.a2.a2 = 32.0;
- a0.a2.a3 = -33.0;
- a0.a3 = 34.0;
- a1.a0 = 35;
- a1.a1.a0.a0 = 36;
- a1.a1.a0.a1.a0.a0 = -37;
- a1.a1.a0.a1.a0.a1 = 38;
- a1.a1.a0.a1.a1.a0 = -39.0;
- a1.a1.a0.a2 = 40;
- a1.a1.a0.a3.a0.a0 = -41.0;
- a1.a1.a0.a3.a1 = 42.0;
- a1.a1.a0.a4 = 43;
- a1.a1.a0.a5.a0.a0 = 44.0;
- a1.a1.a0.a5.a1.a0 = -45.0;
- a1.a1.a0.a6 = 46;
- a1.a1.a1.a0.a0 = -47;
- a1.a1.a1.a0.a1 = 48;
- a1.a1.a1.a1.a0 = -49.0;
- a1.a1.a2 = 50.0;
- a1.a1.a3 = -51.0;
- a1.a2.a0.a0 = 52;
- a1.a2.a0.a1.a0.a0 = -53;
- a1.a2.a0.a1.a0.a1 = 54;
- a1.a2.a0.a1.a1.a0 = -55.0;
- a1.a2.a0.a2 = 56;
- a1.a2.a0.a3.a0.a0 = -57.0;
- a1.a2.a0.a3.a1 = 58.0;
- a1.a2.a0.a4 = 59;
- a1.a2.a0.a5.a0.a0 = 60.0;
- a1.a2.a0.a5.a1.a0 = -61.0;
- a1.a2.a0.a6 = 62;
- a1.a2.a1.a0.a0 = -63;
- a1.a2.a1.a0.a1 = 64;
- a1.a2.a1.a1.a0 = -65.0;
- a1.a2.a2 = 66.0;
- a1.a2.a3 = -67.0;
- a1.a3 = 68.0;
- a2.a0 = 69;
- a2.a1.a0.a0 = 70;
- a2.a1.a0.a1.a0.a0 = -71;
- a2.a1.a0.a1.a0.a1 = 72;
- a2.a1.a0.a1.a1.a0 = -73.0;
- a2.a1.a0.a2 = 74;
- a2.a1.a0.a3.a0.a0 = -75.0;
- a2.a1.a0.a3.a1 = 76.0;
- a2.a1.a0.a4 = 77;
- a2.a1.a0.a5.a0.a0 = 78.0;
- a2.a1.a0.a5.a1.a0 = -79.0;
- a2.a1.a0.a6 = 80;
- a2.a1.a1.a0.a0 = -81;
- a2.a1.a1.a0.a1 = 82;
- a2.a1.a1.a1.a0 = -83.0;
- a2.a1.a2 = 84.0;
- a2.a1.a3 = -85.0;
- a2.a2.a0.a0 = 86;
- a2.a2.a0.a1.a0.a0 = -87;
- a2.a2.a0.a1.a0.a1 = 88;
- a2.a2.a0.a1.a1.a0 = -89.0;
- a2.a2.a0.a2 = 90;
- a2.a2.a0.a3.a0.a0 = -91.0;
- a2.a2.a0.a3.a1 = 92.0;
- a2.a2.a0.a4 = 93;
- a2.a2.a0.a5.a0.a0 = 94.0;
- a2.a2.a0.a5.a1.a0 = -95.0;
- a2.a2.a0.a6 = 96;
- a2.a2.a1.a0.a0 = -97;
- a2.a2.a1.a0.a1 = 98;
- a2.a2.a1.a1.a0 = -99.0;
- a2.a2.a2 = 100.0;
- a2.a2.a3 = -101.0;
- a2.a3 = 102.0;
- a3.a0 = 103;
- a3.a1.a0.a0 = 104;
- a3.a1.a0.a1.a0.a0 = -105;
- a3.a1.a0.a1.a0.a1 = 106;
- a3.a1.a0.a1.a1.a0 = -107.0;
- a3.a1.a0.a2 = 108;
- a3.a1.a0.a3.a0.a0 = -109.0;
- a3.a1.a0.a3.a1 = 110.0;
- a3.a1.a0.a4 = 111;
- a3.a1.a0.a5.a0.a0 = 112.0;
- a3.a1.a0.a5.a1.a0 = -113.0;
- a3.a1.a0.a6 = 114;
- a3.a1.a1.a0.a0 = -115;
- a3.a1.a1.a0.a1 = 116;
- a3.a1.a1.a1.a0 = -117.0;
- a3.a1.a2 = 118.0;
- a3.a1.a3 = -119.0;
- a3.a2.a0.a0 = 120;
- a3.a2.a0.a1.a0.a0 = -121;
- a3.a2.a0.a1.a0.a1 = 122;
- a3.a2.a0.a1.a1.a0 = -123.0;
- a3.a2.a0.a2 = 124;
- a3.a2.a0.a3.a0.a0 = -125.0;
- a3.a2.a0.a3.a1 = 126.0;
- a3.a2.a0.a4 = 127;
- a3.a2.a0.a5.a0.a0 = 128.0;
- a3.a2.a0.a5.a1.a0 = -129.0;
- a3.a2.a0.a6 = 130;
- a3.a2.a1.a0.a0 = -131;
- a3.a2.a1.a0.a1 = 132;
- a3.a2.a1.a1.a0 = -133.0;
- a3.a2.a2 = 134.0;
- a3.a2.a3 = -135.0;
- a3.a3 = 136.0;
-
- final result = passStructNestedIrregularEvenBiggerx4Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(1572.0, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
- calloc.free(a3Pointer);
-}
-
-final passStruct8BytesInlineArrayIntx4Leaf = ffiTestFunctions.lookupFunction<
- Int32 Function(Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt),
- int Function(
- Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt)>("PassStruct8BytesInlineArrayIntx4",
- isLeaf: true);
-
-/// Simple struct with inline array.
-void testPassStruct8BytesInlineArrayIntx4Leaf() {
- final a0Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a3 = a3Pointer.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;
- a1.a0[0] = 9;
- a1.a0[1] = 10;
- a1.a0[2] = 11;
- a1.a0[3] = 12;
- a1.a0[4] = 13;
- a1.a0[5] = 14;
- a1.a0[6] = 15;
- a1.a0[7] = 16;
- a2.a0[0] = 17;
- a2.a0[1] = 18;
- a2.a0[2] = 19;
- a2.a0[3] = 20;
- a2.a0[4] = 21;
- a2.a0[5] = 22;
- a2.a0[6] = 23;
- a2.a0[7] = 24;
- a3.a0[0] = 25;
- a3.a0[1] = 26;
- a3.a0[2] = 27;
- a3.a0[3] = 28;
- a3.a0[4] = 29;
- a3.a0[5] = 30;
- a3.a0[6] = 31;
- a3.a0[7] = 32;
-
- final result = passStruct8BytesInlineArrayIntx4Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.equals(528, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
- calloc.free(a3Pointer);
-}
-
-final passStructInlineArrayIrregularx4Leaf = ffiTestFunctions.lookupFunction<
- Int32 Function(StructInlineArrayIrregular, StructInlineArrayIrregular,
- StructInlineArrayIrregular, StructInlineArrayIrregular),
- int Function(
- StructInlineArrayIrregular,
- StructInlineArrayIrregular,
- StructInlineArrayIrregular,
- StructInlineArrayIrregular)>("PassStructInlineArrayIrregularx4",
- isLeaf: true);
-
-/// Irregular struct with inline array.
-void testPassStructInlineArrayIrregularx4Leaf() {
- final a0Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a3 = a3Pointer.ref;
-
- a0.a0[0].a0 = -1;
- a0.a0[0].a1 = 2;
- a0.a0[1].a0 = -3;
- a0.a0[1].a1 = 4;
- a0.a1 = 5;
- a1.a0[0].a0 = 6;
- a1.a0[0].a1 = -7;
- a1.a0[1].a0 = 8;
- a1.a0[1].a1 = -9;
- a1.a1 = 10;
- a2.a0[0].a0 = -11;
- a2.a0[0].a1 = 12;
- a2.a0[1].a0 = -13;
- a2.a0[1].a1 = 14;
- a2.a1 = 15;
- a3.a0[0].a0 = 16;
- a3.a0[0].a1 = -17;
- a3.a0[1].a0 = 18;
- a3.a0[1].a1 = -19;
- a3.a1 = 20;
-
- final result = passStructInlineArrayIrregularx4Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.equals(50, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
- calloc.free(a3Pointer);
-}
-
-final passStructInlineArray100BytesLeaf = ffiTestFunctions.lookupFunction<
- Int32 Function(StructInlineArray100Bytes),
- int Function(StructInlineArray100Bytes)>(
- "PassStructInlineArray100Bytes",
- isLeaf: true);
-
-/// Regular larger struct with inline array.
-void testPassStructInlineArray100BytesLeaf() {
- final a0Pointer = calloc<StructInlineArray100Bytes>();
- final StructInlineArray100Bytes 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;
- a0.a0[8] = 9;
- a0.a0[9] = 10;
- a0.a0[10] = 11;
- a0.a0[11] = 12;
- a0.a0[12] = 13;
- a0.a0[13] = 14;
- a0.a0[14] = 15;
- a0.a0[15] = 16;
- a0.a0[16] = 17;
- a0.a0[17] = 18;
- a0.a0[18] = 19;
- a0.a0[19] = 20;
- a0.a0[20] = 21;
- a0.a0[21] = 22;
- a0.a0[22] = 23;
- a0.a0[23] = 24;
- a0.a0[24] = 25;
- a0.a0[25] = 26;
- a0.a0[26] = 27;
- a0.a0[27] = 28;
- a0.a0[28] = 29;
- a0.a0[29] = 30;
- a0.a0[30] = 31;
- a0.a0[31] = 32;
- a0.a0[32] = 33;
- a0.a0[33] = 34;
- a0.a0[34] = 35;
- a0.a0[35] = 36;
- a0.a0[36] = 37;
- a0.a0[37] = 38;
- a0.a0[38] = 39;
- a0.a0[39] = 40;
- a0.a0[40] = 41;
- a0.a0[41] = 42;
- a0.a0[42] = 43;
- a0.a0[43] = 44;
- a0.a0[44] = 45;
- a0.a0[45] = 46;
- a0.a0[46] = 47;
- a0.a0[47] = 48;
- a0.a0[48] = 49;
- a0.a0[49] = 50;
- a0.a0[50] = 51;
- a0.a0[51] = 52;
- a0.a0[52] = 53;
- a0.a0[53] = 54;
- a0.a0[54] = 55;
- a0.a0[55] = 56;
- a0.a0[56] = 57;
- a0.a0[57] = 58;
- a0.a0[58] = 59;
- a0.a0[59] = 60;
- a0.a0[60] = 61;
- a0.a0[61] = 62;
- a0.a0[62] = 63;
- a0.a0[63] = 64;
- a0.a0[64] = 65;
- a0.a0[65] = 66;
- a0.a0[66] = 67;
- a0.a0[67] = 68;
- a0.a0[68] = 69;
- a0.a0[69] = 70;
- a0.a0[70] = 71;
- a0.a0[71] = 72;
- a0.a0[72] = 73;
- a0.a0[73] = 74;
- a0.a0[74] = 75;
- a0.a0[75] = 76;
- a0.a0[76] = 77;
- a0.a0[77] = 78;
- a0.a0[78] = 79;
- a0.a0[79] = 80;
- a0.a0[80] = 81;
- a0.a0[81] = 82;
- a0.a0[82] = 83;
- a0.a0[83] = 84;
- a0.a0[84] = 85;
- a0.a0[85] = 86;
- a0.a0[86] = 87;
- a0.a0[87] = 88;
- a0.a0[88] = 89;
- a0.a0[89] = 90;
- a0.a0[90] = 91;
- a0.a0[91] = 92;
- a0.a0[92] = 93;
- a0.a0[93] = 94;
- a0.a0[94] = 95;
- a0.a0[95] = 96;
- a0.a0[96] = 97;
- a0.a0[97] = 98;
- a0.a0[98] = 99;
- a0.a0[99] = 100;
-
- final result = passStructInlineArray100BytesLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(5050, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructStruct16BytesHomogeneousFloat2x5Leaf =
- ffiTestFunctions.lookupFunction<
- Float Function(
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2),
- double Function(
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2)>(
- "PassStructStruct16BytesHomogeneousFloat2x5",
- isLeaf: true);
-
-/// Arguments in FPU registers on arm hardfp and arm64.
-/// 5 struct arguments will exhaust available registers.
-void testPassStructStruct16BytesHomogeneousFloat2x5Leaf() {
- final a0Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a3 = a3Pointer.ref;
- final a4Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a4 = a4Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1[0].a0 = 2.0;
- a0.a1[1].a0 = -3.0;
- a0.a2 = 4.0;
- a1.a0.a0 = -5.0;
- a1.a1[0].a0 = 6.0;
- a1.a1[1].a0 = -7.0;
- a1.a2 = 8.0;
- a2.a0.a0 = -9.0;
- a2.a1[0].a0 = 10.0;
- a2.a1[1].a0 = -11.0;
- a2.a2 = 12.0;
- a3.a0.a0 = -13.0;
- a3.a1[0].a0 = 14.0;
- a3.a1[1].a0 = -15.0;
- a3.a2 = 16.0;
- a4.a0.a0 = -17.0;
- a4.a1[0].a0 = 18.0;
- a4.a1[1].a0 = -19.0;
- a4.a2 = 20.0;
-
- final result =
- passStructStruct16BytesHomogeneousFloat2x5Leaf(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 passStructStruct32BytesHomogeneousDouble2x5Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2),
- double Function(
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2)>(
- "PassStructStruct32BytesHomogeneousDouble2x5",
- isLeaf: true);
-
-/// Arguments in FPU registers on arm64.
-/// 5 struct arguments will exhaust available registers.
-void testPassStructStruct32BytesHomogeneousDouble2x5Leaf() {
- final a0Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a3 = a3Pointer.ref;
- final a4Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a4 = a4Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1[0].a0 = 2.0;
- a0.a1[1].a0 = -3.0;
- a0.a2 = 4.0;
- a1.a0.a0 = -5.0;
- a1.a1[0].a0 = 6.0;
- a1.a1[1].a0 = -7.0;
- a1.a2 = 8.0;
- a2.a0.a0 = -9.0;
- a2.a1[0].a0 = 10.0;
- a2.a1[1].a0 = -11.0;
- a2.a2 = 12.0;
- a3.a0.a0 = -13.0;
- a3.a1[0].a0 = 14.0;
- a3.a1[1].a0 = -15.0;
- a3.a2 = 16.0;
- a4.a0.a0 = -17.0;
- a4.a1[0].a0 = 18.0;
- a4.a1[1].a0 = -19.0;
- a4.a2 = 20.0;
-
- final result =
- passStructStruct32BytesHomogeneousDouble2x5Leaf(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 passStructStruct16BytesMixed3x10Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3),
- double Function(
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3)>("PassStructStruct16BytesMixed3x10",
- isLeaf: true);
-
-/// 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 testPassStructStruct16BytesMixed3x10Leaf() {
- final a0Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a3 = a3Pointer.ref;
- final a4Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a4 = a4Pointer.ref;
- final a5Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a5 = a5Pointer.ref;
- final a6Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a6 = a6Pointer.ref;
- final a7Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a7 = a7Pointer.ref;
- final a8Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a8 = a8Pointer.ref;
- final a9Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a9 = a9Pointer.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;
- a1.a0.a0 = -7.0;
- a1.a1[0].a0 = 8.0;
- a1.a1[0].a1 = -9;
- a1.a1[0].a2 = 10;
- a1.a2[0] = -11;
- a1.a2[1] = 12;
- a2.a0.a0 = -13.0;
- a2.a1[0].a0 = 14.0;
- a2.a1[0].a1 = -15;
- a2.a1[0].a2 = 16;
- a2.a2[0] = -17;
- a2.a2[1] = 18;
- a3.a0.a0 = -19.0;
- a3.a1[0].a0 = 20.0;
- a3.a1[0].a1 = -21;
- a3.a1[0].a2 = 22;
- a3.a2[0] = -23;
- a3.a2[1] = 24;
- a4.a0.a0 = -25.0;
- a4.a1[0].a0 = 26.0;
- a4.a1[0].a1 = -27;
- a4.a1[0].a2 = 28;
- a4.a2[0] = -29;
- a4.a2[1] = 30;
- a5.a0.a0 = -31.0;
- a5.a1[0].a0 = 32.0;
- a5.a1[0].a1 = -33;
- a5.a1[0].a2 = 34;
- a5.a2[0] = -35;
- a5.a2[1] = 36;
- a6.a0.a0 = -37.0;
- a6.a1[0].a0 = 38.0;
- a6.a1[0].a1 = -39;
- a6.a1[0].a2 = 40;
- a6.a2[0] = -41;
- a6.a2[1] = 42;
- a7.a0.a0 = -43.0;
- a7.a1[0].a0 = 44.0;
- a7.a1[0].a1 = -45;
- a7.a1[0].a2 = 46;
- a7.a2[0] = -47;
- a7.a2[1] = 48;
- a8.a0.a0 = -49.0;
- a8.a1[0].a0 = 50.0;
- a8.a1[0].a1 = -51;
- a8.a1[0].a2 = 52;
- a8.a2[0] = -53;
- a8.a2[1] = 54;
- a9.a0.a0 = -55.0;
- a9.a1[0].a0 = 56.0;
- a9.a1[0].a1 = -57;
- a9.a1[0].a2 = 58;
- a9.a2[0] = -59;
- a9.a2[1] = 60;
-
- final result = passStructStruct16BytesMixed3x10Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.approxEquals(30.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 passUint8Struct32BytesInlineArrayMultiDimensionalILeaf =
- ffiTestFunctions.lookupFunction<
- Uint32 Function(
- Uint8,
- Struct32BytesInlineArrayMultiDimensionalInt,
- Uint8,
- Struct8BytesInlineArrayMultiDimensionalInt,
- Uint8,
- Struct8BytesInlineArrayMultiDimensionalInt,
- Uint8),
- int Function(
- int,
- Struct32BytesInlineArrayMultiDimensionalInt,
- int,
- Struct8BytesInlineArrayMultiDimensionalInt,
- int,
- Struct8BytesInlineArrayMultiDimensionalInt,
- int)>("PassUint8Struct32BytesInlineArrayMultiDimensionalI",
- isLeaf: true);
-
-/// Test multi dimensional inline array struct as argument.
-void testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf() {
- int a0;
- final a1Pointer = calloc<Struct32BytesInlineArrayMultiDimensionalInt>();
- final Struct32BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
- int a2;
- final a3Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
- final Struct8BytesInlineArrayMultiDimensionalInt a3 = a3Pointer.ref;
- int a4;
- final a5Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
- final Struct8BytesInlineArrayMultiDimensionalInt a5 = a5Pointer.ref;
- int a6;
-
- a0 = 1;
- a1.a0[0][0][0][0][0] = 2;
- a1.a0[0][0][0][0][1] = 3;
- a1.a0[0][0][0][1][0] = 4;
- a1.a0[0][0][0][1][1] = 5;
- a1.a0[0][0][1][0][0] = 6;
- a1.a0[0][0][1][0][1] = 7;
- a1.a0[0][0][1][1][0] = 8;
- a1.a0[0][0][1][1][1] = 9;
- a1.a0[0][1][0][0][0] = 10;
- a1.a0[0][1][0][0][1] = 11;
- a1.a0[0][1][0][1][0] = 12;
- a1.a0[0][1][0][1][1] = 13;
- a1.a0[0][1][1][0][0] = 14;
- a1.a0[0][1][1][0][1] = 15;
- a1.a0[0][1][1][1][0] = 16;
- a1.a0[0][1][1][1][1] = 17;
- a1.a0[1][0][0][0][0] = 18;
- a1.a0[1][0][0][0][1] = 19;
- a1.a0[1][0][0][1][0] = 20;
- a1.a0[1][0][0][1][1] = 21;
- a1.a0[1][0][1][0][0] = 22;
- a1.a0[1][0][1][0][1] = 23;
- a1.a0[1][0][1][1][0] = 24;
- a1.a0[1][0][1][1][1] = 25;
- a1.a0[1][1][0][0][0] = 26;
- a1.a0[1][1][0][0][1] = 27;
- a1.a0[1][1][0][1][0] = 28;
- a1.a0[1][1][0][1][1] = 29;
- a1.a0[1][1][1][0][0] = 30;
- a1.a0[1][1][1][0][1] = 31;
- a1.a0[1][1][1][1][0] = 32;
- a1.a0[1][1][1][1][1] = 33;
- a2 = 34;
- a3.a0[0][0][0] = 35;
- a3.a0[0][0][1] = 36;
- a3.a0[0][1][0] = 37;
- a3.a0[0][1][1] = 38;
- a3.a0[1][0][0] = 39;
- a3.a0[1][0][1] = 40;
- a3.a0[1][1][0] = 41;
- a3.a0[1][1][1] = 42;
- a4 = 43;
- a5.a0[0][0][0] = 44;
- a5.a0[0][0][1] = 45;
- a5.a0[0][1][0] = 46;
- a5.a0[0][1][1] = 47;
- a5.a0[1][0][0] = 48;
- a5.a0[1][0][1] = 49;
- a5.a0[1][1][0] = 50;
- a5.a0[1][1][1] = 51;
- a6 = 52;
-
- final result = passUint8Struct32BytesInlineArrayMultiDimensionalILeaf(
- a0, a1, a2, a3, a4, a5, a6);
-
- print("result = $result");
-
- Expect.equals(1378, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
-}
-
-final passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf =
- ffiTestFunctions.lookupFunction<
- Uint32 Function(
- Uint8, Struct4BytesInlineArrayMultiDimensionalInt, Uint8),
- int Function(int, Struct4BytesInlineArrayMultiDimensionalInt, int)>(
- "PassUint8Struct4BytesInlineArrayMultiDimensionalIn",
- isLeaf: true);
-
-/// Test struct in multi dimensional inline array.
-void testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf() {
- int a0;
- final a1Pointer = calloc<Struct4BytesInlineArrayMultiDimensionalInt>();
- final Struct4BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
- int a2;
-
- a0 = 1;
- a1.a0[0][0].a0 = 2;
- a1.a0[0][1].a0 = -3;
- a1.a0[1][0].a0 = 4;
- a1.a0[1][1].a0 = -5;
- a2 = 6;
-
- final result =
- passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(5, result);
-
- calloc.free(a1Pointer);
-}
-
-final passStruct3BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt),
- int Function(
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt)>("PassStruct3BytesPackedIntx10", isLeaf: true);
-
-/// Small struct with mis-aligned member.
-void testPassStruct3BytesPackedIntx10Leaf() {
- final a0Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt 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 =
- passStruct3BytesPackedIntx10Leaf(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 passStruct8BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt),
- int Function(
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt)>("PassStruct8BytesPackedIntx10", isLeaf: true);
-
-/// Struct with mis-aligned member.
-void testPassStruct8BytesPackedIntx10Leaf() {
- final a0Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt 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 =
- passStruct8BytesPackedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.equals(1275, 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 passStruct9BytesPackedMixedx10DoubleInt32x2Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Double,
- Int32,
- Int32),
- double Function(
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- double,
- int,
- int)>("PassStruct9BytesPackedMixedx10DoubleInt32x2", isLeaf: true);
-
-/// Struct with mis-aligned member.
-/// Tests backfilling of CPU and FPU registers.
-void testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf() {
- final a0Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a9 = a9Pointer.ref;
- double a10;
- int a11;
- int a12;
-
- a0.a0 = 1;
- a0.a1 = 2.0;
- a1.a0 = 3;
- a1.a1 = 4.0;
- a2.a0 = 5;
- a2.a1 = 6.0;
- a3.a0 = 7;
- a3.a1 = 8.0;
- a4.a0 = 9;
- a4.a1 = 10.0;
- a5.a0 = 11;
- a5.a1 = 12.0;
- a6.a0 = 13;
- a6.a1 = 14.0;
- a7.a0 = 15;
- a7.a1 = 16.0;
- a8.a0 = 17;
- a8.a1 = 18.0;
- a9.a0 = 19;
- a9.a1 = 20.0;
- a10 = -21.0;
- a11 = 22;
- a12 = -23;
-
- final result = passStruct9BytesPackedMixedx10DoubleInt32x2Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
-
- print("result = $result");
-
- Expect.approxEquals(188.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 passStruct5BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct5BytesPackedMixed),
- double Function(
- Struct5BytesPackedMixed)>("PassStruct5BytesPackedMixed", isLeaf: true);
-
-/// This packed struct happens to have only aligned members.
-void testPassStruct5BytesPackedMixedLeaf() {
- final a0Pointer = calloc<Struct5BytesPackedMixed>();
- final Struct5BytesPackedMixed a0 = a0Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2;
-
- final result = passStruct5BytesPackedMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(1.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedAlignmentStruct5BytesPackedMixedLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(StructNestedAlignmentStruct5BytesPackedMixed),
- double Function(StructNestedAlignmentStruct5BytesPackedMixed)>(
- "PassStructNestedAlignmentStruct5BytesPackedMixed",
- isLeaf: true);
-
-/// Check alignment of packed struct in non-packed struct.
-void testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf() {
- final a0Pointer = calloc<StructNestedAlignmentStruct5BytesPackedMixed>();
- final StructNestedAlignmentStruct5BytesPackedMixed a0 = a0Pointer.ref;
-
- a0.a0 = 1;
- a0.a1.a0 = 2.0;
- a0.a1.a1 = 3;
-
- final result = passStructNestedAlignmentStruct5BytesPackedMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(6.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct6BytesInlineArrayIntLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct6BytesInlineArrayInt),
- double Function(Struct6BytesInlineArrayInt)>(
- "PassStruct6BytesInlineArrayInt",
- isLeaf: true);
-
-/// Check alignment of packed struct array in non-packed struct.
-void testPassStruct6BytesInlineArrayIntLeaf() {
- final a0Pointer = calloc<Struct6BytesInlineArrayInt>();
- final Struct6BytesInlineArrayInt a0 = a0Pointer.ref;
-
- a0.a0[0].a0 = -1;
- a0.a0[0].a1 = 2;
- a0.a0[1].a0 = -3;
- a0.a0[1].a1 = 4;
-
- final result = passStruct6BytesInlineArrayIntLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(2.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct15BytesInlineArrayMixedLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct15BytesInlineArrayMixed),
- double Function(Struct15BytesInlineArrayMixed)>(
- "PassStruct15BytesInlineArrayMixed",
- isLeaf: true);
-
-/// Check alignment of packed struct array in non-packed struct.
-void testPassStruct15BytesInlineArrayMixedLeaf() {
- final a0Pointer = calloc<Struct15BytesInlineArrayMixed>();
- final Struct15BytesInlineArrayMixed a0 = a0Pointer.ref;
-
- a0.a0[0].a0 = -1.0;
- a0.a0[0].a1 = 2;
- a0.a0[1].a0 = -3.0;
- a0.a0[1].a1 = 4;
- a0.a0[2].a0 = -5.0;
- a0.a0[2].a1 = 6;
-
- final result = passStruct15BytesInlineArrayMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(3.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passUnion4BytesMixedx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed),
- double Function(
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed)>("PassUnion4BytesMixedx10", isLeaf: true);
-
-/// Check placement of mixed integer/float union.
-void testPassUnion4BytesMixedx10Leaf() {
- final a0Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed 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 =
- passUnion4BytesMixedx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.approxEquals(55.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 passUnion8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat),
- double Function(
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat)>("PassUnion8BytesNestedFloatx10", isLeaf: true);
-
-/// Check placement of mixed floats union.
-void testPassUnion8BytesNestedFloatx10Leaf() {
- final a0Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a9 = a9Pointer.ref;
-
- a0.a0 = -1.0;
- a1.a0 = 2.0;
- a2.a0 = -3.0;
- a3.a0 = 4.0;
- a4.a0 = -5.0;
- a5.a0 = 6.0;
- a6.a0 = -7.0;
- a7.a0 = 8.0;
- a8.a0 = -9.0;
- a9.a0 = 10.0;
-
- final result =
- passUnion8BytesNestedFloatx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.approxEquals(5.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 passUnion9BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt),
- double Function(
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt)>("PassUnion9BytesNestedIntx10", isLeaf: true);
-
-/// Mixed-size union argument.
-void testPassUnion9BytesNestedIntx10Leaf() {
- final a0Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a1.a0.a0 = 4;
- a1.a0.a1 = -5;
- a1.a0.a2 = 6;
- a2.a0.a0 = -7;
- a2.a0.a1 = 8;
- a2.a0.a2 = -9;
- a3.a0.a0 = 10;
- a3.a0.a1 = -11;
- a3.a0.a2 = 12;
- a4.a0.a0 = -13;
- a4.a0.a1 = 14;
- a4.a0.a2 = -15;
- a5.a0.a0 = 16;
- a5.a0.a1 = -17;
- a5.a0.a2 = 18;
- a6.a0.a0 = -19;
- a6.a0.a1 = 20;
- a6.a0.a2 = -21;
- a7.a0.a0 = 22;
- a7.a0.a1 = -23;
- a7.a0.a2 = 24;
- a8.a0.a0 = -25;
- a8.a0.a1 = 26;
- a8.a0.a2 = -27;
- a9.a0.a0 = 28;
- a9.a0.a1 = -29;
- a9.a0.a2 = 30;
-
- final result =
- passUnion9BytesNestedIntx10Leaf(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 passUnion16BytesNestedInlineArrayFloatx10Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat),
- double Function(
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat)>(
- "PassUnion16BytesNestedInlineArrayFloatx10",
- isLeaf: true);
-
-/// Union with homogenous floats.
-void testPassUnion16BytesNestedInlineArrayFloatx10Leaf() {
- final a0Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a9 = a9Pointer.ref;
-
- a0.a0[0] = -1.0;
- a0.a0[1] = 2.0;
- a0.a0[2] = -3.0;
- a0.a0[3] = 4.0;
- a1.a0[0] = -5.0;
- a1.a0[1] = 6.0;
- a1.a0[2] = -7.0;
- a1.a0[3] = 8.0;
- a2.a0[0] = -9.0;
- a2.a0[1] = 10.0;
- a2.a0[2] = -11.0;
- a2.a0[3] = 12.0;
- a3.a0[0] = -13.0;
- a3.a0[1] = 14.0;
- a3.a0[2] = -15.0;
- a3.a0[3] = 16.0;
- a4.a0[0] = -17.0;
- a4.a0[1] = 18.0;
- a4.a0[2] = -19.0;
- a4.a0[3] = 20.0;
- a5.a0[0] = -21.0;
- a5.a0[1] = 22.0;
- a5.a0[2] = -23.0;
- a5.a0[3] = 24.0;
- a6.a0[0] = -25.0;
- a6.a0[1] = 26.0;
- a6.a0[2] = -27.0;
- a6.a0[3] = 28.0;
- a7.a0[0] = -29.0;
- a7.a0[1] = 30.0;
- a7.a0[2] = -31.0;
- a7.a0[3] = 32.0;
- a8.a0[0] = -33.0;
- a8.a0[1] = 34.0;
- a8.a0[2] = -35.0;
- a8.a0[3] = 36.0;
- a9.a0[0] = -37.0;
- a9.a0[1] = 38.0;
- a9.a0[2] = -39.0;
- a9.a0[3] = 40.0;
-
- final result = passUnion16BytesNestedInlineArrayFloatx10Leaf(
- 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 passUnion16BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat),
- double Function(
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat)>("PassUnion16BytesNestedFloatx10",
- isLeaf: true);
-
-/// Union with homogenous floats.
-void testPassUnion16BytesNestedFloatx10Leaf() {
- final a0Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a0.a1 = 2.0;
- a1.a0.a0 = -3.0;
- a1.a0.a1 = 4.0;
- a2.a0.a0 = -5.0;
- a2.a0.a1 = 6.0;
- a3.a0.a0 = -7.0;
- a3.a0.a1 = 8.0;
- a4.a0.a0 = -9.0;
- a4.a0.a1 = 10.0;
- a5.a0.a0 = -11.0;
- a5.a0.a1 = 12.0;
- a6.a0.a0 = -13.0;
- a6.a0.a1 = 14.0;
- a7.a0.a0 = -15.0;
- a7.a0.a1 = 16.0;
- a8.a0.a0 = -17.0;
- a8.a0.a1 = 18.0;
- a9.a0.a0 = -19.0;
- a9.a0.a1 = 20.0;
-
- final result = passUnion16BytesNestedFloatx10Leaf(
- 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 returnStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
- Struct1ByteInt Function(Int8),
- Struct1ByteInt Function(int)>("ReturnStruct1ByteInt", isLeaf: true);
-
-/// Smallest struct with data.
-void testReturnStruct1ByteIntLeaf() {
- int a0;
-
- a0 = -1;
-
- final result = returnStruct1ByteIntLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
-}
-
-final returnStruct3BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct3BytesHomogeneousUint8 Function(Uint8, Uint8, Uint8),
- Struct3BytesHomogeneousUint8 Function(
- int, int, int)>("ReturnStruct3BytesHomogeneousUint8", isLeaf: true);
-
-/// Smaller than word size return value on all architectures.
-void testReturnStruct3BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
-
- final result = returnStruct3BytesHomogeneousUint8Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct3BytesInt2ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
- Struct3BytesInt2ByteAligned Function(Int16, Int8),
- Struct3BytesInt2ByteAligned Function(
- int, int)>("ReturnStruct3BytesInt2ByteAligned", isLeaf: true);
-
-/// Smaller than word size return value on all architectures.
-/// With alignment rules taken into account size is 4 bytes.
-void testReturnStruct3BytesInt2ByteAlignedLeaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct3BytesInt2ByteAlignedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct4BytesHomogeneousInt16Leaf = ffiTestFunctions.lookupFunction<
- Struct4BytesHomogeneousInt16 Function(Int16, Int16),
- Struct4BytesHomogeneousInt16 Function(
- int, int)>("ReturnStruct4BytesHomogeneousInt16", isLeaf: true);
-
-/// Word size return value on 32 bit architectures..
-void testReturnStruct4BytesHomogeneousInt16Leaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct4BytesHomogeneousInt16Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct7BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct7BytesHomogeneousUint8 Function(
- Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
- Struct7BytesHomogeneousUint8 Function(int, int, int, int, int, int,
- int)>("ReturnStruct7BytesHomogeneousUint8", isLeaf: true);
-
-/// Non-wordsize return value.
-void testReturnStruct7BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
-
- final result =
- returnStruct7BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5, a6);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
-}
-
-final returnStruct7BytesInt4ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
- Struct7BytesInt4ByteAligned Function(Int32, Int16, Int8),
- Struct7BytesInt4ByteAligned Function(
- int, int, int)>("ReturnStruct7BytesInt4ByteAligned", isLeaf: true);
-
-/// Non-wordsize return value.
-/// With alignment rules taken into account size is 8 bytes.
-void testReturnStruct7BytesInt4ByteAlignedLeaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct7BytesInt4ByteAlignedLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct8BytesIntLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesInt Function(Int16, Int16, Int32),
- Struct8BytesInt Function(
- int, int, int)>("ReturnStruct8BytesInt", isLeaf: true);
-
-/// Return value in integer registers on many architectures.
-void testReturnStruct8BytesIntLeaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct8BytesIntLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct8BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesHomogeneousFloat Function(Float, Float),
- Struct8BytesHomogeneousFloat Function(
- double, double)>("ReturnStruct8BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value in FP registers on many architectures.
-void testReturnStruct8BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
-
- a0 = -1.0;
- a1 = 2.0;
-
- final result = returnStruct8BytesHomogeneousFloatLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
-}
-
-final returnStruct8BytesMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesMixed Function(Float, Int16, Int16),
- Struct8BytesMixed Function(
- double, int, int)>("ReturnStruct8BytesMixed", isLeaf: true);
-
-/// Return value split over FP and integer register in x64.
-void testReturnStruct8BytesMixedLeaf() {
- double a0;
- int a1;
- int a2;
-
- a0 = -1.0;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct8BytesMixedLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct9BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct9BytesHomogeneousUint8 Function(
- Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
- Struct9BytesHomogeneousUint8 Function(int, int, int, int, int, int, int,
- int, int)>("ReturnStruct9BytesHomogeneousUint8", isLeaf: true);
-
-/// The minimum alignment of this struct is only 1 byte based on its fields.
-/// Test that the memory backing these structs is the right size and that
-/// dart:ffi trampolines do not write outside this size.
-void testReturnStruct9BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- int a8;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
- a7 = 8;
- a8 = 9;
-
- final result = returnStruct9BytesHomogeneousUint8Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
- Expect.equals(a7, result.a7);
- Expect.equals(a8, result.a8);
-}
-
-final returnStruct9BytesInt4Or8ByteAlignedLeaf =
- ffiTestFunctions.lookupFunction<
- Struct9BytesInt4Or8ByteAligned Function(Int64, Int8),
- Struct9BytesInt4Or8ByteAligned Function(
- int, int)>("ReturnStruct9BytesInt4Or8ByteAligned", isLeaf: true);
-
-/// Return value in two integer registers on x64.
-/// With alignment rules taken into account size is 12 or 16 bytes.
-void testReturnStruct9BytesInt4Or8ByteAlignedLeaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct9BytesInt4Or8ByteAlignedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct12BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct12BytesHomogeneousFloat Function(Float, Float, Float),
- Struct12BytesHomogeneousFloat Function(double, double,
- double)>("ReturnStruct12BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value in FPU registers, but does not use all registers on arm hardfp
-/// and arm64.
-void testReturnStruct12BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
- double a2;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
-
- final result = returnStruct12BytesHomogeneousFloatLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
-}
-
-final returnStruct16BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct16BytesHomogeneousFloat Function(Float, Float, Float, Float),
- Struct16BytesHomogeneousFloat Function(double, double, double,
- double)>("ReturnStruct16BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value in FPU registers on arm hardfp and arm64.
-void testReturnStruct16BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
-
- final result = returnStruct16BytesHomogeneousFloatLeaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
-}
-
-final returnStruct16BytesMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct16BytesMixed Function(Double, Int64),
- Struct16BytesMixed Function(
- double, int)>("ReturnStruct16BytesMixed", isLeaf: true);
-
-/// Return value split over FP and integer register in x64.
-void testReturnStruct16BytesMixedLeaf() {
- double a0;
- int a1;
-
- a0 = -1.0;
- a1 = 2;
-
- final result = returnStruct16BytesMixedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct16BytesMixed2Leaf = ffiTestFunctions.lookupFunction<
- Struct16BytesMixed2 Function(Float, Float, Float, Int32),
- Struct16BytesMixed2 Function(double, double, double,
- int)>("ReturnStruct16BytesMixed2", isLeaf: true);
-
-/// Return value split over FP and integer register in x64.
-/// The integer register contains half float half int.
-void testReturnStruct16BytesMixed2Leaf() {
- double a0;
- double a1;
- double a2;
- int a3;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4;
-
- final result = returnStruct16BytesMixed2Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.equals(a3, result.a3);
-}
-
-final returnStruct17BytesIntLeaf = ffiTestFunctions.lookupFunction<
- Struct17BytesInt Function(Int64, Int64, Int8),
- Struct17BytesInt Function(
- int, int, int)>("ReturnStruct17BytesInt", isLeaf: true);
-
-/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
-/// Is non word size on purpose, to test that structs are rounded up to word size
-/// on all ABIs.
-void testReturnStruct17BytesIntLeaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct17BytesIntLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct19BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct19BytesHomogeneousUint8 Function(
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8),
- Struct19BytesHomogeneousUint8 Function(
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int)>("ReturnStruct19BytesHomogeneousUint8", isLeaf: true);
-
-/// The minimum alignment of this struct is only 1 byte based on its fields.
-/// Test that the memory backing these structs is the right size and that
-/// dart:ffi trampolines do not write outside this size.
-void testReturnStruct19BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- int a8;
- int a9;
- int a10;
- int a11;
- int a12;
- int a13;
- int a14;
- int a15;
- int a16;
- int a17;
- int a18;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
- a7 = 8;
- a8 = 9;
- a9 = 10;
- a10 = 11;
- a11 = 12;
- a12 = 13;
- a13 = 14;
- a14 = 15;
- a15 = 16;
- a16 = 17;
- a17 = 18;
- a18 = 19;
-
- final result = returnStruct19BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5,
- a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
- Expect.equals(a7, result.a7);
- Expect.equals(a8, result.a8);
- Expect.equals(a9, result.a9);
- Expect.equals(a10, result.a10);
- Expect.equals(a11, result.a11);
- Expect.equals(a12, result.a12);
- Expect.equals(a13, result.a13);
- Expect.equals(a14, result.a14);
- Expect.equals(a15, result.a15);
- Expect.equals(a16, result.a16);
- Expect.equals(a17, result.a17);
- Expect.equals(a18, result.a18);
-}
-
-final returnStruct20BytesHomogeneousInt32Leaf = ffiTestFunctions.lookupFunction<
- Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32),
- Struct20BytesHomogeneousInt32 Function(int, int, int, int,
- int)>("ReturnStruct20BytesHomogeneousInt32", isLeaf: true);
-
-/// Return value too big to go in cpu registers on arm64.
-void testReturnStruct20BytesHomogeneousInt32Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
- a3 = 4;
- a4 = -5;
-
- final result = returnStruct20BytesHomogeneousInt32Leaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
-}
-
-final returnStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct20BytesHomogeneousFloat Function(Float, Float, Float, Float, Float),
- Struct20BytesHomogeneousFloat Function(double, double, double, double,
- double)>("ReturnStruct20BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
-void testReturnStruct20BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
- double a4;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
- a4 = -5.0;
-
- final result = returnStruct20BytesHomogeneousFloatLeaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
- Expect.approxEquals(a4, result.a4);
-}
-
-final returnStruct32BytesHomogeneousDoubleLeaf =
- ffiTestFunctions.lookupFunction<
- Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double),
- Struct32BytesHomogeneousDouble Function(double, double, double,
- double)>("ReturnStruct32BytesHomogeneousDouble", isLeaf: true);
-
-/// Return value in FPU registers on arm64.
-void testReturnStruct32BytesHomogeneousDoubleLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
-
- final result = returnStruct32BytesHomogeneousDoubleLeaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
-}
-
-final returnStruct40BytesHomogeneousDoubleLeaf =
- ffiTestFunctions.lookupFunction<
- Struct40BytesHomogeneousDouble Function(
- Double, Double, Double, Double, Double),
- Struct40BytesHomogeneousDouble Function(double, double, double, double,
- double)>("ReturnStruct40BytesHomogeneousDouble", isLeaf: true);
-
-/// Return value too big to go in FPU registers on arm64.
-void testReturnStruct40BytesHomogeneousDoubleLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
- double a4;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
- a4 = -5.0;
-
- final result = returnStruct40BytesHomogeneousDoubleLeaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
- Expect.approxEquals(a4, result.a4);
-}
-
-final returnStruct1024BytesHomogeneousUint64Leaf =
- ffiTestFunctions.lookupFunction<
- Struct1024BytesHomogeneousUint64 Function(
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64),
- Struct1024BytesHomogeneousUint64 Function(
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int)>("ReturnStruct1024BytesHomogeneousUint64", isLeaf: true);
-
-/// Test 1kb struct.
-void testReturnStruct1024BytesHomogeneousUint64Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- int a8;
- int a9;
- int a10;
- int a11;
- int a12;
- int a13;
- int a14;
- int a15;
- int a16;
- int a17;
- int a18;
- int a19;
- int a20;
- int a21;
- int a22;
- int a23;
- int a24;
- int a25;
- int a26;
- int a27;
- int a28;
- int a29;
- int a30;
- int a31;
- int a32;
- int a33;
- int a34;
- int a35;
- int a36;
- int a37;
- int a38;
- int a39;
- int a40;
- int a41;
- int a42;
- int a43;
- int a44;
- int a45;
- int a46;
- int a47;
- int a48;
- int a49;
- int a50;
- int a51;
- int a52;
- int a53;
- int a54;
- int a55;
- int a56;
- int a57;
- int a58;
- int a59;
- int a60;
- int a61;
- int a62;
- int a63;
- int a64;
- int a65;
- int a66;
- int a67;
- int a68;
- int a69;
- int a70;
- int a71;
- int a72;
- int a73;
- int a74;
- int a75;
- int a76;
- int a77;
- int a78;
- int a79;
- int a80;
- int a81;
- int a82;
- int a83;
- int a84;
- int a85;
- int a86;
- int a87;
- int a88;
- int a89;
- int a90;
- int a91;
- int a92;
- int a93;
- int a94;
- int a95;
- int a96;
- int a97;
- int a98;
- int a99;
- int a100;
- int a101;
- int a102;
- int a103;
- int a104;
- int a105;
- int a106;
- int a107;
- int a108;
- int a109;
- int a110;
- int a111;
- int a112;
- int a113;
- int a114;
- int a115;
- int a116;
- int a117;
- int a118;
- int a119;
- int a120;
- int a121;
- int a122;
- int a123;
- int a124;
- int a125;
- int a126;
- int a127;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
- a7 = 8;
- a8 = 9;
- a9 = 10;
- a10 = 11;
- a11 = 12;
- a12 = 13;
- a13 = 14;
- a14 = 15;
- a15 = 16;
- a16 = 17;
- a17 = 18;
- a18 = 19;
- a19 = 20;
- a20 = 21;
- a21 = 22;
- a22 = 23;
- a23 = 24;
- a24 = 25;
- a25 = 26;
- a26 = 27;
- a27 = 28;
- a28 = 29;
- a29 = 30;
- a30 = 31;
- a31 = 32;
- a32 = 33;
- a33 = 34;
- a34 = 35;
- a35 = 36;
- a36 = 37;
- a37 = 38;
- a38 = 39;
- a39 = 40;
- a40 = 41;
- a41 = 42;
- a42 = 43;
- a43 = 44;
- a44 = 45;
- a45 = 46;
- a46 = 47;
- a47 = 48;
- a48 = 49;
- a49 = 50;
- a50 = 51;
- a51 = 52;
- a52 = 53;
- a53 = 54;
- a54 = 55;
- a55 = 56;
- a56 = 57;
- a57 = 58;
- a58 = 59;
- a59 = 60;
- a60 = 61;
- a61 = 62;
- a62 = 63;
- a63 = 64;
- a64 = 65;
- a65 = 66;
- a66 = 67;
- a67 = 68;
- a68 = 69;
- a69 = 70;
- a70 = 71;
- a71 = 72;
- a72 = 73;
- a73 = 74;
- a74 = 75;
- a75 = 76;
- a76 = 77;
- a77 = 78;
- a78 = 79;
- a79 = 80;
- a80 = 81;
- a81 = 82;
- a82 = 83;
- a83 = 84;
- a84 = 85;
- a85 = 86;
- a86 = 87;
- a87 = 88;
- a88 = 89;
- a89 = 90;
- a90 = 91;
- a91 = 92;
- a92 = 93;
- a93 = 94;
- a94 = 95;
- a95 = 96;
- a96 = 97;
- a97 = 98;
- a98 = 99;
- a99 = 100;
- a100 = 101;
- a101 = 102;
- a102 = 103;
- a103 = 104;
- a104 = 105;
- a105 = 106;
- a106 = 107;
- a107 = 108;
- a108 = 109;
- a109 = 110;
- a110 = 111;
- a111 = 112;
- a112 = 113;
- a113 = 114;
- a114 = 115;
- a115 = 116;
- a116 = 117;
- a117 = 118;
- a118 = 119;
- a119 = 120;
- a120 = 121;
- a121 = 122;
- a122 = 123;
- a123 = 124;
- a124 = 125;
- a125 = 126;
- a126 = 127;
- a127 = 128;
-
- final result = returnStruct1024BytesHomogeneousUint64Leaf(
- 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);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
- Expect.equals(a7, result.a7);
- Expect.equals(a8, result.a8);
- Expect.equals(a9, result.a9);
- Expect.equals(a10, result.a10);
- Expect.equals(a11, result.a11);
- Expect.equals(a12, result.a12);
- Expect.equals(a13, result.a13);
- Expect.equals(a14, result.a14);
- Expect.equals(a15, result.a15);
- Expect.equals(a16, result.a16);
- Expect.equals(a17, result.a17);
- Expect.equals(a18, result.a18);
- Expect.equals(a19, result.a19);
- Expect.equals(a20, result.a20);
- Expect.equals(a21, result.a21);
- Expect.equals(a22, result.a22);
- Expect.equals(a23, result.a23);
- Expect.equals(a24, result.a24);
- Expect.equals(a25, result.a25);
- Expect.equals(a26, result.a26);
- Expect.equals(a27, result.a27);
- Expect.equals(a28, result.a28);
- Expect.equals(a29, result.a29);
- Expect.equals(a30, result.a30);
- Expect.equals(a31, result.a31);
- Expect.equals(a32, result.a32);
- Expect.equals(a33, result.a33);
- Expect.equals(a34, result.a34);
- Expect.equals(a35, result.a35);
- Expect.equals(a36, result.a36);
- Expect.equals(a37, result.a37);
- Expect.equals(a38, result.a38);
- Expect.equals(a39, result.a39);
- Expect.equals(a40, result.a40);
- Expect.equals(a41, result.a41);
- Expect.equals(a42, result.a42);
- Expect.equals(a43, result.a43);
- Expect.equals(a44, result.a44);
- Expect.equals(a45, result.a45);
- Expect.equals(a46, result.a46);
- Expect.equals(a47, result.a47);
- Expect.equals(a48, result.a48);
- Expect.equals(a49, result.a49);
- Expect.equals(a50, result.a50);
- Expect.equals(a51, result.a51);
- Expect.equals(a52, result.a52);
- Expect.equals(a53, result.a53);
- Expect.equals(a54, result.a54);
- Expect.equals(a55, result.a55);
- Expect.equals(a56, result.a56);
- Expect.equals(a57, result.a57);
- Expect.equals(a58, result.a58);
- Expect.equals(a59, result.a59);
- Expect.equals(a60, result.a60);
- Expect.equals(a61, result.a61);
- Expect.equals(a62, result.a62);
- Expect.equals(a63, result.a63);
- Expect.equals(a64, result.a64);
- Expect.equals(a65, result.a65);
- Expect.equals(a66, result.a66);
- Expect.equals(a67, result.a67);
- Expect.equals(a68, result.a68);
- Expect.equals(a69, result.a69);
- Expect.equals(a70, result.a70);
- Expect.equals(a71, result.a71);
- Expect.equals(a72, result.a72);
- Expect.equals(a73, result.a73);
- Expect.equals(a74, result.a74);
- Expect.equals(a75, result.a75);
- Expect.equals(a76, result.a76);
- Expect.equals(a77, result.a77);
- Expect.equals(a78, result.a78);
- Expect.equals(a79, result.a79);
- Expect.equals(a80, result.a80);
- Expect.equals(a81, result.a81);
- Expect.equals(a82, result.a82);
- Expect.equals(a83, result.a83);
- Expect.equals(a84, result.a84);
- Expect.equals(a85, result.a85);
- Expect.equals(a86, result.a86);
- Expect.equals(a87, result.a87);
- Expect.equals(a88, result.a88);
- Expect.equals(a89, result.a89);
- Expect.equals(a90, result.a90);
- Expect.equals(a91, result.a91);
- Expect.equals(a92, result.a92);
- Expect.equals(a93, result.a93);
- Expect.equals(a94, result.a94);
- Expect.equals(a95, result.a95);
- Expect.equals(a96, result.a96);
- Expect.equals(a97, result.a97);
- Expect.equals(a98, result.a98);
- Expect.equals(a99, result.a99);
- Expect.equals(a100, result.a100);
- Expect.equals(a101, result.a101);
- Expect.equals(a102, result.a102);
- Expect.equals(a103, result.a103);
- Expect.equals(a104, result.a104);
- Expect.equals(a105, result.a105);
- Expect.equals(a106, result.a106);
- Expect.equals(a107, result.a107);
- Expect.equals(a108, result.a108);
- Expect.equals(a109, result.a109);
- Expect.equals(a110, result.a110);
- Expect.equals(a111, result.a111);
- Expect.equals(a112, result.a112);
- Expect.equals(a113, result.a113);
- Expect.equals(a114, result.a114);
- Expect.equals(a115, result.a115);
- Expect.equals(a116, result.a116);
- Expect.equals(a117, result.a117);
- Expect.equals(a118, result.a118);
- Expect.equals(a119, result.a119);
- Expect.equals(a120, result.a120);
- Expect.equals(a121, result.a121);
- Expect.equals(a122, result.a122);
- Expect.equals(a123, result.a123);
- Expect.equals(a124, result.a124);
- Expect.equals(a125, result.a125);
- Expect.equals(a126, result.a126);
- Expect.equals(a127, result.a127);
-}
-
-final returnStruct3BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct3BytesPackedInt Function(Int8, Int16),
- Struct3BytesPackedInt Function(
- int, int)>("ReturnStruct3BytesPackedInt", isLeaf: true);
-
-/// Small struct with mis-aligned member.
-void testReturnStruct3BytesPackedIntLeaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct3BytesPackedIntLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct8BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesPackedInt Function(Uint8, Uint32, Uint8, Uint8, Uint8),
- Struct8BytesPackedInt Function(
- int, int, int, int, int)>("ReturnStruct8BytesPackedInt", isLeaf: true);
-
-/// Struct with mis-aligned member.
-void testReturnStruct8BytesPackedIntLeaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
-
- final result = returnStruct8BytesPackedIntLeaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
-}
-
-final returnStruct9BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct9BytesPackedMixed Function(Uint8, Double),
- Struct9BytesPackedMixed Function(
- int, double)>("ReturnStruct9BytesPackedMixed", isLeaf: true);
-
-/// Struct with mis-aligned member.
-/// Tests backfilling of CPU and FPU registers.
-void testReturnStruct9BytesPackedMixedLeaf() {
- int a0;
- double a1;
-
- a0 = 1;
- a1 = 2.0;
-
- final result = returnStruct9BytesPackedMixedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
-}
-
-final returnUnion4BytesMixedLeaf = ffiTestFunctions.lookupFunction<
- Union4BytesMixed Function(Uint32),
- Union4BytesMixed Function(int)>("ReturnUnion4BytesMixed", isLeaf: true);
-
-/// Returning a mixed integer/float union.
-void testReturnUnion4BytesMixedLeaf() {
- int a0;
-
- a0 = 1;
-
- final result = returnUnion4BytesMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
-}
-
-final returnUnion8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
- Union8BytesNestedFloat Function(Double),
- Union8BytesNestedFloat Function(
- double)>("ReturnUnion8BytesNestedFloat", isLeaf: true);
-
-/// Returning a floating point only union.
-void testReturnUnion8BytesNestedFloatLeaf() {
- double a0;
-
- a0 = -1.0;
-
- final result = returnUnion8BytesNestedFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
-}
-
-final returnUnion9BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Union9BytesNestedInt Function(Struct8BytesInt),
- Union9BytesNestedInt Function(
- Struct8BytesInt)>("ReturnUnion9BytesNestedInt", isLeaf: true);
-
-/// Returning a mixed-size union.
-void testReturnUnion9BytesNestedIntLeaf() {
- final a0Pointer = calloc<Struct8BytesInt>();
- final Struct8BytesInt a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = returnUnion9BytesNestedIntLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0.a0, result.a0.a0);
- Expect.equals(a0.a1, result.a0.a1);
- Expect.equals(a0.a2, result.a0.a2);
-
- calloc.free(a0Pointer);
-}
-
-final returnUnion16BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
- Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat),
- Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat)>(
- "ReturnUnion16BytesNestedFloat",
- isLeaf: true);
-
-/// Returning union with homogenous floats.
-void testReturnUnion16BytesNestedFloatLeaf() {
- final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2.0;
-
- final result = returnUnion16BytesNestedFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(a0.a0, result.a0.a0);
- Expect.approxEquals(a0.a1, result.a0.a1);
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
- Struct1ByteInt Function(Struct1ByteInt),
- Struct1ByteInt Function(
- Struct1ByteInt)>("ReturnStructArgumentStruct1ByteInt", isLeaf: true);
-
-/// 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 testReturnStructArgumentStruct1ByteIntLeaf() {
- final a0Pointer = calloc<Struct1ByteInt>();
- final Struct1ByteInt a0 = a0Pointer.ref;
-
- a0.a0 = -1;
-
- final result = returnStructArgumentStruct1ByteIntLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0.a0, result.a0);
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentInt32x8Struct1ByteIntLeaf =
- ffiTestFunctions
- .lookupFunction<
- Struct1ByteInt Function(Int32, Int32, Int32, Int32, Int32, Int32,
- Int32, Int32, Struct1ByteInt),
- Struct1ByteInt Function(
- int, int, int, int, int, int, int, int, Struct1ByteInt)>(
- "ReturnStructArgumentInt32x8Struct1ByteInt",
- isLeaf: true);
-
-/// Test that a struct passed in as argument can be returned.
-/// Especially for ffi callbacks.
-/// Struct is passed on stack on all ABIs.
-void testReturnStructArgumentInt32x8Struct1ByteIntLeaf() {
- 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 = returnStructArgumentInt32x8Struct1ByteIntLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.equals(a8.a0, result.a0);
-
- calloc.free(a8Pointer);
-}
-
-final returnStructArgumentStruct8BytesHomogeneousFloatLeaf =
- ffiTestFunctions.lookupFunction<
- Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat),
- Struct8BytesHomogeneousFloat Function(
- Struct8BytesHomogeneousFloat)>(
- "ReturnStructArgumentStruct8BytesHomogeneousFloat",
- isLeaf: true);
-
-/// 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 testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf() {
- final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2.0;
-
- final result = returnStructArgumentStruct8BytesHomogeneousFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(a0.a0, result.a0);
- Expect.approxEquals(a0.a1, result.a1);
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentStruct20BytesHomogeneousInt32Leaf =
- ffiTestFunctions
- .lookupFunction<
- Struct20BytesHomogeneousInt32 Function(
- Struct20BytesHomogeneousInt32),
- Struct20BytesHomogeneousInt32 Function(
- Struct20BytesHomogeneousInt32)>(
- "ReturnStructArgumentStruct20BytesHomogeneousInt32",
- isLeaf: true);
-
-/// On arm64, both argument and return value are passed in by pointer.
-void testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf() {
- 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 = returnStructArgumentStruct20BytesHomogeneousInt32Leaf(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);
-}
-
-final returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf =
- ffiTestFunctions.lookupFunction<
- Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32,
- Int32, Int32, Int32, Int32, Struct20BytesHomogeneousInt32),
- Struct20BytesHomogeneousInt32 Function(int, int, int, int, int, int,
- int, int, Struct20BytesHomogeneousInt32)>(
- "ReturnStructArgumentInt32x8Struct20BytesHomogeneou",
- isLeaf: true);
-
-/// On arm64, both argument and return value are passed in by pointer.
-/// Ints exhaust registers, so that pointer is passed on stack.
-void testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf() {
- 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 = returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf(
- 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);
-}
-
-final returnStructArgumentStruct8BytesInlineArrayIntLeaf =
- ffiTestFunctions.lookupFunction<
- Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt),
- Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt)>(
- "ReturnStructArgumentStruct8BytesInlineArrayInt",
- isLeaf: true);
-
-/// Test returning struct with inline array.
-void testReturnStructArgumentStruct8BytesInlineArrayIntLeaf() {
- 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 = returnStructArgumentStruct8BytesInlineArrayIntLeaf(a0);
-
- print("result = $result");
-
- for (int i = 0; i < 8; i++) {
- Expect.equals(a0.a0[i], result.a0[i]);
- }
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentStructStruct16BytesHomogeneousLeaf =
- ffiTestFunctions.lookupFunction<
- StructStruct16BytesHomogeneousFloat2 Function(
- StructStruct16BytesHomogeneousFloat2),
- StructStruct16BytesHomogeneousFloat2 Function(
- StructStruct16BytesHomogeneousFloat2)>(
- "ReturnStructArgumentStructStruct16BytesHomogeneous",
- isLeaf: true);
-
-/// Return value in FPU registers on arm hardfp and arm64.
-void testReturnStructArgumentStructStruct16BytesHomogeneousLeaf() {
- 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 = returnStructArgumentStructStruct16BytesHomogeneousLeaf(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);
-}
-
-final returnStructArgumentStructStruct32BytesHomogeneousLeaf =
- ffiTestFunctions.lookupFunction<
- StructStruct32BytesHomogeneousDouble2 Function(
- StructStruct32BytesHomogeneousDouble2),
- StructStruct32BytesHomogeneousDouble2 Function(
- StructStruct32BytesHomogeneousDouble2)>(
- "ReturnStructArgumentStructStruct32BytesHomogeneous",
- isLeaf: true);
-
-/// Return value in FPU registers on arm64.
-void testReturnStructArgumentStructStruct32BytesHomogeneousLeaf() {
- 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 = returnStructArgumentStructStruct32BytesHomogeneousLeaf(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);
-}
-
-final returnStructArgumentStructStruct16BytesMixed3Leaf =
- ffiTestFunctions.lookupFunction<
- StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3),
- StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3)>(
- "ReturnStructArgumentStructStruct16BytesMixed3",
- isLeaf: true);
-
-/// On x64 Linux, return value is split over FP and int registers.
-void testReturnStructArgumentStructStruct16BytesMixed3Leaf() {
- 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 = returnStructArgumentStructStruct16BytesMixed3Leaf(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);
-}
-
-final returnStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
- StructAlignmentInt16 Function(Int8, Int16, Int8),
- StructAlignmentInt16 Function(
- int, int, int)>("ReturnStructAlignmentInt16", isLeaf: true);
-
-/// Test alignment and padding of 16 byte int within struct.
-void testReturnStructAlignmentInt16Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStructAlignmentInt16Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
- StructAlignmentInt32 Function(Int8, Int32, Int8),
- StructAlignmentInt32 Function(
- int, int, int)>("ReturnStructAlignmentInt32", isLeaf: true);
-
-/// Test alignment and padding of 32 byte int within struct.
-void testReturnStructAlignmentInt32Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStructAlignmentInt32Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
- StructAlignmentInt64 Function(Int8, Int64, Int8),
- StructAlignmentInt64 Function(
- int, int, int)>("ReturnStructAlignmentInt64", isLeaf: true);
-
-/// Test alignment and padding of 64 byte int within struct.
-void testReturnStructAlignmentInt64Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStructAlignmentInt64Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct8BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedInt Function(
- Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16),
- Struct8BytesNestedInt Function(
- Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16)>(
- "ReturnStruct8BytesNestedInt",
- isLeaf: true);
-
-/// Simple nested struct.
-void testReturnStruct8BytesNestedIntLeaf() {
- 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 = returnStruct8BytesNestedIntLeaf(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);
-}
-
-final returnStruct8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedFloat Function(Struct4BytesFloat, Struct4BytesFloat),
- Struct8BytesNestedFloat Function(Struct4BytesFloat,
- Struct4BytesFloat)>("ReturnStruct8BytesNestedFloat", isLeaf: true);
-
-/// Simple nested struct with floats.
-void testReturnStruct8BytesNestedFloatLeaf() {
- 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 = returnStruct8BytesNestedFloatLeaf(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);
-}
-
-final returnStruct8BytesNestedFloat2Leaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedFloat2 Function(Struct4BytesFloat, Float),
- Struct8BytesNestedFloat2 Function(Struct4BytesFloat,
- double)>("ReturnStruct8BytesNestedFloat2", isLeaf: true);
-
-/// The nesting is irregular, testing homogenous float rules on arm and arm64,
-/// and the fpu register usage on x64.
-void testReturnStruct8BytesNestedFloat2Leaf() {
- final a0Pointer = calloc<Struct4BytesFloat>();
- final Struct4BytesFloat a0 = a0Pointer.ref;
- double a1;
-
- a0.a0 = -1.0;
- a1 = 2.0;
-
- final result = returnStruct8BytesNestedFloat2Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.approxEquals(a0.a0, result.a0.a0);
- Expect.approxEquals(a1, result.a1);
-
- calloc.free(a0Pointer);
-}
-
-final returnStruct8BytesNestedMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedMixed Function(
- Struct4BytesHomogeneousInt16, Struct4BytesFloat),
- Struct8BytesNestedMixed Function(Struct4BytesHomogeneousInt16,
- Struct4BytesFloat)>("ReturnStruct8BytesNestedMixed", isLeaf: true);
-
-/// Simple nested struct with mixed members.
-void testReturnStruct8BytesNestedMixedLeaf() {
- 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 = returnStruct8BytesNestedMixedLeaf(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);
-}
-
-final returnStruct16BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct16BytesNestedInt Function(
- Struct8BytesNestedInt, Struct8BytesNestedInt),
- Struct16BytesNestedInt Function(Struct8BytesNestedInt,
- Struct8BytesNestedInt)>("ReturnStruct16BytesNestedInt", isLeaf: true);
-
-/// Deeper nested struct to test recursive member access.
-void testReturnStruct16BytesNestedIntLeaf() {
- 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 = returnStruct16BytesNestedIntLeaf(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);
-}
-
-final returnStruct32BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct32BytesNestedInt Function(
- Struct16BytesNestedInt, Struct16BytesNestedInt),
- Struct32BytesNestedInt Function(Struct16BytesNestedInt,
- Struct16BytesNestedInt)>("ReturnStruct32BytesNestedInt", isLeaf: true);
-
-/// Even deeper nested struct to test recursive member access.
-void testReturnStruct32BytesNestedIntLeaf() {
- 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 = returnStruct32BytesNestedIntLeaf(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);
-}
-
-final returnStructNestedIntStructAlignmentInt16Leaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIntStructAlignmentInt16 Function(
- StructAlignmentInt16, StructAlignmentInt16),
- StructNestedIntStructAlignmentInt16 Function(
- StructAlignmentInt16, StructAlignmentInt16)>(
- "ReturnStructNestedIntStructAlignmentInt16",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 16 byte int.
-void testReturnStructNestedIntStructAlignmentInt16Leaf() {
- 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 = returnStructNestedIntStructAlignmentInt16Leaf(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);
-}
-
-final returnStructNestedIntStructAlignmentInt32Leaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIntStructAlignmentInt32 Function(
- StructAlignmentInt32, StructAlignmentInt32),
- StructNestedIntStructAlignmentInt32 Function(
- StructAlignmentInt32, StructAlignmentInt32)>(
- "ReturnStructNestedIntStructAlignmentInt32",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 32 byte int.
-void testReturnStructNestedIntStructAlignmentInt32Leaf() {
- 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 = returnStructNestedIntStructAlignmentInt32Leaf(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);
-}
-
-final returnStructNestedIntStructAlignmentInt64Leaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIntStructAlignmentInt64 Function(
- StructAlignmentInt64, StructAlignmentInt64),
- StructNestedIntStructAlignmentInt64 Function(
- StructAlignmentInt64, StructAlignmentInt64)>(
- "ReturnStructNestedIntStructAlignmentInt64",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 64 byte int.
-void testReturnStructNestedIntStructAlignmentInt64Leaf() {
- 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 = returnStructNestedIntStructAlignmentInt64Leaf(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);
-}
-
-final returnStructNestedIrregularEvenBiggerLeaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIrregularEvenBigger Function(Uint64,
- StructNestedIrregularBigger, StructNestedIrregularBigger, Double),
- StructNestedIrregularEvenBigger Function(
- int,
- StructNestedIrregularBigger,
- StructNestedIrregularBigger,
- double)>("ReturnStructNestedIrregularEvenBigger", isLeaf: true);
-
-/// Return big irregular struct as smoke test.
-void testReturnStructNestedIrregularEvenBiggerLeaf() {
- 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 = returnStructNestedIrregularEvenBiggerLeaf(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);
-}
diff --git a/tests/ffi/generator/structs_by_value_tests_generator.dart b/tests/ffi/generator/structs_by_value_tests_generator.dart
index f030b93..03f16ff 100644
--- a/tests/ffi/generator/structs_by_value_tests_generator.dart
+++ b/tests/ffi/generator/structs_by_value_tests_generator.dart
@@ -478,14 +478,14 @@
}
extension on CompositeType {
- String dartClass(bool nnbd) {
+ String dartClass({required bool isNnbd}) {
final self = this;
final packingAnnotation = (self is StructType) && self.hasPacking
? "@Packed(${self.packing})"
: "";
String dartFields = "";
for (final member in members) {
- dartFields += "${member.dartStructField(nnbd)}\n\n";
+ dartFields += "${member.dartStructField(isNnbd)}\n\n";
}
String toStringBody = members.map((m) {
if (m.type is FixedLengthArrayType) {
@@ -585,7 +585,7 @@
""";
}
- String dartCallbackCode(bool nnbd) {
+ String dartCallbackCode({required bool isNnbd}) {
final argumentss =
arguments.map((a) => "${a.type.dartType} ${a.name}").join(", ");
@@ -652,7 +652,7 @@
}
String returnNull = "";
- if (!nnbd) {
+ if (!isNnbd) {
returnNull = """
if (${arguments.firstArgumentName()} == $returnNullValue) {
print("returning null!");
@@ -861,15 +861,55 @@
// @dart = 2.9
''';
-headerDartCallTest(bool nnbd) {
- final dartVersion = nnbd ? '' : dart2dot9;
-
+headerCommon({required int copyrightYear}) {
+ final year = copyrightYear;
return """
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) $year, 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.""";
+}
+
+headerDartCompound({required bool isNnbd, required int copyrightYear}) {
+ final dartVersion = isNnbd ? '' : dart2dot9;
+
+ return """
+${headerCommon(copyrightYear: copyrightYear)}
+
+$dartVersion
+
+import 'dart:ffi';
+""";
+}
+
+String compoundsPath({required bool isNnbd}) {
+ final folder = isNnbd ? 'ffi' : 'ffi_2';
+ return Platform.script
+ .resolve(
+ "../../$folder/function_structs_by_value_generated_compounds.dart")
+ .path;
+}
+
+Future<void> writeDartCompounds() async {
+ await Future.wait([true, false].map((isNnbd) async {
+ final StringBuffer buffer = StringBuffer();
+ buffer.write(headerDartCompound(isNnbd: isNnbd, copyrightYear: 2021));
+
+ buffer.writeAll(compounds.map((e) => e.dartClass(isNnbd: isNnbd)));
+
+ final path = compoundsPath(isNnbd: isNnbd);
+ await File(path).writeAsString(buffer.toString());
+ await runProcess("dart", ["format", path]);
+ }));
+}
+
+headerDartCallTest({required bool isNnbd, required int copyrightYear}) {
+ final dartVersion = isNnbd ? '' : dart2dot9;
+
+ return """
+${headerCommon(copyrightYear: copyrightYear)}
//
// SharedObjects=ffi_test_functions
// VMOptions=
@@ -886,49 +926,49 @@
import 'dylib_utils.dart';
+// Reuse the compound classes.
+import 'function_structs_by_value_generated_compounds.dart';
+
final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
""";
}
-void writeDartCallTest() {
- for (bool nnbd in [true, false]) {
+Future<void> writeDartCallTest({required bool isLeaf}) async {
+ await Future.wait([true, false].map((isNnbd) async {
final StringBuffer buffer = StringBuffer();
- buffer.write(headerDartCallTest(nnbd));
+ buffer.write(headerDartCallTest(
+ isNnbd: isNnbd, copyrightYear: isLeaf ? 2021 : 2020));
+ final suffix = isLeaf ? 'Leaf' : '';
buffer.write("""
void main() {
for (int i = 0; i < 10; ++i) {
- ${functions.map((e) => "${e.dartTestName}();").join("\n")}
- ${functions.map((e) => "${e.dartTestName}Leaf();").join("\n")}
+ ${functions.map((e) => "${e.dartTestName}$suffix();").join("\n")}
}
}
""");
- buffer.writeAll(compounds.map((e) => e.dartClass(nnbd)));
- buffer.writeAll(functions.map((e) => e.dartCallCode(isLeaf: false)));
- buffer.writeAll(functions.map((e) => e.dartCallCode(isLeaf: true)));
+ buffer.writeAll(functions.map((e) => e.dartCallCode(isLeaf: isLeaf)));
- final path = callTestPath(nnbd);
- File(path).writeAsStringSync(buffer.toString());
- Process.runSync("dart", ["format", path]);
- }
+ final path = callTestPath(isNnbd: isNnbd, isLeaf: isLeaf);
+ await File(path).writeAsString(buffer.toString());
+ await runProcess("dart", ["format", path]);
+ }));
}
-String callTestPath(bool nnbd) {
- final folder = nnbd ? "ffi" : "ffi_2";
+String callTestPath({required bool isNnbd, required bool isLeaf}) {
+ final folder = isNnbd ? 'ffi' : 'ffi_2';
+ final suffix = isLeaf ? '_leaf' : '';
return Platform.script
- .resolve("../../$folder/function_structs_by_value_generated_test.dart")
+ .resolve(
+ "../../$folder/function_structs_by_value_generated${suffix}_test.dart")
.path;
}
-headerDartCallbackTest(bool nnbd) {
- final dartVersion = nnbd ? '' : dart2dot9;
+headerDartCallbackTest({required bool isNnbd, required int copyrightYear}) {
+ final dartVersion = isNnbd ? '' : dart2dot9;
return """
-// 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.
+${headerCommon(copyrightYear: copyrightYear)}
//
// SharedObjects=ffi_test_functions
// VMOptions=
@@ -945,9 +985,12 @@
import 'callback_tests_utils.dart';
-// Reuse the struct classes.
-import 'function_structs_by_value_generated_test.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() {
testCases.forEach((t) {
@@ -960,10 +1003,10 @@
""";
}
-void writeDartCallbackTest() {
- for (bool nnbd in [true, false]) {
+Future<void> writeDartCallbackTest() async {
+ await Future.wait([true, false].map((isNnbd) async {
final StringBuffer buffer = StringBuffer();
- buffer.write(headerDartCallbackTest(nnbd));
+ buffer.write(headerDartCallbackTest(isNnbd: isNnbd, copyrightYear: 2020));
buffer.write("""
final testCases = [
@@ -971,28 +1014,25 @@
];
""");
- buffer.writeAll(functions.map((e) => e.dartCallbackCode(nnbd)));
+ buffer.writeAll(functions.map((e) => e.dartCallbackCode(isNnbd: isNnbd)));
- final path = callbackTestPath(nnbd);
- File(path).writeAsStringSync(buffer.toString());
- Process.runSync("dart", ["format", path]);
- }
+ final path = callbackTestPath(isNnbd: isNnbd);
+ await File(path).writeAsString(buffer.toString());
+ await runProcess("dart", ["format", path]);
+ }));
}
-String callbackTestPath(bool nnbd) {
- final folder = nnbd ? "ffi" : "ffi_2";
+String callbackTestPath({required bool isNnbd}) {
+ final folder = isNnbd ? "ffi" : "ffi_2";
return Platform.script
.resolve(
"../../$folder/function_callbacks_structs_by_value_generated_test.dart")
.path;
}
-const headerC = """
-// 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.
+headerC({required int copyrightYear}) {
+ return """
+${headerCommon(copyrightYear: copyrightYear)}
#include <stddef.h>
#include <stdlib.h>
@@ -1025,15 +1065,16 @@
((EXPECTED * 0.99) >= (ACTUAL) && (EXPECTED * 1.01) <= (ACTUAL)))
""";
+}
const footerC = """
} // namespace dart
""";
-void writeC() {
+Future<void> writeC() async {
final StringBuffer buffer = StringBuffer();
- buffer.write(headerC);
+ buffer.write(headerC(copyrightYear: 2020));
buffer.writeAll(compounds.map((e) => e.cDefinition));
buffer.writeAll(functions.map((e) => e.cCallCode));
@@ -1041,8 +1082,8 @@
buffer.write(footerC);
- File(ccPath).writeAsStringSync(buffer.toString());
- Process.runSync("clang-format", ["-i", ccPath]);
+ await File(ccPath).writeAsString(buffer.toString());
+ await runProcess("clang-format", ["-i", ccPath]);
}
final ccPath = Platform.script
@@ -1055,20 +1096,50 @@
Generates:
- $ccPath
-- ${callbackTestPath(true)}
-- ${callTestPath(true)}
-- ${callbackTestPath(false)}
-- ${callTestPath(false)}
+- ${compoundsPath(isNnbd: true)}
+- ${callbackTestPath(isNnbd: true)}
+- ${callTestPath(isNnbd: true, isLeaf: false)}
+- ${callTestPath(isNnbd: true, isLeaf: true)}
+- ${compoundsPath(isNnbd: false)}
+- ${callbackTestPath(isNnbd: false)}
+- ${callTestPath(isNnbd: false, isLeaf: false)}
+- ${callTestPath(isNnbd: false, isLeaf: true)}
""");
}
-void main(List<String> arguments) {
+void main(List<String> arguments) async {
if (arguments.length != 0) {
printUsage();
return;
}
- writeDartCallTest();
- writeDartCallbackTest();
- writeC();
+ await Future.wait([
+ writeDartCompounds(),
+ writeDartCallTest(isLeaf: false),
+ writeDartCallTest(isLeaf: true),
+ writeDartCallbackTest(),
+ writeC(),
+ ]);
+}
+
+Future<void> runProcess(String executable, List<String> arguments) async {
+ final commandString = [executable, ...arguments].join(' ');
+ stdout.writeln('Running `$commandString`.');
+ final process = await Process.start(
+ executable,
+ arguments,
+ runInShell: true,
+ includeParentEnvironment: true,
+ ).then((process) {
+ process.stdout.forEach((data) => stdout.add(data));
+ process.stderr.forEach((data) => stderr.add(data));
+ return process;
+ });
+ final exitCode = await process.exitCode;
+ if (exitCode != 0) {
+ final message = 'Command `$commandString` failed with exit code $exitCode.';
+ stderr.writeln(message);
+ throw Exception(message);
+ }
+ stdout.writeln('Command `$commandString` done.');
}
diff --git a/tests/ffi/inline_array_multi_dimensional_test.dart b/tests/ffi/inline_array_multi_dimensional_test.dart
index 15d2059..5c90664 100644
--- a/tests/ffi/inline_array_multi_dimensional_test.dart
+++ b/tests/ffi/inline_array_multi_dimensional_test.dart
@@ -9,8 +9,8 @@
import "package:expect/expect.dart";
import 'package:ffi/ffi.dart';
-// Reuse struct definitions.
-import 'function_structs_by_value_generated_test.dart';
+// Reuse compound definitions.
+import 'function_structs_by_value_generated_compounds.dart';
void main() {
testSizeOf();
diff --git a/tests/ffi/inline_array_test.dart b/tests/ffi/inline_array_test.dart
index 868d117..dc5914c 100644
--- a/tests/ffi/inline_array_test.dart
+++ b/tests/ffi/inline_array_test.dart
@@ -9,8 +9,8 @@
import "package:expect/expect.dart";
import 'package:ffi/ffi.dart';
-// Reuse struct definitions.
-import 'function_structs_by_value_generated_test.dart';
+// Reuse compound definitions.
+import 'function_structs_by_value_generated_compounds.dart';
void main() {
testSizeOf();
diff --git a/tests/ffi/structs_packed_test.dart b/tests/ffi/structs_packed_test.dart
index cec7703..453e795 100644
--- a/tests/ffi/structs_packed_test.dart
+++ b/tests/ffi/structs_packed_test.dart
@@ -10,8 +10,8 @@
import 'dylib_utils.dart';
-// Reuse struct definitions.
-import 'function_structs_by_value_generated_test.dart';
+// Reuse compound definitions.
+import 'function_structs_by_value_generated_compounds.dart';
void main() {
testSizeOfC();
diff --git a/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart b/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
index dd0e719..ba0f7ff 100644
--- a/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
+++ b/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
@@ -3,6 +3,7 @@
// 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=
@@ -19,8 +20,12 @@
import 'callback_tests_utils.dart';
-// Reuse the struct classes.
-import 'function_structs_by_value_generated_test.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() {
testCases.forEach((t) {
diff --git a/tests/ffi_2/function_callbacks_structs_by_value_test.dart b/tests/ffi_2/function_callbacks_structs_by_value_test.dart
index 4ecdbaf..e3cee62 100644
--- a/tests/ffi_2/function_callbacks_structs_by_value_test.dart
+++ b/tests/ffi_2/function_callbacks_structs_by_value_test.dart
@@ -13,8 +13,12 @@
import "package:expect/expect.dart";
import "package:ffi/ffi.dart";
+import 'dylib_utils.dart';
+
// Reuse the struct classes.
-import 'function_structs_by_value_generated_test.dart';
+import 'function_structs_by_value_generated_compounds.dart';
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
for (int i = 0; i < 10; i++) {
diff --git a/tests/ffi_2/function_structs_by_value_generated_compounds.dart b/tests/ffi_2/function_structs_by_value_generated_compounds.dart
new file mode 100644
index 0000000..ede77a3
--- /dev/null
+++ b/tests/ffi_2/function_structs_by_value_generated_compounds.dart
@@ -0,0 +1,1212 @@
+// Copyright (c) 2021, 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.
+
+// @dart = 2.9
+
+import 'dart:ffi';
+
+class Struct1ByteInt extends Struct {
+ @Int8()
+ int a0;
+
+ String toString() => "(${a0})";
+}
+
+class Struct3BytesHomogeneousUint8 extends Struct {
+ @Uint8()
+ int a0;
+
+ @Uint8()
+ int a1;
+
+ @Uint8()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct3BytesInt2ByteAligned extends Struct {
+ @Int16()
+ int a0;
+
+ @Int8()
+ int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct4BytesHomogeneousInt16 extends Struct {
+ @Int16()
+ int a0;
+
+ @Int16()
+ int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct4BytesFloat extends Struct {
+ @Float()
+ double a0;
+
+ String toString() => "(${a0})";
+}
+
+class Struct7BytesHomogeneousUint8 extends Struct {
+ @Uint8()
+ int a0;
+
+ @Uint8()
+ int a1;
+
+ @Uint8()
+ int a2;
+
+ @Uint8()
+ int a3;
+
+ @Uint8()
+ int a4;
+
+ @Uint8()
+ int a5;
+
+ @Uint8()
+ int a6;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})";
+}
+
+class Struct7BytesInt4ByteAligned extends Struct {
+ @Int32()
+ int a0;
+
+ @Int16()
+ int a1;
+
+ @Int8()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct8BytesInt extends Struct {
+ @Int16()
+ int a0;
+
+ @Int16()
+ int a1;
+
+ @Int32()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct8BytesHomogeneousFloat extends Struct {
+ @Float()
+ double a0;
+
+ @Float()
+ double a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct8BytesFloat extends Struct {
+ @Double()
+ double a0;
+
+ String toString() => "(${a0})";
+}
+
+class Struct8BytesMixed extends Struct {
+ @Float()
+ double a0;
+
+ @Int16()
+ int a1;
+
+ @Int16()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct9BytesHomogeneousUint8 extends Struct {
+ @Uint8()
+ int a0;
+
+ @Uint8()
+ int a1;
+
+ @Uint8()
+ int a2;
+
+ @Uint8()
+ int a3;
+
+ @Uint8()
+ int a4;
+
+ @Uint8()
+ int a5;
+
+ @Uint8()
+ int a6;
+
+ @Uint8()
+ int a7;
+
+ @Uint8()
+ int a8;
+
+ String toString() =>
+ "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})";
+}
+
+class Struct9BytesInt4Or8ByteAligned extends Struct {
+ @Int64()
+ int a0;
+
+ @Int8()
+ int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct12BytesHomogeneousFloat extends Struct {
+ @Float()
+ double a0;
+
+ @Float()
+ double a1;
+
+ @Float()
+ double a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct16BytesHomogeneousFloat extends Struct {
+ @Float()
+ double a0;
+
+ @Float()
+ double a1;
+
+ @Float()
+ double a2;
+
+ @Float()
+ double a3;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct16BytesMixed extends Struct {
+ @Double()
+ double a0;
+
+ @Int64()
+ int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct16BytesMixed2 extends Struct {
+ @Float()
+ double a0;
+
+ @Float()
+ double a1;
+
+ @Float()
+ double a2;
+
+ @Int32()
+ int a3;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct17BytesInt extends Struct {
+ @Int64()
+ int a0;
+
+ @Int64()
+ int a1;
+
+ @Int8()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct19BytesHomogeneousUint8 extends Struct {
+ @Uint8()
+ int a0;
+
+ @Uint8()
+ int a1;
+
+ @Uint8()
+ int a2;
+
+ @Uint8()
+ int a3;
+
+ @Uint8()
+ int a4;
+
+ @Uint8()
+ int a5;
+
+ @Uint8()
+ int a6;
+
+ @Uint8()
+ int a7;
+
+ @Uint8()
+ int a8;
+
+ @Uint8()
+ int a9;
+
+ @Uint8()
+ int a10;
+
+ @Uint8()
+ int a11;
+
+ @Uint8()
+ int a12;
+
+ @Uint8()
+ int a13;
+
+ @Uint8()
+ int a14;
+
+ @Uint8()
+ int a15;
+
+ @Uint8()
+ int a16;
+
+ @Uint8()
+ int a17;
+
+ @Uint8()
+ 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()
+ int a0;
+
+ @Int32()
+ int a1;
+
+ @Int32()
+ int a2;
+
+ @Int32()
+ int a3;
+
+ @Int32()
+ int a4;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct20BytesHomogeneousFloat extends Struct {
+ @Float()
+ double a0;
+
+ @Float()
+ double a1;
+
+ @Float()
+ double a2;
+
+ @Float()
+ double a3;
+
+ @Float()
+ double a4;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct32BytesHomogeneousDouble extends Struct {
+ @Double()
+ double a0;
+
+ @Double()
+ double a1;
+
+ @Double()
+ double a2;
+
+ @Double()
+ double a3;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct40BytesHomogeneousDouble extends Struct {
+ @Double()
+ double a0;
+
+ @Double()
+ double a1;
+
+ @Double()
+ double a2;
+
+ @Double()
+ double a3;
+
+ @Double()
+ double a4;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+class Struct1024BytesHomogeneousUint64 extends Struct {
+ @Uint64()
+ int a0;
+
+ @Uint64()
+ int a1;
+
+ @Uint64()
+ int a2;
+
+ @Uint64()
+ int a3;
+
+ @Uint64()
+ int a4;
+
+ @Uint64()
+ int a5;
+
+ @Uint64()
+ int a6;
+
+ @Uint64()
+ int a7;
+
+ @Uint64()
+ int a8;
+
+ @Uint64()
+ int a9;
+
+ @Uint64()
+ int a10;
+
+ @Uint64()
+ int a11;
+
+ @Uint64()
+ int a12;
+
+ @Uint64()
+ int a13;
+
+ @Uint64()
+ int a14;
+
+ @Uint64()
+ int a15;
+
+ @Uint64()
+ int a16;
+
+ @Uint64()
+ int a17;
+
+ @Uint64()
+ int a18;
+
+ @Uint64()
+ int a19;
+
+ @Uint64()
+ int a20;
+
+ @Uint64()
+ int a21;
+
+ @Uint64()
+ int a22;
+
+ @Uint64()
+ int a23;
+
+ @Uint64()
+ int a24;
+
+ @Uint64()
+ int a25;
+
+ @Uint64()
+ int a26;
+
+ @Uint64()
+ int a27;
+
+ @Uint64()
+ int a28;
+
+ @Uint64()
+ int a29;
+
+ @Uint64()
+ int a30;
+
+ @Uint64()
+ int a31;
+
+ @Uint64()
+ int a32;
+
+ @Uint64()
+ int a33;
+
+ @Uint64()
+ int a34;
+
+ @Uint64()
+ int a35;
+
+ @Uint64()
+ int a36;
+
+ @Uint64()
+ int a37;
+
+ @Uint64()
+ int a38;
+
+ @Uint64()
+ int a39;
+
+ @Uint64()
+ int a40;
+
+ @Uint64()
+ int a41;
+
+ @Uint64()
+ int a42;
+
+ @Uint64()
+ int a43;
+
+ @Uint64()
+ int a44;
+
+ @Uint64()
+ int a45;
+
+ @Uint64()
+ int a46;
+
+ @Uint64()
+ int a47;
+
+ @Uint64()
+ int a48;
+
+ @Uint64()
+ int a49;
+
+ @Uint64()
+ int a50;
+
+ @Uint64()
+ int a51;
+
+ @Uint64()
+ int a52;
+
+ @Uint64()
+ int a53;
+
+ @Uint64()
+ int a54;
+
+ @Uint64()
+ int a55;
+
+ @Uint64()
+ int a56;
+
+ @Uint64()
+ int a57;
+
+ @Uint64()
+ int a58;
+
+ @Uint64()
+ int a59;
+
+ @Uint64()
+ int a60;
+
+ @Uint64()
+ int a61;
+
+ @Uint64()
+ int a62;
+
+ @Uint64()
+ int a63;
+
+ @Uint64()
+ int a64;
+
+ @Uint64()
+ int a65;
+
+ @Uint64()
+ int a66;
+
+ @Uint64()
+ int a67;
+
+ @Uint64()
+ int a68;
+
+ @Uint64()
+ int a69;
+
+ @Uint64()
+ int a70;
+
+ @Uint64()
+ int a71;
+
+ @Uint64()
+ int a72;
+
+ @Uint64()
+ int a73;
+
+ @Uint64()
+ int a74;
+
+ @Uint64()
+ int a75;
+
+ @Uint64()
+ int a76;
+
+ @Uint64()
+ int a77;
+
+ @Uint64()
+ int a78;
+
+ @Uint64()
+ int a79;
+
+ @Uint64()
+ int a80;
+
+ @Uint64()
+ int a81;
+
+ @Uint64()
+ int a82;
+
+ @Uint64()
+ int a83;
+
+ @Uint64()
+ int a84;
+
+ @Uint64()
+ int a85;
+
+ @Uint64()
+ int a86;
+
+ @Uint64()
+ int a87;
+
+ @Uint64()
+ int a88;
+
+ @Uint64()
+ int a89;
+
+ @Uint64()
+ int a90;
+
+ @Uint64()
+ int a91;
+
+ @Uint64()
+ int a92;
+
+ @Uint64()
+ int a93;
+
+ @Uint64()
+ int a94;
+
+ @Uint64()
+ int a95;
+
+ @Uint64()
+ int a96;
+
+ @Uint64()
+ int a97;
+
+ @Uint64()
+ int a98;
+
+ @Uint64()
+ int a99;
+
+ @Uint64()
+ int a100;
+
+ @Uint64()
+ int a101;
+
+ @Uint64()
+ int a102;
+
+ @Uint64()
+ int a103;
+
+ @Uint64()
+ int a104;
+
+ @Uint64()
+ int a105;
+
+ @Uint64()
+ int a106;
+
+ @Uint64()
+ int a107;
+
+ @Uint64()
+ int a108;
+
+ @Uint64()
+ int a109;
+
+ @Uint64()
+ int a110;
+
+ @Uint64()
+ int a111;
+
+ @Uint64()
+ int a112;
+
+ @Uint64()
+ int a113;
+
+ @Uint64()
+ int a114;
+
+ @Uint64()
+ int a115;
+
+ @Uint64()
+ int a116;
+
+ @Uint64()
+ int a117;
+
+ @Uint64()
+ int a118;
+
+ @Uint64()
+ int a119;
+
+ @Uint64()
+ int a120;
+
+ @Uint64()
+ int a121;
+
+ @Uint64()
+ int a122;
+
+ @Uint64()
+ int a123;
+
+ @Uint64()
+ int a124;
+
+ @Uint64()
+ int a125;
+
+ @Uint64()
+ int a126;
+
+ @Uint64()
+ 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()
+ int a0;
+
+ @Int16()
+ int a1;
+
+ @Int8()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class StructAlignmentInt32 extends Struct {
+ @Int8()
+ int a0;
+
+ @Int32()
+ int a1;
+
+ @Int8()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class StructAlignmentInt64 extends Struct {
+ @Int8()
+ int a0;
+
+ @Int64()
+ int a1;
+
+ @Int8()
+ int a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
+
+class Struct8BytesNestedInt extends Struct {
+ Struct4BytesHomogeneousInt16 a0;
+
+ Struct4BytesHomogeneousInt16 a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct8BytesNestedFloat extends Struct {
+ Struct4BytesFloat a0;
+
+ Struct4BytesFloat a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct8BytesNestedFloat2 extends Struct {
+ Struct4BytesFloat a0;
+
+ @Float()
+ double a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct8BytesNestedMixed extends Struct {
+ Struct4BytesHomogeneousInt16 a0;
+
+ Struct4BytesFloat a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct16BytesNestedInt extends Struct {
+ Struct8BytesNestedInt a0;
+
+ Struct8BytesNestedInt a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct32BytesNestedInt extends Struct {
+ Struct16BytesNestedInt a0;
+
+ Struct16BytesNestedInt a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class StructNestedIntStructAlignmentInt16 extends Struct {
+ StructAlignmentInt16 a0;
+
+ StructAlignmentInt16 a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class StructNestedIntStructAlignmentInt32 extends Struct {
+ StructAlignmentInt32 a0;
+
+ StructAlignmentInt32 a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class StructNestedIntStructAlignmentInt64 extends Struct {
+ StructAlignmentInt64 a0;
+
+ StructAlignmentInt64 a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class StructNestedIrregularBig extends Struct {
+ @Uint16()
+ int a0;
+
+ Struct8BytesNestedMixed a1;
+
+ @Uint16()
+ int a2;
+
+ Struct8BytesNestedFloat2 a3;
+
+ @Uint16()
+ int a4;
+
+ Struct8BytesNestedFloat a5;
+
+ @Uint16()
+ int a6;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})";
+}
+
+class StructNestedIrregularBigger extends Struct {
+ StructNestedIrregularBig a0;
+
+ Struct8BytesNestedMixed a1;
+
+ @Float()
+ double a2;
+
+ @Double()
+ double a3;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class StructNestedIrregularEvenBigger extends Struct {
+ @Uint64()
+ int a0;
+
+ StructNestedIrregularBigger a1;
+
+ StructNestedIrregularBigger a2;
+
+ @Double()
+ double a3;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
+}
+
+class Struct8BytesInlineArrayInt extends Struct {
+ @Array(8)
+ Array<Uint8> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 8; i0 += 1) a0[i0]]})";
+}
+
+class StructInlineArrayIrregular extends Struct {
+ @Array(2)
+ Array<Struct3BytesInt2ByteAligned> a0;
+
+ @Uint8()
+ int a1;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]}, ${a1})";
+}
+
+class StructInlineArray100Bytes extends Struct {
+ @Array(100)
+ Array<Uint8> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 100; i0 += 1) a0[i0]]})";
+}
+
+class StructInlineArrayBig extends Struct {
+ @Uint32()
+ int a0;
+
+ @Uint32()
+ int a1;
+
+ @Array(4000)
+ Array<Uint8> a2;
+
+ String toString() =>
+ "(${a0}, ${a1}, ${[for (var i0 = 0; i0 < 4000; i0 += 1) a2[i0]]})";
+}
+
+class StructStruct16BytesHomogeneousFloat2 extends Struct {
+ Struct4BytesFloat a0;
+
+ @Array(2)
+ Array<Struct4BytesFloat> a1;
+
+ @Float()
+ double a2;
+
+ String toString() =>
+ "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
+}
+
+class StructStruct32BytesHomogeneousDouble2 extends Struct {
+ Struct8BytesFloat a0;
+
+ @Array(2)
+ Array<Struct8BytesFloat> a1;
+
+ @Double()
+ double a2;
+
+ String toString() =>
+ "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
+}
+
+class StructStruct16BytesMixed3 extends Struct {
+ Struct4BytesFloat a0;
+
+ @Array(1)
+ Array<Struct8BytesMixed> a1;
+
+ @Array(2)
+ Array<Int16> a2;
+
+ String toString() => "(${a0}, ${[
+ for (var i0 = 0; i0 < 1; i0 += 1) a1[i0]
+ ]}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a2[i0]]})";
+}
+
+class Struct8BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array(2, 2, 2)
+ Array<Array<Array<Uint8>>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [
+ for (var i1 = 0; i1 < 2; i1 += 1)
+ [for (var i2 = 0; i2 < 2; i2 += 1) a0[i0][i1][i2]]
+ ]
+ ]})";
+}
+
+class Struct32BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array(2, 2, 2, 2, 2)
+ Array<Array<Array<Array<Array<Uint8>>>>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [
+ for (var i1 = 0; i1 < 2; i1 += 1)
+ [
+ for (var i2 = 0; i2 < 2; i2 += 1)
+ [
+ for (var i3 = 0; i3 < 2; i3 += 1)
+ [for (var i4 = 0; i4 < 2; i4 += 1) a0[i0][i1][i2][i3][i4]]
+ ]
+ ]
+ ]
+ ]})";
+}
+
+class Struct64BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array.multi([2, 2, 2, 2, 2, 2])
+ Array<Array<Array<Array<Array<Array<Uint8>>>>>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [
+ for (var i1 = 0; i1 < 2; i1 += 1)
+ [
+ for (var i2 = 0; i2 < 2; i2 += 1)
+ [
+ for (var i3 = 0; i3 < 2; i3 += 1)
+ [
+ for (var i4 = 0; i4 < 2; i4 += 1)
+ [
+ for (var i5 = 0; i5 < 2; i5 += 1)
+ a0[i0][i1][i2][i3][i4][i5]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]})";
+}
+
+class Struct4BytesInlineArrayMultiDimensionalInt extends Struct {
+ @Array(2, 2)
+ Array<Array<Struct1ByteInt>> a0;
+
+ String toString() => "(${[
+ for (var i0 = 0; i0 < 2; i0 += 1)
+ [for (var i1 = 0; i1 < 2; i1 += 1) a0[i0][i1]]
+ ]})";
+}
+
+@Packed(1)
+class Struct3BytesPackedInt extends Struct {
+ @Int8()
+ int a0;
+
+ @Int16()
+ int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+@Packed(1)
+class Struct3BytesPackedIntMembersAligned extends Struct {
+ @Int8()
+ int a0;
+
+ @Int16()
+ int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+@Packed(1)
+class Struct5BytesPackedMixed extends Struct {
+ @Float()
+ double a0;
+
+ @Uint8()
+ int a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class StructNestedAlignmentStruct5BytesPackedMixed extends Struct {
+ @Uint8()
+ int a0;
+
+ Struct5BytesPackedMixed a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct6BytesInlineArrayInt extends Struct {
+ @Array(2)
+ Array<Struct3BytesPackedIntMembersAligned> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]})";
+}
+
+@Packed(1)
+class Struct8BytesPackedInt extends Struct {
+ @Uint8()
+ int a0;
+
+ @Uint32()
+ int a1;
+
+ @Uint8()
+ int a2;
+
+ @Uint8()
+ int a3;
+
+ @Uint8()
+ int a4;
+
+ String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
+}
+
+@Packed(1)
+class Struct9BytesPackedMixed extends Struct {
+ @Uint8()
+ int a0;
+
+ @Double()
+ double a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Struct15BytesInlineArrayMixed extends Struct {
+ @Array(3)
+ Array<Struct5BytesPackedMixed> a0;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 3; i0 += 1) a0[i0]]})";
+}
+
+class Union4BytesMixed extends Union {
+ @Uint32()
+ int a0;
+
+ @Float()
+ double a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Union8BytesNestedFloat extends Union {
+ @Double()
+ double a0;
+
+ Struct8BytesHomogeneousFloat a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Union9BytesNestedInt extends Union {
+ Struct8BytesInt a0;
+
+ Struct9BytesHomogeneousUint8 a1;
+
+ String toString() => "(${a0}, ${a1})";
+}
+
+class Union16BytesNestedInlineArrayFloat extends Union {
+ @Array(4)
+ Array<Float> a0;
+
+ Struct16BytesHomogeneousFloat a1;
+
+ String toString() => "(${[for (var i0 = 0; i0 < 4; i0 += 1) a0[i0]]}, ${a1})";
+}
+
+class Union16BytesNestedFloat extends Union {
+ Struct8BytesHomogeneousFloat a0;
+
+ Struct12BytesHomogeneousFloat a1;
+
+ Struct16BytesHomogeneousFloat a2;
+
+ String toString() => "(${a0}, ${a1}, ${a2})";
+}
diff --git a/tests/ffi_2/function_structs_by_value_generated_leaf_test.dart b/tests/ffi_2/function_structs_by_value_generated_leaf_test.dart
new file mode 100644
index 0000000..3199ccc
--- /dev/null
+++ b/tests/ffi_2/function_structs_by_value_generated_leaf_test.dart
@@ -0,0 +1,7685 @@
+// Copyright (c) 2021, 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=5
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+
+// @dart = 2.9
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+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() {
+ for (int i = 0; i < 10; ++i) {
+ testPassStruct1ByteIntx10Leaf();
+ testPassStruct3BytesHomogeneousUint8x10Leaf();
+ testPassStruct3BytesInt2ByteAlignedx10Leaf();
+ testPassStruct4BytesHomogeneousInt16x10Leaf();
+ testPassStruct7BytesHomogeneousUint8x10Leaf();
+ testPassStruct7BytesInt4ByteAlignedx10Leaf();
+ testPassStruct8BytesIntx10Leaf();
+ testPassStruct8BytesHomogeneousFloatx10Leaf();
+ testPassStruct8BytesMixedx10Leaf();
+ testPassStruct9BytesHomogeneousUint8x10Leaf();
+ testPassStruct9BytesInt4Or8ByteAlignedx10Leaf();
+ testPassStruct12BytesHomogeneousFloatx6Leaf();
+ testPassStruct16BytesHomogeneousFloatx5Leaf();
+ testPassStruct16BytesMixedx10Leaf();
+ testPassStruct16BytesMixed2x10Leaf();
+ testPassStruct17BytesIntx10Leaf();
+ testPassStruct19BytesHomogeneousUint8x10Leaf();
+ testPassStruct20BytesHomogeneousInt32x10Leaf();
+ testPassStruct20BytesHomogeneousFloatLeaf();
+ testPassStruct32BytesHomogeneousDoublex5Leaf();
+ testPassStruct40BytesHomogeneousDoubleLeaf();
+ testPassStruct1024BytesHomogeneousUint64Leaf();
+ testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf();
+ testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf();
+ testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf();
+ testPassDoublex6Struct16BytesMixedx4Int32Leaf();
+ testPassInt32x4Struct16BytesMixedx4DoubleLeaf();
+ testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf();
+ testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf();
+ testPassStructAlignmentInt16Leaf();
+ testPassStructAlignmentInt32Leaf();
+ testPassStructAlignmentInt64Leaf();
+ testPassStruct8BytesNestedIntx10Leaf();
+ testPassStruct8BytesNestedFloatx10Leaf();
+ testPassStruct8BytesNestedFloat2x10Leaf();
+ testPassStruct8BytesNestedMixedx10Leaf();
+ testPassStruct16BytesNestedIntx2Leaf();
+ testPassStruct32BytesNestedIntx2Leaf();
+ testPassStructNestedIntStructAlignmentInt16Leaf();
+ testPassStructNestedIntStructAlignmentInt32Leaf();
+ testPassStructNestedIntStructAlignmentInt64Leaf();
+ testPassStructNestedIrregularEvenBiggerx4Leaf();
+ testPassStruct8BytesInlineArrayIntx4Leaf();
+ testPassStructInlineArrayIrregularx4Leaf();
+ testPassStructInlineArray100BytesLeaf();
+ testPassStructStruct16BytesHomogeneousFloat2x5Leaf();
+ testPassStructStruct32BytesHomogeneousDouble2x5Leaf();
+ testPassStructStruct16BytesMixed3x10Leaf();
+ testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf();
+ testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf();
+ testPassStruct3BytesPackedIntx10Leaf();
+ testPassStruct8BytesPackedIntx10Leaf();
+ testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf();
+ testPassStruct5BytesPackedMixedLeaf();
+ testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf();
+ testPassStruct6BytesInlineArrayIntLeaf();
+ testPassStruct15BytesInlineArrayMixedLeaf();
+ testPassUnion4BytesMixedx10Leaf();
+ testPassUnion8BytesNestedFloatx10Leaf();
+ testPassUnion9BytesNestedIntx10Leaf();
+ testPassUnion16BytesNestedInlineArrayFloatx10Leaf();
+ testPassUnion16BytesNestedFloatx10Leaf();
+ testReturnStruct1ByteIntLeaf();
+ testReturnStruct3BytesHomogeneousUint8Leaf();
+ testReturnStruct3BytesInt2ByteAlignedLeaf();
+ testReturnStruct4BytesHomogeneousInt16Leaf();
+ testReturnStruct7BytesHomogeneousUint8Leaf();
+ testReturnStruct7BytesInt4ByteAlignedLeaf();
+ testReturnStruct8BytesIntLeaf();
+ testReturnStruct8BytesHomogeneousFloatLeaf();
+ testReturnStruct8BytesMixedLeaf();
+ testReturnStruct9BytesHomogeneousUint8Leaf();
+ testReturnStruct9BytesInt4Or8ByteAlignedLeaf();
+ testReturnStruct12BytesHomogeneousFloatLeaf();
+ testReturnStruct16BytesHomogeneousFloatLeaf();
+ testReturnStruct16BytesMixedLeaf();
+ testReturnStruct16BytesMixed2Leaf();
+ testReturnStruct17BytesIntLeaf();
+ testReturnStruct19BytesHomogeneousUint8Leaf();
+ testReturnStruct20BytesHomogeneousInt32Leaf();
+ testReturnStruct20BytesHomogeneousFloatLeaf();
+ testReturnStruct32BytesHomogeneousDoubleLeaf();
+ testReturnStruct40BytesHomogeneousDoubleLeaf();
+ testReturnStruct1024BytesHomogeneousUint64Leaf();
+ testReturnStruct3BytesPackedIntLeaf();
+ testReturnStruct8BytesPackedIntLeaf();
+ testReturnStruct9BytesPackedMixedLeaf();
+ testReturnUnion4BytesMixedLeaf();
+ testReturnUnion8BytesNestedFloatLeaf();
+ testReturnUnion9BytesNestedIntLeaf();
+ testReturnUnion16BytesNestedFloatLeaf();
+ testReturnStructArgumentStruct1ByteIntLeaf();
+ testReturnStructArgumentInt32x8Struct1ByteIntLeaf();
+ testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf();
+ testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf();
+ testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf();
+ testReturnStructArgumentStruct8BytesInlineArrayIntLeaf();
+ testReturnStructArgumentStructStruct16BytesHomogeneousLeaf();
+ testReturnStructArgumentStructStruct32BytesHomogeneousLeaf();
+ testReturnStructArgumentStructStruct16BytesMixed3Leaf();
+ testReturnStructAlignmentInt16Leaf();
+ testReturnStructAlignmentInt32Leaf();
+ testReturnStructAlignmentInt64Leaf();
+ testReturnStruct8BytesNestedIntLeaf();
+ testReturnStruct8BytesNestedFloatLeaf();
+ testReturnStruct8BytesNestedFloat2Leaf();
+ testReturnStruct8BytesNestedMixedLeaf();
+ testReturnStruct16BytesNestedIntLeaf();
+ testReturnStruct32BytesNestedIntLeaf();
+ testReturnStructNestedIntStructAlignmentInt16Leaf();
+ testReturnStructNestedIntStructAlignmentInt32Leaf();
+ testReturnStructNestedIntStructAlignmentInt64Leaf();
+ testReturnStructNestedIrregularEvenBiggerLeaf();
+ }
+}
+
+final passStruct1ByteIntx10Leaf = 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", isLeaf: true);
+
+/// Smallest struct with data.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct1ByteIntx10Leaf() {
+ 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 =
+ passStruct1ByteIntx10Leaf(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 passStruct3BytesHomogeneousUint8x10Leaf = 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",
+ isLeaf: true);
+
+/// Not a multiple of word size, not a power of two.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct3BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct3BytesHomogeneousUint8x10Leaf(
+ 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 passStruct3BytesInt2ByteAlignedx10Leaf = 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",
+ isLeaf: true);
+
+/// 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 testPassStruct3BytesInt2ByteAlignedx10Leaf() {
+ 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 = passStruct3BytesInt2ByteAlignedx10Leaf(
+ 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 passStruct4BytesHomogeneousInt16x10Leaf = 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",
+ isLeaf: true);
+
+/// Exactly word size on 32-bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct4BytesHomogeneousInt16x10Leaf() {
+ 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 = passStruct4BytesHomogeneousInt16x10Leaf(
+ 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 passStruct7BytesHomogeneousUint8x10Leaf = 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",
+ isLeaf: true);
+
+/// Sub word size on 64 bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct7BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct7BytesHomogeneousUint8x10Leaf(
+ 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 passStruct7BytesInt4ByteAlignedx10Leaf = 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",
+ isLeaf: true);
+
+/// 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 testPassStruct7BytesInt4ByteAlignedx10Leaf() {
+ 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 = passStruct7BytesInt4ByteAlignedx10Leaf(
+ 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 passStruct8BytesIntx10Leaf = 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", isLeaf: true);
+
+/// Exactly word size struct on 64bit architectures.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesIntx10Leaf() {
+ 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 =
+ passStruct8BytesIntx10Leaf(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 passStruct8BytesHomogeneousFloatx10Leaf = 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",
+ isLeaf: true);
+
+/// Arguments passed in FP registers as long as they fit.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesHomogeneousFloatx10Leaf() {
+ 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 = passStruct8BytesHomogeneousFloatx10Leaf(
+ 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 passStruct8BytesMixedx10Leaf = 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", isLeaf: true);
+
+/// On x64, arguments go in int registers because it is not only float.
+/// 10 struct arguments will exhaust available registers.
+void testPassStruct8BytesMixedx10Leaf() {
+ 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 =
+ passStruct8BytesMixedx10Leaf(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 passStruct9BytesHomogeneousUint8x10Leaf = 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",
+ isLeaf: true);
+
+/// 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 testPassStruct9BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct9BytesHomogeneousUint8x10Leaf(
+ 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 passStruct9BytesInt4Or8ByteAlignedx10Leaf =
+ 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",
+ isLeaf: true);
+
+/// 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 testPassStruct9BytesInt4Or8ByteAlignedx10Leaf() {
+ 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 = passStruct9BytesInt4Or8ByteAlignedx10Leaf(
+ 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 passStruct12BytesHomogeneousFloatx6Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat),
+ double Function(
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat,
+ Struct12BytesHomogeneousFloat)>(
+ "PassStruct12BytesHomogeneousFloatx6",
+ isLeaf: true);
+
+/// 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 testPassStruct12BytesHomogeneousFloatx6Leaf() {
+ 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 =
+ passStruct12BytesHomogeneousFloatx6Leaf(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 passStruct16BytesHomogeneousFloatx5Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat),
+ double Function(
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat,
+ Struct16BytesHomogeneousFloat)>(
+ "PassStruct16BytesHomogeneousFloatx5",
+ isLeaf: true);
+
+/// 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 testPassStruct16BytesHomogeneousFloatx5Leaf() {
+ 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 = passStruct16BytesHomogeneousFloatx5Leaf(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 passStruct16BytesMixedx10Leaf = 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", isLeaf: true);
+
+/// 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 testPassStruct16BytesMixedx10Leaf() {
+ 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 =
+ passStruct16BytesMixedx10Leaf(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 passStruct16BytesMixed2x10Leaf = 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", isLeaf: true);
+
+/// 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 testPassStruct16BytesMixed2x10Leaf() {
+ 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 =
+ passStruct16BytesMixed2x10Leaf(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 passStruct17BytesIntx10Leaf = 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", isLeaf: true);
+
+/// Arguments are passed as pointer to copy on arm64.
+/// Tests that the memory allocated for copies are rounded up to word size.
+void testPassStruct17BytesIntx10Leaf() {
+ 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 =
+ passStruct17BytesIntx10Leaf(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 passStruct19BytesHomogeneousUint8x10Leaf =
+ 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",
+ isLeaf: true);
+
+/// 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 testPassStruct19BytesHomogeneousUint8x10Leaf() {
+ 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 = passStruct19BytesHomogeneousUint8x10Leaf(
+ 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 passStruct20BytesHomogeneousInt32x10Leaf =
+ 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",
+ isLeaf: true);
+
+/// 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 testPassStruct20BytesHomogeneousInt32x10Leaf() {
+ 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 = passStruct20BytesHomogeneousInt32x10Leaf(
+ 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 passStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Float Function(Struct20BytesHomogeneousFloat),
+ double Function(Struct20BytesHomogeneousFloat)>(
+ "PassStruct20BytesHomogeneousFloat",
+ isLeaf: true);
+
+/// Argument too big to go into FPU registers in hardfp and arm64.
+void testPassStruct20BytesHomogeneousFloatLeaf() {
+ 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 = passStruct20BytesHomogeneousFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(-3.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct32BytesHomogeneousDoublex5Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble),
+ double Function(
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble,
+ Struct32BytesHomogeneousDouble)>(
+ "PassStruct32BytesHomogeneousDoublex5",
+ isLeaf: true);
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStruct32BytesHomogeneousDoublex5Leaf() {
+ 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 = passStruct32BytesHomogeneousDoublex5Leaf(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 passStruct40BytesHomogeneousDoubleLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct40BytesHomogeneousDouble),
+ double Function(Struct40BytesHomogeneousDouble)>(
+ "PassStruct40BytesHomogeneousDouble",
+ isLeaf: true);
+
+/// Argument too big to go into FPU registers in arm64.
+void testPassStruct40BytesHomogeneousDoubleLeaf() {
+ 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 = passStruct40BytesHomogeneousDoubleLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(-3.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct1024BytesHomogeneousUint64Leaf =
+ ffiTestFunctions.lookupFunction<
+ Uint64 Function(Struct1024BytesHomogeneousUint64),
+ int Function(Struct1024BytesHomogeneousUint64)>(
+ "PassStruct1024BytesHomogeneousUint64",
+ isLeaf: true);
+
+/// Test 1kb struct.
+void testPassStruct1024BytesHomogeneousUint64Leaf() {
+ 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;
+ a0.a124 = 125;
+ a0.a125 = 126;
+ a0.a126 = 127;
+ a0.a127 = 128;
+
+ final result = passStruct1024BytesHomogeneousUint64Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(8256, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf =
+ ffiTestFunctions.lookupFunction<
+ Float Function(
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float,
+ Struct16BytesHomogeneousFloat,
+ Float),
+ double Function(
+ double,
+ Struct16BytesHomogeneousFloat,
+ double,
+ Struct16BytesHomogeneousFloat,
+ double,
+ Struct16BytesHomogeneousFloat,
+ double,
+ Struct16BytesHomogeneousFloat,
+ double)>("PassFloatStruct16BytesHomogeneousFloatFloatStruct1",
+ isLeaf: true);
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf() {
+ double a0;
+ final a1Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a1 = a1Pointer.ref;
+ double a2;
+ final a3Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a3 = a3Pointer.ref;
+ double a4;
+ final a5Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a5 = a5Pointer.ref;
+ double a6;
+ final a7Pointer = calloc<Struct16BytesHomogeneousFloat>();
+ final Struct16BytesHomogeneousFloat a7 = a7Pointer.ref;
+ double a8;
+
+ a0 = -1.0;
+ a1.a0 = 2.0;
+ a1.a1 = -3.0;
+ a1.a2 = 4.0;
+ a1.a3 = -5.0;
+ a2 = 6.0;
+ a3.a0 = -7.0;
+ a3.a1 = 8.0;
+ a3.a2 = -9.0;
+ a3.a3 = 10.0;
+ a4 = -11.0;
+ a5.a0 = 12.0;
+ a5.a1 = -13.0;
+ a5.a2 = 14.0;
+ a5.a3 = -15.0;
+ a6 = 16.0;
+ a7.a0 = -17.0;
+ a7.a1 = 18.0;
+ a7.a2 = -19.0;
+ a7.a3 = 20.0;
+ a8 = -21.0;
+
+ final result = passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-11.0, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float,
+ Struct32BytesHomogeneousDouble,
+ Float),
+ double Function(
+ double,
+ Struct32BytesHomogeneousDouble,
+ double,
+ Struct32BytesHomogeneousDouble,
+ double,
+ Struct32BytesHomogeneousDouble,
+ double,
+ Struct32BytesHomogeneousDouble,
+ double)>("PassFloatStruct32BytesHomogeneousDoubleFloatStruct",
+ isLeaf: true);
+
+/// Tests the alignment of structs in FPU registers and backfilling.
+void testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf() {
+ double a0;
+ final a1Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a1 = a1Pointer.ref;
+ double a2;
+ final a3Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a3 = a3Pointer.ref;
+ double a4;
+ final a5Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a5 = a5Pointer.ref;
+ double a6;
+ final a7Pointer = calloc<Struct32BytesHomogeneousDouble>();
+ final Struct32BytesHomogeneousDouble a7 = a7Pointer.ref;
+ double a8;
+
+ a0 = -1.0;
+ a1.a0 = 2.0;
+ a1.a1 = -3.0;
+ a1.a2 = 4.0;
+ a1.a3 = -5.0;
+ a2 = 6.0;
+ a3.a0 = -7.0;
+ a3.a1 = 8.0;
+ a3.a2 = -9.0;
+ a3.a3 = 10.0;
+ a4 = -11.0;
+ a5.a0 = 12.0;
+ a5.a1 = -13.0;
+ a5.a2 = 14.0;
+ a5.a3 = -15.0;
+ a6 = 16.0;
+ a7.a0 = -17.0;
+ a7.a1 = 18.0;
+ a7.a2 = -19.0;
+ a7.a3 = 20.0;
+ a8 = -21.0;
+
+ final result = passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-11.0, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed,
+ Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8),
+ double Function(
+ int,
+ Struct16BytesMixed,
+ int,
+ Struct16BytesMixed,
+ int,
+ Struct16BytesMixed,
+ int,
+ Struct16BytesMixed,
+ int)>("PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn",
+ isLeaf: true);
+
+/// Tests the alignment of structs in integers registers and on the stack.
+/// Arm32 aligns this struct at 8.
+/// Also, arm32 allocates the second struct partially in registers, partially
+/// on stack.
+/// Test backfilling of integer registers.
+void testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf() {
+ int a0;
+ final a1Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a1 = a1Pointer.ref;
+ int a2;
+ final a3Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a3 = a3Pointer.ref;
+ int a4;
+ final a5Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a5 = a5Pointer.ref;
+ int a6;
+ final a7Pointer = calloc<Struct16BytesMixed>();
+ final Struct16BytesMixed a7 = a7Pointer.ref;
+ int a8;
+
+ a0 = -1;
+ a1.a0 = 2.0;
+ a1.a1 = -3;
+ a2 = 4;
+ a3.a0 = -5.0;
+ a3.a1 = 6;
+ a4 = -7;
+ a5.a0 = 8.0;
+ a5.a1 = -9;
+ a6 = 10;
+ a7.a0 = -11.0;
+ a7.a1 = 12;
+ a8 = -13;
+
+ final result = passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-7.0, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passDoublex6Struct16BytesMixedx4Int32Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Int32),
+ double Function(
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ int)>("PassDoublex6Struct16BytesMixedx4Int32", isLeaf: true);
+
+/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
+/// structs. The rest of the structs will go on the stack.
+/// The int will be backfilled into the int register.
+void testPassDoublex6Struct16BytesMixedx4Int32Leaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+ double a4;
+ double a5;
+ 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;
+ int a10;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+ a4 = -5.0;
+ a5 = 6.0;
+ a6.a0 = -7.0;
+ a6.a1 = 8;
+ a7.a0 = -9.0;
+ a7.a1 = 10;
+ a8.a0 = -11.0;
+ a8.a1 = 12;
+ a9.a0 = -13.0;
+ a9.a1 = 14;
+ a10 = -15;
+
+ final result = passDoublex6Struct16BytesMixedx4Int32Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+
+ print("result = $result");
+
+ Expect.approxEquals(-8.0, result);
+
+ calloc.free(a6Pointer);
+ calloc.free(a7Pointer);
+ calloc.free(a8Pointer);
+ calloc.free(a9Pointer);
+}
+
+final passInt32x4Struct16BytesMixedx4DoubleLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(Int32, Int32, Int32, Int32, Struct16BytesMixed,
+ Struct16BytesMixed, Struct16BytesMixed, Struct16BytesMixed, Double),
+ double Function(
+ int,
+ int,
+ int,
+ int,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ Struct16BytesMixed,
+ double)>("PassInt32x4Struct16BytesMixedx4Double", isLeaf: true);
+
+/// On Linux x64, it will exhaust int registers first.
+/// The rest of the structs will go on the stack.
+/// The double will be backfilled into the xmm register.
+void testPassInt32x4Struct16BytesMixedx4DoubleLeaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ 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;
+ double a8;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+ a3 = 4;
+ a4.a0 = -5.0;
+ a4.a1 = 6;
+ a5.a0 = -7.0;
+ a5.a1 = 8;
+ a6.a0 = -9.0;
+ a6.a1 = 10;
+ a7.a0 = -11.0;
+ a7.a1 = 12;
+ a8 = -13.0;
+
+ final result = passInt32x4Struct16BytesMixedx4DoubleLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.approxEquals(-7.0, result);
+
+ calloc.free(a4Pointer);
+ calloc.free(a5Pointer);
+ calloc.free(a6Pointer);
+ calloc.free(a7Pointer);
+}
+
+final passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(Struct40BytesHomogeneousDouble,
+ Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat),
+ double Function(Struct40BytesHomogeneousDouble,
+ Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat)>(
+ "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo",
+ isLeaf: true);
+
+/// On various architectures, first struct is allocated on stack.
+/// Check that the other two arguments are allocated on registers.
+void testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf() {
+ final a0Pointer = calloc<Struct40BytesHomogeneousDouble>();
+ final Struct40BytesHomogeneousDouble a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct4BytesHomogeneousInt16>();
+ final Struct4BytesHomogeneousInt16 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a2 = a2Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2.0;
+ a0.a2 = -3.0;
+ a0.a3 = 4.0;
+ a0.a4 = -5.0;
+ a1.a0 = 6;
+ a1.a1 = -7;
+ a2.a0 = 8.0;
+ a2.a1 = -9.0;
+
+ final result =
+ passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.approxEquals(-5.0, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+}
+
+final passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Int32,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Double,
+ Int64,
+ Int8,
+ Struct1ByteInt,
+ Int64,
+ Int8,
+ Struct4BytesHomogeneousInt16,
+ Int64,
+ Int8,
+ Struct8BytesInt,
+ Int64,
+ Int8,
+ Struct8BytesHomogeneousFloat,
+ Int64,
+ Int8,
+ Struct8BytesMixed,
+ Int64,
+ Int8,
+ StructAlignmentInt16,
+ Int64,
+ Int8,
+ StructAlignmentInt32,
+ Int64,
+ Int8,
+ StructAlignmentInt64),
+ double Function(
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ double,
+ int,
+ int,
+ Struct1ByteInt,
+ int,
+ int,
+ Struct4BytesHomogeneousInt16,
+ int,
+ int,
+ Struct8BytesInt,
+ int,
+ int,
+ Struct8BytesHomogeneousFloat,
+ int,
+ int,
+ Struct8BytesMixed,
+ int,
+ int,
+ StructAlignmentInt16,
+ int,
+ int,
+ StructAlignmentInt32,
+ int,
+ int,
+ StructAlignmentInt64)>("PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int", isLeaf: true);
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ double a8;
+ double a9;
+ double a10;
+ double a11;
+ double a12;
+ double a13;
+ double a14;
+ double a15;
+ int a16;
+ int a17;
+ final a18Pointer = calloc<Struct1ByteInt>();
+ final Struct1ByteInt a18 = a18Pointer.ref;
+ int a19;
+ int a20;
+ final a21Pointer = calloc<Struct4BytesHomogeneousInt16>();
+ final Struct4BytesHomogeneousInt16 a21 = a21Pointer.ref;
+ int a22;
+ int a23;
+ final a24Pointer = calloc<Struct8BytesInt>();
+ final Struct8BytesInt a24 = a24Pointer.ref;
+ int a25;
+ int a26;
+ final a27Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a27 = a27Pointer.ref;
+ int a28;
+ int a29;
+ final a30Pointer = calloc<Struct8BytesMixed>();
+ final Struct8BytesMixed a30 = a30Pointer.ref;
+ int a31;
+ int a32;
+ final a33Pointer = calloc<StructAlignmentInt16>();
+ final StructAlignmentInt16 a33 = a33Pointer.ref;
+ int a34;
+ int a35;
+ final a36Pointer = calloc<StructAlignmentInt32>();
+ final StructAlignmentInt32 a36 = a36Pointer.ref;
+ int a37;
+ int a38;
+ final a39Pointer = calloc<StructAlignmentInt64>();
+ final StructAlignmentInt64 a39 = a39Pointer.ref;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+ a3 = 4;
+ a4 = -5;
+ a5 = 6;
+ a6 = -7;
+ a7 = 8;
+ a8 = -9.0;
+ a9 = 10.0;
+ a10 = -11.0;
+ a11 = 12.0;
+ a12 = -13.0;
+ a13 = 14.0;
+ a14 = -15.0;
+ a15 = 16.0;
+ a16 = -17;
+ a17 = 18;
+ a18.a0 = -19;
+ a19 = 20;
+ a20 = -21;
+ a21.a0 = 22;
+ a21.a1 = -23;
+ a22 = 24;
+ a23 = -25;
+ a24.a0 = 26;
+ a24.a1 = -27;
+ a24.a2 = 28;
+ a25 = -29;
+ a26 = 30;
+ a27.a0 = -31.0;
+ a27.a1 = 32.0;
+ a28 = -33;
+ a29 = 34;
+ a30.a0 = -35.0;
+ a30.a1 = 36;
+ a30.a2 = -37;
+ a31 = 38;
+ a32 = -39;
+ a33.a0 = 40;
+ a33.a1 = -41;
+ a33.a2 = 42;
+ a34 = -43;
+ a35 = 44;
+ a36.a0 = -45;
+ a36.a1 = 46;
+ a36.a2 = -47;
+ a37 = 48;
+ a38 = -49;
+ a39.a0 = 50;
+ a39.a1 = -51;
+ a39.a2 = 52;
+
+ final result = passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf(
+ 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);
+
+ print("result = $result");
+
+ Expect.approxEquals(26.0, result);
+
+ calloc.free(a18Pointer);
+ calloc.free(a21Pointer);
+ calloc.free(a24Pointer);
+ calloc.free(a27Pointer);
+ calloc.free(a30Pointer);
+ calloc.free(a33Pointer);
+ calloc.free(a36Pointer);
+ calloc.free(a39Pointer);
+}
+
+final passStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(StructAlignmentInt16),
+ int Function(
+ StructAlignmentInt16)>("PassStructAlignmentInt16", isLeaf: true);
+
+/// Test alignment and padding of 16 byte int within struct.
+void testPassStructAlignmentInt16Leaf() {
+ final a0Pointer = calloc<StructAlignmentInt16>();
+ final StructAlignmentInt16 a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = passStructAlignmentInt16Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(-2, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(StructAlignmentInt32),
+ int Function(
+ StructAlignmentInt32)>("PassStructAlignmentInt32", isLeaf: true);
+
+/// Test alignment and padding of 32 byte int within struct.
+void testPassStructAlignmentInt32Leaf() {
+ final a0Pointer = calloc<StructAlignmentInt32>();
+ final StructAlignmentInt32 a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = passStructAlignmentInt32Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(-2, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(StructAlignmentInt64),
+ int Function(
+ StructAlignmentInt64)>("PassStructAlignmentInt64", isLeaf: true);
+
+/// Test alignment and padding of 64 byte int within struct.
+void testPassStructAlignmentInt64Leaf() {
+ final a0Pointer = calloc<StructAlignmentInt64>();
+ final StructAlignmentInt64 a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = passStructAlignmentInt64Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(-2, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct8BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt),
+ int Function(
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt,
+ Struct8BytesNestedInt)>("PassStruct8BytesNestedIntx10", isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust registers on all platforms.
+void testPassStruct8BytesNestedIntx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedInt>();
+ final Struct8BytesNestedInt a9 = a9Pointer.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;
+ a2.a0.a0 = -9;
+ a2.a0.a1 = 10;
+ a2.a1.a0 = -11;
+ a2.a1.a1 = 12;
+ a3.a0.a0 = -13;
+ a3.a0.a1 = 14;
+ a3.a1.a0 = -15;
+ a3.a1.a1 = 16;
+ a4.a0.a0 = -17;
+ a4.a0.a1 = 18;
+ a4.a1.a0 = -19;
+ a4.a1.a1 = 20;
+ a5.a0.a0 = -21;
+ a5.a0.a1 = 22;
+ a5.a1.a0 = -23;
+ a5.a1.a1 = 24;
+ a6.a0.a0 = -25;
+ a6.a0.a1 = 26;
+ a6.a1.a0 = -27;
+ a6.a1.a1 = 28;
+ a7.a0.a0 = -29;
+ a7.a0.a1 = 30;
+ a7.a1.a0 = -31;
+ a7.a1.a1 = 32;
+ a8.a0.a0 = -33;
+ a8.a0.a1 = 34;
+ a8.a1.a0 = -35;
+ a8.a1.a1 = 36;
+ a9.a0.a0 = -37;
+ a9.a0.a1 = 38;
+ a9.a1.a0 = -39;
+ a9.a1.a1 = 40;
+
+ final result =
+ passStruct8BytesNestedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.equals(20, 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 passStruct8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat),
+ double Function(
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat,
+ Struct8BytesNestedFloat)>("PassStruct8BytesNestedFloatx10",
+ isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust fpu registers on all platforms.
+void testPassStruct8BytesNestedFloatx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedFloat>();
+ final Struct8BytesNestedFloat a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1.a0 = 2.0;
+ a1.a0.a0 = -3.0;
+ a1.a1.a0 = 4.0;
+ a2.a0.a0 = -5.0;
+ a2.a1.a0 = 6.0;
+ a3.a0.a0 = -7.0;
+ a3.a1.a0 = 8.0;
+ a4.a0.a0 = -9.0;
+ a4.a1.a0 = 10.0;
+ a5.a0.a0 = -11.0;
+ a5.a1.a0 = 12.0;
+ a6.a0.a0 = -13.0;
+ a6.a1.a0 = 14.0;
+ a7.a0.a0 = -15.0;
+ a7.a1.a0 = 16.0;
+ a8.a0.a0 = -17.0;
+ a8.a1.a0 = 18.0;
+ a9.a0.a0 = -19.0;
+ a9.a1.a0 = 20.0;
+
+ final result = passStruct8BytesNestedFloatx10Leaf(
+ 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 passStruct8BytesNestedFloat2x10Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2),
+ double Function(
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2,
+ Struct8BytesNestedFloat2)>("PassStruct8BytesNestedFloat2x10",
+ isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust fpu registers on all platforms.
+/// The nesting is irregular, testing homogenous float rules on arm and arm64,
+/// and the fpu register usage on x64.
+void testPassStruct8BytesNestedFloat2x10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedFloat2>();
+ final Struct8BytesNestedFloat2 a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1 = 2.0;
+ a1.a0.a0 = -3.0;
+ a1.a1 = 4.0;
+ a2.a0.a0 = -5.0;
+ a2.a1 = 6.0;
+ a3.a0.a0 = -7.0;
+ a3.a1 = 8.0;
+ a4.a0.a0 = -9.0;
+ a4.a1 = 10.0;
+ a5.a0.a0 = -11.0;
+ a5.a1 = 12.0;
+ a6.a0.a0 = -13.0;
+ a6.a1 = 14.0;
+ a7.a0.a0 = -15.0;
+ a7.a1 = 16.0;
+ a8.a0.a0 = -17.0;
+ a8.a1 = 18.0;
+ a9.a0.a0 = -19.0;
+ a9.a1 = 20.0;
+
+ final result = passStruct8BytesNestedFloat2x10Leaf(
+ 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 passStruct8BytesNestedMixedx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed),
+ double Function(
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed,
+ Struct8BytesNestedMixed)>("PassStruct8BytesNestedMixedx10",
+ isLeaf: true);
+
+/// Simple nested struct. No alignment gaps on any architectures.
+/// 10 arguments exhaust all registers on all platforms.
+void testPassStruct8BytesNestedMixedx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesNestedMixed>();
+ final Struct8BytesNestedMixed a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a1.a0 = -3.0;
+ a1.a0.a0 = 4;
+ a1.a0.a1 = -5;
+ a1.a1.a0 = 6.0;
+ a2.a0.a0 = -7;
+ a2.a0.a1 = 8;
+ a2.a1.a0 = -9.0;
+ a3.a0.a0 = 10;
+ a3.a0.a1 = -11;
+ a3.a1.a0 = 12.0;
+ a4.a0.a0 = -13;
+ a4.a0.a1 = 14;
+ a4.a1.a0 = -15.0;
+ a5.a0.a0 = 16;
+ a5.a0.a1 = -17;
+ a5.a1.a0 = 18.0;
+ a6.a0.a0 = -19;
+ a6.a0.a1 = 20;
+ a6.a1.a0 = -21.0;
+ a7.a0.a0 = 22;
+ a7.a0.a1 = -23;
+ a7.a1.a0 = 24.0;
+ a8.a0.a0 = -25;
+ a8.a0.a1 = 26;
+ a8.a1.a0 = -27.0;
+ a9.a0.a0 = 28;
+ a9.a0.a1 = -29;
+ a9.a1.a0 = 30.0;
+
+ final result = passStruct8BytesNestedMixedx10Leaf(
+ 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 passStruct16BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(Struct16BytesNestedInt, Struct16BytesNestedInt),
+ int Function(Struct16BytesNestedInt,
+ Struct16BytesNestedInt)>("PassStruct16BytesNestedIntx2", isLeaf: true);
+
+/// Deeper nested struct to test recursive member access.
+void testPassStruct16BytesNestedIntx2Leaf() {
+ 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 = passStruct16BytesNestedIntx2Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(8, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+}
+
+final passStruct32BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(Struct32BytesNestedInt, Struct32BytesNestedInt),
+ int Function(Struct32BytesNestedInt,
+ Struct32BytesNestedInt)>("PassStruct32BytesNestedIntx2", isLeaf: true);
+
+/// Even deeper nested struct to test recursive member access.
+void testPassStruct32BytesNestedIntx2Leaf() {
+ final a0Pointer = calloc<Struct32BytesNestedInt>();
+ final Struct32BytesNestedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct32BytesNestedInt>();
+ final Struct32BytesNestedInt a1 = a1Pointer.ref;
+
+ a0.a0.a0.a0.a0 = -1;
+ a0.a0.a0.a0.a1 = 2;
+ a0.a0.a0.a1.a0 = -3;
+ a0.a0.a0.a1.a1 = 4;
+ a0.a0.a1.a0.a0 = -5;
+ a0.a0.a1.a0.a1 = 6;
+ a0.a0.a1.a1.a0 = -7;
+ a0.a0.a1.a1.a1 = 8;
+ a0.a1.a0.a0.a0 = -9;
+ a0.a1.a0.a0.a1 = 10;
+ a0.a1.a0.a1.a0 = -11;
+ a0.a1.a0.a1.a1 = 12;
+ a0.a1.a1.a0.a0 = -13;
+ a0.a1.a1.a0.a1 = 14;
+ a0.a1.a1.a1.a0 = -15;
+ a0.a1.a1.a1.a1 = 16;
+ a1.a0.a0.a0.a0 = -17;
+ a1.a0.a0.a0.a1 = 18;
+ a1.a0.a0.a1.a0 = -19;
+ a1.a0.a0.a1.a1 = 20;
+ a1.a0.a1.a0.a0 = -21;
+ a1.a0.a1.a0.a1 = 22;
+ a1.a0.a1.a1.a0 = -23;
+ a1.a0.a1.a1.a1 = 24;
+ a1.a1.a0.a0.a0 = -25;
+ a1.a1.a0.a0.a1 = 26;
+ a1.a1.a0.a1.a0 = -27;
+ a1.a1.a0.a1.a1 = 28;
+ a1.a1.a1.a0.a0 = -29;
+ a1.a1.a1.a0.a1 = 30;
+ a1.a1.a1.a1.a0 = -31;
+ a1.a1.a1.a1.a1 = 32;
+
+ final result = passStruct32BytesNestedIntx2Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(16, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+}
+
+final passStructNestedIntStructAlignmentInt16Leaf =
+ ffiTestFunctions.lookupFunction<
+ Int64 Function(StructNestedIntStructAlignmentInt16),
+ int Function(StructNestedIntStructAlignmentInt16)>(
+ "PassStructNestedIntStructAlignmentInt16",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 16 byte int.
+void testPassStructNestedIntStructAlignmentInt16Leaf() {
+ final a0Pointer = calloc<StructNestedIntStructAlignmentInt16>();
+ final StructNestedIntStructAlignmentInt16 a0 = a0Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a0.a1.a0 = 4;
+ a0.a1.a1 = -5;
+ a0.a1.a2 = 6;
+
+ final result = passStructNestedIntStructAlignmentInt16Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(3, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedIntStructAlignmentInt32Leaf =
+ ffiTestFunctions.lookupFunction<
+ Int64 Function(StructNestedIntStructAlignmentInt32),
+ int Function(StructNestedIntStructAlignmentInt32)>(
+ "PassStructNestedIntStructAlignmentInt32",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 32 byte int.
+void testPassStructNestedIntStructAlignmentInt32Leaf() {
+ final a0Pointer = calloc<StructNestedIntStructAlignmentInt32>();
+ final StructNestedIntStructAlignmentInt32 a0 = a0Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a0.a1.a0 = 4;
+ a0.a1.a1 = -5;
+ a0.a1.a2 = 6;
+
+ final result = passStructNestedIntStructAlignmentInt32Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(3, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedIntStructAlignmentInt64Leaf =
+ ffiTestFunctions.lookupFunction<
+ Int64 Function(StructNestedIntStructAlignmentInt64),
+ int Function(StructNestedIntStructAlignmentInt64)>(
+ "PassStructNestedIntStructAlignmentInt64",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 64 byte int.
+void testPassStructNestedIntStructAlignmentInt64Leaf() {
+ final a0Pointer = calloc<StructNestedIntStructAlignmentInt64>();
+ final StructNestedIntStructAlignmentInt64 a0 = a0Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a0.a1.a0 = 4;
+ a0.a1.a1 = -5;
+ a0.a1.a2 = 6;
+
+ final result = passStructNestedIntStructAlignmentInt64Leaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(3, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedIrregularEvenBiggerx4Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger),
+ double Function(
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger,
+ StructNestedIrregularEvenBigger)>(
+ "PassStructNestedIrregularEvenBiggerx4",
+ isLeaf: true);
+
+/// Return big irregular struct as smoke test.
+void testPassStructNestedIrregularEvenBiggerx4Leaf() {
+ final a0Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructNestedIrregularEvenBigger>();
+ final StructNestedIrregularEvenBigger a3 = a3Pointer.ref;
+
+ a0.a0 = 1;
+ a0.a1.a0.a0 = 2;
+ a0.a1.a0.a1.a0.a0 = -3;
+ a0.a1.a0.a1.a0.a1 = 4;
+ a0.a1.a0.a1.a1.a0 = -5.0;
+ a0.a1.a0.a2 = 6;
+ a0.a1.a0.a3.a0.a0 = -7.0;
+ a0.a1.a0.a3.a1 = 8.0;
+ a0.a1.a0.a4 = 9;
+ a0.a1.a0.a5.a0.a0 = 10.0;
+ a0.a1.a0.a5.a1.a0 = -11.0;
+ a0.a1.a0.a6 = 12;
+ a0.a1.a1.a0.a0 = -13;
+ a0.a1.a1.a0.a1 = 14;
+ a0.a1.a1.a1.a0 = -15.0;
+ a0.a1.a2 = 16.0;
+ a0.a1.a3 = -17.0;
+ a0.a2.a0.a0 = 18;
+ a0.a2.a0.a1.a0.a0 = -19;
+ a0.a2.a0.a1.a0.a1 = 20;
+ a0.a2.a0.a1.a1.a0 = -21.0;
+ a0.a2.a0.a2 = 22;
+ a0.a2.a0.a3.a0.a0 = -23.0;
+ a0.a2.a0.a3.a1 = 24.0;
+ a0.a2.a0.a4 = 25;
+ a0.a2.a0.a5.a0.a0 = 26.0;
+ a0.a2.a0.a5.a1.a0 = -27.0;
+ a0.a2.a0.a6 = 28;
+ a0.a2.a1.a0.a0 = -29;
+ a0.a2.a1.a0.a1 = 30;
+ a0.a2.a1.a1.a0 = -31.0;
+ a0.a2.a2 = 32.0;
+ a0.a2.a3 = -33.0;
+ a0.a3 = 34.0;
+ a1.a0 = 35;
+ a1.a1.a0.a0 = 36;
+ a1.a1.a0.a1.a0.a0 = -37;
+ a1.a1.a0.a1.a0.a1 = 38;
+ a1.a1.a0.a1.a1.a0 = -39.0;
+ a1.a1.a0.a2 = 40;
+ a1.a1.a0.a3.a0.a0 = -41.0;
+ a1.a1.a0.a3.a1 = 42.0;
+ a1.a1.a0.a4 = 43;
+ a1.a1.a0.a5.a0.a0 = 44.0;
+ a1.a1.a0.a5.a1.a0 = -45.0;
+ a1.a1.a0.a6 = 46;
+ a1.a1.a1.a0.a0 = -47;
+ a1.a1.a1.a0.a1 = 48;
+ a1.a1.a1.a1.a0 = -49.0;
+ a1.a1.a2 = 50.0;
+ a1.a1.a3 = -51.0;
+ a1.a2.a0.a0 = 52;
+ a1.a2.a0.a1.a0.a0 = -53;
+ a1.a2.a0.a1.a0.a1 = 54;
+ a1.a2.a0.a1.a1.a0 = -55.0;
+ a1.a2.a0.a2 = 56;
+ a1.a2.a0.a3.a0.a0 = -57.0;
+ a1.a2.a0.a3.a1 = 58.0;
+ a1.a2.a0.a4 = 59;
+ a1.a2.a0.a5.a0.a0 = 60.0;
+ a1.a2.a0.a5.a1.a0 = -61.0;
+ a1.a2.a0.a6 = 62;
+ a1.a2.a1.a0.a0 = -63;
+ a1.a2.a1.a0.a1 = 64;
+ a1.a2.a1.a1.a0 = -65.0;
+ a1.a2.a2 = 66.0;
+ a1.a2.a3 = -67.0;
+ a1.a3 = 68.0;
+ a2.a0 = 69;
+ a2.a1.a0.a0 = 70;
+ a2.a1.a0.a1.a0.a0 = -71;
+ a2.a1.a0.a1.a0.a1 = 72;
+ a2.a1.a0.a1.a1.a0 = -73.0;
+ a2.a1.a0.a2 = 74;
+ a2.a1.a0.a3.a0.a0 = -75.0;
+ a2.a1.a0.a3.a1 = 76.0;
+ a2.a1.a0.a4 = 77;
+ a2.a1.a0.a5.a0.a0 = 78.0;
+ a2.a1.a0.a5.a1.a0 = -79.0;
+ a2.a1.a0.a6 = 80;
+ a2.a1.a1.a0.a0 = -81;
+ a2.a1.a1.a0.a1 = 82;
+ a2.a1.a1.a1.a0 = -83.0;
+ a2.a1.a2 = 84.0;
+ a2.a1.a3 = -85.0;
+ a2.a2.a0.a0 = 86;
+ a2.a2.a0.a1.a0.a0 = -87;
+ a2.a2.a0.a1.a0.a1 = 88;
+ a2.a2.a0.a1.a1.a0 = -89.0;
+ a2.a2.a0.a2 = 90;
+ a2.a2.a0.a3.a0.a0 = -91.0;
+ a2.a2.a0.a3.a1 = 92.0;
+ a2.a2.a0.a4 = 93;
+ a2.a2.a0.a5.a0.a0 = 94.0;
+ a2.a2.a0.a5.a1.a0 = -95.0;
+ a2.a2.a0.a6 = 96;
+ a2.a2.a1.a0.a0 = -97;
+ a2.a2.a1.a0.a1 = 98;
+ a2.a2.a1.a1.a0 = -99.0;
+ a2.a2.a2 = 100.0;
+ a2.a2.a3 = -101.0;
+ a2.a3 = 102.0;
+ a3.a0 = 103;
+ a3.a1.a0.a0 = 104;
+ a3.a1.a0.a1.a0.a0 = -105;
+ a3.a1.a0.a1.a0.a1 = 106;
+ a3.a1.a0.a1.a1.a0 = -107.0;
+ a3.a1.a0.a2 = 108;
+ a3.a1.a0.a3.a0.a0 = -109.0;
+ a3.a1.a0.a3.a1 = 110.0;
+ a3.a1.a0.a4 = 111;
+ a3.a1.a0.a5.a0.a0 = 112.0;
+ a3.a1.a0.a5.a1.a0 = -113.0;
+ a3.a1.a0.a6 = 114;
+ a3.a1.a1.a0.a0 = -115;
+ a3.a1.a1.a0.a1 = 116;
+ a3.a1.a1.a1.a0 = -117.0;
+ a3.a1.a2 = 118.0;
+ a3.a1.a3 = -119.0;
+ a3.a2.a0.a0 = 120;
+ a3.a2.a0.a1.a0.a0 = -121;
+ a3.a2.a0.a1.a0.a1 = 122;
+ a3.a2.a0.a1.a1.a0 = -123.0;
+ a3.a2.a0.a2 = 124;
+ a3.a2.a0.a3.a0.a0 = -125.0;
+ a3.a2.a0.a3.a1 = 126.0;
+ a3.a2.a0.a4 = 127;
+ a3.a2.a0.a5.a0.a0 = 128.0;
+ a3.a2.a0.a5.a1.a0 = -129.0;
+ a3.a2.a0.a6 = 130;
+ a3.a2.a1.a0.a0 = -131;
+ a3.a2.a1.a0.a1 = 132;
+ a3.a2.a1.a1.a0 = -133.0;
+ a3.a2.a2 = 134.0;
+ a3.a2.a3 = -135.0;
+ a3.a3 = 136.0;
+
+ final result = passStructNestedIrregularEvenBiggerx4Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(1572.0, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+ calloc.free(a3Pointer);
+}
+
+final passStruct8BytesInlineArrayIntx4Leaf = ffiTestFunctions.lookupFunction<
+ Int32 Function(Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt),
+ int Function(
+ Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt,
+ Struct8BytesInlineArrayInt)>("PassStruct8BytesInlineArrayIntx4",
+ isLeaf: true);
+
+/// Simple struct with inline array.
+void testPassStruct8BytesInlineArrayIntx4Leaf() {
+ final a0Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesInlineArrayInt>();
+ final Struct8BytesInlineArrayInt a3 = a3Pointer.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;
+ a1.a0[0] = 9;
+ a1.a0[1] = 10;
+ a1.a0[2] = 11;
+ a1.a0[3] = 12;
+ a1.a0[4] = 13;
+ a1.a0[5] = 14;
+ a1.a0[6] = 15;
+ a1.a0[7] = 16;
+ a2.a0[0] = 17;
+ a2.a0[1] = 18;
+ a2.a0[2] = 19;
+ a2.a0[3] = 20;
+ a2.a0[4] = 21;
+ a2.a0[5] = 22;
+ a2.a0[6] = 23;
+ a2.a0[7] = 24;
+ a3.a0[0] = 25;
+ a3.a0[1] = 26;
+ a3.a0[2] = 27;
+ a3.a0[3] = 28;
+ a3.a0[4] = 29;
+ a3.a0[5] = 30;
+ a3.a0[6] = 31;
+ a3.a0[7] = 32;
+
+ final result = passStruct8BytesInlineArrayIntx4Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.equals(528, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+ calloc.free(a3Pointer);
+}
+
+final passStructInlineArrayIrregularx4Leaf = ffiTestFunctions.lookupFunction<
+ Int32 Function(StructInlineArrayIrregular, StructInlineArrayIrregular,
+ StructInlineArrayIrregular, StructInlineArrayIrregular),
+ int Function(
+ StructInlineArrayIrregular,
+ StructInlineArrayIrregular,
+ StructInlineArrayIrregular,
+ StructInlineArrayIrregular)>("PassStructInlineArrayIrregularx4",
+ isLeaf: true);
+
+/// Irregular struct with inline array.
+void testPassStructInlineArrayIrregularx4Leaf() {
+ final a0Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructInlineArrayIrregular>();
+ final StructInlineArrayIrregular a3 = a3Pointer.ref;
+
+ a0.a0[0].a0 = -1;
+ a0.a0[0].a1 = 2;
+ a0.a0[1].a0 = -3;
+ a0.a0[1].a1 = 4;
+ a0.a1 = 5;
+ a1.a0[0].a0 = 6;
+ a1.a0[0].a1 = -7;
+ a1.a0[1].a0 = 8;
+ a1.a0[1].a1 = -9;
+ a1.a1 = 10;
+ a2.a0[0].a0 = -11;
+ a2.a0[0].a1 = 12;
+ a2.a0[1].a0 = -13;
+ a2.a0[1].a1 = 14;
+ a2.a1 = 15;
+ a3.a0[0].a0 = 16;
+ a3.a0[0].a1 = -17;
+ a3.a0[1].a0 = 18;
+ a3.a0[1].a1 = -19;
+ a3.a1 = 20;
+
+ final result = passStructInlineArrayIrregularx4Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.equals(50, result);
+
+ calloc.free(a0Pointer);
+ calloc.free(a1Pointer);
+ calloc.free(a2Pointer);
+ calloc.free(a3Pointer);
+}
+
+final passStructInlineArray100BytesLeaf = ffiTestFunctions.lookupFunction<
+ Int32 Function(StructInlineArray100Bytes),
+ int Function(StructInlineArray100Bytes)>(
+ "PassStructInlineArray100Bytes",
+ isLeaf: true);
+
+/// Regular larger struct with inline array.
+void testPassStructInlineArray100BytesLeaf() {
+ final a0Pointer = calloc<StructInlineArray100Bytes>();
+ final StructInlineArray100Bytes 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;
+ a0.a0[8] = 9;
+ a0.a0[9] = 10;
+ a0.a0[10] = 11;
+ a0.a0[11] = 12;
+ a0.a0[12] = 13;
+ a0.a0[13] = 14;
+ a0.a0[14] = 15;
+ a0.a0[15] = 16;
+ a0.a0[16] = 17;
+ a0.a0[17] = 18;
+ a0.a0[18] = 19;
+ a0.a0[19] = 20;
+ a0.a0[20] = 21;
+ a0.a0[21] = 22;
+ a0.a0[22] = 23;
+ a0.a0[23] = 24;
+ a0.a0[24] = 25;
+ a0.a0[25] = 26;
+ a0.a0[26] = 27;
+ a0.a0[27] = 28;
+ a0.a0[28] = 29;
+ a0.a0[29] = 30;
+ a0.a0[30] = 31;
+ a0.a0[31] = 32;
+ a0.a0[32] = 33;
+ a0.a0[33] = 34;
+ a0.a0[34] = 35;
+ a0.a0[35] = 36;
+ a0.a0[36] = 37;
+ a0.a0[37] = 38;
+ a0.a0[38] = 39;
+ a0.a0[39] = 40;
+ a0.a0[40] = 41;
+ a0.a0[41] = 42;
+ a0.a0[42] = 43;
+ a0.a0[43] = 44;
+ a0.a0[44] = 45;
+ a0.a0[45] = 46;
+ a0.a0[46] = 47;
+ a0.a0[47] = 48;
+ a0.a0[48] = 49;
+ a0.a0[49] = 50;
+ a0.a0[50] = 51;
+ a0.a0[51] = 52;
+ a0.a0[52] = 53;
+ a0.a0[53] = 54;
+ a0.a0[54] = 55;
+ a0.a0[55] = 56;
+ a0.a0[56] = 57;
+ a0.a0[57] = 58;
+ a0.a0[58] = 59;
+ a0.a0[59] = 60;
+ a0.a0[60] = 61;
+ a0.a0[61] = 62;
+ a0.a0[62] = 63;
+ a0.a0[63] = 64;
+ a0.a0[64] = 65;
+ a0.a0[65] = 66;
+ a0.a0[66] = 67;
+ a0.a0[67] = 68;
+ a0.a0[68] = 69;
+ a0.a0[69] = 70;
+ a0.a0[70] = 71;
+ a0.a0[71] = 72;
+ a0.a0[72] = 73;
+ a0.a0[73] = 74;
+ a0.a0[74] = 75;
+ a0.a0[75] = 76;
+ a0.a0[76] = 77;
+ a0.a0[77] = 78;
+ a0.a0[78] = 79;
+ a0.a0[79] = 80;
+ a0.a0[80] = 81;
+ a0.a0[81] = 82;
+ a0.a0[82] = 83;
+ a0.a0[83] = 84;
+ a0.a0[84] = 85;
+ a0.a0[85] = 86;
+ a0.a0[86] = 87;
+ a0.a0[87] = 88;
+ a0.a0[88] = 89;
+ a0.a0[89] = 90;
+ a0.a0[90] = 91;
+ a0.a0[91] = 92;
+ a0.a0[92] = 93;
+ a0.a0[93] = 94;
+ a0.a0[94] = 95;
+ a0.a0[95] = 96;
+ a0.a0[96] = 97;
+ a0.a0[97] = 98;
+ a0.a0[98] = 99;
+ a0.a0[99] = 100;
+
+ final result = passStructInlineArray100BytesLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(5050, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructStruct16BytesHomogeneousFloat2x5Leaf =
+ ffiTestFunctions.lookupFunction<
+ Float Function(
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2),
+ double Function(
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2,
+ StructStruct16BytesHomogeneousFloat2)>(
+ "PassStructStruct16BytesHomogeneousFloat2x5",
+ isLeaf: true);
+
+/// Arguments in FPU registers on arm hardfp and arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStructStruct16BytesHomogeneousFloat2x5Leaf() {
+ final a0Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
+ final StructStruct16BytesHomogeneousFloat2 a4 = a4Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1[0].a0 = 2.0;
+ a0.a1[1].a0 = -3.0;
+ a0.a2 = 4.0;
+ a1.a0.a0 = -5.0;
+ a1.a1[0].a0 = 6.0;
+ a1.a1[1].a0 = -7.0;
+ a1.a2 = 8.0;
+ a2.a0.a0 = -9.0;
+ a2.a1[0].a0 = 10.0;
+ a2.a1[1].a0 = -11.0;
+ a2.a2 = 12.0;
+ a3.a0.a0 = -13.0;
+ a3.a1[0].a0 = 14.0;
+ a3.a1[1].a0 = -15.0;
+ a3.a2 = 16.0;
+ a4.a0.a0 = -17.0;
+ a4.a1[0].a0 = 18.0;
+ a4.a1[1].a0 = -19.0;
+ a4.a2 = 20.0;
+
+ final result =
+ passStructStruct16BytesHomogeneousFloat2x5Leaf(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 passStructStruct32BytesHomogeneousDouble2x5Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2),
+ double Function(
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2,
+ StructStruct32BytesHomogeneousDouble2)>(
+ "PassStructStruct32BytesHomogeneousDouble2x5",
+ isLeaf: true);
+
+/// Arguments in FPU registers on arm64.
+/// 5 struct arguments will exhaust available registers.
+void testPassStructStruct32BytesHomogeneousDouble2x5Leaf() {
+ final a0Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
+ final StructStruct32BytesHomogeneousDouble2 a4 = a4Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a1[0].a0 = 2.0;
+ a0.a1[1].a0 = -3.0;
+ a0.a2 = 4.0;
+ a1.a0.a0 = -5.0;
+ a1.a1[0].a0 = 6.0;
+ a1.a1[1].a0 = -7.0;
+ a1.a2 = 8.0;
+ a2.a0.a0 = -9.0;
+ a2.a1[0].a0 = 10.0;
+ a2.a1[1].a0 = -11.0;
+ a2.a2 = 12.0;
+ a3.a0.a0 = -13.0;
+ a3.a1[0].a0 = 14.0;
+ a3.a1[1].a0 = -15.0;
+ a3.a2 = 16.0;
+ a4.a0.a0 = -17.0;
+ a4.a1[0].a0 = 18.0;
+ a4.a1[1].a0 = -19.0;
+ a4.a2 = 20.0;
+
+ final result =
+ passStructStruct32BytesHomogeneousDouble2x5Leaf(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 passStructStruct16BytesMixed3x10Leaf = ffiTestFunctions.lookupFunction<
+ Float Function(
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3),
+ double Function(
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3,
+ StructStruct16BytesMixed3)>("PassStructStruct16BytesMixed3x10",
+ isLeaf: true);
+
+/// 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 testPassStructStruct16BytesMixed3x10Leaf() {
+ final a0Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a0 = a0Pointer.ref;
+ final a1Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a1 = a1Pointer.ref;
+ final a2Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a2 = a2Pointer.ref;
+ final a3Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a3 = a3Pointer.ref;
+ final a4Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a4 = a4Pointer.ref;
+ final a5Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a5 = a5Pointer.ref;
+ final a6Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a6 = a6Pointer.ref;
+ final a7Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a7 = a7Pointer.ref;
+ final a8Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a8 = a8Pointer.ref;
+ final a9Pointer = calloc<StructStruct16BytesMixed3>();
+ final StructStruct16BytesMixed3 a9 = a9Pointer.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;
+ a1.a0.a0 = -7.0;
+ a1.a1[0].a0 = 8.0;
+ a1.a1[0].a1 = -9;
+ a1.a1[0].a2 = 10;
+ a1.a2[0] = -11;
+ a1.a2[1] = 12;
+ a2.a0.a0 = -13.0;
+ a2.a1[0].a0 = 14.0;
+ a2.a1[0].a1 = -15;
+ a2.a1[0].a2 = 16;
+ a2.a2[0] = -17;
+ a2.a2[1] = 18;
+ a3.a0.a0 = -19.0;
+ a3.a1[0].a0 = 20.0;
+ a3.a1[0].a1 = -21;
+ a3.a1[0].a2 = 22;
+ a3.a2[0] = -23;
+ a3.a2[1] = 24;
+ a4.a0.a0 = -25.0;
+ a4.a1[0].a0 = 26.0;
+ a4.a1[0].a1 = -27;
+ a4.a1[0].a2 = 28;
+ a4.a2[0] = -29;
+ a4.a2[1] = 30;
+ a5.a0.a0 = -31.0;
+ a5.a1[0].a0 = 32.0;
+ a5.a1[0].a1 = -33;
+ a5.a1[0].a2 = 34;
+ a5.a2[0] = -35;
+ a5.a2[1] = 36;
+ a6.a0.a0 = -37.0;
+ a6.a1[0].a0 = 38.0;
+ a6.a1[0].a1 = -39;
+ a6.a1[0].a2 = 40;
+ a6.a2[0] = -41;
+ a6.a2[1] = 42;
+ a7.a0.a0 = -43.0;
+ a7.a1[0].a0 = 44.0;
+ a7.a1[0].a1 = -45;
+ a7.a1[0].a2 = 46;
+ a7.a2[0] = -47;
+ a7.a2[1] = 48;
+ a8.a0.a0 = -49.0;
+ a8.a1[0].a0 = 50.0;
+ a8.a1[0].a1 = -51;
+ a8.a1[0].a2 = 52;
+ a8.a2[0] = -53;
+ a8.a2[1] = 54;
+ a9.a0.a0 = -55.0;
+ a9.a1[0].a0 = 56.0;
+ a9.a1[0].a1 = -57;
+ a9.a1[0].a2 = 58;
+ a9.a2[0] = -59;
+ a9.a2[1] = 60;
+
+ final result = passStructStruct16BytesMixed3x10Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.approxEquals(30.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 passUint8Struct32BytesInlineArrayMultiDimensionalILeaf =
+ ffiTestFunctions.lookupFunction<
+ Uint32 Function(
+ Uint8,
+ Struct32BytesInlineArrayMultiDimensionalInt,
+ Uint8,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ Uint8,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ Uint8),
+ int Function(
+ int,
+ Struct32BytesInlineArrayMultiDimensionalInt,
+ int,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ int,
+ Struct8BytesInlineArrayMultiDimensionalInt,
+ int)>("PassUint8Struct32BytesInlineArrayMultiDimensionalI",
+ isLeaf: true);
+
+/// Test multi dimensional inline array struct as argument.
+void testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf() {
+ int a0;
+ final a1Pointer = calloc<Struct32BytesInlineArrayMultiDimensionalInt>();
+ final Struct32BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
+ int a2;
+ final a3Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
+ final Struct8BytesInlineArrayMultiDimensionalInt a3 = a3Pointer.ref;
+ int a4;
+ final a5Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
+ final Struct8BytesInlineArrayMultiDimensionalInt a5 = a5Pointer.ref;
+ int a6;
+
+ a0 = 1;
+ a1.a0[0][0][0][0][0] = 2;
+ a1.a0[0][0][0][0][1] = 3;
+ a1.a0[0][0][0][1][0] = 4;
+ a1.a0[0][0][0][1][1] = 5;
+ a1.a0[0][0][1][0][0] = 6;
+ a1.a0[0][0][1][0][1] = 7;
+ a1.a0[0][0][1][1][0] = 8;
+ a1.a0[0][0][1][1][1] = 9;
+ a1.a0[0][1][0][0][0] = 10;
+ a1.a0[0][1][0][0][1] = 11;
+ a1.a0[0][1][0][1][0] = 12;
+ a1.a0[0][1][0][1][1] = 13;
+ a1.a0[0][1][1][0][0] = 14;
+ a1.a0[0][1][1][0][1] = 15;
+ a1.a0[0][1][1][1][0] = 16;
+ a1.a0[0][1][1][1][1] = 17;
+ a1.a0[1][0][0][0][0] = 18;
+ a1.a0[1][0][0][0][1] = 19;
+ a1.a0[1][0][0][1][0] = 20;
+ a1.a0[1][0][0][1][1] = 21;
+ a1.a0[1][0][1][0][0] = 22;
+ a1.a0[1][0][1][0][1] = 23;
+ a1.a0[1][0][1][1][0] = 24;
+ a1.a0[1][0][1][1][1] = 25;
+ a1.a0[1][1][0][0][0] = 26;
+ a1.a0[1][1][0][0][1] = 27;
+ a1.a0[1][1][0][1][0] = 28;
+ a1.a0[1][1][0][1][1] = 29;
+ a1.a0[1][1][1][0][0] = 30;
+ a1.a0[1][1][1][0][1] = 31;
+ a1.a0[1][1][1][1][0] = 32;
+ a1.a0[1][1][1][1][1] = 33;
+ a2 = 34;
+ a3.a0[0][0][0] = 35;
+ a3.a0[0][0][1] = 36;
+ a3.a0[0][1][0] = 37;
+ a3.a0[0][1][1] = 38;
+ a3.a0[1][0][0] = 39;
+ a3.a0[1][0][1] = 40;
+ a3.a0[1][1][0] = 41;
+ a3.a0[1][1][1] = 42;
+ a4 = 43;
+ a5.a0[0][0][0] = 44;
+ a5.a0[0][0][1] = 45;
+ a5.a0[0][1][0] = 46;
+ a5.a0[0][1][1] = 47;
+ a5.a0[1][0][0] = 48;
+ a5.a0[1][0][1] = 49;
+ a5.a0[1][1][0] = 50;
+ a5.a0[1][1][1] = 51;
+ a6 = 52;
+
+ final result = passUint8Struct32BytesInlineArrayMultiDimensionalILeaf(
+ a0, a1, a2, a3, a4, a5, a6);
+
+ print("result = $result");
+
+ Expect.equals(1378, result);
+
+ calloc.free(a1Pointer);
+ calloc.free(a3Pointer);
+ calloc.free(a5Pointer);
+}
+
+final passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf =
+ ffiTestFunctions.lookupFunction<
+ Uint32 Function(
+ Uint8, Struct4BytesInlineArrayMultiDimensionalInt, Uint8),
+ int Function(int, Struct4BytesInlineArrayMultiDimensionalInt, int)>(
+ "PassUint8Struct4BytesInlineArrayMultiDimensionalIn",
+ isLeaf: true);
+
+/// Test struct in multi dimensional inline array.
+void testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf() {
+ int a0;
+ final a1Pointer = calloc<Struct4BytesInlineArrayMultiDimensionalInt>();
+ final Struct4BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
+ int a2;
+
+ a0 = 1;
+ a1.a0[0][0].a0 = 2;
+ a1.a0[0][1].a0 = -3;
+ a1.a0[1][0].a0 = 4;
+ a1.a0[1][1].a0 = -5;
+ a2 = 6;
+
+ final result =
+ passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(5, result);
+
+ calloc.free(a1Pointer);
+}
+
+final passStruct3BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt),
+ int Function(
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt,
+ Struct3BytesPackedInt)>("PassStruct3BytesPackedIntx10", isLeaf: true);
+
+/// Small struct with mis-aligned member.
+void testPassStruct3BytesPackedIntx10Leaf() {
+ final a0Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct3BytesPackedInt>();
+ final Struct3BytesPackedInt 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 =
+ passStruct3BytesPackedIntx10Leaf(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 passStruct8BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Int64 Function(
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt),
+ int Function(
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt,
+ Struct8BytesPackedInt)>("PassStruct8BytesPackedIntx10", isLeaf: true);
+
+/// Struct with mis-aligned member.
+void testPassStruct8BytesPackedIntx10Leaf() {
+ final a0Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct8BytesPackedInt>();
+ final Struct8BytesPackedInt 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 =
+ passStruct8BytesPackedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.equals(1275, 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 passStruct9BytesPackedMixedx10DoubleInt32x2Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Double,
+ Int32,
+ Int32),
+ double Function(
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ Struct9BytesPackedMixed,
+ double,
+ int,
+ int)>("PassStruct9BytesPackedMixedx10DoubleInt32x2", isLeaf: true);
+
+/// Struct with mis-aligned member.
+/// Tests backfilling of CPU and FPU registers.
+void testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf() {
+ final a0Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Struct9BytesPackedMixed>();
+ final Struct9BytesPackedMixed a9 = a9Pointer.ref;
+ double a10;
+ int a11;
+ int a12;
+
+ a0.a0 = 1;
+ a0.a1 = 2.0;
+ a1.a0 = 3;
+ a1.a1 = 4.0;
+ a2.a0 = 5;
+ a2.a1 = 6.0;
+ a3.a0 = 7;
+ a3.a1 = 8.0;
+ a4.a0 = 9;
+ a4.a1 = 10.0;
+ a5.a0 = 11;
+ a5.a1 = 12.0;
+ a6.a0 = 13;
+ a6.a1 = 14.0;
+ a7.a0 = 15;
+ a7.a1 = 16.0;
+ a8.a0 = 17;
+ a8.a1 = 18.0;
+ a9.a0 = 19;
+ a9.a1 = 20.0;
+ a10 = -21.0;
+ a11 = 22;
+ a12 = -23;
+
+ final result = passStruct9BytesPackedMixedx10DoubleInt32x2Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
+
+ print("result = $result");
+
+ Expect.approxEquals(188.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 passStruct5BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct5BytesPackedMixed),
+ double Function(
+ Struct5BytesPackedMixed)>("PassStruct5BytesPackedMixed", isLeaf: true);
+
+/// This packed struct happens to have only aligned members.
+void testPassStruct5BytesPackedMixedLeaf() {
+ final a0Pointer = calloc<Struct5BytesPackedMixed>();
+ final Struct5BytesPackedMixed a0 = a0Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2;
+
+ final result = passStruct5BytesPackedMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(1.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStructNestedAlignmentStruct5BytesPackedMixedLeaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(StructNestedAlignmentStruct5BytesPackedMixed),
+ double Function(StructNestedAlignmentStruct5BytesPackedMixed)>(
+ "PassStructNestedAlignmentStruct5BytesPackedMixed",
+ isLeaf: true);
+
+/// Check alignment of packed struct in non-packed struct.
+void testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf() {
+ final a0Pointer = calloc<StructNestedAlignmentStruct5BytesPackedMixed>();
+ final StructNestedAlignmentStruct5BytesPackedMixed a0 = a0Pointer.ref;
+
+ a0.a0 = 1;
+ a0.a1.a0 = 2.0;
+ a0.a1.a1 = 3;
+
+ final result = passStructNestedAlignmentStruct5BytesPackedMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(6.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct6BytesInlineArrayIntLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct6BytesInlineArrayInt),
+ double Function(Struct6BytesInlineArrayInt)>(
+ "PassStruct6BytesInlineArrayInt",
+ isLeaf: true);
+
+/// Check alignment of packed struct array in non-packed struct.
+void testPassStruct6BytesInlineArrayIntLeaf() {
+ final a0Pointer = calloc<Struct6BytesInlineArrayInt>();
+ final Struct6BytesInlineArrayInt a0 = a0Pointer.ref;
+
+ a0.a0[0].a0 = -1;
+ a0.a0[0].a1 = 2;
+ a0.a0[1].a0 = -3;
+ a0.a0[1].a1 = 4;
+
+ final result = passStruct6BytesInlineArrayIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(2.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passStruct15BytesInlineArrayMixedLeaf = ffiTestFunctions.lookupFunction<
+ Double Function(Struct15BytesInlineArrayMixed),
+ double Function(Struct15BytesInlineArrayMixed)>(
+ "PassStruct15BytesInlineArrayMixed",
+ isLeaf: true);
+
+/// Check alignment of packed struct array in non-packed struct.
+void testPassStruct15BytesInlineArrayMixedLeaf() {
+ final a0Pointer = calloc<Struct15BytesInlineArrayMixed>();
+ final Struct15BytesInlineArrayMixed a0 = a0Pointer.ref;
+
+ a0.a0[0].a0 = -1.0;
+ a0.a0[0].a1 = 2;
+ a0.a0[1].a0 = -3.0;
+ a0.a0[1].a1 = 4;
+ a0.a0[2].a0 = -5.0;
+ a0.a0[2].a1 = 6;
+
+ final result = passStruct15BytesInlineArrayMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(3.0, result);
+
+ calloc.free(a0Pointer);
+}
+
+final passUnion4BytesMixedx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed),
+ double Function(
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed,
+ Union4BytesMixed)>("PassUnion4BytesMixedx10", isLeaf: true);
+
+/// Check placement of mixed integer/float union.
+void testPassUnion4BytesMixedx10Leaf() {
+ final a0Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union4BytesMixed>();
+ final Union4BytesMixed 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 =
+ passUnion4BytesMixedx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.approxEquals(55.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 passUnion8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat),
+ double Function(
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat,
+ Union8BytesNestedFloat)>("PassUnion8BytesNestedFloatx10", isLeaf: true);
+
+/// Check placement of mixed floats union.
+void testPassUnion8BytesNestedFloatx10Leaf() {
+ final a0Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union8BytesNestedFloat>();
+ final Union8BytesNestedFloat a9 = a9Pointer.ref;
+
+ a0.a0 = -1.0;
+ a1.a0 = 2.0;
+ a2.a0 = -3.0;
+ a3.a0 = 4.0;
+ a4.a0 = -5.0;
+ a5.a0 = 6.0;
+ a6.a0 = -7.0;
+ a7.a0 = 8.0;
+ a8.a0 = -9.0;
+ a9.a0 = 10.0;
+
+ final result =
+ passUnion8BytesNestedFloatx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
+
+ print("result = $result");
+
+ Expect.approxEquals(5.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 passUnion9BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt),
+ double Function(
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt,
+ Union9BytesNestedInt)>("PassUnion9BytesNestedIntx10", isLeaf: true);
+
+/// Mixed-size union argument.
+void testPassUnion9BytesNestedIntx10Leaf() {
+ final a0Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union9BytesNestedInt>();
+ final Union9BytesNestedInt a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1;
+ a0.a0.a1 = 2;
+ a0.a0.a2 = -3;
+ a1.a0.a0 = 4;
+ a1.a0.a1 = -5;
+ a1.a0.a2 = 6;
+ a2.a0.a0 = -7;
+ a2.a0.a1 = 8;
+ a2.a0.a2 = -9;
+ a3.a0.a0 = 10;
+ a3.a0.a1 = -11;
+ a3.a0.a2 = 12;
+ a4.a0.a0 = -13;
+ a4.a0.a1 = 14;
+ a4.a0.a2 = -15;
+ a5.a0.a0 = 16;
+ a5.a0.a1 = -17;
+ a5.a0.a2 = 18;
+ a6.a0.a0 = -19;
+ a6.a0.a1 = 20;
+ a6.a0.a2 = -21;
+ a7.a0.a0 = 22;
+ a7.a0.a1 = -23;
+ a7.a0.a2 = 24;
+ a8.a0.a0 = -25;
+ a8.a0.a1 = 26;
+ a8.a0.a2 = -27;
+ a9.a0.a0 = 28;
+ a9.a0.a1 = -29;
+ a9.a0.a2 = 30;
+
+ final result =
+ passUnion9BytesNestedIntx10Leaf(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 passUnion16BytesNestedInlineArrayFloatx10Leaf =
+ ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat),
+ double Function(
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat,
+ Union16BytesNestedInlineArrayFloat)>(
+ "PassUnion16BytesNestedInlineArrayFloatx10",
+ isLeaf: true);
+
+/// Union with homogenous floats.
+void testPassUnion16BytesNestedInlineArrayFloatx10Leaf() {
+ final a0Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
+ final Union16BytesNestedInlineArrayFloat a9 = a9Pointer.ref;
+
+ a0.a0[0] = -1.0;
+ a0.a0[1] = 2.0;
+ a0.a0[2] = -3.0;
+ a0.a0[3] = 4.0;
+ a1.a0[0] = -5.0;
+ a1.a0[1] = 6.0;
+ a1.a0[2] = -7.0;
+ a1.a0[3] = 8.0;
+ a2.a0[0] = -9.0;
+ a2.a0[1] = 10.0;
+ a2.a0[2] = -11.0;
+ a2.a0[3] = 12.0;
+ a3.a0[0] = -13.0;
+ a3.a0[1] = 14.0;
+ a3.a0[2] = -15.0;
+ a3.a0[3] = 16.0;
+ a4.a0[0] = -17.0;
+ a4.a0[1] = 18.0;
+ a4.a0[2] = -19.0;
+ a4.a0[3] = 20.0;
+ a5.a0[0] = -21.0;
+ a5.a0[1] = 22.0;
+ a5.a0[2] = -23.0;
+ a5.a0[3] = 24.0;
+ a6.a0[0] = -25.0;
+ a6.a0[1] = 26.0;
+ a6.a0[2] = -27.0;
+ a6.a0[3] = 28.0;
+ a7.a0[0] = -29.0;
+ a7.a0[1] = 30.0;
+ a7.a0[2] = -31.0;
+ a7.a0[3] = 32.0;
+ a8.a0[0] = -33.0;
+ a8.a0[1] = 34.0;
+ a8.a0[2] = -35.0;
+ a8.a0[3] = 36.0;
+ a9.a0[0] = -37.0;
+ a9.a0[1] = 38.0;
+ a9.a0[2] = -39.0;
+ a9.a0[3] = 40.0;
+
+ final result = passUnion16BytesNestedInlineArrayFloatx10Leaf(
+ 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 passUnion16BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
+ Double Function(
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat),
+ double Function(
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat,
+ Union16BytesNestedFloat)>("PassUnion16BytesNestedFloatx10",
+ isLeaf: true);
+
+/// Union with homogenous floats.
+void testPassUnion16BytesNestedFloatx10Leaf() {
+ final a0Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a0 = a0Pointer.ref;
+ final a1Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a1 = a1Pointer.ref;
+ final a2Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a2 = a2Pointer.ref;
+ final a3Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a3 = a3Pointer.ref;
+ final a4Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a4 = a4Pointer.ref;
+ final a5Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a5 = a5Pointer.ref;
+ final a6Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a6 = a6Pointer.ref;
+ final a7Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a7 = a7Pointer.ref;
+ final a8Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a8 = a8Pointer.ref;
+ final a9Pointer = calloc<Union16BytesNestedFloat>();
+ final Union16BytesNestedFloat a9 = a9Pointer.ref;
+
+ a0.a0.a0 = -1.0;
+ a0.a0.a1 = 2.0;
+ a1.a0.a0 = -3.0;
+ a1.a0.a1 = 4.0;
+ a2.a0.a0 = -5.0;
+ a2.a0.a1 = 6.0;
+ a3.a0.a0 = -7.0;
+ a3.a0.a1 = 8.0;
+ a4.a0.a0 = -9.0;
+ a4.a0.a1 = 10.0;
+ a5.a0.a0 = -11.0;
+ a5.a0.a1 = 12.0;
+ a6.a0.a0 = -13.0;
+ a6.a0.a1 = 14.0;
+ a7.a0.a0 = -15.0;
+ a7.a0.a1 = 16.0;
+ a8.a0.a0 = -17.0;
+ a8.a0.a1 = 18.0;
+ a9.a0.a0 = -19.0;
+ a9.a0.a1 = 20.0;
+
+ final result = passUnion16BytesNestedFloatx10Leaf(
+ 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 returnStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct1ByteInt Function(Int8),
+ Struct1ByteInt Function(int)>("ReturnStruct1ByteInt", isLeaf: true);
+
+/// Smallest struct with data.
+void testReturnStruct1ByteIntLeaf() {
+ int a0;
+
+ a0 = -1;
+
+ final result = returnStruct1ByteIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+}
+
+final returnStruct3BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct3BytesHomogeneousUint8 Function(Uint8, Uint8, Uint8),
+ Struct3BytesHomogeneousUint8 Function(
+ int, int, int)>("ReturnStruct3BytesHomogeneousUint8", isLeaf: true);
+
+/// Smaller than word size return value on all architectures.
+void testReturnStruct3BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+
+ final result = returnStruct3BytesHomogeneousUint8Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct3BytesInt2ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
+ Struct3BytesInt2ByteAligned Function(Int16, Int8),
+ Struct3BytesInt2ByteAligned Function(
+ int, int)>("ReturnStruct3BytesInt2ByteAligned", isLeaf: true);
+
+/// Smaller than word size return value on all architectures.
+/// With alignment rules taken into account size is 4 bytes.
+void testReturnStruct3BytesInt2ByteAlignedLeaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct3BytesInt2ByteAlignedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct4BytesHomogeneousInt16Leaf = ffiTestFunctions.lookupFunction<
+ Struct4BytesHomogeneousInt16 Function(Int16, Int16),
+ Struct4BytesHomogeneousInt16 Function(
+ int, int)>("ReturnStruct4BytesHomogeneousInt16", isLeaf: true);
+
+/// Word size return value on 32 bit architectures..
+void testReturnStruct4BytesHomogeneousInt16Leaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct4BytesHomogeneousInt16Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct7BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct7BytesHomogeneousUint8 Function(
+ Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+ Struct7BytesHomogeneousUint8 Function(int, int, int, int, int, int,
+ int)>("ReturnStruct7BytesHomogeneousUint8", isLeaf: true);
+
+/// Non-wordsize return value.
+void testReturnStruct7BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+
+ final result =
+ returnStruct7BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5, a6);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+}
+
+final returnStruct7BytesInt4ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
+ Struct7BytesInt4ByteAligned Function(Int32, Int16, Int8),
+ Struct7BytesInt4ByteAligned Function(
+ int, int, int)>("ReturnStruct7BytesInt4ByteAligned", isLeaf: true);
+
+/// Non-wordsize return value.
+/// With alignment rules taken into account size is 8 bytes.
+void testReturnStruct7BytesInt4ByteAlignedLeaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct7BytesInt4ByteAlignedLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesInt Function(Int16, Int16, Int32),
+ Struct8BytesInt Function(
+ int, int, int)>("ReturnStruct8BytesInt", isLeaf: true);
+
+/// Return value in integer registers on many architectures.
+void testReturnStruct8BytesIntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct8BytesIntLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesHomogeneousFloat Function(Float, Float),
+ Struct8BytesHomogeneousFloat Function(
+ double, double)>("ReturnStruct8BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value in FP registers on many architectures.
+void testReturnStruct8BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+
+ a0 = -1.0;
+ a1 = 2.0;
+
+ final result = returnStruct8BytesHomogeneousFloatLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+}
+
+final returnStruct8BytesMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesMixed Function(Float, Int16, Int16),
+ Struct8BytesMixed Function(
+ double, int, int)>("ReturnStruct8BytesMixed", isLeaf: true);
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct8BytesMixedLeaf() {
+ double a0;
+ int a1;
+ int a2;
+
+ a0 = -1.0;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct8BytesMixedLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct9BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct9BytesHomogeneousUint8 Function(
+ Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
+ Struct9BytesHomogeneousUint8 Function(int, int, int, int, int, int, int,
+ int, int)>("ReturnStruct9BytesHomogeneousUint8", isLeaf: true);
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct9BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ int a8;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+ a7 = 8;
+ a8 = 9;
+
+ final result = returnStruct9BytesHomogeneousUint8Leaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+ Expect.equals(a7, result.a7);
+ Expect.equals(a8, result.a8);
+}
+
+final returnStruct9BytesInt4Or8ByteAlignedLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct9BytesInt4Or8ByteAligned Function(Int64, Int8),
+ Struct9BytesInt4Or8ByteAligned Function(
+ int, int)>("ReturnStruct9BytesInt4Or8ByteAligned", isLeaf: true);
+
+/// Return value in two integer registers on x64.
+/// With alignment rules taken into account size is 12 or 16 bytes.
+void testReturnStruct9BytesInt4Or8ByteAlignedLeaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct9BytesInt4Or8ByteAlignedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct12BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct12BytesHomogeneousFloat Function(Float, Float, Float),
+ Struct12BytesHomogeneousFloat Function(double, double,
+ double)>("ReturnStruct12BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value in FPU registers, but does not use all registers on arm hardfp
+/// and arm64.
+void testReturnStruct12BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+ double a2;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+
+ final result = returnStruct12BytesHomogeneousFloatLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+}
+
+final returnStruct16BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesHomogeneousFloat Function(Float, Float, Float, Float),
+ Struct16BytesHomogeneousFloat Function(double, double, double,
+ double)>("ReturnStruct16BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value in FPU registers on arm hardfp and arm64.
+void testReturnStruct16BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+
+ final result = returnStruct16BytesHomogeneousFloatLeaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct16BytesMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesMixed Function(Double, Int64),
+ Struct16BytesMixed Function(
+ double, int)>("ReturnStruct16BytesMixed", isLeaf: true);
+
+/// Return value split over FP and integer register in x64.
+void testReturnStruct16BytesMixedLeaf() {
+ double a0;
+ int a1;
+
+ a0 = -1.0;
+ a1 = 2;
+
+ final result = returnStruct16BytesMixedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct16BytesMixed2Leaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesMixed2 Function(Float, Float, Float, Int32),
+ Struct16BytesMixed2 Function(double, double, double,
+ int)>("ReturnStruct16BytesMixed2", isLeaf: true);
+
+/// Return value split over FP and integer register in x64.
+/// The integer register contains half float half int.
+void testReturnStruct16BytesMixed2Leaf() {
+ double a0;
+ double a1;
+ double a2;
+ int a3;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4;
+
+ final result = returnStruct16BytesMixed2Leaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+}
+
+final returnStruct17BytesIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct17BytesInt Function(Int64, Int64, Int8),
+ Struct17BytesInt Function(
+ int, int, int)>("ReturnStruct17BytesInt", isLeaf: true);
+
+/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
+/// Is non word size on purpose, to test that structs are rounded up to word size
+/// on all ABIs.
+void testReturnStruct17BytesIntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStruct17BytesIntLeaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct19BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
+ Struct19BytesHomogeneousUint8 Function(
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8,
+ Uint8),
+ Struct19BytesHomogeneousUint8 Function(
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int)>("ReturnStruct19BytesHomogeneousUint8", isLeaf: true);
+
+/// The minimum alignment of this struct is only 1 byte based on its fields.
+/// Test that the memory backing these structs is the right size and that
+/// dart:ffi trampolines do not write outside this size.
+void testReturnStruct19BytesHomogeneousUint8Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ int a8;
+ int a9;
+ int a10;
+ int a11;
+ int a12;
+ int a13;
+ int a14;
+ int a15;
+ int a16;
+ int a17;
+ int a18;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+ a7 = 8;
+ a8 = 9;
+ a9 = 10;
+ a10 = 11;
+ a11 = 12;
+ a12 = 13;
+ a13 = 14;
+ a14 = 15;
+ a15 = 16;
+ a16 = 17;
+ a17 = 18;
+ a18 = 19;
+
+ final result = returnStruct19BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5,
+ a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+ Expect.equals(a7, result.a7);
+ Expect.equals(a8, result.a8);
+ Expect.equals(a9, result.a9);
+ Expect.equals(a10, result.a10);
+ Expect.equals(a11, result.a11);
+ Expect.equals(a12, result.a12);
+ Expect.equals(a13, result.a13);
+ Expect.equals(a14, result.a14);
+ Expect.equals(a15, result.a15);
+ Expect.equals(a16, result.a16);
+ Expect.equals(a17, result.a17);
+ Expect.equals(a18, result.a18);
+}
+
+final returnStruct20BytesHomogeneousInt32Leaf = ffiTestFunctions.lookupFunction<
+ Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32),
+ Struct20BytesHomogeneousInt32 Function(int, int, int, int,
+ int)>("ReturnStruct20BytesHomogeneousInt32", isLeaf: true);
+
+/// Return value too big to go in cpu registers on arm64.
+void testReturnStruct20BytesHomogeneousInt32Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+ a3 = 4;
+ a4 = -5;
+
+ final result = returnStruct20BytesHomogeneousInt32Leaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+}
+
+final returnStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct20BytesHomogeneousFloat Function(Float, Float, Float, Float, Float),
+ Struct20BytesHomogeneousFloat Function(double, double, double, double,
+ double)>("ReturnStruct20BytesHomogeneousFloat", isLeaf: true);
+
+/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
+void testReturnStruct20BytesHomogeneousFloatLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+ double a4;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+ a4 = -5.0;
+
+ final result = returnStruct20BytesHomogeneousFloatLeaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+ Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct32BytesHomogeneousDoubleLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double),
+ Struct32BytesHomogeneousDouble Function(double, double, double,
+ double)>("ReturnStruct32BytesHomogeneousDouble", isLeaf: true);
+
+/// Return value in FPU registers on arm64.
+void testReturnStruct32BytesHomogeneousDoubleLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+
+ final result = returnStruct32BytesHomogeneousDoubleLeaf(a0, a1, a2, a3);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+}
+
+final returnStruct40BytesHomogeneousDoubleLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct40BytesHomogeneousDouble Function(
+ Double, Double, Double, Double, Double),
+ Struct40BytesHomogeneousDouble Function(double, double, double, double,
+ double)>("ReturnStruct40BytesHomogeneousDouble", isLeaf: true);
+
+/// Return value too big to go in FPU registers on arm64.
+void testReturnStruct40BytesHomogeneousDoubleLeaf() {
+ double a0;
+ double a1;
+ double a2;
+ double a3;
+ double a4;
+
+ a0 = -1.0;
+ a1 = 2.0;
+ a2 = -3.0;
+ a3 = 4.0;
+ a4 = -5.0;
+
+ final result = returnStruct40BytesHomogeneousDoubleLeaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+ Expect.approxEquals(a2, result.a2);
+ Expect.approxEquals(a3, result.a3);
+ Expect.approxEquals(a4, result.a4);
+}
+
+final returnStruct1024BytesHomogeneousUint64Leaf =
+ ffiTestFunctions.lookupFunction<
+ Struct1024BytesHomogeneousUint64 Function(
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64,
+ Uint64),
+ Struct1024BytesHomogeneousUint64 Function(
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int,
+ int)>("ReturnStruct1024BytesHomogeneousUint64", isLeaf: true);
+
+/// Test 1kb struct.
+void testReturnStruct1024BytesHomogeneousUint64Leaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+ int a5;
+ int a6;
+ int a7;
+ int a8;
+ int a9;
+ int a10;
+ int a11;
+ int a12;
+ int a13;
+ int a14;
+ int a15;
+ int a16;
+ int a17;
+ int a18;
+ int a19;
+ int a20;
+ int a21;
+ int a22;
+ int a23;
+ int a24;
+ int a25;
+ int a26;
+ int a27;
+ int a28;
+ int a29;
+ int a30;
+ int a31;
+ int a32;
+ int a33;
+ int a34;
+ int a35;
+ int a36;
+ int a37;
+ int a38;
+ int a39;
+ int a40;
+ int a41;
+ int a42;
+ int a43;
+ int a44;
+ int a45;
+ int a46;
+ int a47;
+ int a48;
+ int a49;
+ int a50;
+ int a51;
+ int a52;
+ int a53;
+ int a54;
+ int a55;
+ int a56;
+ int a57;
+ int a58;
+ int a59;
+ int a60;
+ int a61;
+ int a62;
+ int a63;
+ int a64;
+ int a65;
+ int a66;
+ int a67;
+ int a68;
+ int a69;
+ int a70;
+ int a71;
+ int a72;
+ int a73;
+ int a74;
+ int a75;
+ int a76;
+ int a77;
+ int a78;
+ int a79;
+ int a80;
+ int a81;
+ int a82;
+ int a83;
+ int a84;
+ int a85;
+ int a86;
+ int a87;
+ int a88;
+ int a89;
+ int a90;
+ int a91;
+ int a92;
+ int a93;
+ int a94;
+ int a95;
+ int a96;
+ int a97;
+ int a98;
+ int a99;
+ int a100;
+ int a101;
+ int a102;
+ int a103;
+ int a104;
+ int a105;
+ int a106;
+ int a107;
+ int a108;
+ int a109;
+ int a110;
+ int a111;
+ int a112;
+ int a113;
+ int a114;
+ int a115;
+ int a116;
+ int a117;
+ int a118;
+ int a119;
+ int a120;
+ int a121;
+ int a122;
+ int a123;
+ int a124;
+ int a125;
+ int a126;
+ int a127;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+ a5 = 6;
+ a6 = 7;
+ a7 = 8;
+ a8 = 9;
+ a9 = 10;
+ a10 = 11;
+ a11 = 12;
+ a12 = 13;
+ a13 = 14;
+ a14 = 15;
+ a15 = 16;
+ a16 = 17;
+ a17 = 18;
+ a18 = 19;
+ a19 = 20;
+ a20 = 21;
+ a21 = 22;
+ a22 = 23;
+ a23 = 24;
+ a24 = 25;
+ a25 = 26;
+ a26 = 27;
+ a27 = 28;
+ a28 = 29;
+ a29 = 30;
+ a30 = 31;
+ a31 = 32;
+ a32 = 33;
+ a33 = 34;
+ a34 = 35;
+ a35 = 36;
+ a36 = 37;
+ a37 = 38;
+ a38 = 39;
+ a39 = 40;
+ a40 = 41;
+ a41 = 42;
+ a42 = 43;
+ a43 = 44;
+ a44 = 45;
+ a45 = 46;
+ a46 = 47;
+ a47 = 48;
+ a48 = 49;
+ a49 = 50;
+ a50 = 51;
+ a51 = 52;
+ a52 = 53;
+ a53 = 54;
+ a54 = 55;
+ a55 = 56;
+ a56 = 57;
+ a57 = 58;
+ a58 = 59;
+ a59 = 60;
+ a60 = 61;
+ a61 = 62;
+ a62 = 63;
+ a63 = 64;
+ a64 = 65;
+ a65 = 66;
+ a66 = 67;
+ a67 = 68;
+ a68 = 69;
+ a69 = 70;
+ a70 = 71;
+ a71 = 72;
+ a72 = 73;
+ a73 = 74;
+ a74 = 75;
+ a75 = 76;
+ a76 = 77;
+ a77 = 78;
+ a78 = 79;
+ a79 = 80;
+ a80 = 81;
+ a81 = 82;
+ a82 = 83;
+ a83 = 84;
+ a84 = 85;
+ a85 = 86;
+ a86 = 87;
+ a87 = 88;
+ a88 = 89;
+ a89 = 90;
+ a90 = 91;
+ a91 = 92;
+ a92 = 93;
+ a93 = 94;
+ a94 = 95;
+ a95 = 96;
+ a96 = 97;
+ a97 = 98;
+ a98 = 99;
+ a99 = 100;
+ a100 = 101;
+ a101 = 102;
+ a102 = 103;
+ a103 = 104;
+ a104 = 105;
+ a105 = 106;
+ a106 = 107;
+ a107 = 108;
+ a108 = 109;
+ a109 = 110;
+ a110 = 111;
+ a111 = 112;
+ a112 = 113;
+ a113 = 114;
+ a114 = 115;
+ a115 = 116;
+ a116 = 117;
+ a117 = 118;
+ a118 = 119;
+ a119 = 120;
+ a120 = 121;
+ a121 = 122;
+ a122 = 123;
+ a123 = 124;
+ a124 = 125;
+ a125 = 126;
+ a126 = 127;
+ a127 = 128;
+
+ final result = returnStruct1024BytesHomogeneousUint64Leaf(
+ 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);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+ Expect.equals(a5, result.a5);
+ Expect.equals(a6, result.a6);
+ Expect.equals(a7, result.a7);
+ Expect.equals(a8, result.a8);
+ Expect.equals(a9, result.a9);
+ Expect.equals(a10, result.a10);
+ Expect.equals(a11, result.a11);
+ Expect.equals(a12, result.a12);
+ Expect.equals(a13, result.a13);
+ Expect.equals(a14, result.a14);
+ Expect.equals(a15, result.a15);
+ Expect.equals(a16, result.a16);
+ Expect.equals(a17, result.a17);
+ Expect.equals(a18, result.a18);
+ Expect.equals(a19, result.a19);
+ Expect.equals(a20, result.a20);
+ Expect.equals(a21, result.a21);
+ Expect.equals(a22, result.a22);
+ Expect.equals(a23, result.a23);
+ Expect.equals(a24, result.a24);
+ Expect.equals(a25, result.a25);
+ Expect.equals(a26, result.a26);
+ Expect.equals(a27, result.a27);
+ Expect.equals(a28, result.a28);
+ Expect.equals(a29, result.a29);
+ Expect.equals(a30, result.a30);
+ Expect.equals(a31, result.a31);
+ Expect.equals(a32, result.a32);
+ Expect.equals(a33, result.a33);
+ Expect.equals(a34, result.a34);
+ Expect.equals(a35, result.a35);
+ Expect.equals(a36, result.a36);
+ Expect.equals(a37, result.a37);
+ Expect.equals(a38, result.a38);
+ Expect.equals(a39, result.a39);
+ Expect.equals(a40, result.a40);
+ Expect.equals(a41, result.a41);
+ Expect.equals(a42, result.a42);
+ Expect.equals(a43, result.a43);
+ Expect.equals(a44, result.a44);
+ Expect.equals(a45, result.a45);
+ Expect.equals(a46, result.a46);
+ Expect.equals(a47, result.a47);
+ Expect.equals(a48, result.a48);
+ Expect.equals(a49, result.a49);
+ Expect.equals(a50, result.a50);
+ Expect.equals(a51, result.a51);
+ Expect.equals(a52, result.a52);
+ Expect.equals(a53, result.a53);
+ Expect.equals(a54, result.a54);
+ Expect.equals(a55, result.a55);
+ Expect.equals(a56, result.a56);
+ Expect.equals(a57, result.a57);
+ Expect.equals(a58, result.a58);
+ Expect.equals(a59, result.a59);
+ Expect.equals(a60, result.a60);
+ Expect.equals(a61, result.a61);
+ Expect.equals(a62, result.a62);
+ Expect.equals(a63, result.a63);
+ Expect.equals(a64, result.a64);
+ Expect.equals(a65, result.a65);
+ Expect.equals(a66, result.a66);
+ Expect.equals(a67, result.a67);
+ Expect.equals(a68, result.a68);
+ Expect.equals(a69, result.a69);
+ Expect.equals(a70, result.a70);
+ Expect.equals(a71, result.a71);
+ Expect.equals(a72, result.a72);
+ Expect.equals(a73, result.a73);
+ Expect.equals(a74, result.a74);
+ Expect.equals(a75, result.a75);
+ Expect.equals(a76, result.a76);
+ Expect.equals(a77, result.a77);
+ Expect.equals(a78, result.a78);
+ Expect.equals(a79, result.a79);
+ Expect.equals(a80, result.a80);
+ Expect.equals(a81, result.a81);
+ Expect.equals(a82, result.a82);
+ Expect.equals(a83, result.a83);
+ Expect.equals(a84, result.a84);
+ Expect.equals(a85, result.a85);
+ Expect.equals(a86, result.a86);
+ Expect.equals(a87, result.a87);
+ Expect.equals(a88, result.a88);
+ Expect.equals(a89, result.a89);
+ Expect.equals(a90, result.a90);
+ Expect.equals(a91, result.a91);
+ Expect.equals(a92, result.a92);
+ Expect.equals(a93, result.a93);
+ Expect.equals(a94, result.a94);
+ Expect.equals(a95, result.a95);
+ Expect.equals(a96, result.a96);
+ Expect.equals(a97, result.a97);
+ Expect.equals(a98, result.a98);
+ Expect.equals(a99, result.a99);
+ Expect.equals(a100, result.a100);
+ Expect.equals(a101, result.a101);
+ Expect.equals(a102, result.a102);
+ Expect.equals(a103, result.a103);
+ Expect.equals(a104, result.a104);
+ Expect.equals(a105, result.a105);
+ Expect.equals(a106, result.a106);
+ Expect.equals(a107, result.a107);
+ Expect.equals(a108, result.a108);
+ Expect.equals(a109, result.a109);
+ Expect.equals(a110, result.a110);
+ Expect.equals(a111, result.a111);
+ Expect.equals(a112, result.a112);
+ Expect.equals(a113, result.a113);
+ Expect.equals(a114, result.a114);
+ Expect.equals(a115, result.a115);
+ Expect.equals(a116, result.a116);
+ Expect.equals(a117, result.a117);
+ Expect.equals(a118, result.a118);
+ Expect.equals(a119, result.a119);
+ Expect.equals(a120, result.a120);
+ Expect.equals(a121, result.a121);
+ Expect.equals(a122, result.a122);
+ Expect.equals(a123, result.a123);
+ Expect.equals(a124, result.a124);
+ Expect.equals(a125, result.a125);
+ Expect.equals(a126, result.a126);
+ Expect.equals(a127, result.a127);
+}
+
+final returnStruct3BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct3BytesPackedInt Function(Int8, Int16),
+ Struct3BytesPackedInt Function(
+ int, int)>("ReturnStruct3BytesPackedInt", isLeaf: true);
+
+/// Small struct with mis-aligned member.
+void testReturnStruct3BytesPackedIntLeaf() {
+ int a0;
+ int a1;
+
+ a0 = -1;
+ a1 = 2;
+
+ final result = returnStruct3BytesPackedIntLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+}
+
+final returnStruct8BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesPackedInt Function(Uint8, Uint32, Uint8, Uint8, Uint8),
+ Struct8BytesPackedInt Function(
+ int, int, int, int, int)>("ReturnStruct8BytesPackedInt", isLeaf: true);
+
+/// Struct with mis-aligned member.
+void testReturnStruct8BytesPackedIntLeaf() {
+ int a0;
+ int a1;
+ int a2;
+ int a3;
+ int a4;
+
+ a0 = 1;
+ a1 = 2;
+ a2 = 3;
+ a3 = 4;
+ a4 = 5;
+
+ final result = returnStruct8BytesPackedIntLeaf(a0, a1, a2, a3, a4);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+ Expect.equals(a3, result.a3);
+ Expect.equals(a4, result.a4);
+}
+
+final returnStruct9BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct9BytesPackedMixed Function(Uint8, Double),
+ Struct9BytesPackedMixed Function(
+ int, double)>("ReturnStruct9BytesPackedMixed", isLeaf: true);
+
+/// Struct with mis-aligned member.
+/// Tests backfilling of CPU and FPU registers.
+void testReturnStruct9BytesPackedMixedLeaf() {
+ int a0;
+ double a1;
+
+ a0 = 1;
+ a1 = 2.0;
+
+ final result = returnStruct9BytesPackedMixedLeaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.approxEquals(a1, result.a1);
+}
+
+final returnUnion4BytesMixedLeaf = ffiTestFunctions.lookupFunction<
+ Union4BytesMixed Function(Uint32),
+ Union4BytesMixed Function(int)>("ReturnUnion4BytesMixed", isLeaf: true);
+
+/// Returning a mixed integer/float union.
+void testReturnUnion4BytesMixedLeaf() {
+ int a0;
+
+ a0 = 1;
+
+ final result = returnUnion4BytesMixedLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+}
+
+final returnUnion8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
+ Union8BytesNestedFloat Function(Double),
+ Union8BytesNestedFloat Function(
+ double)>("ReturnUnion8BytesNestedFloat", isLeaf: true);
+
+/// Returning a floating point only union.
+void testReturnUnion8BytesNestedFloatLeaf() {
+ double a0;
+
+ a0 = -1.0;
+
+ final result = returnUnion8BytesNestedFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0, result.a0);
+}
+
+final returnUnion9BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Union9BytesNestedInt Function(Struct8BytesInt),
+ Union9BytesNestedInt Function(
+ Struct8BytesInt)>("ReturnUnion9BytesNestedInt", isLeaf: true);
+
+/// Returning a mixed-size union.
+void testReturnUnion9BytesNestedIntLeaf() {
+ final a0Pointer = calloc<Struct8BytesInt>();
+ final Struct8BytesInt a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+ a0.a1 = 2;
+ a0.a2 = -3;
+
+ final result = returnUnion9BytesNestedIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0.a0, result.a0.a0);
+ Expect.equals(a0.a1, result.a0.a1);
+ Expect.equals(a0.a2, result.a0.a2);
+
+ calloc.free(a0Pointer);
+}
+
+final returnUnion16BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
+ Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat),
+ Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat)>(
+ "ReturnUnion16BytesNestedFloat",
+ isLeaf: true);
+
+/// Returning union with homogenous floats.
+void testReturnUnion16BytesNestedFloatLeaf() {
+ final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2.0;
+
+ final result = returnUnion16BytesNestedFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0.a0, result.a0.a0);
+ Expect.approxEquals(a0.a1, result.a0.a1);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct1ByteInt Function(Struct1ByteInt),
+ Struct1ByteInt Function(
+ Struct1ByteInt)>("ReturnStructArgumentStruct1ByteInt", isLeaf: true);
+
+/// 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 testReturnStructArgumentStruct1ByteIntLeaf() {
+ final a0Pointer = calloc<Struct1ByteInt>();
+ final Struct1ByteInt a0 = a0Pointer.ref;
+
+ a0.a0 = -1;
+
+ final result = returnStructArgumentStruct1ByteIntLeaf(a0);
+
+ print("result = $result");
+
+ Expect.equals(a0.a0, result.a0);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentInt32x8Struct1ByteIntLeaf =
+ ffiTestFunctions
+ .lookupFunction<
+ Struct1ByteInt Function(Int32, Int32, Int32, Int32, Int32, Int32,
+ Int32, Int32, Struct1ByteInt),
+ Struct1ByteInt Function(
+ int, int, int, int, int, int, int, int, Struct1ByteInt)>(
+ "ReturnStructArgumentInt32x8Struct1ByteInt",
+ isLeaf: true);
+
+/// Test that a struct passed in as argument can be returned.
+/// Especially for ffi callbacks.
+/// Struct is passed on stack on all ABIs.
+void testReturnStructArgumentInt32x8Struct1ByteIntLeaf() {
+ 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 = returnStructArgumentInt32x8Struct1ByteIntLeaf(
+ a0, a1, a2, a3, a4, a5, a6, a7, a8);
+
+ print("result = $result");
+
+ Expect.equals(a8.a0, result.a0);
+
+ calloc.free(a8Pointer);
+}
+
+final returnStructArgumentStruct8BytesHomogeneousFloatLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat),
+ Struct8BytesHomogeneousFloat Function(
+ Struct8BytesHomogeneousFloat)>(
+ "ReturnStructArgumentStruct8BytesHomogeneousFloat",
+ isLeaf: true);
+
+/// 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 testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf() {
+ final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
+ final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
+
+ a0.a0 = -1.0;
+ a0.a1 = 2.0;
+
+ final result = returnStructArgumentStruct8BytesHomogeneousFloatLeaf(a0);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0.a0, result.a0);
+ Expect.approxEquals(a0.a1, result.a1);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentStruct20BytesHomogeneousInt32Leaf =
+ ffiTestFunctions
+ .lookupFunction<
+ Struct20BytesHomogeneousInt32 Function(
+ Struct20BytesHomogeneousInt32),
+ Struct20BytesHomogeneousInt32 Function(
+ Struct20BytesHomogeneousInt32)>(
+ "ReturnStructArgumentStruct20BytesHomogeneousInt32",
+ isLeaf: true);
+
+/// On arm64, both argument and return value are passed in by pointer.
+void testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf() {
+ 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 = returnStructArgumentStruct20BytesHomogeneousInt32Leaf(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);
+}
+
+final returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32,
+ Int32, Int32, Int32, Int32, Struct20BytesHomogeneousInt32),
+ Struct20BytesHomogeneousInt32 Function(int, int, int, int, int, int,
+ int, int, Struct20BytesHomogeneousInt32)>(
+ "ReturnStructArgumentInt32x8Struct20BytesHomogeneou",
+ isLeaf: true);
+
+/// On arm64, both argument and return value are passed in by pointer.
+/// Ints exhaust registers, so that pointer is passed on stack.
+void testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf() {
+ 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 = returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf(
+ 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);
+}
+
+final returnStructArgumentStruct8BytesInlineArrayIntLeaf =
+ ffiTestFunctions.lookupFunction<
+ Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt),
+ Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt)>(
+ "ReturnStructArgumentStruct8BytesInlineArrayInt",
+ isLeaf: true);
+
+/// Test returning struct with inline array.
+void testReturnStructArgumentStruct8BytesInlineArrayIntLeaf() {
+ 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 = returnStructArgumentStruct8BytesInlineArrayIntLeaf(a0);
+
+ print("result = $result");
+
+ for (int i = 0; i < 8; i++) {
+ Expect.equals(a0.a0[i], result.a0[i]);
+ }
+
+ calloc.free(a0Pointer);
+}
+
+final returnStructArgumentStructStruct16BytesHomogeneousLeaf =
+ ffiTestFunctions.lookupFunction<
+ StructStruct16BytesHomogeneousFloat2 Function(
+ StructStruct16BytesHomogeneousFloat2),
+ StructStruct16BytesHomogeneousFloat2 Function(
+ StructStruct16BytesHomogeneousFloat2)>(
+ "ReturnStructArgumentStructStruct16BytesHomogeneous",
+ isLeaf: true);
+
+/// Return value in FPU registers on arm hardfp and arm64.
+void testReturnStructArgumentStructStruct16BytesHomogeneousLeaf() {
+ 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 = returnStructArgumentStructStruct16BytesHomogeneousLeaf(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);
+}
+
+final returnStructArgumentStructStruct32BytesHomogeneousLeaf =
+ ffiTestFunctions.lookupFunction<
+ StructStruct32BytesHomogeneousDouble2 Function(
+ StructStruct32BytesHomogeneousDouble2),
+ StructStruct32BytesHomogeneousDouble2 Function(
+ StructStruct32BytesHomogeneousDouble2)>(
+ "ReturnStructArgumentStructStruct32BytesHomogeneous",
+ isLeaf: true);
+
+/// Return value in FPU registers on arm64.
+void testReturnStructArgumentStructStruct32BytesHomogeneousLeaf() {
+ 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 = returnStructArgumentStructStruct32BytesHomogeneousLeaf(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);
+}
+
+final returnStructArgumentStructStruct16BytesMixed3Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3),
+ StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3)>(
+ "ReturnStructArgumentStructStruct16BytesMixed3",
+ isLeaf: true);
+
+/// On x64 Linux, return value is split over FP and int registers.
+void testReturnStructArgumentStructStruct16BytesMixed3Leaf() {
+ 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 = returnStructArgumentStructStruct16BytesMixed3Leaf(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);
+}
+
+final returnStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
+ StructAlignmentInt16 Function(Int8, Int16, Int8),
+ StructAlignmentInt16 Function(
+ int, int, int)>("ReturnStructAlignmentInt16", isLeaf: true);
+
+/// Test alignment and padding of 16 byte int within struct.
+void testReturnStructAlignmentInt16Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStructAlignmentInt16Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
+ StructAlignmentInt32 Function(Int8, Int32, Int8),
+ StructAlignmentInt32 Function(
+ int, int, int)>("ReturnStructAlignmentInt32", isLeaf: true);
+
+/// Test alignment and padding of 32 byte int within struct.
+void testReturnStructAlignmentInt32Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStructAlignmentInt32Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
+ StructAlignmentInt64 Function(Int8, Int64, Int8),
+ StructAlignmentInt64 Function(
+ int, int, int)>("ReturnStructAlignmentInt64", isLeaf: true);
+
+/// Test alignment and padding of 64 byte int within struct.
+void testReturnStructAlignmentInt64Leaf() {
+ int a0;
+ int a1;
+ int a2;
+
+ a0 = -1;
+ a1 = 2;
+ a2 = -3;
+
+ final result = returnStructAlignmentInt64Leaf(a0, a1, a2);
+
+ print("result = $result");
+
+ Expect.equals(a0, result.a0);
+ Expect.equals(a1, result.a1);
+ Expect.equals(a2, result.a2);
+}
+
+final returnStruct8BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedInt Function(
+ Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16),
+ Struct8BytesNestedInt Function(
+ Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16)>(
+ "ReturnStruct8BytesNestedInt",
+ isLeaf: true);
+
+/// Simple nested struct.
+void testReturnStruct8BytesNestedIntLeaf() {
+ 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 = returnStruct8BytesNestedIntLeaf(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);
+}
+
+final returnStruct8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedFloat Function(Struct4BytesFloat, Struct4BytesFloat),
+ Struct8BytesNestedFloat Function(Struct4BytesFloat,
+ Struct4BytesFloat)>("ReturnStruct8BytesNestedFloat", isLeaf: true);
+
+/// Simple nested struct with floats.
+void testReturnStruct8BytesNestedFloatLeaf() {
+ 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 = returnStruct8BytesNestedFloatLeaf(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);
+}
+
+final returnStruct8BytesNestedFloat2Leaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedFloat2 Function(Struct4BytesFloat, Float),
+ Struct8BytesNestedFloat2 Function(Struct4BytesFloat,
+ double)>("ReturnStruct8BytesNestedFloat2", isLeaf: true);
+
+/// The nesting is irregular, testing homogenous float rules on arm and arm64,
+/// and the fpu register usage on x64.
+void testReturnStruct8BytesNestedFloat2Leaf() {
+ final a0Pointer = calloc<Struct4BytesFloat>();
+ final Struct4BytesFloat a0 = a0Pointer.ref;
+ double a1;
+
+ a0.a0 = -1.0;
+ a1 = 2.0;
+
+ final result = returnStruct8BytesNestedFloat2Leaf(a0, a1);
+
+ print("result = $result");
+
+ Expect.approxEquals(a0.a0, result.a0.a0);
+ Expect.approxEquals(a1, result.a1);
+
+ calloc.free(a0Pointer);
+}
+
+final returnStruct8BytesNestedMixedLeaf = ffiTestFunctions.lookupFunction<
+ Struct8BytesNestedMixed Function(
+ Struct4BytesHomogeneousInt16, Struct4BytesFloat),
+ Struct8BytesNestedMixed Function(Struct4BytesHomogeneousInt16,
+ Struct4BytesFloat)>("ReturnStruct8BytesNestedMixed", isLeaf: true);
+
+/// Simple nested struct with mixed members.
+void testReturnStruct8BytesNestedMixedLeaf() {
+ 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 = returnStruct8BytesNestedMixedLeaf(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);
+}
+
+final returnStruct16BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct16BytesNestedInt Function(
+ Struct8BytesNestedInt, Struct8BytesNestedInt),
+ Struct16BytesNestedInt Function(Struct8BytesNestedInt,
+ Struct8BytesNestedInt)>("ReturnStruct16BytesNestedInt", isLeaf: true);
+
+/// Deeper nested struct to test recursive member access.
+void testReturnStruct16BytesNestedIntLeaf() {
+ 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 = returnStruct16BytesNestedIntLeaf(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);
+}
+
+final returnStruct32BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
+ Struct32BytesNestedInt Function(
+ Struct16BytesNestedInt, Struct16BytesNestedInt),
+ Struct32BytesNestedInt Function(Struct16BytesNestedInt,
+ Struct16BytesNestedInt)>("ReturnStruct32BytesNestedInt", isLeaf: true);
+
+/// Even deeper nested struct to test recursive member access.
+void testReturnStruct32BytesNestedIntLeaf() {
+ 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 = returnStruct32BytesNestedIntLeaf(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);
+}
+
+final returnStructNestedIntStructAlignmentInt16Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIntStructAlignmentInt16 Function(
+ StructAlignmentInt16, StructAlignmentInt16),
+ StructNestedIntStructAlignmentInt16 Function(
+ StructAlignmentInt16, StructAlignmentInt16)>(
+ "ReturnStructNestedIntStructAlignmentInt16",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 16 byte int.
+void testReturnStructNestedIntStructAlignmentInt16Leaf() {
+ 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 = returnStructNestedIntStructAlignmentInt16Leaf(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);
+}
+
+final returnStructNestedIntStructAlignmentInt32Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIntStructAlignmentInt32 Function(
+ StructAlignmentInt32, StructAlignmentInt32),
+ StructNestedIntStructAlignmentInt32 Function(
+ StructAlignmentInt32, StructAlignmentInt32)>(
+ "ReturnStructNestedIntStructAlignmentInt32",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 32 byte int.
+void testReturnStructNestedIntStructAlignmentInt32Leaf() {
+ 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 = returnStructNestedIntStructAlignmentInt32Leaf(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);
+}
+
+final returnStructNestedIntStructAlignmentInt64Leaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIntStructAlignmentInt64 Function(
+ StructAlignmentInt64, StructAlignmentInt64),
+ StructNestedIntStructAlignmentInt64 Function(
+ StructAlignmentInt64, StructAlignmentInt64)>(
+ "ReturnStructNestedIntStructAlignmentInt64",
+ isLeaf: true);
+
+/// Test alignment and padding of nested struct with 64 byte int.
+void testReturnStructNestedIntStructAlignmentInt64Leaf() {
+ 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 = returnStructNestedIntStructAlignmentInt64Leaf(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);
+}
+
+final returnStructNestedIrregularEvenBiggerLeaf =
+ ffiTestFunctions.lookupFunction<
+ StructNestedIrregularEvenBigger Function(Uint64,
+ StructNestedIrregularBigger, StructNestedIrregularBigger, Double),
+ StructNestedIrregularEvenBigger Function(
+ int,
+ StructNestedIrregularBigger,
+ StructNestedIrregularBigger,
+ double)>("ReturnStructNestedIrregularEvenBigger", isLeaf: true);
+
+/// Return big irregular struct as smoke test.
+void testReturnStructNestedIrregularEvenBiggerLeaf() {
+ 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 = returnStructNestedIrregularEvenBiggerLeaf(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);
+}
diff --git a/tests/ffi_2/function_structs_by_value_generated_test.dart b/tests/ffi_2/function_structs_by_value_generated_test.dart
index 1de965c..3c3f791 100644
--- a/tests/ffi_2/function_structs_by_value_generated_test.dart
+++ b/tests/ffi_2/function_structs_by_value_generated_test.dart
@@ -3,6 +3,7 @@
// 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=
@@ -19,6 +20,9 @@
import 'dylib_utils.dart';
+// Reuse the compound classes.
+import 'function_structs_by_value_generated_compounds.dart';
+
final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
for (int i = 0; i < 10; ++i) {
@@ -135,1324 +139,9 @@
testReturnStructNestedIntStructAlignmentInt32();
testReturnStructNestedIntStructAlignmentInt64();
testReturnStructNestedIrregularEvenBigger();
- testPassStruct1ByteIntx10Leaf();
- testPassStruct3BytesHomogeneousUint8x10Leaf();
- testPassStruct3BytesInt2ByteAlignedx10Leaf();
- testPassStruct4BytesHomogeneousInt16x10Leaf();
- testPassStruct7BytesHomogeneousUint8x10Leaf();
- testPassStruct7BytesInt4ByteAlignedx10Leaf();
- testPassStruct8BytesIntx10Leaf();
- testPassStruct8BytesHomogeneousFloatx10Leaf();
- testPassStruct8BytesMixedx10Leaf();
- testPassStruct9BytesHomogeneousUint8x10Leaf();
- testPassStruct9BytesInt4Or8ByteAlignedx10Leaf();
- testPassStruct12BytesHomogeneousFloatx6Leaf();
- testPassStruct16BytesHomogeneousFloatx5Leaf();
- testPassStruct16BytesMixedx10Leaf();
- testPassStruct16BytesMixed2x10Leaf();
- testPassStruct17BytesIntx10Leaf();
- testPassStruct19BytesHomogeneousUint8x10Leaf();
- testPassStruct20BytesHomogeneousInt32x10Leaf();
- testPassStruct20BytesHomogeneousFloatLeaf();
- testPassStruct32BytesHomogeneousDoublex5Leaf();
- testPassStruct40BytesHomogeneousDoubleLeaf();
- testPassStruct1024BytesHomogeneousUint64Leaf();
- testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf();
- testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf();
- testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf();
- testPassDoublex6Struct16BytesMixedx4Int32Leaf();
- testPassInt32x4Struct16BytesMixedx4DoubleLeaf();
- testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf();
- testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf();
- testPassStructAlignmentInt16Leaf();
- testPassStructAlignmentInt32Leaf();
- testPassStructAlignmentInt64Leaf();
- testPassStruct8BytesNestedIntx10Leaf();
- testPassStruct8BytesNestedFloatx10Leaf();
- testPassStruct8BytesNestedFloat2x10Leaf();
- testPassStruct8BytesNestedMixedx10Leaf();
- testPassStruct16BytesNestedIntx2Leaf();
- testPassStruct32BytesNestedIntx2Leaf();
- testPassStructNestedIntStructAlignmentInt16Leaf();
- testPassStructNestedIntStructAlignmentInt32Leaf();
- testPassStructNestedIntStructAlignmentInt64Leaf();
- testPassStructNestedIrregularEvenBiggerx4Leaf();
- testPassStruct8BytesInlineArrayIntx4Leaf();
- testPassStructInlineArrayIrregularx4Leaf();
- testPassStructInlineArray100BytesLeaf();
- testPassStructStruct16BytesHomogeneousFloat2x5Leaf();
- testPassStructStruct32BytesHomogeneousDouble2x5Leaf();
- testPassStructStruct16BytesMixed3x10Leaf();
- testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf();
- testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf();
- testPassStruct3BytesPackedIntx10Leaf();
- testPassStruct8BytesPackedIntx10Leaf();
- testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf();
- testPassStruct5BytesPackedMixedLeaf();
- testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf();
- testPassStruct6BytesInlineArrayIntLeaf();
- testPassStruct15BytesInlineArrayMixedLeaf();
- testPassUnion4BytesMixedx10Leaf();
- testPassUnion8BytesNestedFloatx10Leaf();
- testPassUnion9BytesNestedIntx10Leaf();
- testPassUnion16BytesNestedInlineArrayFloatx10Leaf();
- testPassUnion16BytesNestedFloatx10Leaf();
- testReturnStruct1ByteIntLeaf();
- testReturnStruct3BytesHomogeneousUint8Leaf();
- testReturnStruct3BytesInt2ByteAlignedLeaf();
- testReturnStruct4BytesHomogeneousInt16Leaf();
- testReturnStruct7BytesHomogeneousUint8Leaf();
- testReturnStruct7BytesInt4ByteAlignedLeaf();
- testReturnStruct8BytesIntLeaf();
- testReturnStruct8BytesHomogeneousFloatLeaf();
- testReturnStruct8BytesMixedLeaf();
- testReturnStruct9BytesHomogeneousUint8Leaf();
- testReturnStruct9BytesInt4Or8ByteAlignedLeaf();
- testReturnStruct12BytesHomogeneousFloatLeaf();
- testReturnStruct16BytesHomogeneousFloatLeaf();
- testReturnStruct16BytesMixedLeaf();
- testReturnStruct16BytesMixed2Leaf();
- testReturnStruct17BytesIntLeaf();
- testReturnStruct19BytesHomogeneousUint8Leaf();
- testReturnStruct20BytesHomogeneousInt32Leaf();
- testReturnStruct20BytesHomogeneousFloatLeaf();
- testReturnStruct32BytesHomogeneousDoubleLeaf();
- testReturnStruct40BytesHomogeneousDoubleLeaf();
- testReturnStruct1024BytesHomogeneousUint64Leaf();
- testReturnStruct3BytesPackedIntLeaf();
- testReturnStruct8BytesPackedIntLeaf();
- testReturnStruct9BytesPackedMixedLeaf();
- testReturnUnion4BytesMixedLeaf();
- testReturnUnion8BytesNestedFloatLeaf();
- testReturnUnion9BytesNestedIntLeaf();
- testReturnUnion16BytesNestedFloatLeaf();
- testReturnStructArgumentStruct1ByteIntLeaf();
- testReturnStructArgumentInt32x8Struct1ByteIntLeaf();
- testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf();
- testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf();
- testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf();
- testReturnStructArgumentStruct8BytesInlineArrayIntLeaf();
- testReturnStructArgumentStructStruct16BytesHomogeneousLeaf();
- testReturnStructArgumentStructStruct32BytesHomogeneousLeaf();
- testReturnStructArgumentStructStruct16BytesMixed3Leaf();
- testReturnStructAlignmentInt16Leaf();
- testReturnStructAlignmentInt32Leaf();
- testReturnStructAlignmentInt64Leaf();
- testReturnStruct8BytesNestedIntLeaf();
- testReturnStruct8BytesNestedFloatLeaf();
- testReturnStruct8BytesNestedFloat2Leaf();
- testReturnStruct8BytesNestedMixedLeaf();
- testReturnStruct16BytesNestedIntLeaf();
- testReturnStruct32BytesNestedIntLeaf();
- testReturnStructNestedIntStructAlignmentInt16Leaf();
- testReturnStructNestedIntStructAlignmentInt32Leaf();
- testReturnStructNestedIntStructAlignmentInt64Leaf();
- testReturnStructNestedIrregularEvenBiggerLeaf();
}
}
-class Struct1ByteInt extends Struct {
- @Int8()
- int a0;
-
- String toString() => "(${a0})";
-}
-
-class Struct3BytesHomogeneousUint8 extends Struct {
- @Uint8()
- int a0;
-
- @Uint8()
- int a1;
-
- @Uint8()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class Struct3BytesInt2ByteAligned extends Struct {
- @Int16()
- int a0;
-
- @Int8()
- int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct4BytesHomogeneousInt16 extends Struct {
- @Int16()
- int a0;
-
- @Int16()
- int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct4BytesFloat extends Struct {
- @Float()
- double a0;
-
- String toString() => "(${a0})";
-}
-
-class Struct7BytesHomogeneousUint8 extends Struct {
- @Uint8()
- int a0;
-
- @Uint8()
- int a1;
-
- @Uint8()
- int a2;
-
- @Uint8()
- int a3;
-
- @Uint8()
- int a4;
-
- @Uint8()
- int a5;
-
- @Uint8()
- int a6;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})";
-}
-
-class Struct7BytesInt4ByteAligned extends Struct {
- @Int32()
- int a0;
-
- @Int16()
- int a1;
-
- @Int8()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class Struct8BytesInt extends Struct {
- @Int16()
- int a0;
-
- @Int16()
- int a1;
-
- @Int32()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class Struct8BytesHomogeneousFloat extends Struct {
- @Float()
- double a0;
-
- @Float()
- double a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct8BytesFloat extends Struct {
- @Double()
- double a0;
-
- String toString() => "(${a0})";
-}
-
-class Struct8BytesMixed extends Struct {
- @Float()
- double a0;
-
- @Int16()
- int a1;
-
- @Int16()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class Struct9BytesHomogeneousUint8 extends Struct {
- @Uint8()
- int a0;
-
- @Uint8()
- int a1;
-
- @Uint8()
- int a2;
-
- @Uint8()
- int a3;
-
- @Uint8()
- int a4;
-
- @Uint8()
- int a5;
-
- @Uint8()
- int a6;
-
- @Uint8()
- int a7;
-
- @Uint8()
- int a8;
-
- String toString() =>
- "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})";
-}
-
-class Struct9BytesInt4Or8ByteAligned extends Struct {
- @Int64()
- int a0;
-
- @Int8()
- int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct12BytesHomogeneousFloat extends Struct {
- @Float()
- double a0;
-
- @Float()
- double a1;
-
- @Float()
- double a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class Struct16BytesHomogeneousFloat extends Struct {
- @Float()
- double a0;
-
- @Float()
- double a1;
-
- @Float()
- double a2;
-
- @Float()
- double a3;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
-}
-
-class Struct16BytesMixed extends Struct {
- @Double()
- double a0;
-
- @Int64()
- int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct16BytesMixed2 extends Struct {
- @Float()
- double a0;
-
- @Float()
- double a1;
-
- @Float()
- double a2;
-
- @Int32()
- int a3;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
-}
-
-class Struct17BytesInt extends Struct {
- @Int64()
- int a0;
-
- @Int64()
- int a1;
-
- @Int8()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class Struct19BytesHomogeneousUint8 extends Struct {
- @Uint8()
- int a0;
-
- @Uint8()
- int a1;
-
- @Uint8()
- int a2;
-
- @Uint8()
- int a3;
-
- @Uint8()
- int a4;
-
- @Uint8()
- int a5;
-
- @Uint8()
- int a6;
-
- @Uint8()
- int a7;
-
- @Uint8()
- int a8;
-
- @Uint8()
- int a9;
-
- @Uint8()
- int a10;
-
- @Uint8()
- int a11;
-
- @Uint8()
- int a12;
-
- @Uint8()
- int a13;
-
- @Uint8()
- int a14;
-
- @Uint8()
- int a15;
-
- @Uint8()
- int a16;
-
- @Uint8()
- int a17;
-
- @Uint8()
- 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()
- int a0;
-
- @Int32()
- int a1;
-
- @Int32()
- int a2;
-
- @Int32()
- int a3;
-
- @Int32()
- int a4;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
-}
-
-class Struct20BytesHomogeneousFloat extends Struct {
- @Float()
- double a0;
-
- @Float()
- double a1;
-
- @Float()
- double a2;
-
- @Float()
- double a3;
-
- @Float()
- double a4;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
-}
-
-class Struct32BytesHomogeneousDouble extends Struct {
- @Double()
- double a0;
-
- @Double()
- double a1;
-
- @Double()
- double a2;
-
- @Double()
- double a3;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
-}
-
-class Struct40BytesHomogeneousDouble extends Struct {
- @Double()
- double a0;
-
- @Double()
- double a1;
-
- @Double()
- double a2;
-
- @Double()
- double a3;
-
- @Double()
- double a4;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
-}
-
-class Struct1024BytesHomogeneousUint64 extends Struct {
- @Uint64()
- int a0;
-
- @Uint64()
- int a1;
-
- @Uint64()
- int a2;
-
- @Uint64()
- int a3;
-
- @Uint64()
- int a4;
-
- @Uint64()
- int a5;
-
- @Uint64()
- int a6;
-
- @Uint64()
- int a7;
-
- @Uint64()
- int a8;
-
- @Uint64()
- int a9;
-
- @Uint64()
- int a10;
-
- @Uint64()
- int a11;
-
- @Uint64()
- int a12;
-
- @Uint64()
- int a13;
-
- @Uint64()
- int a14;
-
- @Uint64()
- int a15;
-
- @Uint64()
- int a16;
-
- @Uint64()
- int a17;
-
- @Uint64()
- int a18;
-
- @Uint64()
- int a19;
-
- @Uint64()
- int a20;
-
- @Uint64()
- int a21;
-
- @Uint64()
- int a22;
-
- @Uint64()
- int a23;
-
- @Uint64()
- int a24;
-
- @Uint64()
- int a25;
-
- @Uint64()
- int a26;
-
- @Uint64()
- int a27;
-
- @Uint64()
- int a28;
-
- @Uint64()
- int a29;
-
- @Uint64()
- int a30;
-
- @Uint64()
- int a31;
-
- @Uint64()
- int a32;
-
- @Uint64()
- int a33;
-
- @Uint64()
- int a34;
-
- @Uint64()
- int a35;
-
- @Uint64()
- int a36;
-
- @Uint64()
- int a37;
-
- @Uint64()
- int a38;
-
- @Uint64()
- int a39;
-
- @Uint64()
- int a40;
-
- @Uint64()
- int a41;
-
- @Uint64()
- int a42;
-
- @Uint64()
- int a43;
-
- @Uint64()
- int a44;
-
- @Uint64()
- int a45;
-
- @Uint64()
- int a46;
-
- @Uint64()
- int a47;
-
- @Uint64()
- int a48;
-
- @Uint64()
- int a49;
-
- @Uint64()
- int a50;
-
- @Uint64()
- int a51;
-
- @Uint64()
- int a52;
-
- @Uint64()
- int a53;
-
- @Uint64()
- int a54;
-
- @Uint64()
- int a55;
-
- @Uint64()
- int a56;
-
- @Uint64()
- int a57;
-
- @Uint64()
- int a58;
-
- @Uint64()
- int a59;
-
- @Uint64()
- int a60;
-
- @Uint64()
- int a61;
-
- @Uint64()
- int a62;
-
- @Uint64()
- int a63;
-
- @Uint64()
- int a64;
-
- @Uint64()
- int a65;
-
- @Uint64()
- int a66;
-
- @Uint64()
- int a67;
-
- @Uint64()
- int a68;
-
- @Uint64()
- int a69;
-
- @Uint64()
- int a70;
-
- @Uint64()
- int a71;
-
- @Uint64()
- int a72;
-
- @Uint64()
- int a73;
-
- @Uint64()
- int a74;
-
- @Uint64()
- int a75;
-
- @Uint64()
- int a76;
-
- @Uint64()
- int a77;
-
- @Uint64()
- int a78;
-
- @Uint64()
- int a79;
-
- @Uint64()
- int a80;
-
- @Uint64()
- int a81;
-
- @Uint64()
- int a82;
-
- @Uint64()
- int a83;
-
- @Uint64()
- int a84;
-
- @Uint64()
- int a85;
-
- @Uint64()
- int a86;
-
- @Uint64()
- int a87;
-
- @Uint64()
- int a88;
-
- @Uint64()
- int a89;
-
- @Uint64()
- int a90;
-
- @Uint64()
- int a91;
-
- @Uint64()
- int a92;
-
- @Uint64()
- int a93;
-
- @Uint64()
- int a94;
-
- @Uint64()
- int a95;
-
- @Uint64()
- int a96;
-
- @Uint64()
- int a97;
-
- @Uint64()
- int a98;
-
- @Uint64()
- int a99;
-
- @Uint64()
- int a100;
-
- @Uint64()
- int a101;
-
- @Uint64()
- int a102;
-
- @Uint64()
- int a103;
-
- @Uint64()
- int a104;
-
- @Uint64()
- int a105;
-
- @Uint64()
- int a106;
-
- @Uint64()
- int a107;
-
- @Uint64()
- int a108;
-
- @Uint64()
- int a109;
-
- @Uint64()
- int a110;
-
- @Uint64()
- int a111;
-
- @Uint64()
- int a112;
-
- @Uint64()
- int a113;
-
- @Uint64()
- int a114;
-
- @Uint64()
- int a115;
-
- @Uint64()
- int a116;
-
- @Uint64()
- int a117;
-
- @Uint64()
- int a118;
-
- @Uint64()
- int a119;
-
- @Uint64()
- int a120;
-
- @Uint64()
- int a121;
-
- @Uint64()
- int a122;
-
- @Uint64()
- int a123;
-
- @Uint64()
- int a124;
-
- @Uint64()
- int a125;
-
- @Uint64()
- int a126;
-
- @Uint64()
- 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()
- int a0;
-
- @Int16()
- int a1;
-
- @Int8()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class StructAlignmentInt32 extends Struct {
- @Int8()
- int a0;
-
- @Int32()
- int a1;
-
- @Int8()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class StructAlignmentInt64 extends Struct {
- @Int8()
- int a0;
-
- @Int64()
- int a1;
-
- @Int8()
- int a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
-class Struct8BytesNestedInt extends Struct {
- Struct4BytesHomogeneousInt16 a0;
-
- Struct4BytesHomogeneousInt16 a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct8BytesNestedFloat extends Struct {
- Struct4BytesFloat a0;
-
- Struct4BytesFloat a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct8BytesNestedFloat2 extends Struct {
- Struct4BytesFloat a0;
-
- @Float()
- double a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct8BytesNestedMixed extends Struct {
- Struct4BytesHomogeneousInt16 a0;
-
- Struct4BytesFloat a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct16BytesNestedInt extends Struct {
- Struct8BytesNestedInt a0;
-
- Struct8BytesNestedInt a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct32BytesNestedInt extends Struct {
- Struct16BytesNestedInt a0;
-
- Struct16BytesNestedInt a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class StructNestedIntStructAlignmentInt16 extends Struct {
- StructAlignmentInt16 a0;
-
- StructAlignmentInt16 a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class StructNestedIntStructAlignmentInt32 extends Struct {
- StructAlignmentInt32 a0;
-
- StructAlignmentInt32 a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class StructNestedIntStructAlignmentInt64 extends Struct {
- StructAlignmentInt64 a0;
-
- StructAlignmentInt64 a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class StructNestedIrregularBig extends Struct {
- @Uint16()
- int a0;
-
- Struct8BytesNestedMixed a1;
-
- @Uint16()
- int a2;
-
- Struct8BytesNestedFloat2 a3;
-
- @Uint16()
- int a4;
-
- Struct8BytesNestedFloat a5;
-
- @Uint16()
- int a6;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6})";
-}
-
-class StructNestedIrregularBigger extends Struct {
- StructNestedIrregularBig a0;
-
- Struct8BytesNestedMixed a1;
-
- @Float()
- double a2;
-
- @Double()
- double a3;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
-}
-
-class StructNestedIrregularEvenBigger extends Struct {
- @Uint64()
- int a0;
-
- StructNestedIrregularBigger a1;
-
- StructNestedIrregularBigger a2;
-
- @Double()
- double a3;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3})";
-}
-
-class Struct8BytesInlineArrayInt extends Struct {
- @Array(8)
- Array<Uint8> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 8; i0 += 1) a0[i0]]})";
-}
-
-class StructInlineArrayIrregular extends Struct {
- @Array(2)
- Array<Struct3BytesInt2ByteAligned> a0;
-
- @Uint8()
- int a1;
-
- String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]}, ${a1})";
-}
-
-class StructInlineArray100Bytes extends Struct {
- @Array(100)
- Array<Uint8> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 100; i0 += 1) a0[i0]]})";
-}
-
-class StructInlineArrayBig extends Struct {
- @Uint32()
- int a0;
-
- @Uint32()
- int a1;
-
- @Array(4000)
- Array<Uint8> a2;
-
- String toString() =>
- "(${a0}, ${a1}, ${[for (var i0 = 0; i0 < 4000; i0 += 1) a2[i0]]})";
-}
-
-class StructStruct16BytesHomogeneousFloat2 extends Struct {
- Struct4BytesFloat a0;
-
- @Array(2)
- Array<Struct4BytesFloat> a1;
-
- @Float()
- double a2;
-
- String toString() =>
- "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
-}
-
-class StructStruct32BytesHomogeneousDouble2 extends Struct {
- Struct8BytesFloat a0;
-
- @Array(2)
- Array<Struct8BytesFloat> a1;
-
- @Double()
- double a2;
-
- String toString() =>
- "(${a0}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a1[i0]]}, ${a2})";
-}
-
-class StructStruct16BytesMixed3 extends Struct {
- Struct4BytesFloat a0;
-
- @Array(1)
- Array<Struct8BytesMixed> a1;
-
- @Array(2)
- Array<Int16> a2;
-
- String toString() => "(${a0}, ${[
- for (var i0 = 0; i0 < 1; i0 += 1) a1[i0]
- ]}, ${[for (var i0 = 0; i0 < 2; i0 += 1) a2[i0]]})";
-}
-
-class Struct8BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array(2, 2, 2)
- Array<Array<Array<Uint8>>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [
- for (var i1 = 0; i1 < 2; i1 += 1)
- [for (var i2 = 0; i2 < 2; i2 += 1) a0[i0][i1][i2]]
- ]
- ]})";
-}
-
-class Struct32BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array(2, 2, 2, 2, 2)
- Array<Array<Array<Array<Array<Uint8>>>>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [
- for (var i1 = 0; i1 < 2; i1 += 1)
- [
- for (var i2 = 0; i2 < 2; i2 += 1)
- [
- for (var i3 = 0; i3 < 2; i3 += 1)
- [for (var i4 = 0; i4 < 2; i4 += 1) a0[i0][i1][i2][i3][i4]]
- ]
- ]
- ]
- ]})";
-}
-
-class Struct64BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array.multi([2, 2, 2, 2, 2, 2])
- Array<Array<Array<Array<Array<Array<Uint8>>>>>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [
- for (var i1 = 0; i1 < 2; i1 += 1)
- [
- for (var i2 = 0; i2 < 2; i2 += 1)
- [
- for (var i3 = 0; i3 < 2; i3 += 1)
- [
- for (var i4 = 0; i4 < 2; i4 += 1)
- [
- for (var i5 = 0; i5 < 2; i5 += 1)
- a0[i0][i1][i2][i3][i4][i5]
- ]
- ]
- ]
- ]
- ]
- ]})";
-}
-
-class Struct4BytesInlineArrayMultiDimensionalInt extends Struct {
- @Array(2, 2)
- Array<Array<Struct1ByteInt>> a0;
-
- String toString() => "(${[
- for (var i0 = 0; i0 < 2; i0 += 1)
- [for (var i1 = 0; i1 < 2; i1 += 1) a0[i0][i1]]
- ]})";
-}
-
-@Packed(1)
-class Struct3BytesPackedInt extends Struct {
- @Int8()
- int a0;
-
- @Int16()
- int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-@Packed(1)
-class Struct3BytesPackedIntMembersAligned extends Struct {
- @Int8()
- int a0;
-
- @Int16()
- int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-@Packed(1)
-class Struct5BytesPackedMixed extends Struct {
- @Float()
- double a0;
-
- @Uint8()
- int a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class StructNestedAlignmentStruct5BytesPackedMixed extends Struct {
- @Uint8()
- int a0;
-
- Struct5BytesPackedMixed a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct6BytesInlineArrayInt extends Struct {
- @Array(2)
- Array<Struct3BytesPackedIntMembersAligned> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 2; i0 += 1) a0[i0]]})";
-}
-
-@Packed(1)
-class Struct8BytesPackedInt extends Struct {
- @Uint8()
- int a0;
-
- @Uint32()
- int a1;
-
- @Uint8()
- int a2;
-
- @Uint8()
- int a3;
-
- @Uint8()
- int a4;
-
- String toString() => "(${a0}, ${a1}, ${a2}, ${a3}, ${a4})";
-}
-
-@Packed(1)
-class Struct9BytesPackedMixed extends Struct {
- @Uint8()
- int a0;
-
- @Double()
- double a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Struct15BytesInlineArrayMixed extends Struct {
- @Array(3)
- Array<Struct5BytesPackedMixed> a0;
-
- String toString() => "(${[for (var i0 = 0; i0 < 3; i0 += 1) a0[i0]]})";
-}
-
-class Union4BytesMixed extends Union {
- @Uint32()
- int a0;
-
- @Float()
- double a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Union8BytesNestedFloat extends Union {
- @Double()
- double a0;
-
- Struct8BytesHomogeneousFloat a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Union9BytesNestedInt extends Union {
- Struct8BytesInt a0;
-
- Struct9BytesHomogeneousUint8 a1;
-
- String toString() => "(${a0}, ${a1})";
-}
-
-class Union16BytesNestedInlineArrayFloat extends Union {
- @Array(4)
- Array<Float> a0;
-
- Struct16BytesHomogeneousFloat a1;
-
- String toString() => "(${[for (var i0 = 0; i0 < 4; i0 += 1) a0[i0]]}, ${a1})";
-}
-
-class Union16BytesNestedFloat extends Union {
- Struct8BytesHomogeneousFloat a0;
-
- Struct12BytesHomogeneousFloat a1;
-
- Struct16BytesHomogeneousFloat a2;
-
- String toString() => "(${a0}, ${a1}, ${a2})";
-}
-
final passStruct1ByteIntx10 = ffiTestFunctions.lookupFunction<
Int64 Function(
Struct1ByteInt,
@@ -8889,7545 +7578,3 @@
calloc.free(a1Pointer);
calloc.free(a2Pointer);
}
-
-final passStruct1ByteIntx10Leaf = 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", isLeaf: true);
-
-/// Smallest struct with data.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct1ByteIntx10Leaf() {
- 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 =
- passStruct1ByteIntx10Leaf(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 passStruct3BytesHomogeneousUint8x10Leaf = 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",
- isLeaf: true);
-
-/// Not a multiple of word size, not a power of two.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct3BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct3BytesHomogeneousUint8x10Leaf(
- 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 passStruct3BytesInt2ByteAlignedx10Leaf = 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",
- isLeaf: true);
-
-/// 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 testPassStruct3BytesInt2ByteAlignedx10Leaf() {
- 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 = passStruct3BytesInt2ByteAlignedx10Leaf(
- 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 passStruct4BytesHomogeneousInt16x10Leaf = 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",
- isLeaf: true);
-
-/// Exactly word size on 32-bit architectures.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct4BytesHomogeneousInt16x10Leaf() {
- 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 = passStruct4BytesHomogeneousInt16x10Leaf(
- 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 passStruct7BytesHomogeneousUint8x10Leaf = 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",
- isLeaf: true);
-
-/// Sub word size on 64 bit architectures.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct7BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct7BytesHomogeneousUint8x10Leaf(
- 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 passStruct7BytesInt4ByteAlignedx10Leaf = 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",
- isLeaf: true);
-
-/// 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 testPassStruct7BytesInt4ByteAlignedx10Leaf() {
- 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 = passStruct7BytesInt4ByteAlignedx10Leaf(
- 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 passStruct8BytesIntx10Leaf = 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", isLeaf: true);
-
-/// Exactly word size struct on 64bit architectures.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct8BytesIntx10Leaf() {
- 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 =
- passStruct8BytesIntx10Leaf(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 passStruct8BytesHomogeneousFloatx10Leaf = 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",
- isLeaf: true);
-
-/// Arguments passed in FP registers as long as they fit.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct8BytesHomogeneousFloatx10Leaf() {
- 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 = passStruct8BytesHomogeneousFloatx10Leaf(
- 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 passStruct8BytesMixedx10Leaf = 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", isLeaf: true);
-
-/// On x64, arguments go in int registers because it is not only float.
-/// 10 struct arguments will exhaust available registers.
-void testPassStruct8BytesMixedx10Leaf() {
- 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 =
- passStruct8BytesMixedx10Leaf(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 passStruct9BytesHomogeneousUint8x10Leaf = 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",
- isLeaf: true);
-
-/// 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 testPassStruct9BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct9BytesHomogeneousUint8x10Leaf(
- 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 passStruct9BytesInt4Or8ByteAlignedx10Leaf =
- 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",
- isLeaf: true);
-
-/// 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 testPassStruct9BytesInt4Or8ByteAlignedx10Leaf() {
- 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 = passStruct9BytesInt4Or8ByteAlignedx10Leaf(
- 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 passStruct12BytesHomogeneousFloatx6Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat),
- double Function(
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat,
- Struct12BytesHomogeneousFloat)>(
- "PassStruct12BytesHomogeneousFloatx6",
- isLeaf: true);
-
-/// 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 testPassStruct12BytesHomogeneousFloatx6Leaf() {
- 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 =
- passStruct12BytesHomogeneousFloatx6Leaf(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 passStruct16BytesHomogeneousFloatx5Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat),
- double Function(
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat,
- Struct16BytesHomogeneousFloat)>(
- "PassStruct16BytesHomogeneousFloatx5",
- isLeaf: true);
-
-/// 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 testPassStruct16BytesHomogeneousFloatx5Leaf() {
- 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 = passStruct16BytesHomogeneousFloatx5Leaf(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 passStruct16BytesMixedx10Leaf = 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", isLeaf: true);
-
-/// 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 testPassStruct16BytesMixedx10Leaf() {
- 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 =
- passStruct16BytesMixedx10Leaf(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 passStruct16BytesMixed2x10Leaf = 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", isLeaf: true);
-
-/// 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 testPassStruct16BytesMixed2x10Leaf() {
- 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 =
- passStruct16BytesMixed2x10Leaf(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 passStruct17BytesIntx10Leaf = 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", isLeaf: true);
-
-/// Arguments are passed as pointer to copy on arm64.
-/// Tests that the memory allocated for copies are rounded up to word size.
-void testPassStruct17BytesIntx10Leaf() {
- 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 =
- passStruct17BytesIntx10Leaf(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 passStruct19BytesHomogeneousUint8x10Leaf =
- 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",
- isLeaf: true);
-
-/// 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 testPassStruct19BytesHomogeneousUint8x10Leaf() {
- 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 = passStruct19BytesHomogeneousUint8x10Leaf(
- 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 passStruct20BytesHomogeneousInt32x10Leaf =
- 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",
- isLeaf: true);
-
-/// 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 testPassStruct20BytesHomogeneousInt32x10Leaf() {
- 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 = passStruct20BytesHomogeneousInt32x10Leaf(
- 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 passStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Float Function(Struct20BytesHomogeneousFloat),
- double Function(Struct20BytesHomogeneousFloat)>(
- "PassStruct20BytesHomogeneousFloat",
- isLeaf: true);
-
-/// Argument too big to go into FPU registers in hardfp and arm64.
-void testPassStruct20BytesHomogeneousFloatLeaf() {
- 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 = passStruct20BytesHomogeneousFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(-3.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct32BytesHomogeneousDoublex5Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble),
- double Function(
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble,
- Struct32BytesHomogeneousDouble)>(
- "PassStruct32BytesHomogeneousDoublex5",
- isLeaf: true);
-
-/// Arguments in FPU registers on arm64.
-/// 5 struct arguments will exhaust available registers.
-void testPassStruct32BytesHomogeneousDoublex5Leaf() {
- 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 = passStruct32BytesHomogeneousDoublex5Leaf(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 passStruct40BytesHomogeneousDoubleLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct40BytesHomogeneousDouble),
- double Function(Struct40BytesHomogeneousDouble)>(
- "PassStruct40BytesHomogeneousDouble",
- isLeaf: true);
-
-/// Argument too big to go into FPU registers in arm64.
-void testPassStruct40BytesHomogeneousDoubleLeaf() {
- 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 = passStruct40BytesHomogeneousDoubleLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(-3.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct1024BytesHomogeneousUint64Leaf =
- ffiTestFunctions.lookupFunction<
- Uint64 Function(Struct1024BytesHomogeneousUint64),
- int Function(Struct1024BytesHomogeneousUint64)>(
- "PassStruct1024BytesHomogeneousUint64",
- isLeaf: true);
-
-/// Test 1kb struct.
-void testPassStruct1024BytesHomogeneousUint64Leaf() {
- 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;
- a0.a124 = 125;
- a0.a125 = 126;
- a0.a126 = 127;
- a0.a127 = 128;
-
- final result = passStruct1024BytesHomogeneousUint64Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(8256, result);
-
- calloc.free(a0Pointer);
-}
-
-final passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf =
- ffiTestFunctions.lookupFunction<
- Float Function(
- Float,
- Struct16BytesHomogeneousFloat,
- Float,
- Struct16BytesHomogeneousFloat,
- Float,
- Struct16BytesHomogeneousFloat,
- Float,
- Struct16BytesHomogeneousFloat,
- Float),
- double Function(
- double,
- Struct16BytesHomogeneousFloat,
- double,
- Struct16BytesHomogeneousFloat,
- double,
- Struct16BytesHomogeneousFloat,
- double,
- Struct16BytesHomogeneousFloat,
- double)>("PassFloatStruct16BytesHomogeneousFloatFloatStruct1",
- isLeaf: true);
-
-/// Tests the alignment of structs in FPU registers and backfilling.
-void testPassFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf() {
- double a0;
- final a1Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a1 = a1Pointer.ref;
- double a2;
- final a3Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a3 = a3Pointer.ref;
- double a4;
- final a5Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a5 = a5Pointer.ref;
- double a6;
- final a7Pointer = calloc<Struct16BytesHomogeneousFloat>();
- final Struct16BytesHomogeneousFloat a7 = a7Pointer.ref;
- double a8;
-
- a0 = -1.0;
- a1.a0 = 2.0;
- a1.a1 = -3.0;
- a1.a2 = 4.0;
- a1.a3 = -5.0;
- a2 = 6.0;
- a3.a0 = -7.0;
- a3.a1 = 8.0;
- a3.a2 = -9.0;
- a3.a3 = 10.0;
- a4 = -11.0;
- a5.a0 = 12.0;
- a5.a1 = -13.0;
- a5.a2 = 14.0;
- a5.a3 = -15.0;
- a6 = 16.0;
- a7.a0 = -17.0;
- a7.a1 = 18.0;
- a7.a2 = -19.0;
- a7.a3 = 20.0;
- a8 = -21.0;
-
- final result = passFloatStruct16BytesHomogeneousFloatFloatStruct1Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-11.0, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
- calloc.free(a7Pointer);
-}
-
-final passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Float,
- Struct32BytesHomogeneousDouble,
- Float,
- Struct32BytesHomogeneousDouble,
- Float,
- Struct32BytesHomogeneousDouble,
- Float,
- Struct32BytesHomogeneousDouble,
- Float),
- double Function(
- double,
- Struct32BytesHomogeneousDouble,
- double,
- Struct32BytesHomogeneousDouble,
- double,
- Struct32BytesHomogeneousDouble,
- double,
- Struct32BytesHomogeneousDouble,
- double)>("PassFloatStruct32BytesHomogeneousDoubleFloatStruct",
- isLeaf: true);
-
-/// Tests the alignment of structs in FPU registers and backfilling.
-void testPassFloatStruct32BytesHomogeneousDoubleFloatStructLeaf() {
- double a0;
- final a1Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a1 = a1Pointer.ref;
- double a2;
- final a3Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a3 = a3Pointer.ref;
- double a4;
- final a5Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a5 = a5Pointer.ref;
- double a6;
- final a7Pointer = calloc<Struct32BytesHomogeneousDouble>();
- final Struct32BytesHomogeneousDouble a7 = a7Pointer.ref;
- double a8;
-
- a0 = -1.0;
- a1.a0 = 2.0;
- a1.a1 = -3.0;
- a1.a2 = 4.0;
- a1.a3 = -5.0;
- a2 = 6.0;
- a3.a0 = -7.0;
- a3.a1 = 8.0;
- a3.a2 = -9.0;
- a3.a3 = 10.0;
- a4 = -11.0;
- a5.a0 = 12.0;
- a5.a1 = -13.0;
- a5.a2 = 14.0;
- a5.a3 = -15.0;
- a6 = 16.0;
- a7.a0 = -17.0;
- a7.a1 = 18.0;
- a7.a2 = -19.0;
- a7.a3 = 20.0;
- a8 = -21.0;
-
- final result = passFloatStruct32BytesHomogeneousDoubleFloatStructLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-11.0, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
- calloc.free(a7Pointer);
-}
-
-final passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(Int8, Struct16BytesMixed, Int8, Struct16BytesMixed,
- Int8, Struct16BytesMixed, Int8, Struct16BytesMixed, Int8),
- double Function(
- int,
- Struct16BytesMixed,
- int,
- Struct16BytesMixed,
- int,
- Struct16BytesMixed,
- int,
- Struct16BytesMixed,
- int)>("PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn",
- isLeaf: true);
-
-/// Tests the alignment of structs in integers registers and on the stack.
-/// Arm32 aligns this struct at 8.
-/// Also, arm32 allocates the second struct partially in registers, partially
-/// on stack.
-/// Test backfilling of integer registers.
-void testPassInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf() {
- int a0;
- final a1Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a1 = a1Pointer.ref;
- int a2;
- final a3Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a3 = a3Pointer.ref;
- int a4;
- final a5Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a5 = a5Pointer.ref;
- int a6;
- final a7Pointer = calloc<Struct16BytesMixed>();
- final Struct16BytesMixed a7 = a7Pointer.ref;
- int a8;
-
- a0 = -1;
- a1.a0 = 2.0;
- a1.a1 = -3;
- a2 = 4;
- a3.a0 = -5.0;
- a3.a1 = 6;
- a4 = -7;
- a5.a0 = 8.0;
- a5.a1 = -9;
- a6 = 10;
- a7.a0 = -11.0;
- a7.a1 = 12;
- a8 = -13;
-
- final result = passInt8Struct16BytesMixedInt8Struct16BytesMixedInLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-7.0, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
- calloc.free(a7Pointer);
-}
-
-final passDoublex6Struct16BytesMixedx4Int32Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Int32),
- double Function(
- double,
- double,
- double,
- double,
- double,
- double,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- int)>("PassDoublex6Struct16BytesMixedx4Int32", isLeaf: true);
-
-/// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
-/// structs. The rest of the structs will go on the stack.
-/// The int will be backfilled into the int register.
-void testPassDoublex6Struct16BytesMixedx4Int32Leaf() {
- double a0;
- double a1;
- double a2;
- double a3;
- double a4;
- double a5;
- 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;
- int a10;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
- a4 = -5.0;
- a5 = 6.0;
- a6.a0 = -7.0;
- a6.a1 = 8;
- a7.a0 = -9.0;
- a7.a1 = 10;
- a8.a0 = -11.0;
- a8.a1 = 12;
- a9.a0 = -13.0;
- a9.a1 = 14;
- a10 = -15;
-
- final result = passDoublex6Struct16BytesMixedx4Int32Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
-
- print("result = $result");
-
- Expect.approxEquals(-8.0, result);
-
- calloc.free(a6Pointer);
- calloc.free(a7Pointer);
- calloc.free(a8Pointer);
- calloc.free(a9Pointer);
-}
-
-final passInt32x4Struct16BytesMixedx4DoubleLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(Int32, Int32, Int32, Int32, Struct16BytesMixed,
- Struct16BytesMixed, Struct16BytesMixed, Struct16BytesMixed, Double),
- double Function(
- int,
- int,
- int,
- int,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- Struct16BytesMixed,
- double)>("PassInt32x4Struct16BytesMixedx4Double", isLeaf: true);
-
-/// On Linux x64, it will exhaust int registers first.
-/// The rest of the structs will go on the stack.
-/// The double will be backfilled into the xmm register.
-void testPassInt32x4Struct16BytesMixedx4DoubleLeaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- 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;
- double a8;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
- a3 = 4;
- a4.a0 = -5.0;
- a4.a1 = 6;
- a5.a0 = -7.0;
- a5.a1 = 8;
- a6.a0 = -9.0;
- a6.a1 = 10;
- a7.a0 = -11.0;
- a7.a1 = 12;
- a8 = -13.0;
-
- final result = passInt32x4Struct16BytesMixedx4DoubleLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.approxEquals(-7.0, result);
-
- calloc.free(a4Pointer);
- calloc.free(a5Pointer);
- calloc.free(a6Pointer);
- calloc.free(a7Pointer);
-}
-
-final passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(Struct40BytesHomogeneousDouble,
- Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat),
- double Function(Struct40BytesHomogeneousDouble,
- Struct4BytesHomogeneousInt16, Struct8BytesHomogeneousFloat)>(
- "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo",
- isLeaf: true);
-
-/// On various architectures, first struct is allocated on stack.
-/// Check that the other two arguments are allocated on registers.
-void testPassStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf() {
- final a0Pointer = calloc<Struct40BytesHomogeneousDouble>();
- final Struct40BytesHomogeneousDouble a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct4BytesHomogeneousInt16>();
- final Struct4BytesHomogeneousInt16 a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a2 = a2Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2.0;
- a0.a2 = -3.0;
- a0.a3 = 4.0;
- a0.a4 = -5.0;
- a1.a0 = 6;
- a1.a1 = -7;
- a2.a0 = 8.0;
- a2.a1 = -9.0;
-
- final result =
- passStruct40BytesHomogeneousDoubleStruct4BytesHomoLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.approxEquals(-5.0, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
-}
-
-final passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Int32,
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Double,
- Int64,
- Int8,
- Struct1ByteInt,
- Int64,
- Int8,
- Struct4BytesHomogeneousInt16,
- Int64,
- Int8,
- Struct8BytesInt,
- Int64,
- Int8,
- Struct8BytesHomogeneousFloat,
- Int64,
- Int8,
- Struct8BytesMixed,
- Int64,
- Int8,
- StructAlignmentInt16,
- Int64,
- Int8,
- StructAlignmentInt32,
- Int64,
- Int8,
- StructAlignmentInt64),
- double Function(
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- double,
- double,
- double,
- double,
- double,
- double,
- double,
- double,
- int,
- int,
- Struct1ByteInt,
- int,
- int,
- Struct4BytesHomogeneousInt16,
- int,
- int,
- Struct8BytesInt,
- int,
- int,
- Struct8BytesHomogeneousFloat,
- int,
- int,
- Struct8BytesMixed,
- int,
- int,
- StructAlignmentInt16,
- int,
- int,
- StructAlignmentInt32,
- int,
- int,
- StructAlignmentInt64)>("PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int", isLeaf: true);
-
-/// Test alignment and padding of 16 byte int within struct.
-void testPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- double a8;
- double a9;
- double a10;
- double a11;
- double a12;
- double a13;
- double a14;
- double a15;
- int a16;
- int a17;
- final a18Pointer = calloc<Struct1ByteInt>();
- final Struct1ByteInt a18 = a18Pointer.ref;
- int a19;
- int a20;
- final a21Pointer = calloc<Struct4BytesHomogeneousInt16>();
- final Struct4BytesHomogeneousInt16 a21 = a21Pointer.ref;
- int a22;
- int a23;
- final a24Pointer = calloc<Struct8BytesInt>();
- final Struct8BytesInt a24 = a24Pointer.ref;
- int a25;
- int a26;
- final a27Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a27 = a27Pointer.ref;
- int a28;
- int a29;
- final a30Pointer = calloc<Struct8BytesMixed>();
- final Struct8BytesMixed a30 = a30Pointer.ref;
- int a31;
- int a32;
- final a33Pointer = calloc<StructAlignmentInt16>();
- final StructAlignmentInt16 a33 = a33Pointer.ref;
- int a34;
- int a35;
- final a36Pointer = calloc<StructAlignmentInt32>();
- final StructAlignmentInt32 a36 = a36Pointer.ref;
- int a37;
- int a38;
- final a39Pointer = calloc<StructAlignmentInt64>();
- final StructAlignmentInt64 a39 = a39Pointer.ref;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
- a3 = 4;
- a4 = -5;
- a5 = 6;
- a6 = -7;
- a7 = 8;
- a8 = -9.0;
- a9 = 10.0;
- a10 = -11.0;
- a11 = 12.0;
- a12 = -13.0;
- a13 = 14.0;
- a14 = -15.0;
- a15 = 16.0;
- a16 = -17;
- a17 = 18;
- a18.a0 = -19;
- a19 = 20;
- a20 = -21;
- a21.a0 = 22;
- a21.a1 = -23;
- a22 = 24;
- a23 = -25;
- a24.a0 = 26;
- a24.a1 = -27;
- a24.a2 = 28;
- a25 = -29;
- a26 = 30;
- a27.a0 = -31.0;
- a27.a1 = 32.0;
- a28 = -33;
- a29 = 34;
- a30.a0 = -35.0;
- a30.a1 = 36;
- a30.a2 = -37;
- a31 = 38;
- a32 = -39;
- a33.a0 = 40;
- a33.a1 = -41;
- a33.a2 = 42;
- a34 = -43;
- a35 = 44;
- a36.a0 = -45;
- a36.a1 = 46;
- a36.a2 = -47;
- a37 = 48;
- a38 = -49;
- a39.a0 = 50;
- a39.a1 = -51;
- a39.a2 = 52;
-
- final result = passInt32x8Doublex8Int64Int8Struct1ByteIntInt64IntLeaf(
- 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);
-
- print("result = $result");
-
- Expect.approxEquals(26.0, result);
-
- calloc.free(a18Pointer);
- calloc.free(a21Pointer);
- calloc.free(a24Pointer);
- calloc.free(a27Pointer);
- calloc.free(a30Pointer);
- calloc.free(a33Pointer);
- calloc.free(a36Pointer);
- calloc.free(a39Pointer);
-}
-
-final passStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(StructAlignmentInt16),
- int Function(
- StructAlignmentInt16)>("PassStructAlignmentInt16", isLeaf: true);
-
-/// Test alignment and padding of 16 byte int within struct.
-void testPassStructAlignmentInt16Leaf() {
- final a0Pointer = calloc<StructAlignmentInt16>();
- final StructAlignmentInt16 a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = passStructAlignmentInt16Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(-2, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(StructAlignmentInt32),
- int Function(
- StructAlignmentInt32)>("PassStructAlignmentInt32", isLeaf: true);
-
-/// Test alignment and padding of 32 byte int within struct.
-void testPassStructAlignmentInt32Leaf() {
- final a0Pointer = calloc<StructAlignmentInt32>();
- final StructAlignmentInt32 a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = passStructAlignmentInt32Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(-2, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(StructAlignmentInt64),
- int Function(
- StructAlignmentInt64)>("PassStructAlignmentInt64", isLeaf: true);
-
-/// Test alignment and padding of 64 byte int within struct.
-void testPassStructAlignmentInt64Leaf() {
- final a0Pointer = calloc<StructAlignmentInt64>();
- final StructAlignmentInt64 a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = passStructAlignmentInt64Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(-2, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct8BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt),
- int Function(
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt,
- Struct8BytesNestedInt)>("PassStruct8BytesNestedIntx10", isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust registers on all platforms.
-void testPassStruct8BytesNestedIntx10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedInt>();
- final Struct8BytesNestedInt a9 = a9Pointer.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;
- a2.a0.a0 = -9;
- a2.a0.a1 = 10;
- a2.a1.a0 = -11;
- a2.a1.a1 = 12;
- a3.a0.a0 = -13;
- a3.a0.a1 = 14;
- a3.a1.a0 = -15;
- a3.a1.a1 = 16;
- a4.a0.a0 = -17;
- a4.a0.a1 = 18;
- a4.a1.a0 = -19;
- a4.a1.a1 = 20;
- a5.a0.a0 = -21;
- a5.a0.a1 = 22;
- a5.a1.a0 = -23;
- a5.a1.a1 = 24;
- a6.a0.a0 = -25;
- a6.a0.a1 = 26;
- a6.a1.a0 = -27;
- a6.a1.a1 = 28;
- a7.a0.a0 = -29;
- a7.a0.a1 = 30;
- a7.a1.a0 = -31;
- a7.a1.a1 = 32;
- a8.a0.a0 = -33;
- a8.a0.a1 = 34;
- a8.a1.a0 = -35;
- a8.a1.a1 = 36;
- a9.a0.a0 = -37;
- a9.a0.a1 = 38;
- a9.a1.a0 = -39;
- a9.a1.a1 = 40;
-
- final result =
- passStruct8BytesNestedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.equals(20, 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 passStruct8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat),
- double Function(
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat,
- Struct8BytesNestedFloat)>("PassStruct8BytesNestedFloatx10",
- isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust fpu registers on all platforms.
-void testPassStruct8BytesNestedFloatx10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedFloat>();
- final Struct8BytesNestedFloat a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1.a0 = 2.0;
- a1.a0.a0 = -3.0;
- a1.a1.a0 = 4.0;
- a2.a0.a0 = -5.0;
- a2.a1.a0 = 6.0;
- a3.a0.a0 = -7.0;
- a3.a1.a0 = 8.0;
- a4.a0.a0 = -9.0;
- a4.a1.a0 = 10.0;
- a5.a0.a0 = -11.0;
- a5.a1.a0 = 12.0;
- a6.a0.a0 = -13.0;
- a6.a1.a0 = 14.0;
- a7.a0.a0 = -15.0;
- a7.a1.a0 = 16.0;
- a8.a0.a0 = -17.0;
- a8.a1.a0 = 18.0;
- a9.a0.a0 = -19.0;
- a9.a1.a0 = 20.0;
-
- final result = passStruct8BytesNestedFloatx10Leaf(
- 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 passStruct8BytesNestedFloat2x10Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2),
- double Function(
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2,
- Struct8BytesNestedFloat2)>("PassStruct8BytesNestedFloat2x10",
- isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust fpu registers on all platforms.
-/// The nesting is irregular, testing homogenous float rules on arm and arm64,
-/// and the fpu register usage on x64.
-void testPassStruct8BytesNestedFloat2x10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedFloat2>();
- final Struct8BytesNestedFloat2 a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1 = 2.0;
- a1.a0.a0 = -3.0;
- a1.a1 = 4.0;
- a2.a0.a0 = -5.0;
- a2.a1 = 6.0;
- a3.a0.a0 = -7.0;
- a3.a1 = 8.0;
- a4.a0.a0 = -9.0;
- a4.a1 = 10.0;
- a5.a0.a0 = -11.0;
- a5.a1 = 12.0;
- a6.a0.a0 = -13.0;
- a6.a1 = 14.0;
- a7.a0.a0 = -15.0;
- a7.a1 = 16.0;
- a8.a0.a0 = -17.0;
- a8.a1 = 18.0;
- a9.a0.a0 = -19.0;
- a9.a1 = 20.0;
-
- final result = passStruct8BytesNestedFloat2x10Leaf(
- 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 passStruct8BytesNestedMixedx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed),
- double Function(
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed,
- Struct8BytesNestedMixed)>("PassStruct8BytesNestedMixedx10",
- isLeaf: true);
-
-/// Simple nested struct. No alignment gaps on any architectures.
-/// 10 arguments exhaust all registers on all platforms.
-void testPassStruct8BytesNestedMixedx10Leaf() {
- final a0Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesNestedMixed>();
- final Struct8BytesNestedMixed a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a1.a0 = -3.0;
- a1.a0.a0 = 4;
- a1.a0.a1 = -5;
- a1.a1.a0 = 6.0;
- a2.a0.a0 = -7;
- a2.a0.a1 = 8;
- a2.a1.a0 = -9.0;
- a3.a0.a0 = 10;
- a3.a0.a1 = -11;
- a3.a1.a0 = 12.0;
- a4.a0.a0 = -13;
- a4.a0.a1 = 14;
- a4.a1.a0 = -15.0;
- a5.a0.a0 = 16;
- a5.a0.a1 = -17;
- a5.a1.a0 = 18.0;
- a6.a0.a0 = -19;
- a6.a0.a1 = 20;
- a6.a1.a0 = -21.0;
- a7.a0.a0 = 22;
- a7.a0.a1 = -23;
- a7.a1.a0 = 24.0;
- a8.a0.a0 = -25;
- a8.a0.a1 = 26;
- a8.a1.a0 = -27.0;
- a9.a0.a0 = 28;
- a9.a0.a1 = -29;
- a9.a1.a0 = 30.0;
-
- final result = passStruct8BytesNestedMixedx10Leaf(
- 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 passStruct16BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(Struct16BytesNestedInt, Struct16BytesNestedInt),
- int Function(Struct16BytesNestedInt,
- Struct16BytesNestedInt)>("PassStruct16BytesNestedIntx2", isLeaf: true);
-
-/// Deeper nested struct to test recursive member access.
-void testPassStruct16BytesNestedIntx2Leaf() {
- 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 = passStruct16BytesNestedIntx2Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(8, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
-}
-
-final passStruct32BytesNestedIntx2Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(Struct32BytesNestedInt, Struct32BytesNestedInt),
- int Function(Struct32BytesNestedInt,
- Struct32BytesNestedInt)>("PassStruct32BytesNestedIntx2", isLeaf: true);
-
-/// Even deeper nested struct to test recursive member access.
-void testPassStruct32BytesNestedIntx2Leaf() {
- final a0Pointer = calloc<Struct32BytesNestedInt>();
- final Struct32BytesNestedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct32BytesNestedInt>();
- final Struct32BytesNestedInt a1 = a1Pointer.ref;
-
- a0.a0.a0.a0.a0 = -1;
- a0.a0.a0.a0.a1 = 2;
- a0.a0.a0.a1.a0 = -3;
- a0.a0.a0.a1.a1 = 4;
- a0.a0.a1.a0.a0 = -5;
- a0.a0.a1.a0.a1 = 6;
- a0.a0.a1.a1.a0 = -7;
- a0.a0.a1.a1.a1 = 8;
- a0.a1.a0.a0.a0 = -9;
- a0.a1.a0.a0.a1 = 10;
- a0.a1.a0.a1.a0 = -11;
- a0.a1.a0.a1.a1 = 12;
- a0.a1.a1.a0.a0 = -13;
- a0.a1.a1.a0.a1 = 14;
- a0.a1.a1.a1.a0 = -15;
- a0.a1.a1.a1.a1 = 16;
- a1.a0.a0.a0.a0 = -17;
- a1.a0.a0.a0.a1 = 18;
- a1.a0.a0.a1.a0 = -19;
- a1.a0.a0.a1.a1 = 20;
- a1.a0.a1.a0.a0 = -21;
- a1.a0.a1.a0.a1 = 22;
- a1.a0.a1.a1.a0 = -23;
- a1.a0.a1.a1.a1 = 24;
- a1.a1.a0.a0.a0 = -25;
- a1.a1.a0.a0.a1 = 26;
- a1.a1.a0.a1.a0 = -27;
- a1.a1.a0.a1.a1 = 28;
- a1.a1.a1.a0.a0 = -29;
- a1.a1.a1.a0.a1 = 30;
- a1.a1.a1.a1.a0 = -31;
- a1.a1.a1.a1.a1 = 32;
-
- final result = passStruct32BytesNestedIntx2Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(16, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
-}
-
-final passStructNestedIntStructAlignmentInt16Leaf =
- ffiTestFunctions.lookupFunction<
- Int64 Function(StructNestedIntStructAlignmentInt16),
- int Function(StructNestedIntStructAlignmentInt16)>(
- "PassStructNestedIntStructAlignmentInt16",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 16 byte int.
-void testPassStructNestedIntStructAlignmentInt16Leaf() {
- final a0Pointer = calloc<StructNestedIntStructAlignmentInt16>();
- final StructNestedIntStructAlignmentInt16 a0 = a0Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a0.a1.a0 = 4;
- a0.a1.a1 = -5;
- a0.a1.a2 = 6;
-
- final result = passStructNestedIntStructAlignmentInt16Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(3, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedIntStructAlignmentInt32Leaf =
- ffiTestFunctions.lookupFunction<
- Int64 Function(StructNestedIntStructAlignmentInt32),
- int Function(StructNestedIntStructAlignmentInt32)>(
- "PassStructNestedIntStructAlignmentInt32",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 32 byte int.
-void testPassStructNestedIntStructAlignmentInt32Leaf() {
- final a0Pointer = calloc<StructNestedIntStructAlignmentInt32>();
- final StructNestedIntStructAlignmentInt32 a0 = a0Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a0.a1.a0 = 4;
- a0.a1.a1 = -5;
- a0.a1.a2 = 6;
-
- final result = passStructNestedIntStructAlignmentInt32Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(3, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedIntStructAlignmentInt64Leaf =
- ffiTestFunctions.lookupFunction<
- Int64 Function(StructNestedIntStructAlignmentInt64),
- int Function(StructNestedIntStructAlignmentInt64)>(
- "PassStructNestedIntStructAlignmentInt64",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 64 byte int.
-void testPassStructNestedIntStructAlignmentInt64Leaf() {
- final a0Pointer = calloc<StructNestedIntStructAlignmentInt64>();
- final StructNestedIntStructAlignmentInt64 a0 = a0Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a0.a1.a0 = 4;
- a0.a1.a1 = -5;
- a0.a1.a2 = 6;
-
- final result = passStructNestedIntStructAlignmentInt64Leaf(a0);
-
- print("result = $result");
-
- Expect.equals(3, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedIrregularEvenBiggerx4Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger),
- double Function(
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger,
- StructNestedIrregularEvenBigger)>(
- "PassStructNestedIrregularEvenBiggerx4",
- isLeaf: true);
-
-/// Return big irregular struct as smoke test.
-void testPassStructNestedIrregularEvenBiggerx4Leaf() {
- final a0Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructNestedIrregularEvenBigger>();
- final StructNestedIrregularEvenBigger a3 = a3Pointer.ref;
-
- a0.a0 = 1;
- a0.a1.a0.a0 = 2;
- a0.a1.a0.a1.a0.a0 = -3;
- a0.a1.a0.a1.a0.a1 = 4;
- a0.a1.a0.a1.a1.a0 = -5.0;
- a0.a1.a0.a2 = 6;
- a0.a1.a0.a3.a0.a0 = -7.0;
- a0.a1.a0.a3.a1 = 8.0;
- a0.a1.a0.a4 = 9;
- a0.a1.a0.a5.a0.a0 = 10.0;
- a0.a1.a0.a5.a1.a0 = -11.0;
- a0.a1.a0.a6 = 12;
- a0.a1.a1.a0.a0 = -13;
- a0.a1.a1.a0.a1 = 14;
- a0.a1.a1.a1.a0 = -15.0;
- a0.a1.a2 = 16.0;
- a0.a1.a3 = -17.0;
- a0.a2.a0.a0 = 18;
- a0.a2.a0.a1.a0.a0 = -19;
- a0.a2.a0.a1.a0.a1 = 20;
- a0.a2.a0.a1.a1.a0 = -21.0;
- a0.a2.a0.a2 = 22;
- a0.a2.a0.a3.a0.a0 = -23.0;
- a0.a2.a0.a3.a1 = 24.0;
- a0.a2.a0.a4 = 25;
- a0.a2.a0.a5.a0.a0 = 26.0;
- a0.a2.a0.a5.a1.a0 = -27.0;
- a0.a2.a0.a6 = 28;
- a0.a2.a1.a0.a0 = -29;
- a0.a2.a1.a0.a1 = 30;
- a0.a2.a1.a1.a0 = -31.0;
- a0.a2.a2 = 32.0;
- a0.a2.a3 = -33.0;
- a0.a3 = 34.0;
- a1.a0 = 35;
- a1.a1.a0.a0 = 36;
- a1.a1.a0.a1.a0.a0 = -37;
- a1.a1.a0.a1.a0.a1 = 38;
- a1.a1.a0.a1.a1.a0 = -39.0;
- a1.a1.a0.a2 = 40;
- a1.a1.a0.a3.a0.a0 = -41.0;
- a1.a1.a0.a3.a1 = 42.0;
- a1.a1.a0.a4 = 43;
- a1.a1.a0.a5.a0.a0 = 44.0;
- a1.a1.a0.a5.a1.a0 = -45.0;
- a1.a1.a0.a6 = 46;
- a1.a1.a1.a0.a0 = -47;
- a1.a1.a1.a0.a1 = 48;
- a1.a1.a1.a1.a0 = -49.0;
- a1.a1.a2 = 50.0;
- a1.a1.a3 = -51.0;
- a1.a2.a0.a0 = 52;
- a1.a2.a0.a1.a0.a0 = -53;
- a1.a2.a0.a1.a0.a1 = 54;
- a1.a2.a0.a1.a1.a0 = -55.0;
- a1.a2.a0.a2 = 56;
- a1.a2.a0.a3.a0.a0 = -57.0;
- a1.a2.a0.a3.a1 = 58.0;
- a1.a2.a0.a4 = 59;
- a1.a2.a0.a5.a0.a0 = 60.0;
- a1.a2.a0.a5.a1.a0 = -61.0;
- a1.a2.a0.a6 = 62;
- a1.a2.a1.a0.a0 = -63;
- a1.a2.a1.a0.a1 = 64;
- a1.a2.a1.a1.a0 = -65.0;
- a1.a2.a2 = 66.0;
- a1.a2.a3 = -67.0;
- a1.a3 = 68.0;
- a2.a0 = 69;
- a2.a1.a0.a0 = 70;
- a2.a1.a0.a1.a0.a0 = -71;
- a2.a1.a0.a1.a0.a1 = 72;
- a2.a1.a0.a1.a1.a0 = -73.0;
- a2.a1.a0.a2 = 74;
- a2.a1.a0.a3.a0.a0 = -75.0;
- a2.a1.a0.a3.a1 = 76.0;
- a2.a1.a0.a4 = 77;
- a2.a1.a0.a5.a0.a0 = 78.0;
- a2.a1.a0.a5.a1.a0 = -79.0;
- a2.a1.a0.a6 = 80;
- a2.a1.a1.a0.a0 = -81;
- a2.a1.a1.a0.a1 = 82;
- a2.a1.a1.a1.a0 = -83.0;
- a2.a1.a2 = 84.0;
- a2.a1.a3 = -85.0;
- a2.a2.a0.a0 = 86;
- a2.a2.a0.a1.a0.a0 = -87;
- a2.a2.a0.a1.a0.a1 = 88;
- a2.a2.a0.a1.a1.a0 = -89.0;
- a2.a2.a0.a2 = 90;
- a2.a2.a0.a3.a0.a0 = -91.0;
- a2.a2.a0.a3.a1 = 92.0;
- a2.a2.a0.a4 = 93;
- a2.a2.a0.a5.a0.a0 = 94.0;
- a2.a2.a0.a5.a1.a0 = -95.0;
- a2.a2.a0.a6 = 96;
- a2.a2.a1.a0.a0 = -97;
- a2.a2.a1.a0.a1 = 98;
- a2.a2.a1.a1.a0 = -99.0;
- a2.a2.a2 = 100.0;
- a2.a2.a3 = -101.0;
- a2.a3 = 102.0;
- a3.a0 = 103;
- a3.a1.a0.a0 = 104;
- a3.a1.a0.a1.a0.a0 = -105;
- a3.a1.a0.a1.a0.a1 = 106;
- a3.a1.a0.a1.a1.a0 = -107.0;
- a3.a1.a0.a2 = 108;
- a3.a1.a0.a3.a0.a0 = -109.0;
- a3.a1.a0.a3.a1 = 110.0;
- a3.a1.a0.a4 = 111;
- a3.a1.a0.a5.a0.a0 = 112.0;
- a3.a1.a0.a5.a1.a0 = -113.0;
- a3.a1.a0.a6 = 114;
- a3.a1.a1.a0.a0 = -115;
- a3.a1.a1.a0.a1 = 116;
- a3.a1.a1.a1.a0 = -117.0;
- a3.a1.a2 = 118.0;
- a3.a1.a3 = -119.0;
- a3.a2.a0.a0 = 120;
- a3.a2.a0.a1.a0.a0 = -121;
- a3.a2.a0.a1.a0.a1 = 122;
- a3.a2.a0.a1.a1.a0 = -123.0;
- a3.a2.a0.a2 = 124;
- a3.a2.a0.a3.a0.a0 = -125.0;
- a3.a2.a0.a3.a1 = 126.0;
- a3.a2.a0.a4 = 127;
- a3.a2.a0.a5.a0.a0 = 128.0;
- a3.a2.a0.a5.a1.a0 = -129.0;
- a3.a2.a0.a6 = 130;
- a3.a2.a1.a0.a0 = -131;
- a3.a2.a1.a0.a1 = 132;
- a3.a2.a1.a1.a0 = -133.0;
- a3.a2.a2 = 134.0;
- a3.a2.a3 = -135.0;
- a3.a3 = 136.0;
-
- final result = passStructNestedIrregularEvenBiggerx4Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(1572.0, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
- calloc.free(a3Pointer);
-}
-
-final passStruct8BytesInlineArrayIntx4Leaf = ffiTestFunctions.lookupFunction<
- Int32 Function(Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt, Struct8BytesInlineArrayInt),
- int Function(
- Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt,
- Struct8BytesInlineArrayInt)>("PassStruct8BytesInlineArrayIntx4",
- isLeaf: true);
-
-/// Simple struct with inline array.
-void testPassStruct8BytesInlineArrayIntx4Leaf() {
- final a0Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesInlineArrayInt>();
- final Struct8BytesInlineArrayInt a3 = a3Pointer.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;
- a1.a0[0] = 9;
- a1.a0[1] = 10;
- a1.a0[2] = 11;
- a1.a0[3] = 12;
- a1.a0[4] = 13;
- a1.a0[5] = 14;
- a1.a0[6] = 15;
- a1.a0[7] = 16;
- a2.a0[0] = 17;
- a2.a0[1] = 18;
- a2.a0[2] = 19;
- a2.a0[3] = 20;
- a2.a0[4] = 21;
- a2.a0[5] = 22;
- a2.a0[6] = 23;
- a2.a0[7] = 24;
- a3.a0[0] = 25;
- a3.a0[1] = 26;
- a3.a0[2] = 27;
- a3.a0[3] = 28;
- a3.a0[4] = 29;
- a3.a0[5] = 30;
- a3.a0[6] = 31;
- a3.a0[7] = 32;
-
- final result = passStruct8BytesInlineArrayIntx4Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.equals(528, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
- calloc.free(a3Pointer);
-}
-
-final passStructInlineArrayIrregularx4Leaf = ffiTestFunctions.lookupFunction<
- Int32 Function(StructInlineArrayIrregular, StructInlineArrayIrregular,
- StructInlineArrayIrregular, StructInlineArrayIrregular),
- int Function(
- StructInlineArrayIrregular,
- StructInlineArrayIrregular,
- StructInlineArrayIrregular,
- StructInlineArrayIrregular)>("PassStructInlineArrayIrregularx4",
- isLeaf: true);
-
-/// Irregular struct with inline array.
-void testPassStructInlineArrayIrregularx4Leaf() {
- final a0Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructInlineArrayIrregular>();
- final StructInlineArrayIrregular a3 = a3Pointer.ref;
-
- a0.a0[0].a0 = -1;
- a0.a0[0].a1 = 2;
- a0.a0[1].a0 = -3;
- a0.a0[1].a1 = 4;
- a0.a1 = 5;
- a1.a0[0].a0 = 6;
- a1.a0[0].a1 = -7;
- a1.a0[1].a0 = 8;
- a1.a0[1].a1 = -9;
- a1.a1 = 10;
- a2.a0[0].a0 = -11;
- a2.a0[0].a1 = 12;
- a2.a0[1].a0 = -13;
- a2.a0[1].a1 = 14;
- a2.a1 = 15;
- a3.a0[0].a0 = 16;
- a3.a0[0].a1 = -17;
- a3.a0[1].a0 = 18;
- a3.a0[1].a1 = -19;
- a3.a1 = 20;
-
- final result = passStructInlineArrayIrregularx4Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.equals(50, result);
-
- calloc.free(a0Pointer);
- calloc.free(a1Pointer);
- calloc.free(a2Pointer);
- calloc.free(a3Pointer);
-}
-
-final passStructInlineArray100BytesLeaf = ffiTestFunctions.lookupFunction<
- Int32 Function(StructInlineArray100Bytes),
- int Function(StructInlineArray100Bytes)>(
- "PassStructInlineArray100Bytes",
- isLeaf: true);
-
-/// Regular larger struct with inline array.
-void testPassStructInlineArray100BytesLeaf() {
- final a0Pointer = calloc<StructInlineArray100Bytes>();
- final StructInlineArray100Bytes 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;
- a0.a0[8] = 9;
- a0.a0[9] = 10;
- a0.a0[10] = 11;
- a0.a0[11] = 12;
- a0.a0[12] = 13;
- a0.a0[13] = 14;
- a0.a0[14] = 15;
- a0.a0[15] = 16;
- a0.a0[16] = 17;
- a0.a0[17] = 18;
- a0.a0[18] = 19;
- a0.a0[19] = 20;
- a0.a0[20] = 21;
- a0.a0[21] = 22;
- a0.a0[22] = 23;
- a0.a0[23] = 24;
- a0.a0[24] = 25;
- a0.a0[25] = 26;
- a0.a0[26] = 27;
- a0.a0[27] = 28;
- a0.a0[28] = 29;
- a0.a0[29] = 30;
- a0.a0[30] = 31;
- a0.a0[31] = 32;
- a0.a0[32] = 33;
- a0.a0[33] = 34;
- a0.a0[34] = 35;
- a0.a0[35] = 36;
- a0.a0[36] = 37;
- a0.a0[37] = 38;
- a0.a0[38] = 39;
- a0.a0[39] = 40;
- a0.a0[40] = 41;
- a0.a0[41] = 42;
- a0.a0[42] = 43;
- a0.a0[43] = 44;
- a0.a0[44] = 45;
- a0.a0[45] = 46;
- a0.a0[46] = 47;
- a0.a0[47] = 48;
- a0.a0[48] = 49;
- a0.a0[49] = 50;
- a0.a0[50] = 51;
- a0.a0[51] = 52;
- a0.a0[52] = 53;
- a0.a0[53] = 54;
- a0.a0[54] = 55;
- a0.a0[55] = 56;
- a0.a0[56] = 57;
- a0.a0[57] = 58;
- a0.a0[58] = 59;
- a0.a0[59] = 60;
- a0.a0[60] = 61;
- a0.a0[61] = 62;
- a0.a0[62] = 63;
- a0.a0[63] = 64;
- a0.a0[64] = 65;
- a0.a0[65] = 66;
- a0.a0[66] = 67;
- a0.a0[67] = 68;
- a0.a0[68] = 69;
- a0.a0[69] = 70;
- a0.a0[70] = 71;
- a0.a0[71] = 72;
- a0.a0[72] = 73;
- a0.a0[73] = 74;
- a0.a0[74] = 75;
- a0.a0[75] = 76;
- a0.a0[76] = 77;
- a0.a0[77] = 78;
- a0.a0[78] = 79;
- a0.a0[79] = 80;
- a0.a0[80] = 81;
- a0.a0[81] = 82;
- a0.a0[82] = 83;
- a0.a0[83] = 84;
- a0.a0[84] = 85;
- a0.a0[85] = 86;
- a0.a0[86] = 87;
- a0.a0[87] = 88;
- a0.a0[88] = 89;
- a0.a0[89] = 90;
- a0.a0[90] = 91;
- a0.a0[91] = 92;
- a0.a0[92] = 93;
- a0.a0[93] = 94;
- a0.a0[94] = 95;
- a0.a0[95] = 96;
- a0.a0[96] = 97;
- a0.a0[97] = 98;
- a0.a0[98] = 99;
- a0.a0[99] = 100;
-
- final result = passStructInlineArray100BytesLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(5050, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructStruct16BytesHomogeneousFloat2x5Leaf =
- ffiTestFunctions.lookupFunction<
- Float Function(
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2),
- double Function(
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2,
- StructStruct16BytesHomogeneousFloat2)>(
- "PassStructStruct16BytesHomogeneousFloat2x5",
- isLeaf: true);
-
-/// Arguments in FPU registers on arm hardfp and arm64.
-/// 5 struct arguments will exhaust available registers.
-void testPassStructStruct16BytesHomogeneousFloat2x5Leaf() {
- final a0Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a3 = a3Pointer.ref;
- final a4Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
- final StructStruct16BytesHomogeneousFloat2 a4 = a4Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1[0].a0 = 2.0;
- a0.a1[1].a0 = -3.0;
- a0.a2 = 4.0;
- a1.a0.a0 = -5.0;
- a1.a1[0].a0 = 6.0;
- a1.a1[1].a0 = -7.0;
- a1.a2 = 8.0;
- a2.a0.a0 = -9.0;
- a2.a1[0].a0 = 10.0;
- a2.a1[1].a0 = -11.0;
- a2.a2 = 12.0;
- a3.a0.a0 = -13.0;
- a3.a1[0].a0 = 14.0;
- a3.a1[1].a0 = -15.0;
- a3.a2 = 16.0;
- a4.a0.a0 = -17.0;
- a4.a1[0].a0 = 18.0;
- a4.a1[1].a0 = -19.0;
- a4.a2 = 20.0;
-
- final result =
- passStructStruct16BytesHomogeneousFloat2x5Leaf(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 passStructStruct32BytesHomogeneousDouble2x5Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2),
- double Function(
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2,
- StructStruct32BytesHomogeneousDouble2)>(
- "PassStructStruct32BytesHomogeneousDouble2x5",
- isLeaf: true);
-
-/// Arguments in FPU registers on arm64.
-/// 5 struct arguments will exhaust available registers.
-void testPassStructStruct32BytesHomogeneousDouble2x5Leaf() {
- final a0Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a3 = a3Pointer.ref;
- final a4Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
- final StructStruct32BytesHomogeneousDouble2 a4 = a4Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a1[0].a0 = 2.0;
- a0.a1[1].a0 = -3.0;
- a0.a2 = 4.0;
- a1.a0.a0 = -5.0;
- a1.a1[0].a0 = 6.0;
- a1.a1[1].a0 = -7.0;
- a1.a2 = 8.0;
- a2.a0.a0 = -9.0;
- a2.a1[0].a0 = 10.0;
- a2.a1[1].a0 = -11.0;
- a2.a2 = 12.0;
- a3.a0.a0 = -13.0;
- a3.a1[0].a0 = 14.0;
- a3.a1[1].a0 = -15.0;
- a3.a2 = 16.0;
- a4.a0.a0 = -17.0;
- a4.a1[0].a0 = 18.0;
- a4.a1[1].a0 = -19.0;
- a4.a2 = 20.0;
-
- final result =
- passStructStruct32BytesHomogeneousDouble2x5Leaf(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 passStructStruct16BytesMixed3x10Leaf = ffiTestFunctions.lookupFunction<
- Float Function(
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3),
- double Function(
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3,
- StructStruct16BytesMixed3)>("PassStructStruct16BytesMixed3x10",
- isLeaf: true);
-
-/// 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 testPassStructStruct16BytesMixed3x10Leaf() {
- final a0Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a0 = a0Pointer.ref;
- final a1Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a1 = a1Pointer.ref;
- final a2Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a2 = a2Pointer.ref;
- final a3Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a3 = a3Pointer.ref;
- final a4Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a4 = a4Pointer.ref;
- final a5Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a5 = a5Pointer.ref;
- final a6Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a6 = a6Pointer.ref;
- final a7Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a7 = a7Pointer.ref;
- final a8Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a8 = a8Pointer.ref;
- final a9Pointer = calloc<StructStruct16BytesMixed3>();
- final StructStruct16BytesMixed3 a9 = a9Pointer.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;
- a1.a0.a0 = -7.0;
- a1.a1[0].a0 = 8.0;
- a1.a1[0].a1 = -9;
- a1.a1[0].a2 = 10;
- a1.a2[0] = -11;
- a1.a2[1] = 12;
- a2.a0.a0 = -13.0;
- a2.a1[0].a0 = 14.0;
- a2.a1[0].a1 = -15;
- a2.a1[0].a2 = 16;
- a2.a2[0] = -17;
- a2.a2[1] = 18;
- a3.a0.a0 = -19.0;
- a3.a1[0].a0 = 20.0;
- a3.a1[0].a1 = -21;
- a3.a1[0].a2 = 22;
- a3.a2[0] = -23;
- a3.a2[1] = 24;
- a4.a0.a0 = -25.0;
- a4.a1[0].a0 = 26.0;
- a4.a1[0].a1 = -27;
- a4.a1[0].a2 = 28;
- a4.a2[0] = -29;
- a4.a2[1] = 30;
- a5.a0.a0 = -31.0;
- a5.a1[0].a0 = 32.0;
- a5.a1[0].a1 = -33;
- a5.a1[0].a2 = 34;
- a5.a2[0] = -35;
- a5.a2[1] = 36;
- a6.a0.a0 = -37.0;
- a6.a1[0].a0 = 38.0;
- a6.a1[0].a1 = -39;
- a6.a1[0].a2 = 40;
- a6.a2[0] = -41;
- a6.a2[1] = 42;
- a7.a0.a0 = -43.0;
- a7.a1[0].a0 = 44.0;
- a7.a1[0].a1 = -45;
- a7.a1[0].a2 = 46;
- a7.a2[0] = -47;
- a7.a2[1] = 48;
- a8.a0.a0 = -49.0;
- a8.a1[0].a0 = 50.0;
- a8.a1[0].a1 = -51;
- a8.a1[0].a2 = 52;
- a8.a2[0] = -53;
- a8.a2[1] = 54;
- a9.a0.a0 = -55.0;
- a9.a1[0].a0 = 56.0;
- a9.a1[0].a1 = -57;
- a9.a1[0].a2 = 58;
- a9.a2[0] = -59;
- a9.a2[1] = 60;
-
- final result = passStructStruct16BytesMixed3x10Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.approxEquals(30.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 passUint8Struct32BytesInlineArrayMultiDimensionalILeaf =
- ffiTestFunctions.lookupFunction<
- Uint32 Function(
- Uint8,
- Struct32BytesInlineArrayMultiDimensionalInt,
- Uint8,
- Struct8BytesInlineArrayMultiDimensionalInt,
- Uint8,
- Struct8BytesInlineArrayMultiDimensionalInt,
- Uint8),
- int Function(
- int,
- Struct32BytesInlineArrayMultiDimensionalInt,
- int,
- Struct8BytesInlineArrayMultiDimensionalInt,
- int,
- Struct8BytesInlineArrayMultiDimensionalInt,
- int)>("PassUint8Struct32BytesInlineArrayMultiDimensionalI",
- isLeaf: true);
-
-/// Test multi dimensional inline array struct as argument.
-void testPassUint8Struct32BytesInlineArrayMultiDimensionalILeaf() {
- int a0;
- final a1Pointer = calloc<Struct32BytesInlineArrayMultiDimensionalInt>();
- final Struct32BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
- int a2;
- final a3Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
- final Struct8BytesInlineArrayMultiDimensionalInt a3 = a3Pointer.ref;
- int a4;
- final a5Pointer = calloc<Struct8BytesInlineArrayMultiDimensionalInt>();
- final Struct8BytesInlineArrayMultiDimensionalInt a5 = a5Pointer.ref;
- int a6;
-
- a0 = 1;
- a1.a0[0][0][0][0][0] = 2;
- a1.a0[0][0][0][0][1] = 3;
- a1.a0[0][0][0][1][0] = 4;
- a1.a0[0][0][0][1][1] = 5;
- a1.a0[0][0][1][0][0] = 6;
- a1.a0[0][0][1][0][1] = 7;
- a1.a0[0][0][1][1][0] = 8;
- a1.a0[0][0][1][1][1] = 9;
- a1.a0[0][1][0][0][0] = 10;
- a1.a0[0][1][0][0][1] = 11;
- a1.a0[0][1][0][1][0] = 12;
- a1.a0[0][1][0][1][1] = 13;
- a1.a0[0][1][1][0][0] = 14;
- a1.a0[0][1][1][0][1] = 15;
- a1.a0[0][1][1][1][0] = 16;
- a1.a0[0][1][1][1][1] = 17;
- a1.a0[1][0][0][0][0] = 18;
- a1.a0[1][0][0][0][1] = 19;
- a1.a0[1][0][0][1][0] = 20;
- a1.a0[1][0][0][1][1] = 21;
- a1.a0[1][0][1][0][0] = 22;
- a1.a0[1][0][1][0][1] = 23;
- a1.a0[1][0][1][1][0] = 24;
- a1.a0[1][0][1][1][1] = 25;
- a1.a0[1][1][0][0][0] = 26;
- a1.a0[1][1][0][0][1] = 27;
- a1.a0[1][1][0][1][0] = 28;
- a1.a0[1][1][0][1][1] = 29;
- a1.a0[1][1][1][0][0] = 30;
- a1.a0[1][1][1][0][1] = 31;
- a1.a0[1][1][1][1][0] = 32;
- a1.a0[1][1][1][1][1] = 33;
- a2 = 34;
- a3.a0[0][0][0] = 35;
- a3.a0[0][0][1] = 36;
- a3.a0[0][1][0] = 37;
- a3.a0[0][1][1] = 38;
- a3.a0[1][0][0] = 39;
- a3.a0[1][0][1] = 40;
- a3.a0[1][1][0] = 41;
- a3.a0[1][1][1] = 42;
- a4 = 43;
- a5.a0[0][0][0] = 44;
- a5.a0[0][0][1] = 45;
- a5.a0[0][1][0] = 46;
- a5.a0[0][1][1] = 47;
- a5.a0[1][0][0] = 48;
- a5.a0[1][0][1] = 49;
- a5.a0[1][1][0] = 50;
- a5.a0[1][1][1] = 51;
- a6 = 52;
-
- final result = passUint8Struct32BytesInlineArrayMultiDimensionalILeaf(
- a0, a1, a2, a3, a4, a5, a6);
-
- print("result = $result");
-
- Expect.equals(1378, result);
-
- calloc.free(a1Pointer);
- calloc.free(a3Pointer);
- calloc.free(a5Pointer);
-}
-
-final passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf =
- ffiTestFunctions.lookupFunction<
- Uint32 Function(
- Uint8, Struct4BytesInlineArrayMultiDimensionalInt, Uint8),
- int Function(int, Struct4BytesInlineArrayMultiDimensionalInt, int)>(
- "PassUint8Struct4BytesInlineArrayMultiDimensionalIn",
- isLeaf: true);
-
-/// Test struct in multi dimensional inline array.
-void testPassUint8Struct4BytesInlineArrayMultiDimensionalInLeaf() {
- int a0;
- final a1Pointer = calloc<Struct4BytesInlineArrayMultiDimensionalInt>();
- final Struct4BytesInlineArrayMultiDimensionalInt a1 = a1Pointer.ref;
- int a2;
-
- a0 = 1;
- a1.a0[0][0].a0 = 2;
- a1.a0[0][1].a0 = -3;
- a1.a0[1][0].a0 = 4;
- a1.a0[1][1].a0 = -5;
- a2 = 6;
-
- final result =
- passUint8Struct4BytesInlineArrayMultiDimensionalInLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(5, result);
-
- calloc.free(a1Pointer);
-}
-
-final passStruct3BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt),
- int Function(
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt,
- Struct3BytesPackedInt)>("PassStruct3BytesPackedIntx10", isLeaf: true);
-
-/// Small struct with mis-aligned member.
-void testPassStruct3BytesPackedIntx10Leaf() {
- final a0Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct3BytesPackedInt>();
- final Struct3BytesPackedInt 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 =
- passStruct3BytesPackedIntx10Leaf(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 passStruct8BytesPackedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Int64 Function(
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt),
- int Function(
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt,
- Struct8BytesPackedInt)>("PassStruct8BytesPackedIntx10", isLeaf: true);
-
-/// Struct with mis-aligned member.
-void testPassStruct8BytesPackedIntx10Leaf() {
- final a0Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct8BytesPackedInt>();
- final Struct8BytesPackedInt 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 =
- passStruct8BytesPackedIntx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.equals(1275, 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 passStruct9BytesPackedMixedx10DoubleInt32x2Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Double,
- Int32,
- Int32),
- double Function(
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- Struct9BytesPackedMixed,
- double,
- int,
- int)>("PassStruct9BytesPackedMixedx10DoubleInt32x2", isLeaf: true);
-
-/// Struct with mis-aligned member.
-/// Tests backfilling of CPU and FPU registers.
-void testPassStruct9BytesPackedMixedx10DoubleInt32x2Leaf() {
- final a0Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a0 = a0Pointer.ref;
- final a1Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a1 = a1Pointer.ref;
- final a2Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a2 = a2Pointer.ref;
- final a3Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a3 = a3Pointer.ref;
- final a4Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a4 = a4Pointer.ref;
- final a5Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a5 = a5Pointer.ref;
- final a6Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a6 = a6Pointer.ref;
- final a7Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a7 = a7Pointer.ref;
- final a8Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a8 = a8Pointer.ref;
- final a9Pointer = calloc<Struct9BytesPackedMixed>();
- final Struct9BytesPackedMixed a9 = a9Pointer.ref;
- double a10;
- int a11;
- int a12;
-
- a0.a0 = 1;
- a0.a1 = 2.0;
- a1.a0 = 3;
- a1.a1 = 4.0;
- a2.a0 = 5;
- a2.a1 = 6.0;
- a3.a0 = 7;
- a3.a1 = 8.0;
- a4.a0 = 9;
- a4.a1 = 10.0;
- a5.a0 = 11;
- a5.a1 = 12.0;
- a6.a0 = 13;
- a6.a1 = 14.0;
- a7.a0 = 15;
- a7.a1 = 16.0;
- a8.a0 = 17;
- a8.a1 = 18.0;
- a9.a0 = 19;
- a9.a1 = 20.0;
- a10 = -21.0;
- a11 = 22;
- a12 = -23;
-
- final result = passStruct9BytesPackedMixedx10DoubleInt32x2Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
-
- print("result = $result");
-
- Expect.approxEquals(188.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 passStruct5BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct5BytesPackedMixed),
- double Function(
- Struct5BytesPackedMixed)>("PassStruct5BytesPackedMixed", isLeaf: true);
-
-/// This packed struct happens to have only aligned members.
-void testPassStruct5BytesPackedMixedLeaf() {
- final a0Pointer = calloc<Struct5BytesPackedMixed>();
- final Struct5BytesPackedMixed a0 = a0Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2;
-
- final result = passStruct5BytesPackedMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(1.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStructNestedAlignmentStruct5BytesPackedMixedLeaf =
- ffiTestFunctions.lookupFunction<
- Double Function(StructNestedAlignmentStruct5BytesPackedMixed),
- double Function(StructNestedAlignmentStruct5BytesPackedMixed)>(
- "PassStructNestedAlignmentStruct5BytesPackedMixed",
- isLeaf: true);
-
-/// Check alignment of packed struct in non-packed struct.
-void testPassStructNestedAlignmentStruct5BytesPackedMixedLeaf() {
- final a0Pointer = calloc<StructNestedAlignmentStruct5BytesPackedMixed>();
- final StructNestedAlignmentStruct5BytesPackedMixed a0 = a0Pointer.ref;
-
- a0.a0 = 1;
- a0.a1.a0 = 2.0;
- a0.a1.a1 = 3;
-
- final result = passStructNestedAlignmentStruct5BytesPackedMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(6.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct6BytesInlineArrayIntLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct6BytesInlineArrayInt),
- double Function(Struct6BytesInlineArrayInt)>(
- "PassStruct6BytesInlineArrayInt",
- isLeaf: true);
-
-/// Check alignment of packed struct array in non-packed struct.
-void testPassStruct6BytesInlineArrayIntLeaf() {
- final a0Pointer = calloc<Struct6BytesInlineArrayInt>();
- final Struct6BytesInlineArrayInt a0 = a0Pointer.ref;
-
- a0.a0[0].a0 = -1;
- a0.a0[0].a1 = 2;
- a0.a0[1].a0 = -3;
- a0.a0[1].a1 = 4;
-
- final result = passStruct6BytesInlineArrayIntLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(2.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passStruct15BytesInlineArrayMixedLeaf = ffiTestFunctions.lookupFunction<
- Double Function(Struct15BytesInlineArrayMixed),
- double Function(Struct15BytesInlineArrayMixed)>(
- "PassStruct15BytesInlineArrayMixed",
- isLeaf: true);
-
-/// Check alignment of packed struct array in non-packed struct.
-void testPassStruct15BytesInlineArrayMixedLeaf() {
- final a0Pointer = calloc<Struct15BytesInlineArrayMixed>();
- final Struct15BytesInlineArrayMixed a0 = a0Pointer.ref;
-
- a0.a0[0].a0 = -1.0;
- a0.a0[0].a1 = 2;
- a0.a0[1].a0 = -3.0;
- a0.a0[1].a1 = 4;
- a0.a0[2].a0 = -5.0;
- a0.a0[2].a1 = 6;
-
- final result = passStruct15BytesInlineArrayMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(3.0, result);
-
- calloc.free(a0Pointer);
-}
-
-final passUnion4BytesMixedx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed),
- double Function(
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed,
- Union4BytesMixed)>("PassUnion4BytesMixedx10", isLeaf: true);
-
-/// Check placement of mixed integer/float union.
-void testPassUnion4BytesMixedx10Leaf() {
- final a0Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union4BytesMixed>();
- final Union4BytesMixed 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 =
- passUnion4BytesMixedx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.approxEquals(55.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 passUnion8BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat),
- double Function(
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat,
- Union8BytesNestedFloat)>("PassUnion8BytesNestedFloatx10", isLeaf: true);
-
-/// Check placement of mixed floats union.
-void testPassUnion8BytesNestedFloatx10Leaf() {
- final a0Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union8BytesNestedFloat>();
- final Union8BytesNestedFloat a9 = a9Pointer.ref;
-
- a0.a0 = -1.0;
- a1.a0 = 2.0;
- a2.a0 = -3.0;
- a3.a0 = 4.0;
- a4.a0 = -5.0;
- a5.a0 = 6.0;
- a6.a0 = -7.0;
- a7.a0 = 8.0;
- a8.a0 = -9.0;
- a9.a0 = 10.0;
-
- final result =
- passUnion8BytesNestedFloatx10Leaf(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
-
- print("result = $result");
-
- Expect.approxEquals(5.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 passUnion9BytesNestedIntx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt),
- double Function(
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt,
- Union9BytesNestedInt)>("PassUnion9BytesNestedIntx10", isLeaf: true);
-
-/// Mixed-size union argument.
-void testPassUnion9BytesNestedIntx10Leaf() {
- final a0Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union9BytesNestedInt>();
- final Union9BytesNestedInt a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1;
- a0.a0.a1 = 2;
- a0.a0.a2 = -3;
- a1.a0.a0 = 4;
- a1.a0.a1 = -5;
- a1.a0.a2 = 6;
- a2.a0.a0 = -7;
- a2.a0.a1 = 8;
- a2.a0.a2 = -9;
- a3.a0.a0 = 10;
- a3.a0.a1 = -11;
- a3.a0.a2 = 12;
- a4.a0.a0 = -13;
- a4.a0.a1 = 14;
- a4.a0.a2 = -15;
- a5.a0.a0 = 16;
- a5.a0.a1 = -17;
- a5.a0.a2 = 18;
- a6.a0.a0 = -19;
- a6.a0.a1 = 20;
- a6.a0.a2 = -21;
- a7.a0.a0 = 22;
- a7.a0.a1 = -23;
- a7.a0.a2 = 24;
- a8.a0.a0 = -25;
- a8.a0.a1 = 26;
- a8.a0.a2 = -27;
- a9.a0.a0 = 28;
- a9.a0.a1 = -29;
- a9.a0.a2 = 30;
-
- final result =
- passUnion9BytesNestedIntx10Leaf(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 passUnion16BytesNestedInlineArrayFloatx10Leaf =
- ffiTestFunctions.lookupFunction<
- Double Function(
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat),
- double Function(
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat,
- Union16BytesNestedInlineArrayFloat)>(
- "PassUnion16BytesNestedInlineArrayFloatx10",
- isLeaf: true);
-
-/// Union with homogenous floats.
-void testPassUnion16BytesNestedInlineArrayFloatx10Leaf() {
- final a0Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union16BytesNestedInlineArrayFloat>();
- final Union16BytesNestedInlineArrayFloat a9 = a9Pointer.ref;
-
- a0.a0[0] = -1.0;
- a0.a0[1] = 2.0;
- a0.a0[2] = -3.0;
- a0.a0[3] = 4.0;
- a1.a0[0] = -5.0;
- a1.a0[1] = 6.0;
- a1.a0[2] = -7.0;
- a1.a0[3] = 8.0;
- a2.a0[0] = -9.0;
- a2.a0[1] = 10.0;
- a2.a0[2] = -11.0;
- a2.a0[3] = 12.0;
- a3.a0[0] = -13.0;
- a3.a0[1] = 14.0;
- a3.a0[2] = -15.0;
- a3.a0[3] = 16.0;
- a4.a0[0] = -17.0;
- a4.a0[1] = 18.0;
- a4.a0[2] = -19.0;
- a4.a0[3] = 20.0;
- a5.a0[0] = -21.0;
- a5.a0[1] = 22.0;
- a5.a0[2] = -23.0;
- a5.a0[3] = 24.0;
- a6.a0[0] = -25.0;
- a6.a0[1] = 26.0;
- a6.a0[2] = -27.0;
- a6.a0[3] = 28.0;
- a7.a0[0] = -29.0;
- a7.a0[1] = 30.0;
- a7.a0[2] = -31.0;
- a7.a0[3] = 32.0;
- a8.a0[0] = -33.0;
- a8.a0[1] = 34.0;
- a8.a0[2] = -35.0;
- a8.a0[3] = 36.0;
- a9.a0[0] = -37.0;
- a9.a0[1] = 38.0;
- a9.a0[2] = -39.0;
- a9.a0[3] = 40.0;
-
- final result = passUnion16BytesNestedInlineArrayFloatx10Leaf(
- 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 passUnion16BytesNestedFloatx10Leaf = ffiTestFunctions.lookupFunction<
- Double Function(
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat),
- double Function(
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat,
- Union16BytesNestedFloat)>("PassUnion16BytesNestedFloatx10",
- isLeaf: true);
-
-/// Union with homogenous floats.
-void testPassUnion16BytesNestedFloatx10Leaf() {
- final a0Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a0 = a0Pointer.ref;
- final a1Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a1 = a1Pointer.ref;
- final a2Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a2 = a2Pointer.ref;
- final a3Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a3 = a3Pointer.ref;
- final a4Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a4 = a4Pointer.ref;
- final a5Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a5 = a5Pointer.ref;
- final a6Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a6 = a6Pointer.ref;
- final a7Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a7 = a7Pointer.ref;
- final a8Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a8 = a8Pointer.ref;
- final a9Pointer = calloc<Union16BytesNestedFloat>();
- final Union16BytesNestedFloat a9 = a9Pointer.ref;
-
- a0.a0.a0 = -1.0;
- a0.a0.a1 = 2.0;
- a1.a0.a0 = -3.0;
- a1.a0.a1 = 4.0;
- a2.a0.a0 = -5.0;
- a2.a0.a1 = 6.0;
- a3.a0.a0 = -7.0;
- a3.a0.a1 = 8.0;
- a4.a0.a0 = -9.0;
- a4.a0.a1 = 10.0;
- a5.a0.a0 = -11.0;
- a5.a0.a1 = 12.0;
- a6.a0.a0 = -13.0;
- a6.a0.a1 = 14.0;
- a7.a0.a0 = -15.0;
- a7.a0.a1 = 16.0;
- a8.a0.a0 = -17.0;
- a8.a0.a1 = 18.0;
- a9.a0.a0 = -19.0;
- a9.a0.a1 = 20.0;
-
- final result = passUnion16BytesNestedFloatx10Leaf(
- 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 returnStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
- Struct1ByteInt Function(Int8),
- Struct1ByteInt Function(int)>("ReturnStruct1ByteInt", isLeaf: true);
-
-/// Smallest struct with data.
-void testReturnStruct1ByteIntLeaf() {
- int a0;
-
- a0 = -1;
-
- final result = returnStruct1ByteIntLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
-}
-
-final returnStruct3BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct3BytesHomogeneousUint8 Function(Uint8, Uint8, Uint8),
- Struct3BytesHomogeneousUint8 Function(
- int, int, int)>("ReturnStruct3BytesHomogeneousUint8", isLeaf: true);
-
-/// Smaller than word size return value on all architectures.
-void testReturnStruct3BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
-
- final result = returnStruct3BytesHomogeneousUint8Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct3BytesInt2ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
- Struct3BytesInt2ByteAligned Function(Int16, Int8),
- Struct3BytesInt2ByteAligned Function(
- int, int)>("ReturnStruct3BytesInt2ByteAligned", isLeaf: true);
-
-/// Smaller than word size return value on all architectures.
-/// With alignment rules taken into account size is 4 bytes.
-void testReturnStruct3BytesInt2ByteAlignedLeaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct3BytesInt2ByteAlignedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct4BytesHomogeneousInt16Leaf = ffiTestFunctions.lookupFunction<
- Struct4BytesHomogeneousInt16 Function(Int16, Int16),
- Struct4BytesHomogeneousInt16 Function(
- int, int)>("ReturnStruct4BytesHomogeneousInt16", isLeaf: true);
-
-/// Word size return value on 32 bit architectures..
-void testReturnStruct4BytesHomogeneousInt16Leaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct4BytesHomogeneousInt16Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct7BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct7BytesHomogeneousUint8 Function(
- Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
- Struct7BytesHomogeneousUint8 Function(int, int, int, int, int, int,
- int)>("ReturnStruct7BytesHomogeneousUint8", isLeaf: true);
-
-/// Non-wordsize return value.
-void testReturnStruct7BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
-
- final result =
- returnStruct7BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5, a6);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
-}
-
-final returnStruct7BytesInt4ByteAlignedLeaf = ffiTestFunctions.lookupFunction<
- Struct7BytesInt4ByteAligned Function(Int32, Int16, Int8),
- Struct7BytesInt4ByteAligned Function(
- int, int, int)>("ReturnStruct7BytesInt4ByteAligned", isLeaf: true);
-
-/// Non-wordsize return value.
-/// With alignment rules taken into account size is 8 bytes.
-void testReturnStruct7BytesInt4ByteAlignedLeaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct7BytesInt4ByteAlignedLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct8BytesIntLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesInt Function(Int16, Int16, Int32),
- Struct8BytesInt Function(
- int, int, int)>("ReturnStruct8BytesInt", isLeaf: true);
-
-/// Return value in integer registers on many architectures.
-void testReturnStruct8BytesIntLeaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct8BytesIntLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct8BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesHomogeneousFloat Function(Float, Float),
- Struct8BytesHomogeneousFloat Function(
- double, double)>("ReturnStruct8BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value in FP registers on many architectures.
-void testReturnStruct8BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
-
- a0 = -1.0;
- a1 = 2.0;
-
- final result = returnStruct8BytesHomogeneousFloatLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
-}
-
-final returnStruct8BytesMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesMixed Function(Float, Int16, Int16),
- Struct8BytesMixed Function(
- double, int, int)>("ReturnStruct8BytesMixed", isLeaf: true);
-
-/// Return value split over FP and integer register in x64.
-void testReturnStruct8BytesMixedLeaf() {
- double a0;
- int a1;
- int a2;
-
- a0 = -1.0;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct8BytesMixedLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct9BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct9BytesHomogeneousUint8 Function(
- Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8, Uint8),
- Struct9BytesHomogeneousUint8 Function(int, int, int, int, int, int, int,
- int, int)>("ReturnStruct9BytesHomogeneousUint8", isLeaf: true);
-
-/// The minimum alignment of this struct is only 1 byte based on its fields.
-/// Test that the memory backing these structs is the right size and that
-/// dart:ffi trampolines do not write outside this size.
-void testReturnStruct9BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- int a8;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
- a7 = 8;
- a8 = 9;
-
- final result = returnStruct9BytesHomogeneousUint8Leaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
- Expect.equals(a7, result.a7);
- Expect.equals(a8, result.a8);
-}
-
-final returnStruct9BytesInt4Or8ByteAlignedLeaf =
- ffiTestFunctions.lookupFunction<
- Struct9BytesInt4Or8ByteAligned Function(Int64, Int8),
- Struct9BytesInt4Or8ByteAligned Function(
- int, int)>("ReturnStruct9BytesInt4Or8ByteAligned", isLeaf: true);
-
-/// Return value in two integer registers on x64.
-/// With alignment rules taken into account size is 12 or 16 bytes.
-void testReturnStruct9BytesInt4Or8ByteAlignedLeaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct9BytesInt4Or8ByteAlignedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct12BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct12BytesHomogeneousFloat Function(Float, Float, Float),
- Struct12BytesHomogeneousFloat Function(double, double,
- double)>("ReturnStruct12BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value in FPU registers, but does not use all registers on arm hardfp
-/// and arm64.
-void testReturnStruct12BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
- double a2;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
-
- final result = returnStruct12BytesHomogeneousFloatLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
-}
-
-final returnStruct16BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct16BytesHomogeneousFloat Function(Float, Float, Float, Float),
- Struct16BytesHomogeneousFloat Function(double, double, double,
- double)>("ReturnStruct16BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value in FPU registers on arm hardfp and arm64.
-void testReturnStruct16BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
-
- final result = returnStruct16BytesHomogeneousFloatLeaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
-}
-
-final returnStruct16BytesMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct16BytesMixed Function(Double, Int64),
- Struct16BytesMixed Function(
- double, int)>("ReturnStruct16BytesMixed", isLeaf: true);
-
-/// Return value split over FP and integer register in x64.
-void testReturnStruct16BytesMixedLeaf() {
- double a0;
- int a1;
-
- a0 = -1.0;
- a1 = 2;
-
- final result = returnStruct16BytesMixedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct16BytesMixed2Leaf = ffiTestFunctions.lookupFunction<
- Struct16BytesMixed2 Function(Float, Float, Float, Int32),
- Struct16BytesMixed2 Function(double, double, double,
- int)>("ReturnStruct16BytesMixed2", isLeaf: true);
-
-/// Return value split over FP and integer register in x64.
-/// The integer register contains half float half int.
-void testReturnStruct16BytesMixed2Leaf() {
- double a0;
- double a1;
- double a2;
- int a3;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4;
-
- final result = returnStruct16BytesMixed2Leaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.equals(a3, result.a3);
-}
-
-final returnStruct17BytesIntLeaf = ffiTestFunctions.lookupFunction<
- Struct17BytesInt Function(Int64, Int64, Int8),
- Struct17BytesInt Function(
- int, int, int)>("ReturnStruct17BytesInt", isLeaf: true);
-
-/// Rerturn value returned in preallocated space passed by pointer on most ABIs.
-/// Is non word size on purpose, to test that structs are rounded up to word size
-/// on all ABIs.
-void testReturnStruct17BytesIntLeaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStruct17BytesIntLeaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct19BytesHomogeneousUint8Leaf = ffiTestFunctions.lookupFunction<
- Struct19BytesHomogeneousUint8 Function(
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8,
- Uint8),
- Struct19BytesHomogeneousUint8 Function(
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int)>("ReturnStruct19BytesHomogeneousUint8", isLeaf: true);
-
-/// The minimum alignment of this struct is only 1 byte based on its fields.
-/// Test that the memory backing these structs is the right size and that
-/// dart:ffi trampolines do not write outside this size.
-void testReturnStruct19BytesHomogeneousUint8Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- int a8;
- int a9;
- int a10;
- int a11;
- int a12;
- int a13;
- int a14;
- int a15;
- int a16;
- int a17;
- int a18;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
- a7 = 8;
- a8 = 9;
- a9 = 10;
- a10 = 11;
- a11 = 12;
- a12 = 13;
- a13 = 14;
- a14 = 15;
- a15 = 16;
- a16 = 17;
- a17 = 18;
- a18 = 19;
-
- final result = returnStruct19BytesHomogeneousUint8Leaf(a0, a1, a2, a3, a4, a5,
- a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
- Expect.equals(a7, result.a7);
- Expect.equals(a8, result.a8);
- Expect.equals(a9, result.a9);
- Expect.equals(a10, result.a10);
- Expect.equals(a11, result.a11);
- Expect.equals(a12, result.a12);
- Expect.equals(a13, result.a13);
- Expect.equals(a14, result.a14);
- Expect.equals(a15, result.a15);
- Expect.equals(a16, result.a16);
- Expect.equals(a17, result.a17);
- Expect.equals(a18, result.a18);
-}
-
-final returnStruct20BytesHomogeneousInt32Leaf = ffiTestFunctions.lookupFunction<
- Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32, Int32),
- Struct20BytesHomogeneousInt32 Function(int, int, int, int,
- int)>("ReturnStruct20BytesHomogeneousInt32", isLeaf: true);
-
-/// Return value too big to go in cpu registers on arm64.
-void testReturnStruct20BytesHomogeneousInt32Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
- a3 = 4;
- a4 = -5;
-
- final result = returnStruct20BytesHomogeneousInt32Leaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
-}
-
-final returnStruct20BytesHomogeneousFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct20BytesHomogeneousFloat Function(Float, Float, Float, Float, Float),
- Struct20BytesHomogeneousFloat Function(double, double, double, double,
- double)>("ReturnStruct20BytesHomogeneousFloat", isLeaf: true);
-
-/// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
-void testReturnStruct20BytesHomogeneousFloatLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
- double a4;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
- a4 = -5.0;
-
- final result = returnStruct20BytesHomogeneousFloatLeaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
- Expect.approxEquals(a4, result.a4);
-}
-
-final returnStruct32BytesHomogeneousDoubleLeaf =
- ffiTestFunctions.lookupFunction<
- Struct32BytesHomogeneousDouble Function(Double, Double, Double, Double),
- Struct32BytesHomogeneousDouble Function(double, double, double,
- double)>("ReturnStruct32BytesHomogeneousDouble", isLeaf: true);
-
-/// Return value in FPU registers on arm64.
-void testReturnStruct32BytesHomogeneousDoubleLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
-
- final result = returnStruct32BytesHomogeneousDoubleLeaf(a0, a1, a2, a3);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
-}
-
-final returnStruct40BytesHomogeneousDoubleLeaf =
- ffiTestFunctions.lookupFunction<
- Struct40BytesHomogeneousDouble Function(
- Double, Double, Double, Double, Double),
- Struct40BytesHomogeneousDouble Function(double, double, double, double,
- double)>("ReturnStruct40BytesHomogeneousDouble", isLeaf: true);
-
-/// Return value too big to go in FPU registers on arm64.
-void testReturnStruct40BytesHomogeneousDoubleLeaf() {
- double a0;
- double a1;
- double a2;
- double a3;
- double a4;
-
- a0 = -1.0;
- a1 = 2.0;
- a2 = -3.0;
- a3 = 4.0;
- a4 = -5.0;
-
- final result = returnStruct40BytesHomogeneousDoubleLeaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
- Expect.approxEquals(a2, result.a2);
- Expect.approxEquals(a3, result.a3);
- Expect.approxEquals(a4, result.a4);
-}
-
-final returnStruct1024BytesHomogeneousUint64Leaf =
- ffiTestFunctions.lookupFunction<
- Struct1024BytesHomogeneousUint64 Function(
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64,
- Uint64),
- Struct1024BytesHomogeneousUint64 Function(
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int,
- int)>("ReturnStruct1024BytesHomogeneousUint64", isLeaf: true);
-
-/// Test 1kb struct.
-void testReturnStruct1024BytesHomogeneousUint64Leaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
- int a5;
- int a6;
- int a7;
- int a8;
- int a9;
- int a10;
- int a11;
- int a12;
- int a13;
- int a14;
- int a15;
- int a16;
- int a17;
- int a18;
- int a19;
- int a20;
- int a21;
- int a22;
- int a23;
- int a24;
- int a25;
- int a26;
- int a27;
- int a28;
- int a29;
- int a30;
- int a31;
- int a32;
- int a33;
- int a34;
- int a35;
- int a36;
- int a37;
- int a38;
- int a39;
- int a40;
- int a41;
- int a42;
- int a43;
- int a44;
- int a45;
- int a46;
- int a47;
- int a48;
- int a49;
- int a50;
- int a51;
- int a52;
- int a53;
- int a54;
- int a55;
- int a56;
- int a57;
- int a58;
- int a59;
- int a60;
- int a61;
- int a62;
- int a63;
- int a64;
- int a65;
- int a66;
- int a67;
- int a68;
- int a69;
- int a70;
- int a71;
- int a72;
- int a73;
- int a74;
- int a75;
- int a76;
- int a77;
- int a78;
- int a79;
- int a80;
- int a81;
- int a82;
- int a83;
- int a84;
- int a85;
- int a86;
- int a87;
- int a88;
- int a89;
- int a90;
- int a91;
- int a92;
- int a93;
- int a94;
- int a95;
- int a96;
- int a97;
- int a98;
- int a99;
- int a100;
- int a101;
- int a102;
- int a103;
- int a104;
- int a105;
- int a106;
- int a107;
- int a108;
- int a109;
- int a110;
- int a111;
- int a112;
- int a113;
- int a114;
- int a115;
- int a116;
- int a117;
- int a118;
- int a119;
- int a120;
- int a121;
- int a122;
- int a123;
- int a124;
- int a125;
- int a126;
- int a127;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
- a5 = 6;
- a6 = 7;
- a7 = 8;
- a8 = 9;
- a9 = 10;
- a10 = 11;
- a11 = 12;
- a12 = 13;
- a13 = 14;
- a14 = 15;
- a15 = 16;
- a16 = 17;
- a17 = 18;
- a18 = 19;
- a19 = 20;
- a20 = 21;
- a21 = 22;
- a22 = 23;
- a23 = 24;
- a24 = 25;
- a25 = 26;
- a26 = 27;
- a27 = 28;
- a28 = 29;
- a29 = 30;
- a30 = 31;
- a31 = 32;
- a32 = 33;
- a33 = 34;
- a34 = 35;
- a35 = 36;
- a36 = 37;
- a37 = 38;
- a38 = 39;
- a39 = 40;
- a40 = 41;
- a41 = 42;
- a42 = 43;
- a43 = 44;
- a44 = 45;
- a45 = 46;
- a46 = 47;
- a47 = 48;
- a48 = 49;
- a49 = 50;
- a50 = 51;
- a51 = 52;
- a52 = 53;
- a53 = 54;
- a54 = 55;
- a55 = 56;
- a56 = 57;
- a57 = 58;
- a58 = 59;
- a59 = 60;
- a60 = 61;
- a61 = 62;
- a62 = 63;
- a63 = 64;
- a64 = 65;
- a65 = 66;
- a66 = 67;
- a67 = 68;
- a68 = 69;
- a69 = 70;
- a70 = 71;
- a71 = 72;
- a72 = 73;
- a73 = 74;
- a74 = 75;
- a75 = 76;
- a76 = 77;
- a77 = 78;
- a78 = 79;
- a79 = 80;
- a80 = 81;
- a81 = 82;
- a82 = 83;
- a83 = 84;
- a84 = 85;
- a85 = 86;
- a86 = 87;
- a87 = 88;
- a88 = 89;
- a89 = 90;
- a90 = 91;
- a91 = 92;
- a92 = 93;
- a93 = 94;
- a94 = 95;
- a95 = 96;
- a96 = 97;
- a97 = 98;
- a98 = 99;
- a99 = 100;
- a100 = 101;
- a101 = 102;
- a102 = 103;
- a103 = 104;
- a104 = 105;
- a105 = 106;
- a106 = 107;
- a107 = 108;
- a108 = 109;
- a109 = 110;
- a110 = 111;
- a111 = 112;
- a112 = 113;
- a113 = 114;
- a114 = 115;
- a115 = 116;
- a116 = 117;
- a117 = 118;
- a118 = 119;
- a119 = 120;
- a120 = 121;
- a121 = 122;
- a122 = 123;
- a123 = 124;
- a124 = 125;
- a125 = 126;
- a126 = 127;
- a127 = 128;
-
- final result = returnStruct1024BytesHomogeneousUint64Leaf(
- 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);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
- Expect.equals(a5, result.a5);
- Expect.equals(a6, result.a6);
- Expect.equals(a7, result.a7);
- Expect.equals(a8, result.a8);
- Expect.equals(a9, result.a9);
- Expect.equals(a10, result.a10);
- Expect.equals(a11, result.a11);
- Expect.equals(a12, result.a12);
- Expect.equals(a13, result.a13);
- Expect.equals(a14, result.a14);
- Expect.equals(a15, result.a15);
- Expect.equals(a16, result.a16);
- Expect.equals(a17, result.a17);
- Expect.equals(a18, result.a18);
- Expect.equals(a19, result.a19);
- Expect.equals(a20, result.a20);
- Expect.equals(a21, result.a21);
- Expect.equals(a22, result.a22);
- Expect.equals(a23, result.a23);
- Expect.equals(a24, result.a24);
- Expect.equals(a25, result.a25);
- Expect.equals(a26, result.a26);
- Expect.equals(a27, result.a27);
- Expect.equals(a28, result.a28);
- Expect.equals(a29, result.a29);
- Expect.equals(a30, result.a30);
- Expect.equals(a31, result.a31);
- Expect.equals(a32, result.a32);
- Expect.equals(a33, result.a33);
- Expect.equals(a34, result.a34);
- Expect.equals(a35, result.a35);
- Expect.equals(a36, result.a36);
- Expect.equals(a37, result.a37);
- Expect.equals(a38, result.a38);
- Expect.equals(a39, result.a39);
- Expect.equals(a40, result.a40);
- Expect.equals(a41, result.a41);
- Expect.equals(a42, result.a42);
- Expect.equals(a43, result.a43);
- Expect.equals(a44, result.a44);
- Expect.equals(a45, result.a45);
- Expect.equals(a46, result.a46);
- Expect.equals(a47, result.a47);
- Expect.equals(a48, result.a48);
- Expect.equals(a49, result.a49);
- Expect.equals(a50, result.a50);
- Expect.equals(a51, result.a51);
- Expect.equals(a52, result.a52);
- Expect.equals(a53, result.a53);
- Expect.equals(a54, result.a54);
- Expect.equals(a55, result.a55);
- Expect.equals(a56, result.a56);
- Expect.equals(a57, result.a57);
- Expect.equals(a58, result.a58);
- Expect.equals(a59, result.a59);
- Expect.equals(a60, result.a60);
- Expect.equals(a61, result.a61);
- Expect.equals(a62, result.a62);
- Expect.equals(a63, result.a63);
- Expect.equals(a64, result.a64);
- Expect.equals(a65, result.a65);
- Expect.equals(a66, result.a66);
- Expect.equals(a67, result.a67);
- Expect.equals(a68, result.a68);
- Expect.equals(a69, result.a69);
- Expect.equals(a70, result.a70);
- Expect.equals(a71, result.a71);
- Expect.equals(a72, result.a72);
- Expect.equals(a73, result.a73);
- Expect.equals(a74, result.a74);
- Expect.equals(a75, result.a75);
- Expect.equals(a76, result.a76);
- Expect.equals(a77, result.a77);
- Expect.equals(a78, result.a78);
- Expect.equals(a79, result.a79);
- Expect.equals(a80, result.a80);
- Expect.equals(a81, result.a81);
- Expect.equals(a82, result.a82);
- Expect.equals(a83, result.a83);
- Expect.equals(a84, result.a84);
- Expect.equals(a85, result.a85);
- Expect.equals(a86, result.a86);
- Expect.equals(a87, result.a87);
- Expect.equals(a88, result.a88);
- Expect.equals(a89, result.a89);
- Expect.equals(a90, result.a90);
- Expect.equals(a91, result.a91);
- Expect.equals(a92, result.a92);
- Expect.equals(a93, result.a93);
- Expect.equals(a94, result.a94);
- Expect.equals(a95, result.a95);
- Expect.equals(a96, result.a96);
- Expect.equals(a97, result.a97);
- Expect.equals(a98, result.a98);
- Expect.equals(a99, result.a99);
- Expect.equals(a100, result.a100);
- Expect.equals(a101, result.a101);
- Expect.equals(a102, result.a102);
- Expect.equals(a103, result.a103);
- Expect.equals(a104, result.a104);
- Expect.equals(a105, result.a105);
- Expect.equals(a106, result.a106);
- Expect.equals(a107, result.a107);
- Expect.equals(a108, result.a108);
- Expect.equals(a109, result.a109);
- Expect.equals(a110, result.a110);
- Expect.equals(a111, result.a111);
- Expect.equals(a112, result.a112);
- Expect.equals(a113, result.a113);
- Expect.equals(a114, result.a114);
- Expect.equals(a115, result.a115);
- Expect.equals(a116, result.a116);
- Expect.equals(a117, result.a117);
- Expect.equals(a118, result.a118);
- Expect.equals(a119, result.a119);
- Expect.equals(a120, result.a120);
- Expect.equals(a121, result.a121);
- Expect.equals(a122, result.a122);
- Expect.equals(a123, result.a123);
- Expect.equals(a124, result.a124);
- Expect.equals(a125, result.a125);
- Expect.equals(a126, result.a126);
- Expect.equals(a127, result.a127);
-}
-
-final returnStruct3BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct3BytesPackedInt Function(Int8, Int16),
- Struct3BytesPackedInt Function(
- int, int)>("ReturnStruct3BytesPackedInt", isLeaf: true);
-
-/// Small struct with mis-aligned member.
-void testReturnStruct3BytesPackedIntLeaf() {
- int a0;
- int a1;
-
- a0 = -1;
- a1 = 2;
-
- final result = returnStruct3BytesPackedIntLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
-}
-
-final returnStruct8BytesPackedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesPackedInt Function(Uint8, Uint32, Uint8, Uint8, Uint8),
- Struct8BytesPackedInt Function(
- int, int, int, int, int)>("ReturnStruct8BytesPackedInt", isLeaf: true);
-
-/// Struct with mis-aligned member.
-void testReturnStruct8BytesPackedIntLeaf() {
- int a0;
- int a1;
- int a2;
- int a3;
- int a4;
-
- a0 = 1;
- a1 = 2;
- a2 = 3;
- a3 = 4;
- a4 = 5;
-
- final result = returnStruct8BytesPackedIntLeaf(a0, a1, a2, a3, a4);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
- Expect.equals(a3, result.a3);
- Expect.equals(a4, result.a4);
-}
-
-final returnStruct9BytesPackedMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct9BytesPackedMixed Function(Uint8, Double),
- Struct9BytesPackedMixed Function(
- int, double)>("ReturnStruct9BytesPackedMixed", isLeaf: true);
-
-/// Struct with mis-aligned member.
-/// Tests backfilling of CPU and FPU registers.
-void testReturnStruct9BytesPackedMixedLeaf() {
- int a0;
- double a1;
-
- a0 = 1;
- a1 = 2.0;
-
- final result = returnStruct9BytesPackedMixedLeaf(a0, a1);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.approxEquals(a1, result.a1);
-}
-
-final returnUnion4BytesMixedLeaf = ffiTestFunctions.lookupFunction<
- Union4BytesMixed Function(Uint32),
- Union4BytesMixed Function(int)>("ReturnUnion4BytesMixed", isLeaf: true);
-
-/// Returning a mixed integer/float union.
-void testReturnUnion4BytesMixedLeaf() {
- int a0;
-
- a0 = 1;
-
- final result = returnUnion4BytesMixedLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
-}
-
-final returnUnion8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
- Union8BytesNestedFloat Function(Double),
- Union8BytesNestedFloat Function(
- double)>("ReturnUnion8BytesNestedFloat", isLeaf: true);
-
-/// Returning a floating point only union.
-void testReturnUnion8BytesNestedFloatLeaf() {
- double a0;
-
- a0 = -1.0;
-
- final result = returnUnion8BytesNestedFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(a0, result.a0);
-}
-
-final returnUnion9BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Union9BytesNestedInt Function(Struct8BytesInt),
- Union9BytesNestedInt Function(
- Struct8BytesInt)>("ReturnUnion9BytesNestedInt", isLeaf: true);
-
-/// Returning a mixed-size union.
-void testReturnUnion9BytesNestedIntLeaf() {
- final a0Pointer = calloc<Struct8BytesInt>();
- final Struct8BytesInt a0 = a0Pointer.ref;
-
- a0.a0 = -1;
- a0.a1 = 2;
- a0.a2 = -3;
-
- final result = returnUnion9BytesNestedIntLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0.a0, result.a0.a0);
- Expect.equals(a0.a1, result.a0.a1);
- Expect.equals(a0.a2, result.a0.a2);
-
- calloc.free(a0Pointer);
-}
-
-final returnUnion16BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
- Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat),
- Union16BytesNestedFloat Function(Struct8BytesHomogeneousFloat)>(
- "ReturnUnion16BytesNestedFloat",
- isLeaf: true);
-
-/// Returning union with homogenous floats.
-void testReturnUnion16BytesNestedFloatLeaf() {
- final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2.0;
-
- final result = returnUnion16BytesNestedFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(a0.a0, result.a0.a0);
- Expect.approxEquals(a0.a1, result.a0.a1);
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
- Struct1ByteInt Function(Struct1ByteInt),
- Struct1ByteInt Function(
- Struct1ByteInt)>("ReturnStructArgumentStruct1ByteInt", isLeaf: true);
-
-/// 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 testReturnStructArgumentStruct1ByteIntLeaf() {
- final a0Pointer = calloc<Struct1ByteInt>();
- final Struct1ByteInt a0 = a0Pointer.ref;
-
- a0.a0 = -1;
-
- final result = returnStructArgumentStruct1ByteIntLeaf(a0);
-
- print("result = $result");
-
- Expect.equals(a0.a0, result.a0);
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentInt32x8Struct1ByteIntLeaf =
- ffiTestFunctions
- .lookupFunction<
- Struct1ByteInt Function(Int32, Int32, Int32, Int32, Int32, Int32,
- Int32, Int32, Struct1ByteInt),
- Struct1ByteInt Function(
- int, int, int, int, int, int, int, int, Struct1ByteInt)>(
- "ReturnStructArgumentInt32x8Struct1ByteInt",
- isLeaf: true);
-
-/// Test that a struct passed in as argument can be returned.
-/// Especially for ffi callbacks.
-/// Struct is passed on stack on all ABIs.
-void testReturnStructArgumentInt32x8Struct1ByteIntLeaf() {
- 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 = returnStructArgumentInt32x8Struct1ByteIntLeaf(
- a0, a1, a2, a3, a4, a5, a6, a7, a8);
-
- print("result = $result");
-
- Expect.equals(a8.a0, result.a0);
-
- calloc.free(a8Pointer);
-}
-
-final returnStructArgumentStruct8BytesHomogeneousFloatLeaf =
- ffiTestFunctions.lookupFunction<
- Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat),
- Struct8BytesHomogeneousFloat Function(
- Struct8BytesHomogeneousFloat)>(
- "ReturnStructArgumentStruct8BytesHomogeneousFloat",
- isLeaf: true);
-
-/// 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 testReturnStructArgumentStruct8BytesHomogeneousFloatLeaf() {
- final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
- final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;
-
- a0.a0 = -1.0;
- a0.a1 = 2.0;
-
- final result = returnStructArgumentStruct8BytesHomogeneousFloatLeaf(a0);
-
- print("result = $result");
-
- Expect.approxEquals(a0.a0, result.a0);
- Expect.approxEquals(a0.a1, result.a1);
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentStruct20BytesHomogeneousInt32Leaf =
- ffiTestFunctions
- .lookupFunction<
- Struct20BytesHomogeneousInt32 Function(
- Struct20BytesHomogeneousInt32),
- Struct20BytesHomogeneousInt32 Function(
- Struct20BytesHomogeneousInt32)>(
- "ReturnStructArgumentStruct20BytesHomogeneousInt32",
- isLeaf: true);
-
-/// On arm64, both argument and return value are passed in by pointer.
-void testReturnStructArgumentStruct20BytesHomogeneousInt32Leaf() {
- 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 = returnStructArgumentStruct20BytesHomogeneousInt32Leaf(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);
-}
-
-final returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf =
- ffiTestFunctions.lookupFunction<
- Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32,
- Int32, Int32, Int32, Int32, Struct20BytesHomogeneousInt32),
- Struct20BytesHomogeneousInt32 Function(int, int, int, int, int, int,
- int, int, Struct20BytesHomogeneousInt32)>(
- "ReturnStructArgumentInt32x8Struct20BytesHomogeneou",
- isLeaf: true);
-
-/// On arm64, both argument and return value are passed in by pointer.
-/// Ints exhaust registers, so that pointer is passed on stack.
-void testReturnStructArgumentInt32x8Struct20BytesHomogeneouLeaf() {
- 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 = returnStructArgumentInt32x8Struct20BytesHomogeneouLeaf(
- 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);
-}
-
-final returnStructArgumentStruct8BytesInlineArrayIntLeaf =
- ffiTestFunctions.lookupFunction<
- Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt),
- Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt)>(
- "ReturnStructArgumentStruct8BytesInlineArrayInt",
- isLeaf: true);
-
-/// Test returning struct with inline array.
-void testReturnStructArgumentStruct8BytesInlineArrayIntLeaf() {
- 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 = returnStructArgumentStruct8BytesInlineArrayIntLeaf(a0);
-
- print("result = $result");
-
- for (int i = 0; i < 8; i++) {
- Expect.equals(a0.a0[i], result.a0[i]);
- }
-
- calloc.free(a0Pointer);
-}
-
-final returnStructArgumentStructStruct16BytesHomogeneousLeaf =
- ffiTestFunctions.lookupFunction<
- StructStruct16BytesHomogeneousFloat2 Function(
- StructStruct16BytesHomogeneousFloat2),
- StructStruct16BytesHomogeneousFloat2 Function(
- StructStruct16BytesHomogeneousFloat2)>(
- "ReturnStructArgumentStructStruct16BytesHomogeneous",
- isLeaf: true);
-
-/// Return value in FPU registers on arm hardfp and arm64.
-void testReturnStructArgumentStructStruct16BytesHomogeneousLeaf() {
- 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 = returnStructArgumentStructStruct16BytesHomogeneousLeaf(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);
-}
-
-final returnStructArgumentStructStruct32BytesHomogeneousLeaf =
- ffiTestFunctions.lookupFunction<
- StructStruct32BytesHomogeneousDouble2 Function(
- StructStruct32BytesHomogeneousDouble2),
- StructStruct32BytesHomogeneousDouble2 Function(
- StructStruct32BytesHomogeneousDouble2)>(
- "ReturnStructArgumentStructStruct32BytesHomogeneous",
- isLeaf: true);
-
-/// Return value in FPU registers on arm64.
-void testReturnStructArgumentStructStruct32BytesHomogeneousLeaf() {
- 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 = returnStructArgumentStructStruct32BytesHomogeneousLeaf(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);
-}
-
-final returnStructArgumentStructStruct16BytesMixed3Leaf =
- ffiTestFunctions.lookupFunction<
- StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3),
- StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3)>(
- "ReturnStructArgumentStructStruct16BytesMixed3",
- isLeaf: true);
-
-/// On x64 Linux, return value is split over FP and int registers.
-void testReturnStructArgumentStructStruct16BytesMixed3Leaf() {
- 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 = returnStructArgumentStructStruct16BytesMixed3Leaf(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);
-}
-
-final returnStructAlignmentInt16Leaf = ffiTestFunctions.lookupFunction<
- StructAlignmentInt16 Function(Int8, Int16, Int8),
- StructAlignmentInt16 Function(
- int, int, int)>("ReturnStructAlignmentInt16", isLeaf: true);
-
-/// Test alignment and padding of 16 byte int within struct.
-void testReturnStructAlignmentInt16Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStructAlignmentInt16Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStructAlignmentInt32Leaf = ffiTestFunctions.lookupFunction<
- StructAlignmentInt32 Function(Int8, Int32, Int8),
- StructAlignmentInt32 Function(
- int, int, int)>("ReturnStructAlignmentInt32", isLeaf: true);
-
-/// Test alignment and padding of 32 byte int within struct.
-void testReturnStructAlignmentInt32Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStructAlignmentInt32Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStructAlignmentInt64Leaf = ffiTestFunctions.lookupFunction<
- StructAlignmentInt64 Function(Int8, Int64, Int8),
- StructAlignmentInt64 Function(
- int, int, int)>("ReturnStructAlignmentInt64", isLeaf: true);
-
-/// Test alignment and padding of 64 byte int within struct.
-void testReturnStructAlignmentInt64Leaf() {
- int a0;
- int a1;
- int a2;
-
- a0 = -1;
- a1 = 2;
- a2 = -3;
-
- final result = returnStructAlignmentInt64Leaf(a0, a1, a2);
-
- print("result = $result");
-
- Expect.equals(a0, result.a0);
- Expect.equals(a1, result.a1);
- Expect.equals(a2, result.a2);
-}
-
-final returnStruct8BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedInt Function(
- Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16),
- Struct8BytesNestedInt Function(
- Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16)>(
- "ReturnStruct8BytesNestedInt",
- isLeaf: true);
-
-/// Simple nested struct.
-void testReturnStruct8BytesNestedIntLeaf() {
- 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 = returnStruct8BytesNestedIntLeaf(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);
-}
-
-final returnStruct8BytesNestedFloatLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedFloat Function(Struct4BytesFloat, Struct4BytesFloat),
- Struct8BytesNestedFloat Function(Struct4BytesFloat,
- Struct4BytesFloat)>("ReturnStruct8BytesNestedFloat", isLeaf: true);
-
-/// Simple nested struct with floats.
-void testReturnStruct8BytesNestedFloatLeaf() {
- 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 = returnStruct8BytesNestedFloatLeaf(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);
-}
-
-final returnStruct8BytesNestedFloat2Leaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedFloat2 Function(Struct4BytesFloat, Float),
- Struct8BytesNestedFloat2 Function(Struct4BytesFloat,
- double)>("ReturnStruct8BytesNestedFloat2", isLeaf: true);
-
-/// The nesting is irregular, testing homogenous float rules on arm and arm64,
-/// and the fpu register usage on x64.
-void testReturnStruct8BytesNestedFloat2Leaf() {
- final a0Pointer = calloc<Struct4BytesFloat>();
- final Struct4BytesFloat a0 = a0Pointer.ref;
- double a1;
-
- a0.a0 = -1.0;
- a1 = 2.0;
-
- final result = returnStruct8BytesNestedFloat2Leaf(a0, a1);
-
- print("result = $result");
-
- Expect.approxEquals(a0.a0, result.a0.a0);
- Expect.approxEquals(a1, result.a1);
-
- calloc.free(a0Pointer);
-}
-
-final returnStruct8BytesNestedMixedLeaf = ffiTestFunctions.lookupFunction<
- Struct8BytesNestedMixed Function(
- Struct4BytesHomogeneousInt16, Struct4BytesFloat),
- Struct8BytesNestedMixed Function(Struct4BytesHomogeneousInt16,
- Struct4BytesFloat)>("ReturnStruct8BytesNestedMixed", isLeaf: true);
-
-/// Simple nested struct with mixed members.
-void testReturnStruct8BytesNestedMixedLeaf() {
- 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 = returnStruct8BytesNestedMixedLeaf(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);
-}
-
-final returnStruct16BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct16BytesNestedInt Function(
- Struct8BytesNestedInt, Struct8BytesNestedInt),
- Struct16BytesNestedInt Function(Struct8BytesNestedInt,
- Struct8BytesNestedInt)>("ReturnStruct16BytesNestedInt", isLeaf: true);
-
-/// Deeper nested struct to test recursive member access.
-void testReturnStruct16BytesNestedIntLeaf() {
- 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 = returnStruct16BytesNestedIntLeaf(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);
-}
-
-final returnStruct32BytesNestedIntLeaf = ffiTestFunctions.lookupFunction<
- Struct32BytesNestedInt Function(
- Struct16BytesNestedInt, Struct16BytesNestedInt),
- Struct32BytesNestedInt Function(Struct16BytesNestedInt,
- Struct16BytesNestedInt)>("ReturnStruct32BytesNestedInt", isLeaf: true);
-
-/// Even deeper nested struct to test recursive member access.
-void testReturnStruct32BytesNestedIntLeaf() {
- 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 = returnStruct32BytesNestedIntLeaf(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);
-}
-
-final returnStructNestedIntStructAlignmentInt16Leaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIntStructAlignmentInt16 Function(
- StructAlignmentInt16, StructAlignmentInt16),
- StructNestedIntStructAlignmentInt16 Function(
- StructAlignmentInt16, StructAlignmentInt16)>(
- "ReturnStructNestedIntStructAlignmentInt16",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 16 byte int.
-void testReturnStructNestedIntStructAlignmentInt16Leaf() {
- 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 = returnStructNestedIntStructAlignmentInt16Leaf(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);
-}
-
-final returnStructNestedIntStructAlignmentInt32Leaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIntStructAlignmentInt32 Function(
- StructAlignmentInt32, StructAlignmentInt32),
- StructNestedIntStructAlignmentInt32 Function(
- StructAlignmentInt32, StructAlignmentInt32)>(
- "ReturnStructNestedIntStructAlignmentInt32",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 32 byte int.
-void testReturnStructNestedIntStructAlignmentInt32Leaf() {
- 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 = returnStructNestedIntStructAlignmentInt32Leaf(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);
-}
-
-final returnStructNestedIntStructAlignmentInt64Leaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIntStructAlignmentInt64 Function(
- StructAlignmentInt64, StructAlignmentInt64),
- StructNestedIntStructAlignmentInt64 Function(
- StructAlignmentInt64, StructAlignmentInt64)>(
- "ReturnStructNestedIntStructAlignmentInt64",
- isLeaf: true);
-
-/// Test alignment and padding of nested struct with 64 byte int.
-void testReturnStructNestedIntStructAlignmentInt64Leaf() {
- 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 = returnStructNestedIntStructAlignmentInt64Leaf(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);
-}
-
-final returnStructNestedIrregularEvenBiggerLeaf =
- ffiTestFunctions.lookupFunction<
- StructNestedIrregularEvenBigger Function(Uint64,
- StructNestedIrregularBigger, StructNestedIrregularBigger, Double),
- StructNestedIrregularEvenBigger Function(
- int,
- StructNestedIrregularBigger,
- StructNestedIrregularBigger,
- double)>("ReturnStructNestedIrregularEvenBigger", isLeaf: true);
-
-/// Return big irregular struct as smoke test.
-void testReturnStructNestedIrregularEvenBiggerLeaf() {
- 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 = returnStructNestedIrregularEvenBiggerLeaf(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);
-}
diff --git a/tests/ffi_2/inline_array_multi_dimensional_test.dart b/tests/ffi_2/inline_array_multi_dimensional_test.dart
index 08a5e44..d3a7b40 100644
--- a/tests/ffi_2/inline_array_multi_dimensional_test.dart
+++ b/tests/ffi_2/inline_array_multi_dimensional_test.dart
@@ -11,8 +11,8 @@
import "package:expect/expect.dart";
import 'package:ffi/ffi.dart';
-// Reuse struct definitions.
-import 'function_structs_by_value_generated_test.dart';
+// Reuse compound definitions.
+import 'function_structs_by_value_generated_compounds.dart';
void main() {
testSizeOf();
diff --git a/tests/ffi_2/inline_array_test.dart b/tests/ffi_2/inline_array_test.dart
index 70872c3..f3ff6ba 100644
--- a/tests/ffi_2/inline_array_test.dart
+++ b/tests/ffi_2/inline_array_test.dart
@@ -11,8 +11,8 @@
import "package:expect/expect.dart";
import 'package:ffi/ffi.dart';
-// Reuse struct definitions.
-import 'function_structs_by_value_generated_test.dart';
+// Reuse compound definitions.
+import 'function_structs_by_value_generated_compounds.dart';
void main() {
testSizeOf();
diff --git a/tests/ffi_2/structs_packed_test.dart b/tests/ffi_2/structs_packed_test.dart
index b50e10c..6834ee7 100644
--- a/tests/ffi_2/structs_packed_test.dart
+++ b/tests/ffi_2/structs_packed_test.dart
@@ -12,8 +12,8 @@
import 'dylib_utils.dart';
-// Reuse struct definitions.
-import 'function_structs_by_value_generated_test.dart';
+// Reuse compound definitions.
+import 'function_structs_by_value_generated_compounds.dart';
void main() {
testSizeOfC();
diff --git a/tools/VERSION b/tools/VERSION
index cfac96c..80892437 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 15
PATCH 0
-PRERELEASE 220
+PRERELEASE 221
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 50a38bb..bf28d56 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -122,6 +122,12 @@
const-functions:
help: "Allow more of the Dart language to be executed in const expressions."
+ enhanced-enums:
+ help: "Enhanced Enums"
+
+ named-arguments-anywhere:
+ help: "Named Arguments Anywhere"
+
# Experiment flag only used for testing.
test-experiment:
help: >-