Version 2.14.0-83.0.dev
Merge commit 'cc1f9b9564144ca5d40bbe21b88acfcd461cf56a' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index b813027..e4dbd47 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -41,9 +41,11 @@
LibraryDependency,
LibraryPart,
Name,
+ NamedNode,
NonNullableByDefaultCompiledMode,
Procedure,
ProcedureKind,
+ Reference,
ReturnStatement,
Source,
Supertype,
@@ -126,6 +128,8 @@
import 'uri_translator.dart' show UriTranslator;
+final Uri dartFfiUri = Uri.parse("dart:ffi");
+
class IncrementalCompiler implements IncrementalKernelGenerator {
final CompilerContext context;
@@ -998,6 +1002,20 @@
}
}
+ bool _importsFfi() {
+ if (userBuilders == null) return false;
+ final Uri dartFfiUri = Uri.parse("dart:ffi");
+ for (LibraryBuilder builder in userBuilders.values) {
+ Library lib = builder.library;
+ for (LibraryDependency dependency in lib.dependencies) {
+ if (dependency.targetLibrary.importUri == dartFfiUri) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
/// Figure out if we can (and was asked to) do experimental invalidation.
/// Note that this returns (future or) [null] if we're not doing experimental
/// invalidation.
@@ -1071,6 +1089,9 @@
}
}
+ // Special case mixins: Because the VM mixin transformation inlines
+ // procedures, if the changed file is used as a mixin anywhere else
+ // we can't only recompile the changed file.
// TODO(jensj): Check for mixins in a smarter and faster way.
for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
if (missingSources.contains(builder.fileUri)) {
@@ -1094,6 +1115,37 @@
}
}
+ // Special case FFI: Because the VM ffi transformation inlines
+ // size and position, if the changed file contains ffi structs
+ // we can't only recompile the changed file.
+ // TODO(jensj): Come up with something smarter for this. E.g. we might
+ // check if the FFI-classes are used in other libraries, or as actual nested
+ // structures in other FFI-classes etc.
+ // Alternatively (https://github.com/dart-lang/sdk/issues/45899) we might
+ // do something else entirely that doesn't require special handling.
+ if (_importsFfi()) {
+ for (LibraryBuilder builder in rebuildBodies) {
+ Library lib = builder.library;
+ for (LibraryDependency dependency in lib.dependencies) {
+ Library importLibrary = dependency.targetLibrary;
+ if (importLibrary.importUri == dartFfiUri) {
+ // Explicitly imports dart:ffi.
+ return null;
+ }
+ for (Reference exportReference in importLibrary.additionalExports) {
+ NamedNode export = exportReference.node;
+ if (export is Class) {
+ Class c = export;
+ if (c.enclosingLibrary.importUri == dartFfiUri) {
+ // Implicitly imports a dart:ffi class.
+ return null;
+ }
+ }
+ }
+ }
+ }
+ }
+
originalNotReusedLibraries = new Set<LibraryBuilder>();
Set<Uri> seenUris = new Set<Uri>();
for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index a4ee9b7..42782a9 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -573,6 +573,7 @@
init
initializations
initializer's
+inlines
insertion
inspect
inspecting
@@ -962,6 +963,7 @@
receivers
recheck
recognizing
+recompile
recompiled
recompiling
recompute
@@ -1145,6 +1147,7 @@
strict
stringified
stringify
+structs
structures
stub
stubs
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
index 211fe88..e422ff5 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
@@ -3,7 +3,8 @@
# BSD-style license that can be found in the LICENSE.md file.
# Compile an application, change a file, but don't change the outline.
-# Test FFI compilation.
+# Test FFI compilation. Because FFI is special we can't expect to only
+# compile the changed files.
type: newworld
worlds:
@@ -78,4 +79,4 @@
}
}
expectedLibraryCount: 2
- expectsRebuildBodiesOnly: true
+ expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml
new file mode 100644
index 0000000..03f9511a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml
@@ -0,0 +1,55 @@
+# 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.md file.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+
+type: newworld
+worlds:
+ - entry: main.dart
+ experiments: alternative-invalidation-strategy,non-nullable
+ sources:
+ main.dart: |
+ import "dart:ffi";
+ import 'lib.dart';
+ class X extends Struct {
+ external Y x1;
+ external Y x2;
+ @Uint8()
+ external int x3;
+ }
+ lib.dart: |
+ import 'dart:ffi';
+ class Y extends Struct {
+ @Uint8()
+ external int y1;
+ @Uint8()
+ external int y2;
+ @Uint64()
+ external int y3;
+ }
+ expectedLibraryCount: 2
+
+ - entry: main.dart
+ experiments: alternative-invalidation-strategy,non-nullable
+ worldType: updated
+ expectInitializeFromDill: false
+ invalidate:
+ - lib.dart
+ sources:
+ lib.dart: |
+ import 'dart:ffi';
+ class Y extends Struct {
+ @Uint8()
+ external int y1;
+ @Uint64()
+ external int y3;
+ @Uint8()
+ external int y2;
+ }
+ expectedLibraryCount: 2
+ # The FFI transformation have to update the size and position of containers
+ # (i.e. other structs with this Struct inside), so rebuilding only the
+ # changed library doesn't work.
+ expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..6563e60
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+ import "dart:ffi";
+
+ @#C7
+ class Y extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → lib::Y
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ @#C11
+ get y1() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y1(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C11
+ get y2() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y2(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C16
+ get y3() → dart.core::int
+ return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C16
+ set y3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "dart:ffi";
+ import "org-dartlang-test:///lib.dart";
+
+ @#C23
+ class X extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → main::X
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ get x1() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x1(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ get x2() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x2(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ get x3() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set x3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+constants {
+ #C1 = "vm:ffi:struct-fields"
+ #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+ #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+ #C4 = <dart.core::Type>[#C2, #C2, #C3]
+ #C5 = null
+ #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+ #C7 = dart.core::pragma {name:#C1, options:#C6}
+ #C8 = 16
+ #C9 = 12
+ #C10 = <dart.core::int*>[#C8, #C9, #C8]
+ #C11 = dart.ffi::Uint8 {}
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 1
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = dart.ffi::Uint64 {}
+ #C17 = 8
+ #C18 = 4
+ #C19 = <dart.core::int*>[#C17, #C18, #C17]
+ #C20 = TypeLiteralConstant(lib::Y)
+ #C21 = <dart.core::Type>[#C20, #C20, #C2]
+ #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+ #C23 = dart.core::pragma {name:#C1, options:#C22}
+ #C24 = 40
+ #C25 = 28
+ #C26 = <dart.core::int*>[#C24, #C25, #C24]
+ #C27 = 32
+ #C28 = 24
+ #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..8713870
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+ import "dart:ffi";
+
+ @#C7
+ class Y extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → lib::Y
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ @#C11
+ get y1() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y1(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C14
+ get y3() → dart.core::int
+ return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C14
+ set y3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C11
+ get y2() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y2(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "dart:ffi";
+ import "org-dartlang-test:///lib.dart";
+
+ @#C23
+ class X extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → main::X
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ get x1() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x1(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ get x2() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x2(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ get x3() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set x3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+constants {
+ #C1 = "vm:ffi:struct-fields"
+ #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+ #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+ #C4 = <dart.core::Type>[#C2, #C3, #C2]
+ #C5 = null
+ #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+ #C7 = dart.core::pragma {name:#C1, options:#C6}
+ #C8 = 24
+ #C9 = 16
+ #C10 = <dart.core::int*>[#C8, #C9, #C8]
+ #C11 = dart.ffi::Uint8 {}
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = dart.ffi::Uint64 {}
+ #C15 = 8
+ #C16 = 4
+ #C17 = <dart.core::int*>[#C15, #C16, #C15]
+ #C18 = 12
+ #C19 = <dart.core::int*>[#C9, #C18, #C9]
+ #C20 = TypeLiteralConstant(lib::Y)
+ #C21 = <dart.core::Type>[#C20, #C20, #C2]
+ #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+ #C23 = dart.core::pragma {name:#C1, options:#C22}
+ #C24 = 56
+ #C25 = 36
+ #C26 = <dart.core::int*>[#C24, #C25, #C24]
+ #C27 = 48
+ #C28 = 32
+ #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml
new file mode 100644
index 0000000..7f7cdad
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml
@@ -0,0 +1,64 @@
+# 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.md file.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+# This test initializes from dill.
+
+type: newworld
+worlds:
+ - entry: main.dart
+ experiments: alternative-invalidation-strategy,non-nullable
+ sources:
+ main.dart: |
+ import "dart:ffi";
+ import 'lib.dart';
+ class X extends Struct {
+ external Y x1;
+ external Y x2;
+ @Uint8()
+ external int x3;
+ }
+ lib.dart: |
+ import 'dart:ffi';
+ class Y extends Struct {
+ @Uint8()
+ external int y1;
+ @Uint8()
+ external int y2;
+ @Uint64()
+ external int y3;
+ }
+ expectedLibraryCount: 2
+
+ - entry: main.dart
+ experiments: alternative-invalidation-strategy,non-nullable
+ expectInitializeFromDill: true
+ invalidate:
+ - lib.dart
+ sources:
+ main.dart: |
+ import "dart:ffi";
+ import 'lib.dart';
+ class X extends Struct {
+ external Y x1;
+ external Y x2;
+ @Uint8()
+ external int x3;
+ }
+ lib.dart: |
+ import 'dart:ffi';
+ class Y extends Struct {
+ @Uint8()
+ external int y1;
+ @Uint64()
+ external int y3;
+ @Uint8()
+ external int y2;
+ }
+ expectedLibraryCount: 2
+ # The FFI transformation have to update the size and position of containers
+ # (i.e. other structs with this Struct inside), so rebuilding only the
+ # changed library doesn't work.
+ expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..6563e60
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+ import "dart:ffi";
+
+ @#C7
+ class Y extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → lib::Y
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ @#C11
+ get y1() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y1(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C11
+ get y2() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y2(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C16
+ get y3() → dart.core::int
+ return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C16
+ set y3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "dart:ffi";
+ import "org-dartlang-test:///lib.dart";
+
+ @#C23
+ class X extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → main::X
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ get x1() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x1(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ get x2() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x2(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ get x3() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set x3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+constants {
+ #C1 = "vm:ffi:struct-fields"
+ #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+ #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+ #C4 = <dart.core::Type>[#C2, #C2, #C3]
+ #C5 = null
+ #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+ #C7 = dart.core::pragma {name:#C1, options:#C6}
+ #C8 = 16
+ #C9 = 12
+ #C10 = <dart.core::int*>[#C8, #C9, #C8]
+ #C11 = dart.ffi::Uint8 {}
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 1
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = dart.ffi::Uint64 {}
+ #C17 = 8
+ #C18 = 4
+ #C19 = <dart.core::int*>[#C17, #C18, #C17]
+ #C20 = TypeLiteralConstant(lib::Y)
+ #C21 = <dart.core::Type>[#C20, #C20, #C2]
+ #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+ #C23 = dart.core::pragma {name:#C1, options:#C22}
+ #C24 = 40
+ #C25 = 28
+ #C26 = <dart.core::int*>[#C24, #C25, #C24]
+ #C27 = 32
+ #C28 = 24
+ #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..8713870
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+ import "dart:ffi";
+
+ @#C7
+ class Y extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → lib::Y
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ @#C11
+ get y1() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y1(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C14
+ get y3() → dart.core::int
+ return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C14
+ set y3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C11
+ get y2() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y2(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "dart:ffi";
+ import "org-dartlang-test:///lib.dart";
+
+ @#C23
+ class X extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → main::X
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ get x1() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x1(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ get x2() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x2(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ get x3() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set x3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+constants {
+ #C1 = "vm:ffi:struct-fields"
+ #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+ #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+ #C4 = <dart.core::Type>[#C2, #C3, #C2]
+ #C5 = null
+ #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+ #C7 = dart.core::pragma {name:#C1, options:#C6}
+ #C8 = 24
+ #C9 = 16
+ #C10 = <dart.core::int*>[#C8, #C9, #C8]
+ #C11 = dart.ffi::Uint8 {}
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = dart.ffi::Uint64 {}
+ #C15 = 8
+ #C16 = 4
+ #C17 = <dart.core::int*>[#C15, #C16, #C15]
+ #C18 = 12
+ #C19 = <dart.core::int*>[#C9, #C18, #C9]
+ #C20 = TypeLiteralConstant(lib::Y)
+ #C21 = <dart.core::Type>[#C20, #C20, #C2]
+ #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+ #C23 = dart.core::pragma {name:#C1, options:#C22}
+ #C24 = 56
+ #C25 = 36
+ #C26 = <dart.core::int*>[#C24, #C25, #C24]
+ #C27 = 48
+ #C28 = 32
+ #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml
new file mode 100644
index 0000000..025fb00
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml
@@ -0,0 +1,59 @@
+# 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.md file.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+
+type: newworld
+worlds:
+ - entry: main.dart
+ experiments: alternative-invalidation-strategy,non-nullable
+ sources:
+ main.dart: |
+ import "dart:ffi";
+ import 'lib.dart';
+ class X extends Struct {
+ external Y x1;
+ external Y x2;
+ @Uint8()
+ external int x3;
+ }
+ lib.dart: |
+ import 'lib2.dart';
+ class Y extends Struct {
+ @Uint8()
+ external int y1;
+ @Uint8()
+ external int y2;
+ @Uint64()
+ external int y3;
+ }
+ lib2.dart: |
+ export 'lib3.dart';
+ lib3.dart: |
+ export 'dart:ffi';
+ expectedLibraryCount: 4
+
+ - entry: main.dart
+ experiments: alternative-invalidation-strategy,non-nullable
+ worldType: updated
+ expectInitializeFromDill: false
+ invalidate:
+ - lib.dart
+ sources:
+ lib.dart: |
+ import 'lib2.dart';
+ class Y extends Struct {
+ @Uint8()
+ external int y1;
+ @Uint64()
+ external int y3;
+ @Uint8()
+ external int y2;
+ }
+ expectedLibraryCount: 4
+ # The FFI transformation have to update the size and position of containers
+ # (i.e. other structs with this Struct inside), so rebuilding only the
+ # changed library doesn't work.
+ expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..790b63b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
@@ -0,0 +1,239 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+ import "org-dartlang-test:///lib2.dart";
+
+ @#C7
+ class Y extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → lib::Y
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ @#C11
+ get y1() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y1(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C11
+ get y2() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y2(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C16
+ get y3() → dart.core::int
+ return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C16
+ set y3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (ffi::nullptr,
+ ffi::unsized,
+ ffi::sizeOf,
+ ffi::Dart_NativeMessageHandler,
+ ffi::Allocator,
+ ffi::AllocatorAlloc,
+ ffi::Array,
+ ffi::ArrayArray,
+ ffi::DartRepresentationOf,
+ ffi::Dart_CObject,
+ ffi::Double,
+ ffi::DoubleArray,
+ ffi::DoublePointer,
+ ffi::DynamicLibrary,
+ ffi::DynamicLibraryExtension,
+ ffi::Float,
+ ffi::FloatArray,
+ ffi::FloatPointer,
+ ffi::Handle,
+ ffi::Int16,
+ ffi::Int16Array,
+ ffi::Int16Pointer,
+ ffi::Int32,
+ ffi::Int32Array,
+ ffi::Int32Pointer,
+ ffi::Int64,
+ ffi::Int64Array,
+ ffi::Int64Pointer,
+ ffi::Int8,
+ ffi::Int8Array,
+ ffi::Int8Pointer,
+ ffi::IntPtr,
+ ffi::IntPtrArray,
+ ffi::IntPtrPointer,
+ ffi::NativeApi,
+ ffi::NativeFunction,
+ ffi::NativeFunctionPointer,
+ ffi::NativePort,
+ ffi::NativeType,
+ ffi::Opaque,
+ ffi::Packed,
+ ffi::Pointer,
+ ffi::PointerArray,
+ ffi::PointerPointer,
+ ffi::Struct,
+ ffi::StructArray,
+ ffi::StructPointer,
+ ffi::Uint16,
+ ffi::Uint16Array,
+ ffi::Uint16Pointer,
+ ffi::Uint32,
+ ffi::Uint32Array,
+ ffi::Uint32Pointer,
+ ffi::Uint64,
+ ffi::Uint64Array,
+ ffi::Uint64Pointer,
+ ffi::Uint8,
+ ffi::Uint8Array,
+ ffi::Uint8Pointer,
+ ffi::Union,
+ ffi::UnionArray,
+ ffi::UnionPointer,
+ ffi::Unsized,
+ ffi::Void)
+
+ export "org-dartlang-test:///lib3.dart";
+
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (ffi::nullptr,
+ ffi::unsized,
+ ffi::sizeOf,
+ ffi::Dart_NativeMessageHandler,
+ ffi::Allocator,
+ ffi::AllocatorAlloc,
+ ffi::Array,
+ ffi::ArrayArray,
+ ffi::DartRepresentationOf,
+ ffi::Dart_CObject,
+ ffi::Double,
+ ffi::DoubleArray,
+ ffi::DoublePointer,
+ ffi::DynamicLibrary,
+ ffi::DynamicLibraryExtension,
+ ffi::Float,
+ ffi::FloatArray,
+ ffi::FloatPointer,
+ ffi::Handle,
+ ffi::Int16,
+ ffi::Int16Array,
+ ffi::Int16Pointer,
+ ffi::Int32,
+ ffi::Int32Array,
+ ffi::Int32Pointer,
+ ffi::Int64,
+ ffi::Int64Array,
+ ffi::Int64Pointer,
+ ffi::Int8,
+ ffi::Int8Array,
+ ffi::Int8Pointer,
+ ffi::IntPtr,
+ ffi::IntPtrArray,
+ ffi::IntPtrPointer,
+ ffi::NativeApi,
+ ffi::NativeFunction,
+ ffi::NativeFunctionPointer,
+ ffi::NativePort,
+ ffi::NativeType,
+ ffi::Opaque,
+ ffi::Packed,
+ ffi::Pointer,
+ ffi::PointerArray,
+ ffi::PointerPointer,
+ ffi::Struct,
+ ffi::StructArray,
+ ffi::StructPointer,
+ ffi::Uint16,
+ ffi::Uint16Array,
+ ffi::Uint16Pointer,
+ ffi::Uint32,
+ ffi::Uint32Array,
+ ffi::Uint32Pointer,
+ ffi::Uint64,
+ ffi::Uint64Array,
+ ffi::Uint64Pointer,
+ ffi::Uint8,
+ ffi::Uint8Array,
+ ffi::Uint8Pointer,
+ ffi::Union,
+ ffi::UnionArray,
+ ffi::UnionPointer,
+ ffi::Unsized,
+ ffi::Void)
+
+ export "dart:ffi";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "dart:ffi";
+ import "org-dartlang-test:///lib.dart";
+
+ @#C23
+ class X extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → main::X
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ get x1() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x1(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ get x2() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x2(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ get x3() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set x3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+constants {
+ #C1 = "vm:ffi:struct-fields"
+ #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+ #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+ #C4 = <dart.core::Type>[#C2, #C2, #C3]
+ #C5 = null
+ #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+ #C7 = dart.core::pragma {name:#C1, options:#C6}
+ #C8 = 16
+ #C9 = 12
+ #C10 = <dart.core::int*>[#C8, #C9, #C8]
+ #C11 = dart.ffi::Uint8 {}
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = 1
+ #C15 = <dart.core::int*>[#C14, #C14, #C14]
+ #C16 = dart.ffi::Uint64 {}
+ #C17 = 8
+ #C18 = 4
+ #C19 = <dart.core::int*>[#C17, #C18, #C17]
+ #C20 = TypeLiteralConstant(lib::Y)
+ #C21 = <dart.core::Type>[#C20, #C20, #C2]
+ #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+ #C23 = dart.core::pragma {name:#C1, options:#C22}
+ #C24 = 40
+ #C25 = 28
+ #C26 = <dart.core::int*>[#C24, #C25, #C24]
+ #C27 = 32
+ #C28 = 24
+ #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..44136bf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
@@ -0,0 +1,239 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+ import "org-dartlang-test:///lib2.dart";
+
+ @#C7
+ class Y extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → lib::Y
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ @#C11
+ get y1() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y1(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C14
+ get y3() → dart.core::int
+ return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C14
+ set y3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ @#C11
+ get y2() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set y2(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (ffi::nullptr,
+ ffi::unsized,
+ ffi::sizeOf,
+ ffi::Dart_NativeMessageHandler,
+ ffi::Allocator,
+ ffi::AllocatorAlloc,
+ ffi::Array,
+ ffi::ArrayArray,
+ ffi::DartRepresentationOf,
+ ffi::Dart_CObject,
+ ffi::Double,
+ ffi::DoubleArray,
+ ffi::DoublePointer,
+ ffi::DynamicLibrary,
+ ffi::DynamicLibraryExtension,
+ ffi::Float,
+ ffi::FloatArray,
+ ffi::FloatPointer,
+ ffi::Handle,
+ ffi::Int16,
+ ffi::Int16Array,
+ ffi::Int16Pointer,
+ ffi::Int32,
+ ffi::Int32Array,
+ ffi::Int32Pointer,
+ ffi::Int64,
+ ffi::Int64Array,
+ ffi::Int64Pointer,
+ ffi::Int8,
+ ffi::Int8Array,
+ ffi::Int8Pointer,
+ ffi::IntPtr,
+ ffi::IntPtrArray,
+ ffi::IntPtrPointer,
+ ffi::NativeApi,
+ ffi::NativeFunction,
+ ffi::NativeFunctionPointer,
+ ffi::NativePort,
+ ffi::NativeType,
+ ffi::Opaque,
+ ffi::Packed,
+ ffi::Pointer,
+ ffi::PointerArray,
+ ffi::PointerPointer,
+ ffi::Struct,
+ ffi::StructArray,
+ ffi::StructPointer,
+ ffi::Uint16,
+ ffi::Uint16Array,
+ ffi::Uint16Pointer,
+ ffi::Uint32,
+ ffi::Uint32Array,
+ ffi::Uint32Pointer,
+ ffi::Uint64,
+ ffi::Uint64Array,
+ ffi::Uint64Pointer,
+ ffi::Uint8,
+ ffi::Uint8Array,
+ ffi::Uint8Pointer,
+ ffi::Union,
+ ffi::UnionArray,
+ ffi::UnionPointer,
+ ffi::Unsized,
+ ffi::Void)
+
+ export "org-dartlang-test:///lib3.dart";
+
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (ffi::nullptr,
+ ffi::unsized,
+ ffi::sizeOf,
+ ffi::Dart_NativeMessageHandler,
+ ffi::Allocator,
+ ffi::AllocatorAlloc,
+ ffi::Array,
+ ffi::ArrayArray,
+ ffi::DartRepresentationOf,
+ ffi::Dart_CObject,
+ ffi::Double,
+ ffi::DoubleArray,
+ ffi::DoublePointer,
+ ffi::DynamicLibrary,
+ ffi::DynamicLibraryExtension,
+ ffi::Float,
+ ffi::FloatArray,
+ ffi::FloatPointer,
+ ffi::Handle,
+ ffi::Int16,
+ ffi::Int16Array,
+ ffi::Int16Pointer,
+ ffi::Int32,
+ ffi::Int32Array,
+ ffi::Int32Pointer,
+ ffi::Int64,
+ ffi::Int64Array,
+ ffi::Int64Pointer,
+ ffi::Int8,
+ ffi::Int8Array,
+ ffi::Int8Pointer,
+ ffi::IntPtr,
+ ffi::IntPtrArray,
+ ffi::IntPtrPointer,
+ ffi::NativeApi,
+ ffi::NativeFunction,
+ ffi::NativeFunctionPointer,
+ ffi::NativePort,
+ ffi::NativeType,
+ ffi::Opaque,
+ ffi::Packed,
+ ffi::Pointer,
+ ffi::PointerArray,
+ ffi::PointerPointer,
+ ffi::Struct,
+ ffi::StructArray,
+ ffi::StructPointer,
+ ffi::Uint16,
+ ffi::Uint16Array,
+ ffi::Uint16Pointer,
+ ffi::Uint32,
+ ffi::Uint32Array,
+ ffi::Uint32Pointer,
+ ffi::Uint64,
+ ffi::Uint64Array,
+ ffi::Uint64Pointer,
+ ffi::Uint8,
+ ffi::Uint8Array,
+ ffi::Uint8Pointer,
+ ffi::Union,
+ ffi::UnionArray,
+ ffi::UnionPointer,
+ ffi::Unsized,
+ ffi::Void)
+
+ export "dart:ffi";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "dart:ffi";
+ import "org-dartlang-test:///lib.dart";
+
+ @#C23
+ class X extends dart.ffi::Struct {
+ static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+ synthetic constructor •() → main::X
+ : super dart.ffi::Struct::•()
+ ;
+ constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+ : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+ ;
+ get x1() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x1(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ get x2() → lib::Y
+ return new lib::Y::#fromTypedDataBase( block {
+ dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+ dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+ } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+ set x2(lib::Y #externalFieldValue) → void
+ return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ get x3() → dart.core::int
+ return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+ @#C11
+ set x3(dart.core::int #externalFieldValue) → void
+ return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+ }
+}
+constants {
+ #C1 = "vm:ffi:struct-fields"
+ #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+ #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+ #C4 = <dart.core::Type>[#C2, #C3, #C2]
+ #C5 = null
+ #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+ #C7 = dart.core::pragma {name:#C1, options:#C6}
+ #C8 = 24
+ #C9 = 16
+ #C10 = <dart.core::int*>[#C8, #C9, #C8]
+ #C11 = dart.ffi::Uint8 {}
+ #C12 = 0
+ #C13 = <dart.core::int*>[#C12, #C12, #C12]
+ #C14 = dart.ffi::Uint64 {}
+ #C15 = 8
+ #C16 = 4
+ #C17 = <dart.core::int*>[#C15, #C16, #C15]
+ #C18 = 12
+ #C19 = <dart.core::int*>[#C9, #C18, #C9]
+ #C20 = TypeLiteralConstant(lib::Y)
+ #C21 = <dart.core::Type>[#C20, #C20, #C2]
+ #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+ #C23 = dart.core::pragma {name:#C1, options:#C22}
+ #C24 = 56
+ #C25 = 36
+ #C26 = <dart.core::int*>[#C24, #C25, #C24]
+ #C27 = 48
+ #C28 = 32
+ #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/test_runner/lib/src/multitest.dart b/pkg/test_runner/lib/src/multitest.dart
index 7cd62eb..a194c73 100644
--- a/pkg/test_runner/lib/src/multitest.dart
+++ b/pkg/test_runner/lib/src/multitest.dart
@@ -83,10 +83,7 @@
'syntax error',
'compile-time error',
'runtime error',
- // TODO(rnystrom): Remove these after Dart 1.0 tests are removed.
- 'static type warning', // This is still a valid analyzer test
- 'dynamic type error', // This is now a no-op
- 'checked mode compile-time error' // This is now a no-op
+ 'static type warning', // Used by some analyzer tests.
};
void _generateTestsFromMultitest(Path filePath, Map<String, String> tests,
diff --git a/tests/language/deferred/constraints_type_annotation_test.dart b/tests/language/deferred/constraints_type_annotation_test.dart
index 9d86ccb..8431093 100644
--- a/tests/language/deferred/constraints_type_annotation_test.dart
+++ b/tests/language/deferred/constraints_type_annotation_test.dart
@@ -22,11 +22,11 @@
lib2.C a1 = new lib2.C(); //# type_annotation_non_deferred: continued
asyncStart();
lib.loadLibrary().then((_) {
- lib.C a2 = new lib.C(); //# type_annotation1: dynamic type error, compile-time error
- lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: dynamic type error, compile-time error
+ lib.C a2 = new lib.C(); //# type_annotation1: compile-time error
+ lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: compile-time error
G2<lib.C> a4 = new G2(); //# type_annotation_generic2: compile-time error
G2<lib.C> a5 = new G2<lib.C>(); //# type_annotation_generic3: compile-time error
- lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: dynamic type error, compile-time error
+ lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: compile-time error
var a6 = new lib.C(); //# new: ok
var g1 = new lib.G<F>(); //# new_generic1: ok
// new G2<lib.C>() does not give a dynamic type error because a malformed
diff --git a/tests/language/factory/factory1_test.dart b/tests/language/factory/factory1_test.dart
index d29187b..18302b0 100644
--- a/tests/language/factory/factory1_test.dart
+++ b/tests/language/factory/factory1_test.dart
@@ -6,7 +6,11 @@
class A<T> {
A() {}
factory A.factory() {
- return new A<String>(); // //# 00: compile-time error
+ return new A<String>();
+ // ^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+ // ^
+ // [cfe] A value of type 'A<String>' can't be returned from a function with return type 'A<T>'.
return A<T>();
}
}
@@ -14,14 +18,18 @@
class B<T> extends A<T> {
B() {}
factory B.factory() {
- return new B<String>(); // //# 01: compile-time error
+ return new B<String>();
+ // ^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+ // ^
+ // [cfe] A value of type 'B<String>' can't be returned from a function with return type 'B<T>'.
return B<T>();
}
}
main() {
new A<String>.factory();
- new A<int>.factory(); // //# 00: dynamic type error
+ new A<int>.factory();
new B<String>.factory();
- new B<int>.factory(); // //# 01: dynamic type error
+ new B<int>.factory();
}
diff --git a/tests/language_2/deferred/constraints_type_annotation_test.dart b/tests/language_2/deferred/constraints_type_annotation_test.dart
index d155d14..bb620b8 100644
--- a/tests/language_2/deferred/constraints_type_annotation_test.dart
+++ b/tests/language_2/deferred/constraints_type_annotation_test.dart
@@ -24,11 +24,11 @@
lib2.C a1 = new lib2.C(); //# type_annotation_non_deferred: continued
asyncStart();
lib.loadLibrary().then((_) {
- lib.C a2 = new lib.C(); //# type_annotation1: dynamic type error, compile-time error
- lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: dynamic type error, compile-time error
+ lib.C a2 = new lib.C(); //# type_annotation1: compile-time error
+ lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: compile-time error
G2<lib.C> a4 = new G2(); //# type_annotation_generic2: compile-time error
G2<lib.C> a5 = new G2<lib.C>(); //# type_annotation_generic3: compile-time error
- lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: dynamic type error, compile-time error
+ lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: compile-time error
var a6 = new lib.C(); //# new: ok
var g1 = new lib.G<F>(); //# new_generic1: ok
// new G2<lib.C>() does not give a dynamic type error because a malformed
diff --git a/tests/language_2/factory/factory1_test.dart b/tests/language_2/factory/factory1_test.dart
index d8b1dd7..bac0e94 100644
--- a/tests/language_2/factory/factory1_test.dart
+++ b/tests/language_2/factory/factory1_test.dart
@@ -8,20 +8,28 @@
class A<T> {
A() {}
factory A.factory() {
- return new A<String>(); // //# 00: compile-time error
+ return new A<String>();
+ // ^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+ // ^
+ // [cfe] A value of type 'A<String>' can't be assigned to a variable of type 'A<T>'.
}
}
class B<T> extends A<T> {
B() {}
factory B.factory() {
- return new B<String>(); // //# 01: compile-time error
+ return new B<String>();
+ // ^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+ // ^
+ // [cfe] A value of type 'B<String>' can't be assigned to a variable of type 'B<T>'.
}
}
main() {
new A<String>.factory();
- new A<int>.factory(); // //# 00: dynamic type error
+ new A<int>.factory();
new B<String>.factory();
- new B<int>.factory(); // //# 01: dynamic type error
+ new B<int>.factory();
}
diff --git a/tools/VERSION b/tools/VERSION
index a12e0b3..6e2781c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 82
+PRERELEASE 83
PRERELEASE_PATCH 0
\ No newline at end of file