mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:17:14 +00:00
f18c1bfb84
https://dart-review.googlesource.com/c/sdk/+/198281 introduced support for incremental compilation to the FfiTransform. This included reading fields from already transformed structs and unions. However, fields which already had been transformed are indistinguishable from user-defined getters. So instead of re-reading the information from the fields, for already transformed structs, we read the information from the `vm:ffi:struct-fields` pragma on the struct class. Closes: https://github.com/dart-lang/sdk/issues/46004 TEST=tests/ffi/regress_46004_test.dart TEST=pkg/front_end/testcases/incremental/regress_46004.yaml Change-Id: Iebffda037913e71349bba9685dc16e2f478a0e7b Cq-Include-Trybots: luci.dart.try:vm-kernel-win-debug-x64-try,front-end-nnbd-linux-release-x64-try,front-end-linux-release-x64-try,vm-ffi-android-debug-arm64-try,vm-precomp-ffi-qemu-linux-release-arm-try Fixed: 46004 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/200640 Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Clement Skau <cskau@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
29 lines
884 B
Dart
29 lines
884 B
Dart
// 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.
|
|
|
|
import 'dart:ffi';
|
|
|
|
import "package:expect/expect.dart";
|
|
import "package:ffi/ffi.dart";
|
|
|
|
class COMObject extends Struct {
|
|
external Pointer<IntPtr> lpVtbl;
|
|
|
|
// This should not be interpreted as a native field.
|
|
Pointer<IntPtr> get vtable => Pointer.fromAddress(lpVtbl.value);
|
|
}
|
|
|
|
void main() {
|
|
Expect.equals(sizeOf<Pointer>(), sizeOf<COMObject>());
|
|
|
|
final comObjectPointer = calloc<COMObject>();
|
|
final vTablePointer = calloc<IntPtr>();
|
|
vTablePointer.value = 1234;
|
|
final comObject = comObjectPointer.ref;
|
|
comObject.lpVtbl = vTablePointer;
|
|
Expect.equals(1234, comObject.vtable.address);
|
|
calloc.free(comObjectPointer);
|
|
calloc.free(vTablePointer);
|
|
}
|