blob: 30542077f2d9bd753fe86304826d610016424306 [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// SharedObjects=ffi_test_functions
import 'dart:ffi';
import 'package:expect/expect.dart';
import 'dylib_utils.dart';
final class Struct9Uint8 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})';
}
typedef Callback = Struct9Uint8 Function(Pointer<Struct9Uint8> s9);
Struct9Uint8 returnStruct9(Pointer<Struct9Uint8> s9) {
return s9.ref;
}
void main() {
final ffiTestFunctions = dlopenPlatformSpecific('ffi_test_functions');
final alloc = ffiTestFunctions.lookupFunction<
Pointer<Struct9Uint8> Function(),
Pointer<Struct9Uint8> Function()>('AllocStruct9Uint8');
final sum = ffiTestFunctions.lookupFunction<Int64 Function(Struct9Uint8),
int Function(Struct9Uint8)>('SumStruct9Uint8');
final sumReturnStruct9 = ffiTestFunctions.lookupFunction<
Int64 Function(Pointer<NativeFunction<Callback>>, Pointer<Struct9Uint8>),
int Function(Pointer<NativeFunction<Callback>>,
Pointer<Struct9Uint8>)>('SumReturnStruct9Uint8');
final free = ffiTestFunctions.lookupFunction<
Void Function(Pointer<Struct9Uint8>),
void Function(Pointer<Struct9Uint8>)>('FreeStruct9Uint8');
final array = alloc();
Struct9Uint8 s9 = array[64 * 1024 - 1]; // At the end of a page.
Pointer<Struct9Uint8> s9Pointer = array + 64 * 1024 - 1;
s9.a0 = 1;
s9.a1 = 2;
s9.a2 = 3;
s9.a3 = 4;
s9.a4 = 5;
s9.a5 = 6;
s9.a6 = 7;
s9.a7 = 8;
s9.a8 = 9;
// sizeof and alignof Struct9Uint8 are not a multiple of the word size. The
// marshaller must not access the last member as a full word load, which could
// fault.
int result = sum(s9);
Expect.equals(45, result);
// Also on the return path.
final callback = Pointer.fromFunction<Callback>(returnStruct9);
result = sumReturnStruct9(callback, s9Pointer);
Expect.equals(45, result);
free(array);
}