Version 2.11.0-267.0.dev
Merge commit '34cedb980c99f19d9c7f69e7e41b3b1be8f93044' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28b2ea5..5e40af4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -50,6 +50,27 @@
* Fixed `unawaited_futures` to handle `Future` subtypes.
* New lint: `avoid_type_to_string`.
+## 2.10.3 - 2020-10-29
+
+This is a patch release that fixes the following issues:
+* breaking changes in Chrome 86 that affect DDC (issues [#43750][] and
+ [#43193][]).
+* compiler error causing incorrect use of positional parameters when named
+ parameters should be used instead (issues [flutter/flutter#65324][] and
+ [flutter/flutter#68092][]).
+* crashes and/or undefined behavor in AOT compiled code (issues [#43770][] and
+ [#43786][]).
+* AOT compilation of classes with more than 64 unboxed fields
+ (issue [flutter/flutter#67803][]).
+
+[#43750]: https://github.com/dart-lang/sdk/issues/43750
+[#43193]: https://github.com/dart-lang/sdk/issues/43193
+[flutter/flutter#65324]: https://github.com/flutter/flutter/issues/65324
+[flutter/flutter#68092]: https://github.com/flutter/flutter/issues/68092
+[#43770]: https://github.com/dart-lang/sdk/issues/43770
+[#43786]: https://github.com/dart-lang/sdk/issues/43786
+[flutter/flutter#67803]: https://github.com/flutter/flutter/issues/67803
+
## 2.10.2 - 2020-10-15
This is a patch release that fixes a DDC compiler crash (issue [#43589]).
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 36f4dad..082be52 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -436,7 +436,7 @@
typeSubstitution: getSubstitutionMap(cls.mixedInType));
// TODO(jensj): Provide a "referenceFrom" if we need to support
// the incremental compiler.
- cls.addMember(cloneVisitor.cloneField(field, null));
+ cls.addField(cloneVisitor.cloneField(field, null));
continue;
}
addField(field, includeStatic: false);
@@ -448,7 +448,7 @@
typeSubstitution: getSubstitutionMap(cls.mixedInType));
// TODO(jensj): Provide a "referenceFrom" if we need to support
// the incremental compiler.
- cls.addMember(cloneVisitor.cloneProcedure(procedure, null));
+ cls.addProcedure(cloneVisitor.cloneProcedure(procedure, null));
continue;
}
addProcedure(procedure,
@@ -486,7 +486,7 @@
for (var superclassConstructor in cls.superclass.constructors) {
var forwardingConstructor = _buildForwardingConstructor(
superclassCloner, superclassConstructor);
- cls.addMember(forwardingConstructor);
+ cls.addConstructor(forwardingConstructor);
_constructorMap[forwardingConstructor.name.text] =
forwardingConstructor;
}
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 537e376..deb42c7 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -264,7 +264,8 @@
charEndOffset,
toStringReference,
null,
- AsyncMarker.Sync);
+ AsyncMarker.Sync,
+ /* isExtensionInstanceMember = */ false);
members["toString"] = toStringBuilder;
String className = name;
if (enumConstantInfos != null) {
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 1b81273..a4c221b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -82,6 +82,8 @@
@override
Procedure get actualProcedure => _procedure;
+ final bool isExtensionInstanceMember;
+
ProcedureBuilderImpl(
List<MetadataBuilder> metadata,
int modifiers,
@@ -96,8 +98,10 @@
this.charOpenParenOffset,
int charEndOffset,
Procedure referenceFrom,
+ this.isExtensionInstanceMember,
[String nativeMethodName])
- : _procedure = new Procedure(null, kind, null,
+ : _procedure = new Procedure(
+ null, isExtensionInstanceMember ? ProcedureKind.Method : kind, null,
fileUri: compilationUnit.fileUri,
reference: referenceFrom?.reference)
..startFileOffset = startCharOffset
@@ -228,6 +232,7 @@
Procedure referenceFrom,
this._tearOffReferenceFrom,
AsyncMarker asyncModifier,
+ bool isExtensionInstanceMember,
[String nativeMethodName])
: super(
metadata,
@@ -243,6 +248,7 @@
charOpenParenOffset,
charEndOffset,
referenceFrom,
+ isExtensionInstanceMember,
nativeMethodName) {
this.asyncModifier = asyncModifier;
}
@@ -366,7 +372,7 @@
_procedure.isExtensionMember = true;
_procedure.isStatic = true;
if (isExtensionInstanceMember) {
- _procedure.kind = ProcedureKind.Method;
+ assert(_procedure.kind == ProcedureKind.Method);
}
_procedure.name = new Name(
createProcedureName(true, !isExtensionInstanceMember, kind,
@@ -674,6 +680,7 @@
charOpenParenOffset,
charEndOffset,
referenceFrom,
+ /* isExtensionInstanceMember = */ false,
nativeMethodName);
@override
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 700d6a9..331b581 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -208,7 +208,8 @@
DillConstructorBuilder(this.constructor, Builder parent)
: super(constructor, parent);
- Member get member => constructor;
+ @override
+ Constructor get member => constructor;
@override
Member get readTarget => null;
@@ -217,7 +218,7 @@
Member get writeTarget => null;
@override
- Member get invokeTarget => constructor;
+ Constructor get invokeTarget => constructor;
}
class DillClassMember extends BuilderClassMember {
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 51255bf..0885714 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -61,6 +61,7 @@
import '../names.dart' show noSuchMethodName;
+import '../problems.dart';
import '../scope.dart' show Scope;
import '../source/source_class_builder.dart';
@@ -3168,7 +3169,18 @@
Member stub =
new ForwardingNode(combinedMemberSignature, kind).finalize();
if (stub != null && classBuilder.cls == stub.enclosingClass) {
- classBuilder.cls.addMember(stub);
+ if (stub is Procedure) {
+ classBuilder.cls.addProcedure(stub);
+ } else if (stub is Field) {
+ classBuilder.cls.addField(stub);
+ } else if (stub is Constructor) {
+ classBuilder.cls.addConstructor(stub);
+ } else if (stub is RedirectingFactoryConstructor) {
+ classBuilder.cls.addRedirectingFactoryConstructor(stub);
+ } else {
+ unhandled("${stub.runtimeType}", "getMember", stub.fileOffset,
+ stub.fileUri);
+ }
SourceLibraryBuilder library = classBuilder.library;
Member bestMemberSoFar =
combinedMemberSignature.canonicalMember.getMember(hierarchy);
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 6a9bacf..471859f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -862,7 +862,8 @@
endToken.charOffset,
nativeMethodName,
asyncModifier,
- isTopLevel: true);
+ isTopLevel: true,
+ isExtensionInstanceMember: false);
nativeMethodName = null;
}
@@ -950,42 +951,42 @@
@override
void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.classMethod);
}
void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.classConstructor);
}
void endMixinMethod(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.mixinMethod);
}
void endExtensionMethod(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, false);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.extensionMethod);
}
void endMixinConstructor(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.mixinConstructor);
}
void endExtensionConstructor(Token getOrSet, Token beginToken,
Token beginParam, Token beginInitializers, Token endToken) {
- _endClassMethod(
- getOrSet, beginToken, beginParam, beginInitializers, endToken, true);
+ _endClassMethod(getOrSet, beginToken, beginParam, beginInitializers,
+ endToken, _MethodKind.extensionConstructor);
}
void _endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
- Token beginInitializers, Token endToken, bool isConstructor) {
+ Token beginInitializers, Token endToken, _MethodKind methodKind) {
assert(checkState(beginToken, [ValueKinds.MethodBody]));
debugEvent("Method");
MethodBody bodyKind = pop();
@@ -1113,12 +1114,23 @@
return;
}
- String constructorName = isConstructor
- ? (libraryBuilder.computeAndValidateConstructorName(name, charOffset) ??
- name)
- : null;
+ String constructorName;
+ switch (methodKind) {
+ case _MethodKind.classConstructor:
+ case _MethodKind.mixinConstructor:
+ case _MethodKind.extensionConstructor:
+ constructorName = libraryBuilder.computeAndValidateConstructorName(
+ name, charOffset) ??
+ name;
+ break;
+ case _MethodKind.classMethod:
+ case _MethodKind.mixinMethod:
+ case _MethodKind.extensionMethod:
+ break;
+ }
+ bool isStatic = (modifiers & staticMask) != 0;
if (constructorName == null &&
- (modifiers & staticMask) == 0 &&
+ !isStatic &&
libraryBuilder.currentTypeParameterScopeBuilder.kind ==
TypeParameterScopeKind.extensionDeclaration) {
TypeParameterScopeBuilder extension =
@@ -1216,7 +1228,9 @@
endToken.charOffset,
nativeMethodName,
asyncModifier,
- isTopLevel: false);
+ isTopLevel: false,
+ isExtensionInstanceMember:
+ methodKind == _MethodKind.extensionMethod && !isStatic);
}
nativeMethodName = null;
inConstructor = false;
@@ -2184,3 +2198,12 @@
// printEvent('OutlineBuilder: $name');
}
}
+
+enum _MethodKind {
+ classConstructor,
+ classMethod,
+ mixinConstructor,
+ mixinMethod,
+ extensionConstructor,
+ extensionMethod,
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index de76fc2..35a1e40 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -147,7 +147,18 @@
(Member member, BuiltMemberKind memberKind) {
member.parent = cls;
if (!memberBuilder.isPatch && !memberBuilder.isDuplicate) {
- cls.addMember(member);
+ if (member is Procedure) {
+ cls.addProcedure(member);
+ } else if (member is Field) {
+ cls.addField(member);
+ } else if (member is Constructor) {
+ cls.addConstructor(member);
+ } else if (member is RedirectingFactoryConstructor) {
+ cls.addRedirectingFactoryConstructor(member);
+ } else {
+ unhandled("${member.runtimeType}", "getMember",
+ member.fileOffset, member.fileUri);
+ }
}
});
} else {
@@ -545,7 +556,7 @@
constructorScopeBuilder.addMember(name, constructorBuilder);
// Synthetic constructors are created after the component has been built
// so we need to add the constructor to the class.
- cls.addMember(constructorBuilder.member);
+ cls.addConstructor(constructorBuilder.member);
if (constructorBuilder.isConst) {
cls.hasConstConstructor = true;
}
@@ -851,7 +862,7 @@
fileUri: cls.fileUri,
reference: referenceFrom?.reference)
..fileOffset = cls.fileOffset;
- cls.addMember(field);
+ cls.addField(field);
constructorsField = new DillFieldBuilder(field, this);
origin.scope
.addLocalMember(redirectingName, constructorsField, setter: false);
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 867fb41..0479011 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -146,7 +146,14 @@
break;
}
assert(kind != null);
- libraryBuilder.library.addMember(member);
+ if (member is Field) {
+ libraryBuilder.library.addField(member);
+ } else if (member is Procedure) {
+ libraryBuilder.library.addProcedure(member);
+ } else {
+ unhandled("${member.runtimeType}", "buildBuilders",
+ member.fileOffset, member.fileUri);
+ }
extension.members.add(new ExtensionMemberDescriptor(
name: new Name(memberBuilder.name, libraryBuilder.library),
member: member.reference,
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index ea70844..badb049 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -972,7 +972,7 @@
if (unserializableExports != null) {
Field referenceFrom = referencesFromIndexed?.lookupField("_exports#");
- library.addMember(new Field(new Name("_exports#", library),
+ library.addField(new Field(new Name("_exports#", library),
initializer: new StringLiteral(jsonEncode(unserializableExports)),
isStatic: true,
isConst: true,
@@ -2282,7 +2282,11 @@
int charEndOffset,
String nativeMethodName,
AsyncMarker asyncModifier,
- {bool isTopLevel}) {
+ {bool isTopLevel,
+ bool isExtensionInstanceMember}) {
+ assert(isTopLevel != null);
+ assert(isExtensionInstanceMember != null);
+
MetadataCollector metadataCollector = loader.target.metadataCollector;
if (returnType == null) {
if (kind == ProcedureKind.Operator &&
@@ -2357,6 +2361,7 @@
referenceFrom,
tearOffReferenceFrom,
asyncModifier,
+ isExtensionInstanceMember,
nativeMethodName);
metadataCollector?.setDocumentationComment(
procedureBuilder.procedure, documentationComment);
@@ -2443,6 +2448,7 @@
referenceFrom,
null,
asyncModifier,
+ /* isExtensionInstanceMember = */ false,
nativeMethodName);
}
@@ -2608,11 +2614,17 @@
(Member member, BuiltMemberKind memberKind) {
if (member is Field) {
member.isStatic = true;
+ if (!declaration.isPatch && !declaration.isDuplicate) {
+ library.addField(member);
+ }
} else if (member is Procedure) {
member.isStatic = true;
- }
- if (!declaration.isPatch && !declaration.isDuplicate) {
- library.addMember(member);
+ if (!declaration.isPatch && !declaration.isDuplicate) {
+ library.addProcedure(member);
+ }
+ } else {
+ unhandled("${member.runtimeType}:${memberKind}", "buildBuilder",
+ declaration.charOffset, declaration.fileUri);
}
});
} else if (declaration is SourceTypeAliasBuilder) {
@@ -2807,7 +2819,7 @@
for (Import import in imports) {
if (import.deferred) {
Procedure tearoff = import.prefixBuilder.loadLibraryBuilder.tearoff;
- if (tearoff != null) library.addMember(tearoff);
+ if (tearoff != null) library.addProcedure(tearoff);
total++;
}
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 7dfb32e..a8a4a63 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -474,7 +474,8 @@
-1,
null,
null,
- AsyncMarker.Sync)
+ AsyncMarker.Sync,
+ /* isExtensionInstanceMember = */ false)
..parent = parent;
BodyBuilder listener = dietListener.createListener(
builder, dietListener.memberScope,
diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart
index d4e1665..a1ac89a 100644
--- a/pkg/front_end/test/fasta/ambiguous_export_test.dart
+++ b/pkg/front_end/test/fasta/ambiguous_export_test.dart
@@ -23,7 +23,7 @@
Library library = new Library(Uri.parse("org.dartlang.fasta:library"));
Field field = new Field(new Name("_exports#", library),
initializer: new StringLiteral('{"main":"Problem with main"}'));
- library.addMember(field);
+ library.addField(field);
Component component = new Component(libraries: <Library>[library]);
await CompilerContext.runWithDefaultOptions((CompilerContext c) async {
DillTarget target = new DillTarget(c.options.ticker,
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 84c4f14..3ebb511 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -18,7 +18,6 @@
Expression,
FunctionNode,
Library,
- Member,
Name,
Procedure,
ProcedureKind,
@@ -83,11 +82,11 @@
null);
LoadLibraryBuilder loadLibraryBuilder =
new LoadLibraryBuilder(libraryBuilder, null, -1);
- Member getter = new Procedure(
+ Procedure getter = new Procedure(
new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null));
- Member interfaceTarget = new Procedure(new Name("myInterfaceTarget"),
+ Procedure interfaceTarget = new Procedure(new Name("myInterfaceTarget"),
ProcedureKind.Method, new FunctionNode(null));
- Member setter = new Procedure(
+ Procedure setter = new Procedure(
new Name("mySetter"), ProcedureKind.Setter, new FunctionNode(null));
Message message = templateUnspecified.withArguments("My Message.");
Name binaryOperator = new Name("+");
@@ -112,7 +111,7 @@
library.addClass(cls);
library.addProcedure(getter);
library.addProcedure(setter);
- cls.addMember(interfaceTarget);
+ cls.addProcedure(interfaceTarget);
PrefixUseGenerator prefixUseGenerator =
new PrefixUseGenerator(helper, token, prefixBuilder);
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index b364cc6..69abdd8 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -1911,7 +1911,7 @@
reference: lib.reference.canonicalName
?.getChildFromFieldWithName(fieldName)
?.reference);
- lib.addMember(field);
+ lib.addField(field);
for (Class c in lib.classes) {
if (c.fields
.where((f) => f.name.text == "unique_SimulateTransformer")
@@ -1923,7 +1923,7 @@
reference: c.reference.canonicalName
?.getChildFromFieldWithName(fieldName)
?.reference);
- c.addMember(field);
+ c.addField(field);
}
}
}
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index fc136ab..7f9e8d2 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
@@ -244,6 +244,14 @@
// Should be ok, but we shouldn't actually initialize from dill.
List<int> mixedPart1;
{
+ // Create a component that is compiled without NNBD.
+ Map<ExperimentalFlag, bool> prevTesting =
+ options.defaultExperimentFlagsForTesting;
+ options.defaultExperimentFlagsForTesting = {
+ ExperimentalFlag.nonNullable: false
+ };
+ NnbdMode prevNnbd = options.nnbdMode;
+ options.nnbdMode = NnbdMode.Weak;
compiler = new IncrementalCompiler(
new CompilerContext(
new ProcessedOptions(options: options, inputs: [helper2File])),
@@ -252,10 +260,13 @@
c.setMainMethodAndMode(
null, false, NonNullableByDefaultCompiledMode.Weak);
mixedPart1 = serializeComponent(c);
+ options.defaultExperimentFlagsForTesting = prevTesting;
+ options.nnbdMode = prevNnbd;
}
List<int> mixedPart2;
{
+ // Create a component that is compiled with strong NNBD.
Map<ExperimentalFlag, bool> prevTesting =
options.defaultExperimentFlagsForTesting;
options.defaultExperimentFlagsForTesting = {
@@ -275,6 +286,9 @@
options.nnbdMode = prevNnbd;
}
+ // Now mix the two components together and try to initialize from them.
+ // We expect the compilation to be OK but that the dill is not actually
+ // used to initialize from (as it's invalid because of the mixed mode).
List<int> mixed = [];
mixed.addAll(mixedPart1);
mixed.addAll(mixedPart2);
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index c577233..17e9ba5 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -316,7 +316,7 @@
library.addClass(cls);
Procedure factoryConstructor = new Procedure(
new Name(''), ProcedureKind.Factory, new FunctionNode(null));
- cls.addMember(factoryConstructor);
+ cls.addProcedure(factoryConstructor);
testExpression(
new FactoryConstructorInvocationJudgment(
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index de1281f..6470e3a 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -143,7 +143,7 @@
type ComponentFile {
UInt32 magic = 0x90ABCDEF;
- UInt32 formatVersion = 47;
+ UInt32 formatVersion = 49;
Byte[10] shortSdkHash;
List<String> problemsAsJson; // Described in problems.md.
Library[] libraries;
@@ -230,8 +230,7 @@
}
type Library {
- Byte flags (_unused_, isSynthetic, isNonNullableByDefault,
- nnbdModeBit1, nnbdModeBit2);
+ Byte flags (isSynthetic, isNonNullableByDefault, nnbdModeBit1, nnbdModeBit2);
UInt languageVersionMajor;
UInt languageVersionMinor;
CanonicalNameReference canonicalName;
@@ -301,16 +300,6 @@
Byte tag;
}
-enum ClassLevel { Type = 0, Hierarchy = 1, Mixin = 2, Body = 3, }
-
-// A class can be represented at one of three levels: type, hierarchy, or body.
-//
-// If the enclosing library is external, a class is either at type or
-// hierarchy level, depending on its isTypeLevel flag.
-// If the enclosing library is not external, a class is always at body level.
-//
-// See ClassLevel in ast.dart for the details of each loading level.
-
type Class extends Node {
Byte tag = 2;
CanonicalNameReference canonicalName;
@@ -319,9 +308,8 @@
FileOffset startFileOffset; // Offset of the start of the class including any annotations.
FileOffset fileOffset; // Offset of the name of the class.
FileOffset fileEndOffset;
- Byte flags (levelBit0, levelBit1, isAbstract, isEnum, isAnonymousMixin,
- isEliminatedMixin, isMixinDeclaration,
- hasConstConstructor); // Where level is index into ClassLevel
+ Byte flags (isAbstract, isEnum, isAnonymousMixin, isEliminatedMixin,
+ isMixinDeclaration, hasConstConstructor);
StringReference name;
List<Expression> annotations;
List<TypeParameter> typeParameters;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 917c48e..09193dc 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -366,10 +366,10 @@
_languageVersion = languageVersion;
}
- static const int SyntheticFlag = 1 << 1;
- static const int NonNullableByDefaultFlag = 1 << 2;
- static const int NonNullableByDefaultModeBit1Weak = 1 << 3;
- static const int NonNullableByDefaultModeBit2Strong = 1 << 4;
+ static const int SyntheticFlag = 1 << 0;
+ static const int NonNullableByDefaultFlag = 1 << 1;
+ static const int NonNullableByDefaultModeBit1 = 1 << 2;
+ static const int NonNullableByDefaultModeBit2 = 1 << 3;
int flags = 0;
@@ -388,32 +388,29 @@
}
NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode {
- bool weak = (flags & NonNullableByDefaultModeBit1Weak) != 0;
- bool strong = (flags & NonNullableByDefaultModeBit2Strong) != 0;
-
- if (weak && strong) return NonNullableByDefaultCompiledMode.Agnostic;
- if (strong) return NonNullableByDefaultCompiledMode.Strong;
- if (weak) return NonNullableByDefaultCompiledMode.Weak;
- // Nothing set is implicitly weak.
- return NonNullableByDefaultCompiledMode.Weak;
+ bool bit1 = (flags & NonNullableByDefaultModeBit1) != 0;
+ bool bit2 = (flags & NonNullableByDefaultModeBit2) != 0;
+ if (!bit1 && !bit2) return NonNullableByDefaultCompiledMode.Weak;
+ if (bit1 && !bit2) return NonNullableByDefaultCompiledMode.Strong;
+ if (bit1 && bit2) return NonNullableByDefaultCompiledMode.Agnostic;
+ // !bit1 && bit2 is unused.
+ throw new StateError("Unused bit-pattern for compilation mode");
}
void set nonNullableByDefaultCompiledMode(
NonNullableByDefaultCompiledMode mode) {
- // Technically we could but the isNonNullableByDefault flag in here as it's
- // only allowed when we're weak.
switch (mode) {
case NonNullableByDefaultCompiledMode.Weak:
- flags = (flags | NonNullableByDefaultModeBit1Weak) &
- ~NonNullableByDefaultModeBit2Strong;
+ flags = (flags & ~NonNullableByDefaultModeBit1) &
+ ~NonNullableByDefaultModeBit2;
break;
case NonNullableByDefaultCompiledMode.Strong:
- flags = (flags & ~NonNullableByDefaultModeBit1Weak) |
- NonNullableByDefaultModeBit2Strong;
+ flags = (flags | NonNullableByDefaultModeBit1) &
+ ~NonNullableByDefaultModeBit2;
break;
case NonNullableByDefaultCompiledMode.Agnostic:
- flags = (flags | NonNullableByDefaultModeBit1Weak) |
- NonNullableByDefaultModeBit2Strong;
+ flags = (flags | NonNullableByDefaultModeBit1) |
+ NonNullableByDefaultModeBit2;
break;
}
}
@@ -498,17 +495,6 @@
Iterable<Member> get members =>
<Iterable<Member>>[fields, procedures].expand((x) => x);
- void addMember(Member member) {
- member.parent = this;
- if (member is Procedure) {
- procedures.add(member);
- } else if (member is Field) {
- fields.add(member);
- } else {
- throw new ArgumentError(member);
- }
- }
-
void addAnnotation(Expression node) {
node.parent = this;
annotations.add(node);
@@ -547,11 +533,11 @@
}
for (int i = 0; i < fields.length; ++i) {
Field field = fields[i];
- canonicalName.getChildFromMember(field).bindTo(field.reference);
+ canonicalName.getChildFromField(field).bindTo(field.reference);
}
for (int i = 0; i < procedures.length; ++i) {
Procedure member = procedures[i];
- canonicalName.getChildFromMember(member).bindTo(member.reference);
+ canonicalName.getChildFromProcedure(member).bindTo(member.reference);
}
for (int i = 0; i < classes.length; ++i) {
Class class_ = classes[i];
@@ -886,53 +872,6 @@
}
}
-/// The degree to which the contents of a class have been loaded into memory.
-///
-/// Each level imply the requirements of the previous ones.
-enum ClassLevel {
- /// Temporary loading level for internal use by IR producers. Consumers of
- /// kernel code should not expect to see classes at this level.
- Temporary,
-
- /// The class may be used as a type, and it may contain members that are
- /// referenced from this build unit.
- ///
- /// The type parameters and their bounds are present.
- ///
- /// There is no guarantee that all members are present.
- ///
- /// All supertypes of this class are at [Type] level or higher.
- Type,
-
- /// All instance members of the class are present.
- ///
- /// All supertypes of this class are at [Hierarchy] level or higher.
- ///
- /// This level exists so supertypes of a fully loaded class contain all the
- /// members needed to detect override constraints.
- Hierarchy,
-
- /// All instance members of the class have their body loaded, and their
- /// annotations are present.
- ///
- /// All supertypes of this class are at [Hierarchy] level or higher.
- ///
- /// If this class is a mixin application, then its mixin is loaded at [Mixin]
- /// level or higher.
- ///
- /// This level exists so the contents of a mixin can be cloned into a
- /// mixin application.
- Mixin,
-
- /// All members of the class are fully loaded and are in the correct order.
- ///
- /// Annotations are present on classes and members.
- ///
- /// All supertypes of this class are at [Hierarchy] level or higher,
- /// not necessarily at [Body] level.
- Body,
-}
-
/// List-wrapper that marks the parent-class as dirty if the list is modified.
///
/// The idea being, that for non-dirty classes (classes just loaded from dill)
@@ -989,9 +928,6 @@
/// (this is the default if none is specifically set).
int fileEndOffset = TreeNode.noOffset;
- /// The degree to which the contents of the class have been loaded.
- ClassLevel level = ClassLevel.Body;
-
/// List of metadata annotations on the class.
///
/// This defaults to an immutable empty list. Use [addAnnotation] to add
@@ -1008,13 +944,12 @@
String name;
// Must match serialized bit positions.
- static const int LevelMask = 0x3; // Bits 0 and 1.
- static const int FlagAbstract = 1 << 2;
- static const int FlagEnum = 1 << 3;
- static const int FlagAnonymousMixin = 1 << 4;
- static const int FlagEliminatedMixin = 1 << 5;
- static const int FlagMixinDeclaration = 1 << 6;
- static const int FlagHasConstConstructor = 1 << 7;
+ static const int FlagAbstract = 1 << 0;
+ static const int FlagEnum = 1 << 1;
+ static const int FlagAnonymousMixin = 1 << 2;
+ static const int FlagEliminatedMixin = 1 << 3;
+ static const int FlagMixinDeclaration = 1 << 4;
+ static const int FlagHasConstConstructor = 1 << 5;
int flags = 0;
@@ -1242,19 +1177,21 @@
if (!dirty) return;
for (int i = 0; i < fields.length; ++i) {
Field member = fields[i];
- canonicalName.getChildFromMember(member).bindTo(member.reference);
+ canonicalName.getChildFromField(member).bindTo(member.reference);
}
for (int i = 0; i < procedures.length; ++i) {
Procedure member = procedures[i];
- canonicalName.getChildFromMember(member).bindTo(member.reference);
+ canonicalName.getChildFromProcedure(member).bindTo(member.reference);
}
for (int i = 0; i < constructors.length; ++i) {
Constructor member = constructors[i];
- canonicalName.getChildFromMember(member).bindTo(member.reference);
+ canonicalName.getChildFromConstructor(member).bindTo(member.reference);
}
for (int i = 0; i < redirectingFactoryConstructors.length; ++i) {
RedirectingFactoryConstructor member = redirectingFactoryConstructors[i];
- canonicalName.getChildFromMember(member).bindTo(member.reference);
+ canonicalName
+ .getChildFromRedirectingFactoryConstructor(member)
+ .bindTo(member.reference);
}
dirty = false;
}
@@ -1347,24 +1284,33 @@
/// if false we can skip it.
bool dirty = true;
- /// Adds a member to this class.
- ///
- /// Throws an error if attempting to add a field or procedure to a mixin
- /// application.
- void addMember(Member member) {
+ /// Adds a constructor to this class.
+ void addConstructor(Constructor constructor) {
dirty = true;
- member.parent = this;
- if (member is Constructor) {
- constructorsInternal.add(member);
- } else if (member is Procedure) {
- proceduresInternal.add(member);
- } else if (member is Field) {
- fieldsInternal.add(member);
- } else if (member is RedirectingFactoryConstructor) {
- redirectingFactoryConstructorsInternal.add(member);
- } else {
- throw new ArgumentError(member);
- }
+ constructor.parent = this;
+ constructorsInternal.add(constructor);
+ }
+
+ /// Adds a procedure to this class.
+ void addProcedure(Procedure procedure) {
+ dirty = true;
+ procedure.parent = this;
+ proceduresInternal.add(procedure);
+ }
+
+ /// Adds a field to this class.
+ void addField(Field field) {
+ dirty = true;
+ field.parent = this;
+ fieldsInternal.add(field);
+ }
+
+ /// Adds a field to this class.
+ void addRedirectingFactoryConstructor(
+ RedirectingFactoryConstructor redirectingFactoryConstructor) {
+ dirty = true;
+ redirectingFactoryConstructor.parent = this;
+ redirectingFactoryConstructorsInternal.add(redirectingFactoryConstructor);
}
void addAnnotation(Expression node) {
@@ -2176,7 +2122,7 @@
/// set).
int startFileOffset = TreeNode.noOffset;
- ProcedureKind kind;
+ final ProcedureKind kind;
int flags = 0;
// function is null if and only if abstract, external.
FunctionNode function;
@@ -2257,7 +2203,8 @@
this.forwardingStubSuperTargetReference,
this.forwardingStubInterfaceTargetReference,
this.memberSignatureOriginReference})
- : super(name, fileUri, reference) {
+ : assert(kind != null),
+ super(name, fileUri, reference) {
function?.parent = this;
this.isAbstract = isAbstract;
this.isStatic = isStatic;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index ab556d1..8153e05 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1149,9 +1149,7 @@
node = null;
}
if (node == null) {
- node = new Class(reference: reference)
- ..level = ClassLevel.Temporary
- ..dirty = false;
+ node = new Class(reference: reference)..dirty = false;
}
var fileUri = readUriReference();
@@ -1159,12 +1157,7 @@
node.fileOffset = readOffset();
node.fileEndOffset = readOffset();
int flags = readByte();
- node.flags = flags & ~Class.LevelMask;
- int levelIndex = flags & Class.LevelMask;
- var level = ClassLevel.values[levelIndex + 1];
- if (level.index >= node.level.index) {
- node.level = level;
- }
+ node.flags = flags;
var name = readStringOrNullIfEmpty();
var annotations = readAnnotationList(node);
assert(() {
@@ -1378,15 +1371,17 @@
if (alwaysCreateNewNamedNodes) {
node = null;
}
- if (node == null) {
- node = new Procedure(null, null, null, reference: reference);
- }
var fileUri = readUriReference();
var startFileOffset = readOffset();
var fileOffset = readOffset();
var fileEndOffset = readOffset();
int kindIndex = readByte();
var kind = ProcedureKind.values[kindIndex];
+ if (node == null) {
+ node = new Procedure(null, kind, null, reference: reference);
+ } else {
+ assert(node.kind == kind);
+ }
var flags = readUInt();
var name = readName();
var annotations = readAnnotationList(node);
@@ -1410,7 +1405,6 @@
node.startFileOffset = startFileOffset;
node.fileOffset = fileOffset;
node.fileEndOffset = fileEndOffset;
- node.kind = kind;
node.flags = flags;
node.name = name;
node.fileUri = fileUri;
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 872398e..a5a426f 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1113,20 +1113,12 @@
}
}
- int _encodeClassFlags(int flags, ClassLevel level) {
- assert((flags & Class.LevelMask) == 0);
- final levelIndex = level.index - 1;
- assert((levelIndex & Class.LevelMask) == levelIndex);
- return flags | levelIndex;
- }
-
@override
void visitClass(Class node) {
classOffsets.add(getBufferOffset());
if (node.isAnonymousMixin) _currentlyInNonimplementation = true;
- int flags = _encodeClassFlags(node.flags, node.level);
if (node.canonicalName == null) {
throw new ArgumentError('Missing canonical name for $node');
}
@@ -1137,7 +1129,7 @@
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
- writeByte(flags);
+ writeByte(node.flags);
writeStringReference(node.name ?? '');
enterScope(memberScope: true);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 4fdf50b..ebdf993 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -146,7 +146,7 @@
/// Internal version of kernel binary format.
/// Bump it when making incompatible changes in kernel binaries.
/// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
- static const int BinaryFormatVersion = 47;
+ static const int BinaryFormatVersion = 49;
}
abstract class ConstantTag {
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 95acedd..27e66ef 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -122,9 +122,24 @@
: getChild(name.text);
}
- CanonicalName getChildFromMember(Member member) {
- return getChild(getMemberQualifier(member))
- .getChildFromQualifiedName(member.name);
+ CanonicalName getChildFromProcedure(Procedure procedure) {
+ return getChild(getProcedureQualifier(procedure))
+ .getChildFromQualifiedName(procedure.name);
+ }
+
+ CanonicalName getChildFromField(Field field) {
+ return getChild('@fields').getChildFromQualifiedName(field.name);
+ }
+
+ CanonicalName getChildFromConstructor(Constructor constructor) {
+ return getChild('@constructors')
+ .getChildFromQualifiedName(constructor.name);
+ }
+
+ CanonicalName getChildFromRedirectingFactoryConstructor(
+ RedirectingFactoryConstructor redirectingFactoryConstructor) {
+ return getChild('@factories')
+ .getChildFromQualifiedName(redirectingFactoryConstructor.name);
}
CanonicalName getChildFromFieldWithName(Name name) {
@@ -210,22 +225,10 @@
return reference ??= (new Reference()..canonicalName = this);
}
- static String getMemberQualifier(Member member) {
- if (member is Procedure) {
- if (member.isGetter) return '@getters';
- if (member.isSetter) return '@setters';
- if (member.isFactory) return '@factories';
- return '@methods';
- }
- if (member is Field) {
- return '@fields';
- }
- if (member is Constructor) {
- return '@constructors';
- }
- if (member is RedirectingFactoryConstructor) {
- return '@factories';
- }
- throw 'Unexpected member: $member';
+ static String getProcedureQualifier(Procedure procedure) {
+ if (procedure.isGetter) return '@getters';
+ if (procedure.isSetter) return '@setters';
+ if (procedure.isFactory) return '@factories';
+ return '@methods';
}
}
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 602ec1c7..f83e594 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -640,7 +640,7 @@
return result;
}
- cloneProcedure(Procedure node, Procedure referenceFrom) {
+ Procedure cloneProcedure(Procedure node, Procedure referenceFrom) {
final Uri activeFileUriSaved = _activeFileUri;
_activeFileUri = node.fileUri ?? _activeFileUri;
@@ -664,7 +664,7 @@
return result;
}
- cloneField(Field node, Field referenceFrom) {
+ Field cloneField(Field node, Field referenceFrom) {
final Uri activeFileUriSaved = _activeFileUri;
_activeFileUri = node.fileUri ?? _activeFileUri;
@@ -692,7 +692,8 @@
return result;
}
- cloneRedirectingFactoryConstructor(RedirectingFactoryConstructor node,
+ RedirectingFactoryConstructor cloneRedirectingFactoryConstructor(
+ RedirectingFactoryConstructor node,
RedirectingFactoryConstructor referenceFrom) {
final Uri activeFileUriSaved = _activeFileUri;
_activeFileUri = node.fileUri ?? _activeFileUri;
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index e633d04..5d12e73 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1617,8 +1617,8 @@
const Map<int, String> libraryFlagToName = const {
Library.SyntheticFlag: "synthetic",
Library.NonNullableByDefaultFlag: "nnbd",
- Library.NonNullableByDefaultModeBit1Weak: "nnbd-weak",
- Library.NonNullableByDefaultModeBit2Strong: "nnbd-strong",
+ Library.NonNullableByDefaultModeBit1: "nnbd-bit1",
+ Library.NonNullableByDefaultModeBit2: "nnbd-bit2",
};
class LibraryFlagTagger implements Tagger<int> {
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 8af53bf..345d452 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -83,8 +83,7 @@
}
// Ensure super classes have been transformed before this class.
- if (class_.superclass != null &&
- class_.superclass.level.index >= ClassLevel.Mixin.index) {
+ if (class_.superclass != null) {
transformClass(librariesToBeTransformed, processedClasses,
transformedClasses, class_.superclass, referenceFromIndex);
}
@@ -94,12 +93,6 @@
if (!class_.isMixinApplication) return;
assert(librariesToBeTransformed.contains(enclosingLibrary));
- if (class_.mixedInClass.level.index < ClassLevel.Mixin.index) {
- throw new Exception(
- 'Class "${class_.name}" mixes in "${class_.mixedInClass.name}" from'
- ' an external library. Did you forget --link?');
- }
-
transformedClasses.add(class_);
// Clone fields and methods from the mixin class.
@@ -134,7 +127,7 @@
clone.isGenericCovariantImpl = parameter.isGenericCovariantImpl;
}
nonSetters.remove(field.name);
- class_.addMember(clone);
+ class_.addField(clone);
}
class_.procedures.clear();
class_.procedures..addAll(nonSetters.values)..addAll(setters.values);
@@ -208,7 +201,7 @@
class_.procedures[originalIndex] = clone;
} else {
- class_.addMember(clone);
+ class_.addProcedure(clone);
}
}
assert(class_.constructors.isNotEmpty);
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index a47072d..3713e32 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -382,7 +382,7 @@
reference: clazz.reference.canonicalName
?.getChildFromFieldWithName(fieldName)
?.reference);
- clazz.addMember(locationField);
+ clazz.addField(locationField);
final Set<Constructor> _handledConstructors =
new Set<Constructor>.identity();
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index d56989a..5e21e5c 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -183,7 +183,7 @@
positionalParameters: [other]),
fileUri: cls.fileUri)
..fileOffset = cls.fileOffset;
- cls.addMember(equalsOperator);
+ cls.addProcedure(equalsOperator);
}
void addHashCode(Class cls, CoreTypes coreTypes, ClassHierarchy hierarchy,
@@ -226,7 +226,7 @@
targetsHashcode[variable] = targetHashcode;
targets[variable] = target;
}
- cls.addMember(Procedure(
+ cls.addProcedure(Procedure(
Name("hashCode"),
ProcedureKind.Getter,
FunctionNode(
@@ -278,7 +278,7 @@
}
DartType returnType =
coreTypes.stringRawType(cls.enclosingLibrary.nonNullable);
- cls.addMember(Procedure(
+ cls.addProcedure(Procedure(
Name("toString"),
ProcedureKind.Method,
FunctionNode(ReturnStatement(StringConcatenation(wording)),
@@ -311,7 +311,7 @@
targets[variable] = target;
}
- cls.addMember(Procedure(
+ cls.addProcedure(Procedure(
Name("copyWith"),
ProcedureKind.Method,
FunctionNode(
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 731e054..613f5f7 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -167,7 +167,7 @@
hierarchy.getDispatchTargets(a), unorderedEquals([methodA1, methodA2]));
// Add a member to A, but only update A.
- a.addMember(methodA3);
+ a.addProcedure(methodA3);
hierarchy.applyMemberChanges([a]);
expect(hierarchy.getDispatchTargets(b),
unorderedEquals([methodA1, methodA2, methodB1]));
diff --git a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
index 3d37648..05bbc05 100644
--- a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
+++ b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
@@ -22,8 +22,8 @@
Procedure p2 = new Procedure(new Name("p2"), ProcedureKind.Method,
new FunctionNode(new ReturnStatement()))
..fileUri = uri1;
- library1.addMember(p1);
- library2.addMember(p2);
+ library1.addProcedure(p1);
+ library2.addProcedure(p2);
Component component = new Component(libraries: [library1, library2])
..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
diff --git a/pkg/kernel/test/relink_test.dart b/pkg/kernel/test/relink_test.dart
index fef6210..ed51ee6 100644
--- a/pkg/kernel/test/relink_test.dart
+++ b/pkg/kernel/test/relink_test.dart
@@ -91,7 +91,7 @@
new Name("method"),
ProcedureKind.Method,
new FunctionNode(libProcedureBody, returnType: new DynamicType()));
- lib.addMember(libProcedure);
+ lib.addProcedure(libProcedure);
final Library main = new Library(Uri.parse('org-dartlang:///main.dart'));
final Block mainProcedureBody = new Block([
@@ -102,7 +102,7 @@
new Name("method"),
ProcedureKind.Method,
new FunctionNode(mainProcedureBody, returnType: new DynamicType()));
- main.addMember(mainProcedure);
+ main.addProcedure(mainProcedure);
return new Component(libraries: [main, lib])
..setMainMethodAndMode(null, false, NonNullableByDefaultCompiledMode.Weak);
}
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 0e5a207..56ccfcf 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -292,7 +292,7 @@
new FunctionNode(new EmptyStatement(),
positionalParameters: [new VariableDeclaration('p')]),
isStatic: true);
- test.enclosingClass.addMember(method);
+ test.enclosingClass.addProcedure(method);
test.addNode(
StaticInvocation(method, new Arguments([new NullLiteral()])));
},
@@ -303,7 +303,7 @@
var method = new Procedure(new Name('bar'), ProcedureKind.Method,
new FunctionNode(new EmptyStatement()),
isStatic: true);
- test.enclosingClass.addMember(method);
+ test.enclosingClass.addProcedure(method);
test.addNode(
StaticInvocation(method, new Arguments([new NullLiteral()])));
return method;
@@ -320,7 +320,7 @@
new FunctionNode(new EmptyStatement(),
positionalParameters: [new VariableDeclaration('p')]),
isStatic: true);
- test.enclosingClass.addMember(method);
+ test.enclosingClass.addProcedure(method);
test.addNode(StaticInvocation(method, new Arguments.empty()));
return method;
},
@@ -332,7 +332,7 @@
var method = new Procedure(new Name('bar'), ProcedureKind.Method,
new FunctionNode(new EmptyStatement()),
isStatic: true);
- test.enclosingClass.addMember(method);
+ test.enclosingClass.addProcedure(method);
test.addNode(StaticInvocation(
method,
new Arguments([],
@@ -351,7 +351,7 @@
new FunctionNode(new EmptyStatement(),
typeParameters: [test.makeTypeParameter()]),
isStatic: true);
- test.enclosingClass.addMember(method);
+ test.enclosingClass.addProcedure(method);
test.addNode(StaticInvocation(method, new Arguments.empty()));
return method;
},
@@ -363,7 +363,7 @@
(TestHarness test) {
var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
name: new Name('foo'));
- test.enclosingClass.addMember(constructor);
+ test.enclosingClass.addConstructor(constructor);
test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
return constructor;
},
@@ -424,7 +424,7 @@
var field = new Field(new Name('field'),
type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
test.enclosingLibrary.addTypedef(typedef_);
- test.enclosingLibrary.addMember(field);
+ test.enclosingLibrary.addField(field);
},
);
negative1Test(
@@ -635,7 +635,7 @@
var field =
new Field(new Name('field'), type: typedefType, isStatic: true);
test.enclosingLibrary.addTypedef(foo);
- test.enclosingLibrary.addMember(field);
+ test.enclosingLibrary.addField(field);
return typedefType;
},
(Node typedefType) =>
@@ -648,7 +648,7 @@
var foo = new Typedef('Foo', test.otherLegacyRawType, typeParameters: []);
var field = new Field(new Name('field'),
type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
- test.enclosingLibrary.addMember(field);
+ test.enclosingLibrary.addField(field);
return foo;
},
(Node foo) => "Dangling reference to '$foo', parent is: 'null'",
@@ -657,7 +657,7 @@
'Non-static top-level field',
(TestHarness test) {
var field = new Field(new Name('field'));
- test.enclosingLibrary.addMember(field);
+ test.enclosingLibrary.addField(field);
return null;
},
(Node node) => "The top-level field 'field' should be static",
@@ -715,11 +715,27 @@
}
void addClassMember(Member node) {
- enclosingClass.addMember(node);
+ if (node is Procedure) {
+ enclosingClass.addProcedure(node);
+ } else if (node is Field) {
+ enclosingClass.addField(node);
+ } else if (node is Constructor) {
+ enclosingClass.addConstructor(node);
+ } else if (node is RedirectingFactoryConstructor) {
+ enclosingClass.addRedirectingFactoryConstructor(node);
+ } else {
+ throw "Unexpected class member: ${node.runtimeType}";
+ }
}
void addTopLevelMember(Member node) {
- enclosingLibrary.addMember(node);
+ if (node is Procedure) {
+ enclosingLibrary.addProcedure(node);
+ } else if (node is Field) {
+ enclosingLibrary.addField(node);
+ } else {
+ throw "Unexpected top level member: ${node.runtimeType}";
+ }
}
void addClass(Class node) {
@@ -762,7 +778,7 @@
enclosingLibrary.addClass(enclosingClass);
enclosingMember = new Procedure(new Name('test'), ProcedureKind.Method,
new FunctionNode(new EmptyStatement()));
- enclosingClass.addMember(enclosingMember);
+ enclosingClass.addProcedure(enclosingMember);
otherClass = new Class(
name: 'OtherClass',
typeParameters: [makeTypeParameter('OtherT')],
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index b8a3e62..8986ebe 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -286,7 +286,7 @@
..fileOffset = node.fileOffset
..isNonNullableByDefault = node.enclosingLibrary.isNonNullableByDefault;
_makeEntryPoint(ctor);
- node.addMember(ctor);
+ node.addConstructor(ctor);
}
/// Computes the field offsets (for all ABIs) in the struct and replaces the
@@ -349,7 +349,7 @@
.map((Abi abi, SizeAndOffsets v) => MapEntry(abi, v.offsets[i]));
final methods = _generateMethodsForField(
fields[i], types[i], fieldOffsets, indexedClass);
- methods.forEach((p) => node.addMember(p));
+ methods.forEach((p) => node.addProcedure(p));
}
for (final Field f in fields.values) {
@@ -537,7 +537,7 @@
reference: indexedClass?.lookupField(name.text)?.reference)
..fileOffset = struct.fileOffset;
_makeEntryPoint(sizeOf);
- struct.addMember(sizeOf);
+ struct.addField(sizeOf);
}
int _sizeInBytes(NativeType type, Abi abi) {
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index b0926a1..fb6635c 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -347,7 +347,7 @@
fileUri: currentLibrary.fileUri,
reference: currentLibraryIndex?.lookupField(name.text)?.reference)
..fileOffset = node.fileOffset;
- currentLibrary.addMember(field);
+ currentLibrary.addField(field);
return StaticGet(field);
}
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 53f5219..de5576f 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -695,7 +695,7 @@
isAbstract: true, fileUri: field.fileUri);
}
accessor.fileOffset = field.fileOffset;
- field.enclosingClass.addMember(accessor);
+ field.enclosingClass.addProcedure(accessor);
_removedFields[accessor] = field;
shaker.addUsedMember(accessor);
return accessor;
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 321285e..e3f6c54 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -689,12 +689,12 @@
};
enum Flag {
- kIsAbstract = 1 << 2,
- kIsEnumClass = 1 << 3,
- kIsAnonymousMixin = 1 << 4,
- kIsEliminatedMixin = 1 << 5,
- kFlagMixinDeclaration = 1 << 6,
- kHasConstConstructor = 1 << 7,
+ kIsAbstract = 1 << 0,
+ kIsEnumClass = 1 << 1,
+ kIsAnonymousMixin = 1 << 2,
+ kIsEliminatedMixin = 1 << 3,
+ kFlagMixinDeclaration = 1 << 4,
+ kHasConstConstructor = 1 << 5,
};
explicit ClassHelper(KernelReaderHelper* helper)
@@ -770,11 +770,10 @@
};
enum Flag {
- kExternal = 1 << 0,
- kSynthetic = 1 << 1,
- kIsNonNullableByDefault = 1 << 2,
- kNonNullableByDefaultCompiledModeBit1Weak = 1 << 3,
- kNonNullableByDefaultCompiledModeBit2Strong = 1 << 4,
+ kSynthetic = 1 << 0,
+ kIsNonNullableByDefault = 1 << 1,
+ kNonNullableByDefaultCompiledModeBit1 = 1 << 2,
+ kNonNullableByDefaultCompiledModeBit2 = 1 << 3,
};
explicit LibraryHelper(KernelReaderHelper* helper, uint32_t binary_version)
@@ -789,19 +788,18 @@
void SetNext(Field field) { next_read_ = field; }
void SetJustRead(Field field) { next_read_ = field + 1; }
- bool IsExternal() const { return (flags_ & kExternal) != 0; }
bool IsSynthetic() const { return (flags_ & kSynthetic) != 0; }
bool IsNonNullableByDefault() const {
return (flags_ & kIsNonNullableByDefault) != 0;
}
NNBDCompiledMode GetNonNullableByDefaultCompiledMode() const {
- bool weak = (flags_ & kNonNullableByDefaultCompiledModeBit1Weak) != 0;
- bool strong = (flags_ & kNonNullableByDefaultCompiledModeBit2Strong) != 0;
- if (weak && strong) return NNBDCompiledMode::kAgnostic;
- if (strong) return NNBDCompiledMode::kStrong;
- if (weak) return NNBDCompiledMode::kWeak;
- // Nothing set is implicitly weak.
- return NNBDCompiledMode::kWeak;
+ bool bit1 = (flags_ & kNonNullableByDefaultCompiledModeBit1) != 0;
+ bool bit2 = (flags_ & kNonNullableByDefaultCompiledModeBit2) != 0;
+ if (!bit1 && !bit2) return NNBDCompiledMode::kWeak;
+ if (bit1 && !bit2) return NNBDCompiledMode::kStrong;
+ if (bit1 && bit2) return NNBDCompiledMode::kAgnostic;
+ // !bit1 && bit2 is unused.
+ UNREACHABLE();
}
uint8_t flags_ = 0;
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 49898fe..1625ce1 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
// Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 47;
-static const uint32_t kMaxSupportedKernelFormatVersion = 47;
+static const uint32_t kMinSupportedKernelFormatVersion = 49;
+static const uint32_t kMaxSupportedKernelFormatVersion = 49;
// Keep in sync with package:kernel/lib/binary/tag.dart
#define KERNEL_TAG_LIST(V) \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 44b07a4..5b5ea0d 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1040,8 +1040,6 @@
Library& library =
Library::Handle(Z, LookupLibrary(library_helper.canonical_name_));
- // The Kernel library is external implies that it is already loaded.
- ASSERT(!library_helper.IsExternal() || library.Loaded());
if (library.Loaded()) return library.raw();
library.set_is_nnbd(library_helper.IsNonNullableByDefault());
diff --git a/tools/VERSION b/tools/VERSION
index dd0d6b5..392009d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 266
+PRERELEASE 267
PRERELEASE_PATCH 0
\ No newline at end of file