| // Copyright (c) 2019, 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. |
| |
| // @dart = 2.9 |
| |
| import 'dart:ffi'; |
| |
| import "package:expect/expect.dart"; |
| import "package:ffi/ffi.dart"; |
| |
| main(List<String> arguments) { |
| for (int i = 0; i < 100; i++) { |
| testStoreLoad(); |
| testReifiedGeneric(); |
| testCompoundLoadAndStore(); |
| } |
| } |
| |
| testStoreLoad() { |
| final p = calloc<Int8>(2); |
| p.value = 10; |
| Expect.equals(10, p.value); |
| p[1] = 20; |
| Expect.equals(20, p[1]); |
| if (sizeOf<IntPtr>() == 4) { |
| // Test round tripping. |
| Expect.equals(20, p.elementAt(0x100000001).value); |
| Expect.equals(20, p[0x100000001]); |
| } |
| |
| // Test negative index. |
| final pUseNegative = p.elementAt(1); |
| Expect.equals(10, pUseNegative[-1]); |
| |
| final p1 = calloc<Double>(2); |
| p1.value = 10.0; |
| Expect.approxEquals(10.0, p1.value); |
| p1[1] = 20.0; |
| Expect.approxEquals(20.0, p1[1]); |
| calloc.free(p1); |
| |
| final p2 = calloc<Pointer<Int8>>(2); |
| p2.value = p; |
| Expect.equals(p, p2.value); |
| p2[1] = p; |
| Expect.equals(p, p2[1]); |
| calloc.free(p2); |
| calloc.free(p); |
| |
| final p3 = calloc<Foo>(); |
| Foo foo = p3.ref; |
| foo.a = 1; |
| Expect.equals(1, foo.a); |
| calloc.free(p3); |
| |
| final p4 = calloc<Foo>(2); |
| Foo src = p4[1]; |
| src.a = 2; |
| p4.ref = src; |
| Foo dst = p4.ref; |
| Expect.equals(2, dst.a); |
| calloc.free(p4); |
| } |
| |
| testReifiedGeneric() { |
| final p = calloc<Pointer<Int8>>(); |
| Pointer<Pointer<NativeType>> p2 = p; |
| Expect.isTrue(p2.value is Pointer<Int8>); |
| calloc.free(p); |
| } |
| |
| testCompoundLoadAndStore() { |
| final foos = calloc<Foo>(10); |
| final reference = foos.ref..a = 10; |
| |
| for (var i = 1; i < 9; i++) { |
| foos[i] = reference; |
| Expect.isTrue(foos[i].a == 10); |
| |
| foos.elementAt(i).ref = reference; |
| Expect.isTrue(foos.elementAt(i).ref.a == 10); |
| } |
| |
| final bars = calloc<Bar>(10); |
| bars[0].foo = reference; |
| |
| for (var i = 1; i < 9; i++) { |
| bars[i] = bars[0]; |
| Expect.isTrue(bars.elementAt(i).ref.foo.a == 10); |
| } |
| |
| calloc.free(foos); |
| calloc.free(bars); |
| } |
| |
| class Foo extends Struct { |
| @Int8() |
| int a; |
| } |
| |
| class Bar extends Union { |
| Foo foo; |
| @Int32() |
| int baz; |
| } |