[kernel] Don't use increasing .length = in class_hierarchy.dart
Closes #45013
Change-Id: I1b51818f447faea50fdc34ed7504cba02d65bc34
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/184789
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7275558..fa63366 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -11552,3 +11552,7 @@
/// `List.filled` constructor.
const NamedType namedTypeDummy =
const NamedType('', dartTypeDummy, isRequired: false);
+
+/// Non-nullable `Member` value to be used as a dummy initial value for the
+/// `List.filled` constructor.
+final Member dummyMember = new Field.mutable(new _PublicName(''));
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 30fc980..08ed371 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -248,7 +248,9 @@
List<Member> first, List<Member> second) {
if (first.isEmpty) return second;
if (second.isEmpty) return first;
- List<Member> result = <Member>[]..length = first.length + second.length;
+ List<Member> result = new List<Member>.filled(
+ first.length + second.length, dummyMember,
+ growable: true);
int storeIndex = 0;
int i = 0, j = 0;
while (i < first.length && j < second.length) {
@@ -1282,8 +1284,9 @@
static List<Member> _inheritMembers(
List<Member> declared, List<Member> inherited,
{bool skipAbstractMembers: false}) {
- List<Member> result = <Member>[]..length =
- declared.length + inherited.length;
+ List<Member> result = new List<Member>.filled(
+ declared.length + inherited.length, dummyMember,
+ growable: true);
// Since both lists are sorted, we can fuse them like in merge sort.
int storeIndex = 0;
int i = 0, j = 0;
@@ -1333,7 +1336,8 @@
/// The input lists must be sorted, and the returned list is sorted.
static List<Member> _getUnshadowedInheritedMembers(
List<Member> declared, List<Member> inherited) {
- List<Member> result = <Member>[]..length = inherited.length;
+ List<Member> result =
+ new List<Member>.filled(inherited.length, dummyMember, growable: true);
int storeIndex = 0;
int i = 0, j = 0;
while (i < declared.length && j < inherited.length) {
@@ -1433,10 +1437,8 @@
for (Class class_ in _infoMap.keys) {
_ClassInfo info = _infoMap[class_]!;
int intervals = info.supertypeIntervalList.length ~/ 2;
- if (intervals >= result.length) {
- int oldLength = result.length;
- result.length = intervals + 1;
- result.fillRange(oldLength, result.length, 0);
+ while (result.length <= intervals) {
+ result.add(0);
}
result[intervals] += 1;
}