| // 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); |
| } |