| // 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 tests the non trampoline aspects of nested structs. | |
| // | |
| // SharedObjects=ffi_test_functions | |
| import 'dart:ffi'; | |
| import "package:expect/expect.dart"; | |
| import "package:ffi/ffi.dart"; | |
| import 'dylib_utils.dart'; | |
| final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions"); | |
| void main() { | |
| for (int i = 0; i < 10; ++i) { | |
| testSizeOf(); | |
| testAllocate(); | |
| testRead(); | |
| testWrite(); | |
| testCopy(); | |
| } | |
| } | |
| final class Struct4BytesHomogeneousInt16 extends Struct { | |
| @Int16() | |
| external int a0; | |
| @Int16() | |
| external int a1; | |
| String toString() => "(${a0}, ${a1})"; | |
| } | |
| final class Struct8BytesNestedInt extends Struct { | |
| external Struct4BytesHomogeneousInt16 a0; | |
| external Struct4BytesHomogeneousInt16 a1; | |
| String toString() => "(${a0}, ${a1})"; | |
| } | |
| void testSizeOf() { | |
| print(sizeOf<Struct8BytesNestedInt>()); | |
| Expect.equals(8, sizeOf<Struct8BytesNestedInt>()); | |
| } | |
| void testAllocate() { | |
| final p = calloc<Struct8BytesNestedInt>(); | |
| Expect.type<Pointer<Struct8BytesNestedInt>>(p); | |
| print(p); | |
| calloc.free(p); | |
| } | |
| /// Test that reading does not segfault, even uninitialized. | |
| void testRead() { | |
| print("read"); | |
| final p = calloc<Struct8BytesNestedInt>(); | |
| print(p); | |
| print(p.ref.runtimeType); | |
| print(p.address); | |
| print(p.ref.a0.runtimeType); | |
| print(p.ref.a0.a0); | |
| calloc.free(p); | |
| print("read"); | |
| } | |
| void testWrite() { | |
| print("write"); | |
| final p = calloc<Struct8BytesNestedInt>(2); | |
| p[0].a0.a0 = 12; | |
| p[0].a0.a1 = 13; | |
| p[0].a1.a0 = 14; | |
| p[0].a1.a1 = 15; | |
| p[1].a0.a0 = 16; | |
| p[1].a0.a1 = 17; | |
| p[1].a1.a0 = 18; | |
| p[1].a1.a1 = 19; | |
| Expect.equals(12, p[0].a0.a0); | |
| Expect.equals(13, p[0].a0.a1); | |
| Expect.equals(14, p[0].a1.a0); | |
| Expect.equals(15, p[0].a1.a1); | |
| Expect.equals(16, p[1].a0.a0); | |
| Expect.equals(17, p[1].a0.a1); | |
| Expect.equals(18, p[1].a1.a0); | |
| Expect.equals(19, p[1].a1.a1); | |
| calloc.free(p); | |
| print("written"); | |
| } | |
| void testCopy() { | |
| print("copy"); | |
| final p = calloc<Struct8BytesNestedInt>(); | |
| p.ref.a0.a0 = 12; | |
| p.ref.a0.a1 = 13; | |
| p.ref.a1 = p.ref.a0; | |
| Expect.equals(12, p.ref.a1.a0); | |
| Expect.equals(13, p.ref.a1.a1); | |
| calloc.free(p); | |
| print("copied"); | |
| } |