Version 2.14.0-82.0.dev
Merge commit '55ba4d56a73224dda7f98812e6fff33f5ec62491' into 'dev'
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.equivalence_info b/pkg/front_end/parser_testcases/general/issue_45848_01.equivalence_info
new file mode 100644
index 0000000..7bb0fd9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.equivalence_info
@@ -0,0 +1,7 @@
+files:
+ - issue_45848_01.dart
+ - issue_45848_01_prime.dart
+filters:
+ - ignoreListenerArguments
+ignored:
+ - handleParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.equivalence_info b/pkg/front_end/parser_testcases/general/issue_45848_02.equivalence_info
new file mode 100644
index 0000000..786165c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.equivalence_info
@@ -0,0 +1,7 @@
+files:
+ - issue_45848_02.dart
+ - issue_45848_02_prime.dart
+filters:
+ - ignoreListenerArguments
+ignored:
+ - handleParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.equivalence_info b/pkg/front_end/parser_testcases/general/issue_45848_03.equivalence_info
new file mode 100644
index 0000000..e17dc1c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.equivalence_info
@@ -0,0 +1,7 @@
+files:
+ - issue_45848_03.dart
+ - issue_45848_03_prime.dart
+filters:
+ - ignoreListenerArguments
+ignored:
+ - handleParenthesizedExpression
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_04.equivalence_info b/pkg/front_end/parser_testcases/general/issue_45848_04.equivalence_info
new file mode 100644
index 0000000..789e92a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/issue_45848_04.equivalence_info
@@ -0,0 +1,7 @@
+files:
+ - issue_45848_04.dart
+ - issue_45848_04_prime.dart
+filters:
+ - ignoreListenerArguments
+ignored:
+ - handleRecoverableError
diff --git a/pkg/front_end/parser_testcases/parser_equivalence.status b/pkg/front_end/parser_testcases/parser_equivalence.status
new file mode 100644
index 0000000..ce2368d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/parser_equivalence.status
@@ -0,0 +1,3 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
diff --git a/pkg/front_end/test/parser_equivalence_suite.dart b/pkg/front_end/test/parser_equivalence_suite.dart
new file mode 100644
index 0000000..0e473f3
--- /dev/null
+++ b/pkg/front_end/test/parser_equivalence_suite.dart
@@ -0,0 +1,158 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import 'dart:io';
+
+import "package:yaml/yaml.dart" show YamlMap, loadYamlNode;
+
+import 'package:testing/testing.dart'
+ show Chain, ChainContext, Result, Step, TestDescription, runMe;
+
+import 'testing_utils.dart' show checkEnvironment;
+
+import 'parser_suite.dart'
+ show ListenerStep, ParserTestListenerWithMessageFormatting;
+
+main([List<String> arguments = const []]) => runMe(
+ arguments,
+ createContext,
+ configurationPath: "../testing.json",
+ );
+
+Future<Context> createContext(
+ Chain suite, Map<String, String> environment) async {
+ const Set<String> knownEnvironmentKeys = {};
+ checkEnvironment(environment, knownEnvironmentKeys);
+
+ return new Context(suite.name);
+}
+
+class Context extends ChainContext {
+ final String suiteName;
+
+ Context(this.suiteName);
+
+ final List<Step> steps = const <Step>[
+ const ListenerCompareStep(),
+ ];
+}
+
+class ListenerCompareStep
+ extends Step<TestDescription, TestDescription, Context> {
+ const ListenerCompareStep();
+
+ String get name => "listenerCompare";
+
+ Future<Result<TestDescription>> run(
+ TestDescription description, Context context) {
+ Uri uri = description.uri;
+ String contents = new File.fromUri(uri).readAsStringSync();
+ YamlMap yaml = loadYamlNode(contents, sourceUrl: uri);
+ List<Uri> files =
+ (yaml["files"] as List).map((s) => uri.resolve(s)).toList();
+ Set<String> filters = new Set<String>.from(yaml["filters"] ?? []);
+ Set<String> ignored = new Set<String>.from(yaml["ignored"] ?? []);
+
+ ParserTestListenerWithMessageFormatting parserTestListenerFirst =
+ ListenerStep.doListenerParsing(
+ files[0],
+ context.suiteName,
+ description.shortName,
+ );
+ if (parserTestListenerFirst == null) {
+ return Future.value(crash(description, StackTrace.current));
+ }
+
+ for (int i = 1; i < files.length; i++) {
+ ParserTestListenerWithMessageFormatting parserTestListener =
+ ListenerStep.doListenerParsing(
+ files[i],
+ context.suiteName,
+ description.shortName,
+ );
+ if (parserTestListener == null) {
+ return Future.value(crash(description, StackTrace.current));
+ }
+ String compareResult = compare(
+ parserTestListenerFirst, parserTestListener, filters, ignored);
+ if (compareResult != null) {
+ return Future.value(
+ fail(description, compareResult, StackTrace.current));
+ }
+ }
+
+ return new Future.value(new Result<TestDescription>.pass(description));
+ }
+
+ String compare(
+ ParserTestListenerWithMessageFormatting a,
+ ParserTestListenerWithMessageFormatting b,
+ Set<String> filters,
+ Set<String> ignored) {
+ List<String> aLines = a.sb.toString().split("\n");
+ List<String> bLines = b.sb.toString().split("\n");
+
+ bool doRemoveListenerArguments =
+ filters.contains("ignoreListenerArguments");
+
+ int aIndex = 0;
+ int bIndex = 0;
+ while (aIndex < aLines.length && bIndex < bLines.length) {
+ String aLine = aLines[aIndex];
+ String bLine = bLines[bIndex];
+ if (doRemoveListenerArguments) {
+ aLine = removeListenerArguments(aLine);
+ bLine = removeListenerArguments(bLine);
+ }
+ bool anyIgnored = false;
+ if (ignored.contains(aLine.trim())) {
+ anyIgnored = true;
+ aIndex++;
+ }
+ if (ignored.contains(bLine.trim())) {
+ anyIgnored = true;
+ bIndex++;
+ }
+ if (anyIgnored) continue;
+ if (aLine != bLine) {
+ return "Disagreement: '${aLine}' vs '${bLine}'";
+ }
+ aIndex++;
+ bIndex++;
+ }
+
+ // Any trailing lines?
+ while (aIndex < aLines.length) {
+ String aLine = aLines[aIndex];
+ if (doRemoveListenerArguments) {
+ aLine = removeListenerArguments(aLine);
+ }
+ if (ignored.contains(aLine.trim())) {
+ aIndex++;
+ continue;
+ }
+ return "Unmatched line at end: '$aLine'";
+ }
+ while (bIndex < bLines.length) {
+ String bLine = bLines[bIndex];
+ if (doRemoveListenerArguments) {
+ bLine = removeListenerArguments(bLine);
+ }
+ if (ignored.contains(bLine.trim())) {
+ bIndex++;
+ continue;
+ }
+ return "Unmatched line at end: '$bLine'";
+ }
+ return null;
+ }
+
+ String removeListenerArguments(String s) {
+ int index = s.indexOf("(");
+ if (index < 0) return s;
+ return s.substring(0, index);
+ }
+}
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index 6221db7..4b6015b 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -174,29 +174,46 @@
String get name => "listener";
- Future<Result<TestDescription>> run(
- TestDescription description, Context context) {
+ /// Scans the uri, parses it with the test listener and returns it.
+ ///
+ /// Returns null if scanner doesn't return any Token.
+ static ParserTestListenerWithMessageFormatting doListenerParsing(
+ Uri uri, String suiteName, String shortName,
+ {bool addTrace: false, bool annotateLines: false}) {
List<int> lineStarts = <int>[];
-
- Token firstToken =
- scanUri(description.uri, description.shortName, lineStarts: lineStarts);
+ Token firstToken = scanUri(uri, shortName, lineStarts: lineStarts);
if (firstToken == null) {
- return Future.value(crash(description, StackTrace.current));
+ return null;
}
- File f = new File.fromUri(description.uri);
+ File f = new File.fromUri(uri);
List<int> rawBytes = f.readAsBytesSync();
- Source source =
- new Source(lineStarts, rawBytes, description.uri, description.uri);
-
- String shortName = "${context.suiteName}/${description.shortName}";
-
+ Source source = new Source(lineStarts, rawBytes, uri, uri);
+ String shortNameId = "${suiteName}/${shortName}";
ParserTestListenerWithMessageFormatting parserTestListener =
new ParserTestListenerWithMessageFormatting(
- context.addTrace, context.annotateLines, source, shortName);
+ addTrace, annotateLines, source, shortNameId);
Parser parser = new Parser(parserTestListener);
parser.parseUnit(firstToken);
+ return parserTestListener;
+ }
+
+ Future<Result<TestDescription>> run(
+ TestDescription description, Context context) {
+ Uri uri = description.uri;
+
+ ParserTestListenerWithMessageFormatting parserTestListener =
+ doListenerParsing(
+ uri,
+ context.suiteName,
+ description.shortName,
+ addTrace: context.addTrace,
+ annotateLines: context.annotateLines,
+ );
+ if (parserTestListener == null) {
+ return Future.value(crash(description, StackTrace.current));
+ }
String errors = "";
if (parserTestListener.errors.isNotEmpty) {
@@ -205,8 +222,8 @@
}
if (doExpects) {
- return context.match<TestDescription>(".expect",
- "${errors}${parserTestListener.sb}", description.uri, description);
+ return context.match<TestDescription>(
+ ".expect", "${errors}${parserTestListener.sb}", uri, description);
} else {
return new Future.value(new Result<TestDescription>.pass(description));
}
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 2a418f9..7b81151 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -294,6 +294,7 @@
field4b
filesystem
filler
+filters
fisk
five
floor
diff --git a/pkg/front_end/test/unit_test_suites_impl.dart b/pkg/front_end/test/unit_test_suites_impl.dart
index cdead85..c9d550c 100644
--- a/pkg/front_end/test/unit_test_suites_impl.dart
+++ b/pkg/front_end/test/unit_test_suites_impl.dart
@@ -32,6 +32,7 @@
import 'incremental_suite.dart' as incremental show createContext;
import 'lint_suite.dart' as lint show createContext;
import 'parser_suite.dart' as parser show createContext;
+import 'parser_equivalence_suite.dart' as parserEquivalence show createContext;
import 'parser_all_suite.dart' as parserAll show createContext;
import 'spelling_test_not_src_suite.dart' as spelling_not_src
show createContext;
@@ -415,6 +416,12 @@
shardCount: 1,
),
const Suite(
+ "parser_equivalence",
+ parserEquivalence.createContext,
+ "../testing.json",
+ shardCount: 1,
+ ),
+ const Suite(
"parser_all",
parserAll.createContext,
"../testing.json",
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index ef56494..ab205e0 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -229,6 +229,17 @@
"exclude": []
},
{
+ "name": "parser_equivalence",
+ "kind": "Chain",
+ "source": "test/parser_equivalence_suite.dart",
+ "path": "parser_testcases/",
+ "status": "parser_testcases/parser_equivalence.status",
+ "pattern": [
+ "\\.equivalence_info$"
+ ],
+ "exclude": []
+ },
+ {
"name": "parser_all",
"kind": "Chain",
"source": "test/parser_all_suite.dart",
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 039a81f..7c3f61f 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -519,11 +519,7 @@
List<Expression> readAnnotationList([TreeNode? parent]) {
int length = readUInt30();
- if (!useGrowableLists && length == 0) {
- // When lists don't have to be growable anyway, we might as well use an
- // almost constant one for the empty list.
- return emptyListOfExpression;
- }
+ if (length == 0) return const <Expression>[];
return new List<Expression>.generate(
length, (_) => readExpression()..parent = parent,
growable: useGrowableLists);
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 815f38d..1b8f1de 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -159,7 +159,7 @@
} else {
// TODO(jensj/dacoharkes): We can probably limit the transformations to
// libraries that transitivley depend on dart:ffi.
- final ffiTransformerData = transformFfiDefinitions.transformLibraries(
+ transformFfiDefinitions.transformLibraries(
component,
coreTypes,
hierarchy,
@@ -167,14 +167,8 @@
diagnosticReporter,
referenceFromIndex,
changedStructureNotifier);
- transformFfiUseSites.transformLibraries(
- component,
- coreTypes,
- hierarchy,
- libraries,
- diagnosticReporter,
- ffiTransformerData,
- referenceFromIndex);
+ transformFfiUseSites.transformLibraries(component, coreTypes, hierarchy,
+ libraries, diagnosticReporter, referenceFromIndex);
logger?.call("Transformed ffi annotations");
}
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index a08f107..558f4da 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -786,13 +786,6 @@
}
}
-/// Contains all information collected by _FfiDefinitionTransformer that is
-/// needed in _FfiUseSiteTransformer.
-class FfiTransformerData {
- final Set<Class> emptyCompounds;
- FfiTransformerData(this.emptyCompounds);
-}
-
/// Checks if any library depends on dart:ffi.
bool importsFfi(Component component, List<Library> libraries) {
Set<Library> allLibs = {...component.libraries, ...libraries};
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 5c202a1..b7ef1d7 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -63,7 +63,7 @@
///
/// static final int #sizeOf = 24;
/// }
-FfiTransformerData transformLibraries(
+void transformLibraries(
Component component,
CoreTypes coreTypes,
ClassHierarchy hierarchy,
@@ -77,17 +77,16 @@
// TODO: This check doesn't make sense: "dart:ffi" is always loaded/created
// for the VM target.
// If dart:ffi is not loaded, do not do the transformation.
- return FfiTransformerData({});
+ return;
}
if (index.tryGetClass('dart:ffi', 'NativeFunction') == null) {
// If dart:ffi is not loaded (for real): do not do the transformation.
- return FfiTransformerData({});
+ return;
}
final transformer = new _FfiDefinitionTransformer(index, coreTypes, hierarchy,
diagnosticReporter, referenceFromIndex, changedStructureNotifier);
libraries.forEach(transformer.visitLibrary);
transformer.manualVisitInTopologicalOrder();
- return FfiTransformerData(transformer.emptyCompounds);
}
class CompoundDependencyGraph<T> implements Graph<T> {
@@ -108,8 +107,6 @@
Map<Class, bool> fieldsValid = {};
Map<Class, CompoundNativeTypeCfe> compoundCache = {};
- Set<Class> emptyCompounds = {};
-
ChangedStructureNotifier changedStructureNotifier;
IndexedLibrary currentLibraryIndex;
@@ -528,7 +525,6 @@
node.fileOffset,
node.name.length,
node.location.file);
- emptyCompounds.add(node);
}
final compoundType = node.superclass == structClass
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index 153a07a..860c2d2 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -9,7 +9,6 @@
messageFfiExceptionalReturnNull,
messageFfiExpectedConstant,
templateFfiDartTypeMismatch,
- templateFfiEmptyStruct,
templateFfiExpectedExceptionalReturn,
templateFfiExpectedNoExceptionalReturn,
templateFfiExtendsOrImplementsSealedClass,
@@ -27,7 +26,6 @@
import 'ffi.dart'
show
- FfiTransformerData,
NativeType,
FfiTransformer,
nativeTypeSizes,
@@ -42,7 +40,6 @@
ClassHierarchy hierarchy,
List<Library> libraries,
DiagnosticReporter diagnosticReporter,
- FfiTransformerData ffiTransformerData,
ReferenceFromIndex referenceFromIndex) {
final index = new LibraryIndex(
component, ["dart:ffi", "dart:_internal", "dart:typed_data"]);
@@ -57,18 +54,12 @@
return;
}
final transformer = new _FfiUseSiteTransformer(
- index,
- coreTypes,
- hierarchy,
- diagnosticReporter,
- referenceFromIndex,
- ffiTransformerData.emptyCompounds);
+ index, coreTypes, hierarchy, diagnosticReporter, referenceFromIndex);
libraries.forEach(transformer.visitLibrary);
}
/// Checks and replaces calls to dart:ffi compound fields and methods.
class _FfiUseSiteTransformer extends FfiTransformer {
- final Set<Class> emptyCompounds;
StaticTypeContext _staticTypeContext;
bool get isFfiLibrary => currentLibrary == ffiLibrary;
@@ -82,8 +73,7 @@
CoreTypes coreTypes,
ClassHierarchy hierarchy,
DiagnosticReporter diagnosticReporter,
- ReferenceFromIndex referenceFromIndex,
- this.emptyCompounds)
+ ReferenceFromIndex referenceFromIndex)
: super(index, coreTypes, hierarchy, diagnosticReporter,
referenceFromIndex) {}
@@ -192,7 +182,6 @@
_ensureNativeTypeValid(nativeType, node);
_ensureNativeTypeToDartType(nativeType, dartType, node);
- _ensureNoEmptyCompounds(dartType, node);
final replacement = _replaceLookupFunction(node);
@@ -214,7 +203,6 @@
_ensureNativeTypeValid(nativeType, node);
_ensureNativeTypeToDartType(nativeType, dartType, node);
- _ensureNoEmptyCompounds(dartType, node);
final DartType nativeSignature =
(nativeType as InterfaceType).typeArguments[0];
@@ -246,7 +234,6 @@
_ensureNativeTypeValid(nativeType, node);
_ensureNativeTypeToDartType(nativeType, dartType, node);
- _ensureNoEmptyCompounds(dartType, node);
final funcType = dartType as FunctionType;
@@ -785,30 +772,6 @@
}
}
- void _ensureNoEmptyCompounds(DartType nativeType, Expression node) {
- // Error on structs with no fields.
- if (nativeType is InterfaceType) {
- final Class nativeClass = nativeType.classNode;
- if (hierarchy.isSubclassOf(nativeClass, compoundClass)) {
- if (emptyCompounds.contains(nativeClass)) {
- diagnosticReporter.report(
- templateFfiEmptyStruct.withArguments(
- nativeClass.superclass.name, nativeClass.name),
- node.fileOffset,
- 1,
- node.location.file);
- }
- }
- }
-
- // Recurse when seeing a function type.
- if (nativeType is FunctionType) {
- nativeType.positionalParameters
- .forEach((e) => _ensureNoEmptyCompounds(e, node));
- _ensureNoEmptyCompounds(nativeType.returnType, node);
- }
- }
-
/// The Dart type system does not enforce that NativeFunction return and
/// parameter types are only NativeTypes, so we need to check this.
bool _nativeTypeValid(DartType nativeType,
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 6705857..dfbeeef 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -191,7 +191,7 @@
const Instance& owner_mirror) {
const Array& args = Array::Handle(Array::New(3));
args.SetAt(0, param);
- args.SetAt(1, String::Handle(param.UserVisibleName()));
+ args.SetAt(1, String::Handle(param.name()));
args.SetAt(2, owner_mirror);
return CreateMirror(Symbols::_TypeVariableMirror(), args);
}
@@ -199,17 +199,18 @@
// We create a list in native code and let Dart code create the type mirror
// object and the ordered map.
static InstancePtr CreateTypeVariableList(const Class& cls) {
- const intptr_t num_type_params = cls.NumTypeParameters();
- if (num_type_params == 0) {
+ const TypeArguments& args = TypeArguments::Handle(cls.type_parameters());
+ if (args.IsNull()) {
return Object::empty_array().ptr();
}
- const Array& result = Array::Handle(Array::New(num_type_params * 2));
+ const Array& result = Array::Handle(Array::New(args.Length() * 2));
TypeParameter& type = TypeParameter::Handle();
String& name = String::Handle();
- for (intptr_t i = 0; i < num_type_params; i++) {
- type = cls.TypeParameterAt(i, Nullability::kLegacy);
+ for (intptr_t i = 0; i < args.Length(); i++) {
+ type ^= args.TypeAt(i);
+ ASSERT(type.IsTypeParameter());
ASSERT(type.IsFinalized());
- name = type.UserVisibleName();
+ name = type.name();
result.SetAt(2 * i, name);
result.SetAt(2 * i + 1, type);
}
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index fb999cf..6b0e86c 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -449,19 +449,18 @@
const Closure& closure =
Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
const Function& target = Function::Handle(zone, closure.function());
- const TypeParameters& type_params =
- TypeParameters::Handle(zone, target.type_parameters());
- if (type_params.IsNull() || type_params.AllDynamicBounds()) {
- // The function is not generic or the bounds are all dynamic.
- return Object::null();
- }
+ const TypeArguments& bounds =
+ TypeArguments::Handle(zone, target.type_parameters());
+
+ // Either the bounds are all-dynamic or the function is not generic.
+ if (bounds.IsNull()) return Object::null();
const TypeArguments& type_args_to_check =
TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(1));
// This should be guaranteed by the front-end.
ASSERT(type_args_to_check.IsNull() ||
- type_params.Length() <= type_args_to_check.Length());
+ bounds.Length() <= type_args_to_check.Length());
// The bounds on the closure may need instantiation.
const TypeArguments& instantiator_type_args =
@@ -471,8 +470,10 @@
AbstractType& supertype = AbstractType::Handle(zone);
AbstractType& subtype = AbstractType::Handle(zone);
- for (intptr_t i = 0; i < type_params.Length(); ++i) {
- supertype = type_params.BoundAt(i);
+ TypeParameter& parameter = TypeParameter::Handle(zone);
+ for (intptr_t i = 0; i < bounds.Length(); ++i) {
+ parameter ^= bounds.TypeAt(i);
+ supertype = parameter.bound();
subtype = type_args_to_check.IsNull() ? Object::dynamic_type().ptr()
: type_args_to_check.TypeAt(i);
@@ -491,7 +492,7 @@
ASSERT(caller_frame != NULL);
location = caller_frame->GetTokenPos();
}
- const auto& parameter_name = String::Handle(zone, type_params.NameAt(i));
+ String& parameter_name = String::Handle(zone, parameter.Name());
Exceptions::CreateAndThrowTypeError(location, subtype, supertype,
parameter_name);
UNREACHABLE();
diff --git a/runtime/vm/canonical_tables.cc b/runtime/vm/canonical_tables.cc
index bfdc140..13c9470 100644
--- a/runtime/vm/canonical_tables.cc
+++ b/runtime/vm/canonical_tables.cc
@@ -40,6 +40,11 @@
const Object& owner_b = Object::Handle(Field::Cast(b).Owner());
return IsMatch(owner_a, owner_b);
} else if (a.IsTypeParameter() && b.IsTypeParameter()) {
+ const String& name_a = String::Handle(TypeParameter::Cast(a).name());
+ const String& name_b = String::Handle(TypeParameter::Cast(b).name());
+ if (!name_a.Equals(name_b)) {
+ return false;
+ }
if (TypeParameter::Cast(a).index() != TypeParameter::Cast(b).index() ||
TypeParameter::Cast(a).base() != TypeParameter::Cast(b).base()) {
return false;
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index eff5ead..e429842 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -294,41 +294,31 @@
}
IsolateGroup::Current()->heap()->Verify();
}
-#endif // defined(DART_PRECOMPILED_RUNTIME)
-void ClassFinalizer::FinalizeTypeParameters(Zone* zone,
- const Class& cls,
- const FunctionType& signature,
- FinalizationKind finalization,
- PendingTypes* pending_types) {
+void ClassFinalizer::FinalizeTypeParameters(const Class& cls,
+ FinalizationKind finalization) {
if (FLAG_trace_type_finalization) {
- THR_Print(
- "%s type parameters of %s '%s'\n",
- finalization == kFinalize ? "Finalizing" : "Canonicalizing",
- !cls.IsNull() ? "class" : "signature",
- String::Handle(zone, !cls.IsNull() ? cls.Name() : signature.Name())
- .ToCString());
+ THR_Print("%s type parameters of '%s'\n",
+ String::Handle(cls.Name()).ToCString(),
+ finalization == kFinalize ? "Finalizing" : "Canonicalizing");
}
- const TypeParameters& type_params =
- TypeParameters::Handle(zone, !cls.IsNull() ? cls.type_parameters()
- : signature.type_parameters());
+ const TypeArguments& type_params =
+ TypeArguments::Handle(cls.type_parameters());
if (!type_params.IsNull()) {
- TypeArguments& type_args = TypeArguments::Handle(zone);
-
- type_args = type_params.bounds();
- type_args =
- FinalizeTypeArguments(zone, type_args, finalization, pending_types);
- type_params.set_bounds(type_args);
-
- type_args = type_params.defaults();
- type_args =
- FinalizeTypeArguments(zone, type_args, finalization, pending_types);
- type_params.set_defaults(type_args);
-
- type_params.OptimizeFlags();
+ const intptr_t num_type_params = type_params.Length();
+ TypeParameter& type_param = TypeParameter::Handle();
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ if (!type_param.IsBeingFinalized()) {
+ type_param ^= FinalizeType(type_param, finalization);
+ type_params.SetTypeAt(i, type_param);
+ }
+ }
}
}
+#endif // defined(DART_PRECOMPILED_RUNTIME)
+
// This function reports a compilation error if the recursive 'type' T being
// finalized is a non-contractive type, i.e. if the induced type set S of P is
// not finite, where P is the instantiation of T with its own type parameters.
@@ -417,9 +407,9 @@
// Expand the type arguments of the given type and finalize its full type
// argument vector. Return the number of type arguments (0 for a raw type).
intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
- Zone* zone,
const AbstractType& type,
PendingTypes* pending_types) {
+ Zone* zone = Thread::Current()->zone();
// The type class does not need to be finalized in order to finalize the type.
// Also, the type parameters of the type class must be finalized.
Class& type_class = Class::Handle(zone, type.type_class());
@@ -493,8 +483,8 @@
}
if (offset > 0) {
TrailPtr trail = new Trail(zone, 4);
- FillAndFinalizeTypeArguments(zone, type_class, full_arguments, offset,
- pending_types, trail);
+ FinalizeTypeArguments(type_class, full_arguments, offset, pending_types,
+ trail);
}
if (full_arguments.IsRaw(0, num_type_arguments)) {
// The parameterized_type is raw. Set its argument vector to null, which
@@ -545,24 +535,22 @@
// same time. Canonicalization happens when pending types are processed.
// The trail is required to correctly instantiate a recursive type argument
// of the super type.
-void ClassFinalizer::FillAndFinalizeTypeArguments(
- Zone* zone,
- const Class& cls,
- const TypeArguments& arguments,
- intptr_t num_uninitialized_arguments,
- PendingTypes* pending_types,
- TrailPtr trail) {
+void ClassFinalizer::FinalizeTypeArguments(const Class& cls,
+ const TypeArguments& arguments,
+ intptr_t num_uninitialized_arguments,
+ PendingTypes* pending_types,
+ TrailPtr trail) {
ASSERT(arguments.Length() >= cls.NumTypeArguments());
if (!cls.is_type_finalized()) {
#if defined(DART_PRECOMPILED_RUNTIME)
UNREACHABLE();
#else
- FinalizeTypeParameters(zone, cls, Object::null_function_type(), kFinalize);
+ FinalizeTypeParameters(cls, kFinalize);
#endif // defined(DART_PRECOMPILED_RUNTIME)
}
- AbstractType& super_type = AbstractType::Handle(zone, cls.super_type());
+ AbstractType& super_type = AbstractType::Handle(cls.super_type());
if (!super_type.IsNull()) {
- const Class& super_class = Class::Handle(zone, super_type.type_class());
+ const Class& super_class = Class::Handle(super_type.type_class());
const intptr_t num_super_type_params = super_class.NumTypeParameters();
const intptr_t num_super_type_args = super_class.NumTypeArguments();
if (!super_type.IsFinalized() && !super_type.IsBeingFinalized()) {
@@ -570,12 +558,11 @@
cls.set_super_type(super_type);
}
TypeArguments& super_type_args =
- TypeArguments::Handle(zone, super_type.arguments());
+ TypeArguments::Handle(super_type.arguments());
// Offset of super type's type parameters in cls' type argument vector.
const intptr_t super_offset = num_super_type_args - num_super_type_params;
// If the super type is raw (i.e. super_type_args is null), set to dynamic.
- AbstractType& super_type_arg =
- AbstractType::Handle(zone, Type::DynamicType());
+ AbstractType& super_type_arg = AbstractType::Handle(Type::DynamicType());
for (intptr_t i = super_offset; i < num_uninitialized_arguments; i++) {
if (!super_type_args.IsNull()) {
super_type_arg = super_type_args.TypeAt(i);
@@ -594,10 +581,9 @@
ASSERT(super_type_arg.IsFunctionType());
}
if (FLAG_trace_type_finalization) {
- THR_Print(
- "Creating TypeRef '%s': '%s'\n",
- String::Handle(zone, super_type_arg.Name()).ToCString(),
- super_type_arg.ToCString());
+ THR_Print("Creating TypeRef '%s': '%s'\n",
+ String::Handle(super_type_arg.Name()).ToCString(),
+ super_type_arg.ToCString());
}
super_type_arg = TypeRef::New(super_type_arg);
}
@@ -615,12 +601,12 @@
// Instantiate super_type_arg with the current argument vector.
if (!super_type_arg.IsInstantiated()) {
if (FLAG_trace_type_finalization && super_type_arg.IsTypeRef()) {
- AbstractType& ref_type = AbstractType::Handle(
- zone, TypeRef::Cast(super_type_arg).type());
+ AbstractType& ref_type =
+ AbstractType::Handle(TypeRef::Cast(super_type_arg).type());
THR_Print(
"Instantiating TypeRef '%s': '%s'\n"
" instantiator: '%s'\n",
- String::Handle(zone, super_type_arg.Name()).ToCString(),
+ String::Handle(super_type_arg.Name()).ToCString(),
ref_type.ToCString(), arguments.ToCString());
}
// In the typical case of an F-bounded type, the instantiation of the
@@ -642,7 +628,7 @@
// The super_type_arg was instantiated from a type being finalized.
// We need to finish finalizing its type arguments, unless it is a
// type parameter, in which case there is nothing more to do.
- AbstractType& unfinalized_type = AbstractType::Handle(zone);
+ AbstractType& unfinalized_type = AbstractType::Handle();
if (super_type_arg.IsTypeRef()) {
unfinalized_type = TypeRef::Cast(super_type_arg).type();
} else {
@@ -650,19 +636,18 @@
unfinalized_type = super_type_arg.ptr();
}
if (FLAG_trace_type_finalization) {
- THR_Print(
- "Instantiated unfinalized '%s': '%s'\n",
- String::Handle(zone, unfinalized_type.Name()).ToCString(),
- unfinalized_type.ToCString());
+ THR_Print("Instantiated unfinalized '%s': '%s'\n",
+ String::Handle(unfinalized_type.Name()).ToCString(),
+ unfinalized_type.ToCString());
}
if (unfinalized_type.IsType()) {
CheckRecursiveType(unfinalized_type, pending_types);
pending_types->Add(unfinalized_type);
}
const Class& super_cls =
- Class::Handle(zone, unfinalized_type.type_class());
+ Class::Handle(unfinalized_type.type_class());
const TypeArguments& super_args =
- TypeArguments::Handle(zone, unfinalized_type.arguments());
+ TypeArguments::Handle(unfinalized_type.arguments());
// Mark as finalized before finalizing to avoid cycles.
unfinalized_type.SetIsFinalized();
// Although the instantiator is different between cls and super_cls,
@@ -670,53 +655,25 @@
// divergence. Finalizing the type arguments of super_cls may indeed
// recursively require instantiating the same type_refs already
// present in the trail (see issue #29949).
- FillAndFinalizeTypeArguments(
- zone, super_cls, super_args,
+ FinalizeTypeArguments(
+ super_cls, super_args,
super_cls.NumTypeArguments() - super_cls.NumTypeParameters(),
pending_types, trail);
if (FLAG_trace_type_finalization) {
- THR_Print(
- "Finalized instantiated '%s': '%s'\n",
- String::Handle(zone, unfinalized_type.Name()).ToCString(),
- unfinalized_type.ToCString());
+ THR_Print("Finalized instantiated '%s': '%s'\n",
+ String::Handle(unfinalized_type.Name()).ToCString(),
+ unfinalized_type.ToCString());
}
}
}
}
arguments.SetTypeAt(i, super_type_arg);
}
- FillAndFinalizeTypeArguments(zone, super_class, arguments, super_offset,
- pending_types, trail);
+ FinalizeTypeArguments(super_class, arguments, super_offset, pending_types,
+ trail);
}
}
-TypeArgumentsPtr ClassFinalizer::FinalizeTypeArguments(
- Zone* zone,
- const TypeArguments& type_args,
- FinalizationKind finalization,
- PendingTypes* pending_types) {
- if (type_args.IsNull()) return TypeArguments::null();
- ASSERT(type_args.ptr() != Object::empty_type_arguments().ptr());
- const intptr_t len = type_args.Length();
- AbstractType& type = AbstractType::Handle(zone);
- AbstractType& finalized_type = AbstractType::Handle(zone);
- for (intptr_t i = 0; i < len; i++) {
- type = type_args.TypeAt(i);
- if (type.IsBeingFinalized()) {
- ASSERT(finalization < kCanonicalize);
- continue;
- }
- finalized_type = FinalizeType(type, kFinalize, pending_types);
- if (type.ptr() != finalized_type.ptr()) {
- type_args.SetTypeAt(i, finalized_type);
- }
- }
- if (finalization >= kCanonicalize) {
- return type_args.Canonicalize(Thread::Current(), nullptr);
- }
- return type_args.ptr();
-}
-
AbstractTypePtr ClassFinalizer::FinalizeType(const AbstractType& type,
FinalizationKind finalization,
PendingTypes* pending_types) {
@@ -744,8 +701,8 @@
return type.ptr();
}
- // Recursive types must be processed in FillAndFinalizeTypeArguments() and
- // cannot be encountered here.
+ // Recursive types must be processed in FinalizeTypeArguments() and cannot be
+ // encountered here.
ASSERT(!type.IsBeingFinalized());
// Mark the type as being finalized in order to detect self reference.
@@ -780,20 +737,17 @@
type_parameter.set_parameterized_class_id(kClassCid);
}
- AbstractType& upper_bound = AbstractType::Handle(zone);
- upper_bound = type_parameter.bound();
- if (upper_bound.IsBeingFinalized()) {
- if (upper_bound.IsTypeRef()) {
- // Nothing to do.
- } else {
- upper_bound = TypeRef::New(upper_bound);
- type_parameter.set_bound(upper_bound);
- upper_bound = FinalizeType(upper_bound, kFinalize);
- }
- } else {
- upper_bound = FinalizeType(upper_bound, kFinalize);
- type_parameter.set_bound(upper_bound);
+ AbstractType& t = AbstractType::Handle(zone);
+ t = type_parameter.bound();
+ if (!t.IsBeingFinalized()) {
+ t = FinalizeType(t, kFinalize);
+ type_parameter.set_bound(t);
}
+ t = type_parameter.default_argument();
+ // The default argument cannot create a cycle with the type parameter.
+ t = FinalizeType(t, kFinalize);
+ type_parameter.set_default_argument(t);
+
type_parameter.SetIsFinalized();
if (FLAG_trace_type_finalization) {
@@ -827,7 +781,7 @@
pending_types->Add(type);
const intptr_t num_expanded_type_arguments =
- ExpandAndFinalizeTypeArguments(zone, type, pending_types);
+ ExpandAndFinalizeTypeArguments(type, pending_types);
// Self referencing types may get finalized indirectly.
if (!type.IsFinalized()) {
@@ -865,12 +819,23 @@
const FunctionType& signature,
FinalizationKind finalization,
PendingTypes* pending_types) {
- // Finalize signature type parameter upper bounds and default args.
- FinalizeTypeParameters(zone, Object::null_class(), signature, finalization,
- pending_types);
-
AbstractType& type = AbstractType::Handle(zone);
AbstractType& finalized_type = AbstractType::Handle(zone);
+ // Finalize signature type parameters, their upper bounds and default args.
+ const intptr_t num_type_params = signature.NumTypeParameters();
+ if (num_type_params > 0) {
+ TypeParameter& type_param = TypeParameter::Handle(zone);
+ const TypeArguments& type_params =
+ TypeArguments::Handle(zone, signature.type_parameters());
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ finalized_type ^= FinalizeType(type_param, kFinalize, pending_types);
+ if (type_param.ptr() != finalized_type.ptr()) {
+ type_params.SetTypeAt(i, TypeParameter::Cast(finalized_type));
+ }
+ }
+ }
+
// Finalize result type.
type = signature.result_type();
finalized_type = FinalizeType(type, kFinalize, pending_types);
@@ -1019,7 +984,6 @@
#if defined(DART_PRECOMPILED_RUNTIME)
UNREACHABLE();
#else
- Zone* zone = thread->zone();
SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
if (cls.is_type_finalized()) {
return;
@@ -1029,24 +993,24 @@
THR_Print("Finalize types in %s\n", cls.ToCString());
}
// Finalize super class.
- Class& super_class = Class::Handle(zone, cls.SuperClass());
+ Class& super_class = Class::Handle(cls.SuperClass());
if (!super_class.IsNull()) {
FinalizeTypesInClass(super_class);
}
// Finalize type parameters before finalizing the super type.
- FinalizeTypeParameters(zone, cls, Object::null_function_type(),
- kCanonicalize);
+ FinalizeTypeParameters(cls, kFinalize);
ASSERT(super_class.ptr() == cls.SuperClass()); // Not modified.
ASSERT(super_class.IsNull() || super_class.is_type_finalized());
+ FinalizeTypeParameters(cls, kCanonicalize);
// Finalize super type.
- AbstractType& super_type = AbstractType::Handle(zone, cls.super_type());
+ AbstractType& super_type = AbstractType::Handle(cls.super_type());
if (!super_type.IsNull()) {
super_type = FinalizeType(super_type);
cls.set_super_type(super_type);
}
// Finalize interface types (but not necessarily interface classes).
- Array& interface_types = Array::Handle(zone, cls.interfaces());
- AbstractType& interface_type = AbstractType::Handle(zone);
+ Array& interface_types = Array::Handle(cls.interfaces());
+ AbstractType& interface_type = AbstractType::Handle();
for (intptr_t i = 0; i < interface_types.Length(); i++) {
interface_type ^= interface_types.At(i);
interface_type = FinalizeType(interface_type);
@@ -1379,7 +1343,8 @@
error = cls.EnsureIsFinalized(thread);
ASSERT(error.IsNull());
ASSERT(cls.NumTypeParameters() == 1);
- type_param = cls.TypeParameterAt(0);
+ type_param ^= TypeParameter::RawCast(
+ TypeArguments::Handle(cls.type_parameters()).TypeAt(0));
ASSERT(Pointer::kNativeTypeArgPos == type_param.index());
#endif
}
@@ -1695,8 +1660,7 @@
for (intptr_t i = 0; i < typeparams.Length(); i++) {
typeparam ^= typeparams.At(i);
bool present = typeparams_table.Insert(typeparam);
- // Two recursive types with different topology (and hashes) may be equal.
- ASSERT(!present || typeparam.IsRecursive());
+ ASSERT(!present);
}
object_store->set_canonical_type_parameters(typeparams_table.Release());
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 3f7775d..db2b973 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -79,13 +79,6 @@
#endif // !defined(DART_PRECOMPILED_RUNTIME)
private:
- // Finalize given type argument vector.
- static TypeArgumentsPtr FinalizeTypeArguments(
- Zone* zone,
- const TypeArguments& type_args,
- FinalizationKind finalization = kCanonicalize,
- PendingTypes* pending_types = NULL);
-
// Finalize the types in the signature and the signature itself.
static AbstractTypePtr FinalizeSignature(
Zone* zone,
@@ -95,24 +88,18 @@
#if !defined(DART_PRECOMPILED_RUNTIME)
static void AllocateEnumValues(const Class& enum_cls);
+ static void FinalizeTypeParameters(
+ const Class& cls,
+ FinalizationKind finalization = kCanonicalize);
#endif // !defined(DART_PRECOMPILED_RUNTIME)
- static void FinalizeTypeParameters(
- Zone* zone,
- const Class& cls,
- const FunctionType& signature,
- FinalizationKind finalization = kCanonicalize,
- PendingTypes* pending_types = NULL);
-
- static intptr_t ExpandAndFinalizeTypeArguments(Zone* zone,
- const AbstractType& type,
+ static intptr_t ExpandAndFinalizeTypeArguments(const AbstractType& type,
PendingTypes* pending_types);
- static void FillAndFinalizeTypeArguments(Zone* zone,
- const Class& cls,
- const TypeArguments& arguments,
- intptr_t num_uninitialized_arguments,
- PendingTypes* pending_types,
- TrailPtr trail);
+ static void FinalizeTypeArguments(const Class& cls,
+ const TypeArguments& arguments,
+ intptr_t num_uninitialized_arguments,
+ PendingTypes* pending_types,
+ TrailPtr trail);
static void CheckRecursiveType(const AbstractType& type,
PendingTypes* pending_types);
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index 5e2b4c7..cb1b9f0 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -21,7 +21,6 @@
V(Class) \
V(PatchClass) \
V(Function) \
- V(TypeParameters) \
V(ClosureData) \
V(FfiTrampolineData) \
V(Field) \
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index b99bc8a..3de7da8 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -533,14 +533,8 @@
element ^= ptr;
intptr_t entry = -1;
const bool present = table.FindKeyOrDeletedOrUnused(element, &entry);
- if (!present) {
- table.InsertKey(entry, element);
- } else {
- // Two recursive types with different topology (and hashes)
- // may be equal.
- ASSERT(element.IsRecursive());
- objects_[num_occupied++] = ptr;
- }
+ ASSERT(!present);
+ table.InsertKey(entry, element);
} else {
objects_[num_occupied++] = ptr;
}
@@ -692,74 +686,6 @@
};
#if !defined(DART_PRECOMPILED_RUNTIME)
-class TypeParametersSerializationCluster : public SerializationCluster {
- public:
- TypeParametersSerializationCluster()
- : SerializationCluster("TypeParameters",
- kTypeParametersCid,
- compiler::target::TypeParameters::InstanceSize()) {
- }
- ~TypeParametersSerializationCluster() {}
-
- void Trace(Serializer* s, ObjectPtr object) {
- TypeParametersPtr type_params = TypeParameters::RawCast(object);
- objects_.Add(type_params);
- PushFromTo(type_params);
- }
-
- void WriteAlloc(Serializer* s) {
- const intptr_t count = objects_.length();
- s->WriteUnsigned(count);
- for (intptr_t i = 0; i < count; i++) {
- TypeParametersPtr type_params = objects_[i];
- s->AssignRef(type_params);
- }
- }
-
- void WriteFill(Serializer* s) {
- const intptr_t count = objects_.length();
- for (intptr_t i = 0; i < count; i++) {
- TypeParametersPtr type_params = objects_[i];
- AutoTraceObject(type_params);
- WriteFromTo(type_params);
- }
- }
-
- private:
- GrowableArray<TypeParametersPtr> objects_;
-};
-#endif // !DART_PRECOMPILED_RUNTIME
-
-class TypeParametersDeserializationCluster : public DeserializationCluster {
- public:
- TypeParametersDeserializationCluster()
- : DeserializationCluster("TypeParameters") {}
- ~TypeParametersDeserializationCluster() {}
-
- void ReadAlloc(Deserializer* d) {
- start_index_ = d->next_index();
- PageSpace* old_space = d->heap()->old_space();
- const intptr_t count = d->ReadUnsigned();
- for (intptr_t i = 0; i < count; i++) {
- d->AssignRef(
- AllocateUninitialized(old_space, TypeParameters::InstanceSize()));
- }
- stop_index_ = d->next_index();
- }
-
- void ReadFill(Deserializer* d, bool primary) {
- ASSERT(!is_canonical()); // Never canonical.
- for (intptr_t id = start_index_; id < stop_index_; id++) {
- TypeParametersPtr type_params =
- static_cast<TypeParametersPtr>(d->Ref(id));
- Deserializer::InitializeHeader(type_params, kTypeParametersCid,
- TypeParameters::InstanceSize());
- ReadFromTo(type_params);
- }
- }
-};
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
class TypeArgumentsSerializationCluster
: public CanonicalSetSerializationCluster<CanonicalTypeArgumentsSet,
TypeArguments,
@@ -1162,6 +1088,7 @@
}
s->Push(data->untag()->parent_function());
s->Push(data->untag()->closure());
+ s->Push(data->untag()->default_type_arguments());
}
void WriteAlloc(Serializer* s) {
@@ -1183,6 +1110,7 @@
}
WriteCompressedField(data, parent_function);
WriteCompressedField(data, closure);
+ WriteCompressedField(data, default_type_arguments);
s->WriteUnsigned(
static_cast<intptr_t>(data->untag()->default_type_arguments_kind_));
}
@@ -1223,6 +1151,8 @@
}
data->untag()->parent_function_ = static_cast<FunctionPtr>(d->ReadRef());
data->untag()->closure_ = static_cast<InstancePtr>(d->ReadRef());
+ data->untag()->default_type_arguments_ =
+ static_cast<TypeArgumentsPtr>(d->ReadRef());
data->untag()->default_type_arguments_kind_ =
static_cast<ClosureData::DefaultTypeArgumentsKind>(d->ReadUnsigned());
}
@@ -4288,8 +4218,8 @@
AutoTraceObject(type);
WriteFromTo(type);
s->Write<int32_t>(type->untag()->parameterized_class_id_);
- s->Write<uint8_t>(type->untag()->base_);
- s->Write<uint8_t>(type->untag()->index_);
+ s->Write<uint16_t>(type->untag()->base_);
+ s->Write<uint16_t>(type->untag()->index_);
ASSERT(type->untag()->flags_ < (1 << UntaggedTypeParameter::kFlagsBitSize));
ASSERT(type->untag()->nullability_ < (1 << kNullabilityBitSize));
static_assert(UntaggedTypeParameter::kFlagsBitSize + kNullabilityBitSize <=
@@ -4334,8 +4264,8 @@
primary && is_canonical());
ReadFromTo(type);
type->untag()->parameterized_class_id_ = d->Read<int32_t>();
- type->untag()->base_ = d->Read<uint8_t>();
- type->untag()->index_ = d->Read<uint8_t>();
+ type->untag()->base_ = d->Read<uint16_t>();
+ type->untag()->index_ = d->Read<uint16_t>();
const uint8_t combined = d->Read<uint8_t>();
type->untag()->flags_ = combined >> kNullabilityBitSize;
type->untag()->nullability_ = combined & kNullabilityBitMask;
@@ -6606,8 +6536,6 @@
switch (cid) {
case kClassCid:
return new (Z) ClassSerializationCluster(num_cids_ + num_tlc_cids_);
- case kTypeParametersCid:
- return new (Z) TypeParametersSerializationCluster();
case kTypeArgumentsCid:
return new (Z) TypeArgumentsSerializationCluster(
is_canonical, cluster_represents_canonical_set);
@@ -7460,8 +7388,6 @@
case kClassCid:
ASSERT(!is_canonical);
return new (Z) ClassDeserializationCluster();
- case kTypeParametersCid:
- return new (Z) TypeParametersDeserializationCluster();
case kTypeArgumentsCid:
return new (Z)
TypeArgumentsDeserializationCluster(is_canonical, !is_non_root_unit_);
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 56c13e8..1910b15 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -962,7 +962,7 @@
AddType(type);
}
- AddTypeParameters(TypeParameters::Handle(Z, cls.type_parameters()));
+ AddTypeArguments(TypeArguments::Handle(Z, cls.type_parameters()));
type = cls.super_type();
AddType(type);
@@ -991,6 +991,15 @@
const FunctionType& signature = FunctionType::Handle(Z, function.signature());
AddType(signature);
+ // At this point, ensure any cached default type arguments are canonicalized.
+ function.UpdateCachedDefaultTypeArguments(thread());
+ if (function.CachesDefaultTypeArguments()) {
+ const auto& defaults = TypeArguments::Handle(
+ Z, function.default_type_arguments(/*kind_out=*/nullptr));
+ ASSERT(defaults.IsCanonical());
+ AddTypeArguments(defaults);
+ }
+
// A class may have all functions inlined except a local function.
const Class& owner = Class::Handle(Z, function.Owner());
AddTypesOf(owner);
@@ -1045,8 +1054,10 @@
if (typeparams_to_retain_.HasKey(¶m)) return;
typeparams_to_retain_.Insert(&TypeParameter::ZoneHandle(Z, param.ptr()));
- auto& bound = AbstractType::Handle(Z, param.bound());
- AddType(bound);
+ auto& type = AbstractType::Handle(Z, param.bound());
+ AddType(type);
+ type = param.default_argument();
+ AddType(type);
return;
}
@@ -1056,7 +1067,7 @@
FunctionType::ZoneHandle(Z, FunctionType::Cast(abstype).ptr());
functiontypes_to_retain_.Insert(&signature);
- AddTypeParameters(TypeParameters::Handle(Z, signature.type_parameters()));
+ AddTypeArguments(TypeArguments::Handle(Z, signature.type_parameters()));
AbstractType& type = AbstractType::Handle(Z);
type = signature.result_type();
@@ -1084,16 +1095,6 @@
}
}
-void Precompiler::AddTypeParameters(const TypeParameters& params) {
- if (params.IsNull()) return;
-
- TypeArguments& args = TypeArguments::Handle();
- args = params.bounds();
- AddTypeArguments(args);
- args = params.defaults();
- AddTypeArguments(args);
-}
-
void Precompiler::AddTypeArguments(const TypeArguments& args) {
if (args.IsNull()) return;
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index fba9413..24bebca 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -298,7 +298,6 @@
void AddType(const AbstractType& type);
void AddTypesOf(const Class& cls);
void AddTypesOf(const Function& function);
- void AddTypeParameters(const TypeParameters& params);
void AddTypeArguments(const TypeArguments& args);
void AddCalleesOf(const Function& function, intptr_t gop_offset);
void AddCalleesOfHelper(const Object& entry,
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 5737444..f6b9929 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2694,6 +2694,7 @@
case Slot::Kind::kClosure_function_type_arguments:
case Slot::Kind::kClosure_instantiator_type_arguments:
case Slot::Kind::kClosure_hash:
+ case Slot::Kind::kClosureData_default_type_arguments:
case Slot::Kind::kCapturedVariable:
case Slot::Kind::kDartField:
case Slot::Kind::kFunction_data:
@@ -2704,11 +2705,8 @@
case Slot::Kind::kPointerBase_data_field:
case Slot::Kind::kType_arguments:
case Slot::Kind::kTypeArgumentsIndex:
- case Slot::Kind::kTypeParameters_names:
- case Slot::Kind::kTypeParameters_flags:
- case Slot::Kind::kTypeParameters_bounds:
- case Slot::Kind::kTypeParameters_defaults:
case Slot::Kind::kTypeParameter_bound:
+ case Slot::Kind::kTypeParameter_name:
case Slot::Kind::kUnhandledException_exception:
case Slot::Kind::kUnhandledException_stacktrace:
case Slot::Kind::kWeakProperty_key:
diff --git a/runtime/vm/compiler/backend/il_test_helper.cc b/runtime/vm/compiler/backend/il_test_helper.cc
index de02bc4..a99374c 100644
--- a/runtime/vm/compiler/backend/il_test_helper.cc
+++ b/runtime/vm/compiler/backend/il_test_helper.cc
@@ -52,14 +52,18 @@
return cls.ptr();
}
-TypeParameterPtr GetClassTypeParameter(const Class& klass, intptr_t index) {
- const auto& param = TypeParameter::Handle(klass.TypeParameterAt(index));
+TypeParameterPtr GetClassTypeParameter(const Class& klass, const char* name) {
+ const auto& param = TypeParameter::Handle(
+ klass.LookupTypeParameter(String::Handle(String::New(name))));
EXPECT(!param.IsNull());
return param.ptr();
}
-TypeParameterPtr GetFunctionTypeParameter(const Function& fun, intptr_t index) {
- const auto& param = TypeParameter::Handle(fun.TypeParameterAt(index));
+TypeParameterPtr GetFunctionTypeParameter(const Function& fun,
+ const char* name) {
+ intptr_t fun_level = 0;
+ const auto& param = TypeParameter::Handle(
+ fun.LookupTypeParameter(String::Handle(String::New(name)), &fun_level));
EXPECT(!param.IsNull());
return param.ptr();
}
diff --git a/runtime/vm/compiler/backend/il_test_helper.h b/runtime/vm/compiler/backend/il_test_helper.h
index b42febd..7ef8db3 100644
--- a/runtime/vm/compiler/backend/il_test_helper.h
+++ b/runtime/vm/compiler/backend/il_test_helper.h
@@ -58,8 +58,9 @@
FunctionPtr GetFunction(const Library& lib, const char* name);
ClassPtr GetClass(const Library& lib, const char* name);
-TypeParameterPtr GetClassTypeParameter(const Class& klass, intptr_t index);
-TypeParameterPtr GetFunctionTypeParameter(const Function& fun, intptr_t index);
+TypeParameterPtr GetClassTypeParameter(const Class& klass, const char* name);
+TypeParameterPtr GetFunctionTypeParameter(const Function& fun,
+ const char* name);
ObjectPtr Invoke(const Library& lib, const char* name);
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index b65bdf1..3992c8b 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2797,6 +2797,7 @@
case Slot::Kind::kClosure_function:
case Slot::Kind::kClosure_function_type_arguments:
case Slot::Kind::kClosure_instantiator_type_arguments:
+ case Slot::Kind::kClosureData_default_type_arguments:
case Slot::Kind::kFunction_data:
case Slot::Kind::kFunction_signature:
case Slot::Kind::kFunctionType_parameter_names:
@@ -2806,11 +2807,8 @@
case Slot::Kind::kTypedDataView_data:
case Slot::Kind::kType_arguments:
case Slot::Kind::kTypeArgumentsIndex:
- case Slot::Kind::kTypeParameters_names:
- case Slot::Kind::kTypeParameters_flags:
- case Slot::Kind::kTypeParameters_bounds:
- case Slot::Kind::kTypeParameters_defaults:
case Slot::Kind::kTypeParameter_bound:
+ case Slot::Kind::kTypeParameter_name:
case Slot::Kind::kUnhandledException_exception:
case Slot::Kind::kUnhandledException_stacktrace:
case Slot::Kind::kWeakProperty_key:
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index a9ff524..3292e7f 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -58,13 +58,10 @@
FINAL) \
V(Closure, UntaggedClosure, delayed_type_arguments, TypeArguments, FINAL) \
V(Closure, UntaggedClosure, function_type_arguments, TypeArguments, FINAL) \
+ V(ClosureData, UntaggedClosureData, default_type_arguments, TypeArguments, \
+ FINAL_COMPRESSED) \
V(Type, UntaggedType, arguments, TypeArguments, FINAL_COMPRESSED) \
- V(FunctionType, UntaggedFunctionType, type_parameters, TypeParameters, \
- FINAL_COMPRESSED) \
- V(TypeParameters, UntaggedTypeParameters, flags, Array, FINAL_COMPRESSED) \
- V(TypeParameters, UntaggedTypeParameters, bounds, TypeArguments, \
- FINAL_COMPRESSED) \
- V(TypeParameters, UntaggedTypeParameters, defaults, TypeArguments, \
+ V(FunctionType, UntaggedFunctionType, type_parameters, TypeArguments, \
FINAL_COMPRESSED) \
V(WeakProperty, UntaggedWeakProperty, key, Dynamic, VAR) \
V(WeakProperty, UntaggedWeakProperty, value, Dynamic, VAR)
@@ -110,8 +107,8 @@
V(ArgumentsDescriptor, UntaggedArray, size, Smi, FINAL) \
V(PointerBase, UntaggedPointerBase, data_field, Dynamic, FINAL) \
V(TypeArguments, UntaggedTypeArguments, length, Smi, FINAL_COMPRESSED) \
- V(TypeParameters, UntaggedTypeParameters, names, Array, FINAL_COMPRESSED) \
V(TypeParameter, UntaggedTypeParameter, bound, Dynamic, FINAL_COMPRESSED) \
+ V(TypeParameter, UntaggedTypeParameter, name, Dynamic, FINAL_COMPRESSED) \
V(UnhandledException, UntaggedUnhandledException, exception, Dynamic, \
FINAL_COMPRESSED) \
V(UnhandledException, UntaggedUnhandledException, stacktrace, Dynamic, \
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 49b36d8..3d4e86f 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1387,12 +1387,14 @@
ASSERT(class_table->HasValidClassAt(kFfiPointerCid));
const auto& pointer_class =
Class::ZoneHandle(H.zone(), class_table->At(kFfiPointerCid));
- const auto& pointer_type_param =
- TypeParameter::ZoneHandle(pointer_class.TypeParameterAt(0));
+ const auto& pointer_type_args =
+ TypeArguments::Handle(pointer_class.type_parameters());
+ const auto& pointer_type_arg =
+ AbstractType::ZoneHandle(pointer_type_args.TypeAt(0));
// But we type check it as a method on a generic class at runtime.
- body += LoadLocal(arg_value); // value.
- body += Constant(pointer_type_param); // dst_type.
+ body += LoadLocal(arg_value); // value.
+ body += Constant(pointer_type_arg); // dst_type.
// We pass the Pointer type argument as instantiator_type_args.
//
// Call sites to this recognized method are guaranteed to pass a
@@ -1765,27 +1767,26 @@
ASSERT(!forwarding_target->IsNull());
}
- TypeParameters& type_parameters = TypeParameters::Handle(Z);
+ TypeArguments& type_parameters = TypeArguments::Handle(Z);
if (dart_function.IsFactory()) {
type_parameters = Class::Handle(Z, dart_function.Owner()).type_parameters();
} else {
type_parameters = dart_function.type_parameters();
}
- const intptr_t num_type_params = type_parameters.Length();
- if (num_type_params == 0) return;
+ intptr_t num_type_params = type_parameters.Length();
if (forwarding_target != nullptr) {
type_parameters = forwarding_target->type_parameters();
ASSERT(type_parameters.Length() == num_type_params);
}
- if (type_parameters.AllDynamicBounds()) {
- return; // All bounds are dynamic.
- }
+
TypeParameter& type_param = TypeParameter::Handle(Z);
String& name = String::Handle(Z);
AbstractType& bound = AbstractType::Handle(Z);
Fragment check_bounds;
for (intptr_t i = 0; i < num_type_params; ++i) {
- bound = type_parameters.BoundAt(i);
+ type_param ^= type_parameters.TypeAt(i);
+
+ bound = type_param.bound();
if (bound.IsTopTypeForSubtyping()) {
continue;
}
@@ -1794,26 +1795,19 @@
case TypeChecksToBuild::kCheckAllTypeParameterBounds:
break;
case TypeChecksToBuild::kCheckCovariantTypeParameterBounds:
- if (!type_parameters.IsGenericCovariantImplAt(i)) {
+ if (!type_param.IsGenericCovariantImpl()) {
continue;
}
break;
case TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds:
- if (type_parameters.IsGenericCovariantImplAt(i)) {
+ if (type_param.IsGenericCovariantImpl()) {
continue;
}
break;
}
- name = type_parameters.NameAt(i);
+ name = type_param.name();
- if (forwarding_target != nullptr) {
- type_param = forwarding_target->TypeParameterAt(i);
- } else if (dart_function.IsFactory()) {
- type_param = Class::Handle(Z, dart_function.Owner()).TypeParameterAt(i);
- } else {
- type_param = dart_function.TypeParameterAt(i);
- }
ASSERT(type_param.IsFinalized());
check_bounds +=
AssertSubtype(TokenPosition::kNoSource, type_param, bound, name);
@@ -2082,8 +2076,8 @@
const ArgumentsDescriptor descriptor;
ParsedFunction::DynamicClosureCallVars* const vars;
- // Set up by BuildClosureCallDefaultTypeHandling() when needed. These values
- // are read-only, so they don't need real local variables and are created
+ // Set up by BuildDynamicCallChecks() when needed. These values are
+ // read-only, so they don't need real local variables and are created
// using MakeTemporary().
LocalVariable* signature = nullptr;
LocalVariable* num_fixed_params = nullptr;
@@ -2093,11 +2087,8 @@
LocalVariable* parameter_names = nullptr;
LocalVariable* parameter_types = nullptr;
LocalVariable* type_parameters = nullptr;
- LocalVariable* num_type_parameters = nullptr;
- LocalVariable* type_parameter_flags = nullptr;
LocalVariable* instantiator_type_args = nullptr;
LocalVariable* parent_function_type_args = nullptr;
- LocalVariable* num_parent_type_args = nullptr;
};
Fragment FlowGraphBuilder::TestClosureFunctionGeneric(
@@ -2248,8 +2239,8 @@
store_default += BranchIfEqual(&can_share_instantiator, &can_share_function);
Fragment instantiated(is_instantiated);
- instantiated += LoadLocal(info.type_parameters);
- instantiated += LoadNativeField(Slot::TypeParameters_defaults());
+ instantiated += LoadLocal(closure_data);
+ instantiated += LoadNativeField(Slot::ClosureData_default_type_arguments());
instantiated += StoreLocal(info.vars->function_type_args);
instantiated += Drop();
instantiated += Goto(done);
@@ -2261,8 +2252,9 @@
// can be used within the defaults).
do_instantiation += LoadLocal(info.parent_function_type_args);
// Load the default type arguments to instantiate.
- do_instantiation += LoadLocal(info.type_parameters);
- do_instantiation += LoadNativeField(Slot::TypeParameters_defaults());
+ do_instantiation += LoadLocal(closure_data);
+ do_instantiation +=
+ LoadNativeField(Slot::ClosureData_default_type_arguments());
do_instantiation += InstantiateDynamicTypeArguments();
do_instantiation += StoreLocal(info.vars->function_type_args);
do_instantiation += Drop();
@@ -2441,8 +2433,7 @@
check_type_args_length += BranchIfNull(&null, ¬_null);
check_type_args_length.current = not_null; // Continue in non-error case.
check_type_args_length += LoadLocal(info.type_parameters);
- check_type_args_length += LoadNativeField(Slot::TypeParameters_names());
- check_type_args_length += LoadNativeField(Slot::Array_length());
+ check_type_args_length += LoadNativeField(Slot::TypeArguments_length());
check_type_args_length += IntConstant(info.descriptor.TypeArgsLen());
TargetEntryInstr *equal, *not_equal;
check_type_args_length += BranchIfEqual(&equal, ¬_equal);
@@ -2531,16 +2522,6 @@
// We assume that the value stored in :t_type_parameters is not null (i.e.,
// the function stored in :t_function is generic).
Fragment loop_init;
-
- // A null bounds vector represents a vector of dynamic and no check is needed.
- loop_init += LoadLocal(info.type_parameters);
- loop_init += LoadNativeField(Slot::TypeParameters_bounds());
- TargetEntryInstr *null_bounds, *non_null_bounds;
- loop_init += BranchIfNull(&null_bounds, &non_null_bounds);
-
- Fragment(null_bounds) + Goto(done);
-
- loop_init.current = non_null_bounds;
// Loop over the type parameters array.
loop_init += IntConstant(0);
loop_init += StoreLocal(info.vars->current_param_index);
@@ -2549,93 +2530,54 @@
Fragment loop_check(loop);
loop_check += LoadLocal(info.vars->current_param_index);
- loop_check += LoadLocal(info.num_type_parameters);
+ loop_check += LoadLocal(info.type_parameters);
+ loop_check += LoadNativeField(Slot::TypeArguments_length());
loop_check += SmiRelationalOp(Token::kLT);
TargetEntryInstr *more, *no_more;
loop_check += BranchIfTrue(&more, &no_more);
Fragment(no_more) + Goto(done);
- Fragment loop_test_flag(more);
+ Fragment loop_body(more);
+ loop_body += LoadLocal(info.type_parameters);
+ loop_body += LoadLocal(info.vars->current_param_index);
+ loop_body += LoadIndexed(
+ kTypeArgumentsCid, /*index_scale*/ compiler::target::kCompressedWordSize);
+ LocalVariable* current_param = MakeTemporary("current_param"); // Read-only.
+
+ // One read-only local variable on stack (param) to drop after joining.
JoinEntryInstr* next = BuildJoinEntry();
- JoinEntryInstr* check = BuildJoinEntry();
- loop_test_flag += LoadLocal(info.type_parameter_flags);
- TargetEntryInstr *null_flags, *non_null_flags;
- loop_test_flag += BranchIfNull(&null_flags, &non_null_flags);
- Fragment(null_flags) + Goto(check); // Check type if null (non-covariant).
-
- loop_test_flag.current = non_null_flags; // Test flags if not null.
- loop_test_flag += LoadLocal(info.type_parameter_flags);
- loop_test_flag += LoadLocal(info.vars->current_param_index);
- loop_test_flag += IntConstant(TypeParameters::kFlagsPerSmiShift);
- loop_test_flag += SmiBinaryOp(Token::kSHR);
- loop_test_flag += LoadIndexed(kArrayCid);
- loop_test_flag += LoadLocal(info.vars->current_param_index);
- loop_test_flag += IntConstant(TypeParameters::kFlagsPerSmiMask);
- loop_test_flag += SmiBinaryOp(Token::kBIT_AND);
- loop_test_flag += SmiBinaryOp(Token::kSHR);
- loop_test_flag += IntConstant(1);
- loop_test_flag += SmiBinaryOp(Token::kBIT_AND);
- loop_test_flag += IntConstant(0);
+ loop_body += LoadLocal(current_param);
+ loop_body += LoadNativeField(Slot::TypeParameter_flags());
+ loop_body += Box(kUnboxedUint8);
+ loop_body += IntConstant(
+ UntaggedTypeParameter::GenericCovariantImplBit::mask_in_place());
+ loop_body += SmiBinaryOp(Token::kBIT_AND);
+ loop_body += IntConstant(0);
TargetEntryInstr *is_noncovariant, *is_covariant;
- loop_test_flag += BranchIfEqual(&is_noncovariant, &is_covariant);
+ loop_body += BranchIfEqual(&is_noncovariant, &is_covariant);
Fragment(is_covariant) + Goto(next); // Continue if covariant.
- Fragment(is_noncovariant) + Goto(check); // Check type if non-covariant.
- Fragment loop_prep_type_param(check);
- JoinEntryInstr* dynamic_type_param = BuildJoinEntry();
- JoinEntryInstr* call = BuildJoinEntry();
-
- // Load type argument already stored in function_type_args if non null.
- loop_prep_type_param += LoadLocal(info.vars->function_type_args);
- TargetEntryInstr *null_ftav, *non_null_ftav;
- loop_prep_type_param += BranchIfNull(&null_ftav, &non_null_ftav);
-
- Fragment(null_ftav) + Goto(dynamic_type_param);
-
- loop_prep_type_param.current = non_null_ftav;
- loop_prep_type_param += LoadLocal(info.vars->function_type_args);
- loop_prep_type_param += LoadLocal(info.vars->current_param_index);
- loop_prep_type_param += LoadLocal(info.num_parent_type_args);
- loop_prep_type_param += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
- loop_prep_type_param += LoadIndexed(
- kTypeArgumentsCid, /*index_scale*/ compiler::target::kCompressedWordSize);
- loop_prep_type_param += StoreLocal(info.vars->current_type_param);
- loop_prep_type_param += Drop();
- loop_prep_type_param += Goto(call);
-
- Fragment loop_dynamic_type_param(dynamic_type_param);
- // If function_type_args is null, the instantiated type param is dynamic.
- loop_dynamic_type_param += Constant(Type::ZoneHandle(Type::DynamicType()));
- loop_dynamic_type_param += StoreLocal(info.vars->current_type_param);
- loop_dynamic_type_param += Drop();
- loop_dynamic_type_param += Goto(call);
-
- Fragment loop_call_check(call);
- // Load instantiators.
- loop_call_check += LoadLocal(info.instantiator_type_args);
- loop_call_check += LoadLocal(info.vars->function_type_args);
- // Load instantiated type parameter.
- loop_call_check += LoadLocal(info.vars->current_type_param);
- // Load bound from type parameters.
- loop_call_check += LoadLocal(info.type_parameters);
- loop_call_check += LoadNativeField(Slot::TypeParameters_bounds());
- loop_call_check += LoadLocal(info.vars->current_param_index);
- loop_call_check += LoadIndexed(
- kTypeArgumentsCid, /*index_scale*/ compiler::target::kCompressedWordSize);
- // Load (canonicalized) name of type parameter in signature.
- loop_call_check += LoadLocal(info.type_parameters);
- loop_call_check += LoadNativeField(Slot::TypeParameters_names());
- loop_call_check += LoadLocal(info.vars->current_param_index);
- loop_call_check += LoadIndexed(kArrayCid);
- // Assert that the passed-in type argument is consistent with the bound of
- // the corresponding type parameter.
- loop_call_check += AssertSubtype(TokenPosition::kNoSource);
- loop_call_check += Goto(next);
+ loop_body.current = is_noncovariant; // Type check if non-covariant.
+ loop_body += LoadLocal(info.instantiator_type_args);
+ loop_body += LoadLocal(info.vars->function_type_args);
+ // Load parameter.
+ loop_body += LoadLocal(current_param);
+ // Load bounds from parameter.
+ loop_body += LoadLocal(current_param);
+ loop_body += LoadNativeField(Slot::TypeParameter_bound());
+ // Load name from parameter.
+ loop_body += LoadLocal(current_param);
+ loop_body += LoadNativeField(Slot::TypeParameter_name());
+ // Assert that the type the parameter is instantiated as is consistent with
+ // the bounds of the parameter.
+ loop_body += AssertSubtype(TokenPosition::kNoSource);
+ loop_body += Goto(next);
Fragment loop_incr(next);
+ loop_incr += DropTemporary(¤t_param);
loop_incr += LoadLocal(info.vars->current_param_index);
loop_incr += IntConstant(1);
loop_incr += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
@@ -2775,38 +2717,23 @@
// full set of function type arguments, then check the local function type
// arguments against the closure function's type parameter bounds.
Fragment generic;
- // Calculate the number of parent type arguments and store them in
- // info.num_parent_type_args.
- generic += LoadLocal(info.signature);
- generic += BuildExtractUnboxedSlotBitFieldIntoSmi<
- UntaggedFunctionType::PackedNumParentTypeArguments>(
- Slot::FunctionType_packed_fields());
- info.num_parent_type_args = MakeTemporary("num_parent_type_args");
-
- // Hoist number of type parameters.
- generic += LoadLocal(info.type_parameters);
- generic += LoadNativeField(Slot::TypeParameters_names());
- generic += LoadNativeField(Slot::Array_length());
- info.num_type_parameters = MakeTemporary("num_type_parameters");
-
- // Hoist type parameter flags.
- generic += LoadLocal(info.type_parameters);
- generic += LoadNativeField(Slot::TypeParameters_flags());
- info.type_parameter_flags = MakeTemporary("type_parameter_flags");
-
// Calculate the local function type arguments and store them in
// info.vars->function_type_args.
generic += BuildClosureCallDefaultTypeHandling(info);
-
// Load the local function type args.
generic += LoadLocal(info.vars->function_type_args);
// Load the parent function type args.
generic += LoadLocal(info.parent_function_type_args);
// Load the number of parent type parameters.
- generic += LoadLocal(info.num_parent_type_args);
+ generic += LoadLocal(info.signature);
+ generic += BuildExtractUnboxedSlotBitFieldIntoSmi<
+ UntaggedFunctionType::PackedNumParentTypeArguments>(
+ Slot::FunctionType_packed_fields());
// Load the number of total type parameters.
- generic += LoadLocal(info.num_parent_type_args);
- generic += LoadLocal(info.num_type_parameters);
+ LocalVariable* num_parents = MakeTemporary();
+ generic += LoadLocal(info.type_parameters);
+ generic += LoadNativeField(Slot::TypeArguments_length());
+ generic += LoadLocal(num_parents);
generic += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
// Call the static function for prepending type arguments.
@@ -2826,9 +2753,6 @@
} else {
generic += check_bounds;
}
- generic += DropTemporary(&info.type_parameter_flags);
- generic += DropTemporary(&info.num_type_parameters);
- generic += DropTemporary(&info.num_parent_type_args);
// Call the appropriate fragment for setting up the function type arguments
// and performing any needed type argument checking.
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index f1db2d4..f786a81 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -710,18 +710,7 @@
type = klass.DeclarationType();
} else {
// Note that the type argument vector is not yet extended.
- TypeArguments& type_args = TypeArguments::Handle(Z);
- const intptr_t num_type_params = klass.NumTypeParameters();
- if (num_type_params > 0) {
- type_args = TypeArguments::New(num_type_params);
- TypeParameter& type_param = TypeParameter::Handle();
- for (intptr_t i = 0; i < num_type_params; i++) {
- type_param = klass.TypeParameterAt(i);
- ASSERT(type_param.bound() != AbstractType::null());
- type_args.SetTypeAt(i, type_param);
- }
- }
- type = Type::New(klass, type_args, Nullability::kNonNullable);
+ type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()));
}
return type;
}
@@ -2846,13 +2835,19 @@
intptr_t ActiveClass::MemberTypeParameterCount(Zone* zone) {
ASSERT(member != NULL);
if (member->IsFactory()) {
- return klass->NumTypeParameters();
+ TypeArguments& class_types =
+ TypeArguments::Handle(zone, klass->type_parameters());
+ return class_types.Length();
} else if (member->IsMethodExtractor()) {
Function& extracted =
Function::Handle(zone, member->extracted_method_closure());
- return extracted.NumTypeParameters();
+ TypeArguments& function_types =
+ TypeArguments::Handle(zone, extracted.type_parameters());
+ return function_types.Length();
} else {
- return member->NumTypeParameters();
+ TypeArguments& function_types =
+ TypeArguments::Handle(zone, member->type_parameters());
+ return function_types.Length();
}
}
@@ -2861,15 +2856,17 @@
const Function& innermost,
const FunctionType* innermost_signature,
Zone* Z)
- : active_class_(active_class), saved_(*active_class), zone_(Z) {
+ : active_class_(active_class), saved_(*active_class) {
active_class_->enclosing = innermost_signature;
intptr_t num_params = 0;
Function& f = Function::Handle(Z);
+ TypeArguments& f_params = TypeArguments::Handle(Z);
for (f = innermost.ptr(); f.parent_function() != Object::null();
f = f.parent_function()) {
- num_params += f.NumTypeParameters();
+ f_params = f.type_parameters();
+ num_params += f_params.Length();
}
if (num_params == 0) return;
@@ -2879,10 +2876,9 @@
intptr_t index = num_params;
for (f = innermost.ptr(); f.parent_function() != Object::null();
f = f.parent_function()) {
- for (intptr_t j = f.NumTypeParameters() - 1; j >= 0; --j) {
- const auto& type_param = TypeParameter::Handle(Z, f.TypeParameterAt(j));
- params.SetTypeAt(--index, type_param);
- active_class_->RecordDerivedTypeParameter(Z, type_param);
+ f_params = f.type_parameters();
+ for (intptr_t j = f_params.Length() - 1; j >= 0; --j) {
+ params.SetTypeAt(--index, AbstractType::Handle(Z, f_params.TypeAt(j)));
}
}
@@ -2892,55 +2888,32 @@
ActiveTypeParametersScope::ActiveTypeParametersScope(
ActiveClass* active_class,
const FunctionType* innermost_signature,
+ const TypeArguments& new_params,
Zone* Z)
- : active_class_(active_class), saved_(*active_class), zone_(Z) {
+ : active_class_(active_class), saved_(*active_class) {
active_class_->enclosing = innermost_signature;
- const intptr_t num_new_params =
- innermost_signature == nullptr ? active_class->klass->NumTypeParameters()
- : innermost_signature->NumTypeParameters();
- if (num_new_params == 0) return;
+ if (new_params.IsNull()) return;
const TypeArguments* old_params = active_class->local_type_parameters;
const intptr_t old_param_count =
old_params == NULL ? 0 : old_params->Length();
const TypeArguments& extended_params = TypeArguments::Handle(
- Z, TypeArguments::New(old_param_count + num_new_params));
+ Z, TypeArguments::New(old_param_count + new_params.Length()));
intptr_t index = 0;
for (intptr_t i = 0; i < old_param_count; ++i) {
- extended_params.SetTypeAt(index++,
- AbstractType::Handle(Z, old_params->TypeAt(i)));
+ extended_params.SetTypeAt(
+ index++, AbstractType::ZoneHandle(Z, old_params->TypeAt(i)));
}
- for (intptr_t i = 0; i < num_new_params; ++i) {
- const auto& type_param =
- TypeParameter::Handle(Z, innermost_signature == nullptr
- ? active_class->klass->TypeParameterAt(i)
- : innermost_signature->TypeParameterAt(i));
- extended_params.SetTypeAt(index++, type_param);
- active_class->RecordDerivedTypeParameter(Z, type_param);
+ for (intptr_t i = 0; i < new_params.Length(); ++i) {
+ extended_params.SetTypeAt(
+ index++, AbstractType::ZoneHandle(Z, new_params.TypeAt(i)));
}
active_class_->local_type_parameters = &extended_params;
}
-ActiveTypeParametersScope::~ActiveTypeParametersScope() {
- GrowableObjectArray* dropped = active_class_->derived_type_parameters;
- const bool preserve_unpatched =
- dropped != nullptr && saved_.derived_type_parameters == nullptr;
- *active_class_ = saved_;
- if (preserve_unpatched) {
- // Preserve still unpatched derived type parameters that would be dropped.
- auto& derived = TypeParameter::Handle(Z);
- for (intptr_t i = 0, n = dropped->Length(); i < n; ++i) {
- derived ^= dropped->At(i);
- if (derived.bound() == AbstractType::null()) {
- active_class_->RecordDerivedTypeParameter(Z, derived);
- }
- }
- }
-}
-
TypeTranslator::TypeTranslator(KernelReaderHelper* helper,
ConstantReader* constant_reader,
ActiveClass* active_class,
@@ -3081,12 +3054,14 @@
if (!simple) {
type_parameter_count = helper_->ReadListLength();
- LoadAndSetupTypeParameters(active_class_, Object::null_function(),
- Object::null_class(), signature,
- type_parameter_count);
+ LoadAndSetupTypeParameters(
+ active_class_, Object::null_function(), Object::null_class(), signature,
+ type_parameter_count, active_class_->klass->nnbd_mode());
}
- ActiveTypeParametersScope scope(active_class_, &signature, Z);
+ ActiveTypeParametersScope scope(
+ active_class_, &signature,
+ TypeArguments::Handle(Z, signature.type_parameters()), Z);
if (!simple) {
LoadAndSetupBounds(active_class_, Object::null_function(),
@@ -3174,16 +3149,19 @@
// If the type is from a constant, the parameter index isn't offset by the
// enclosing context.
if (!in_constant_context_) {
- const intptr_t class_type_parameter_count =
- active_class_->klass->NumTypeParameters();
- if (class_type_parameter_count > parameter_index) {
- result_ =
- active_class_->klass->TypeParameterAt(parameter_index, nullability);
- active_class_->RecordDerivedTypeParameter(Z,
+ const TypeArguments& class_types =
+ TypeArguments::Handle(Z, active_class_->klass->type_parameters());
+ if (parameter_index < class_types.Length()) {
+ // The index of the type parameter in [parameters] is
+ // the same index into the `klass->type_parameters()` array.
+ const auto& type_param =
+ TypeParameter::CheckedHandle(Z, class_types.TypeAt(parameter_index));
+ result_ = type_param.ToNullability(nullability, Heap::kOld);
+ active_class_->RecordDerivedTypeParameter(Z, type_param,
TypeParameter::Cast(result_));
return;
}
- parameter_index -= class_type_parameter_count;
+ parameter_index -= class_types.Length();
if (active_class_->HasMember()) {
if (active_class_->MemberIsFactoryProcedure()) {
@@ -3204,32 +3182,33 @@
// static A.x<T'>() { return new B<T'>(); }
// }
//
- if (class_type_parameter_count > parameter_index) {
- result_ = active_class_->klass->TypeParameterAt(parameter_index,
- nullability);
+ if (class_types.Length() > parameter_index) {
+ const auto& type_param = TypeParameter::CheckedHandle(
+ Z, class_types.TypeAt(parameter_index));
+ result_ = type_param.ToNullability(nullability, Heap::kOld);
active_class_->RecordDerivedTypeParameter(
- Z, TypeParameter::Cast(result_));
+ Z, type_param, TypeParameter::Cast(result_));
return;
}
- parameter_index -= class_type_parameter_count;
+ parameter_index -= class_types.Length();
}
// Factory function should not be considered as procedure.
- const intptr_t procedure_type_parameter_count =
+ intptr_t procedure_type_parameter_count =
(active_class_->MemberIsProcedure() &&
!active_class_->MemberIsFactoryProcedure())
? active_class_->MemberTypeParameterCount(Z)
: 0;
if (procedure_type_parameter_count > 0) {
if (procedure_type_parameter_count > parameter_index) {
- result_ = active_class_->member->TypeParameterAt(parameter_index,
- nullability);
+ const auto& type_param = TypeParameter::CheckedHandle(
+ Z,
+ TypeArguments::Handle(Z, active_class_->member->type_parameters())
+ .TypeAt(parameter_index));
+ result_ = type_param.ToNullability(nullability, Heap::kOld);
+ active_class_->RecordDerivedTypeParameter(
+ Z, type_param, TypeParameter::Cast(result_));
if (finalize_) {
- ASSERT(TypeParameter::Cast(result_).bound() !=
- AbstractType::null());
result_ = ClassFinalizer::FinalizeType(result_);
- } else {
- active_class_->RecordDerivedTypeParameter(
- Z, TypeParameter::Cast(result_));
}
return;
}
@@ -3242,12 +3221,10 @@
const auto& type_param = TypeParameter::CheckedHandle(
Z, active_class_->local_type_parameters->TypeAt(parameter_index));
result_ = type_param.ToNullability(nullability, Heap::kOld);
+ active_class_->RecordDerivedTypeParameter(Z, type_param,
+ TypeParameter::Cast(result_));
if (finalize_) {
- ASSERT(TypeParameter::Cast(result_).bound() != AbstractType::null());
result_ = ClassFinalizer::FinalizeType(result_);
- } else {
- active_class_->RecordDerivedTypeParameter(Z,
- TypeParameter::Cast(result_));
}
return;
}
@@ -3323,7 +3300,8 @@
const Function& function,
const Class& parameterized_class,
const FunctionType& parameterized_signature,
- intptr_t type_parameter_count) {
+ intptr_t type_parameter_count,
+ const NNBDMode nnbd_mode) {
ASSERT(parameterized_class.IsNull() != parameterized_signature.IsNull());
ASSERT(type_parameter_count >= 0);
if (type_parameter_count == 0) {
@@ -3339,18 +3317,23 @@
// First setup the type parameters, so if any of the following code uses it
// (in a recursive way) we're fine.
-
- // - Create a [ TypeParameters ] object.
- const TypeParameters& type_parameters =
- TypeParameters::Handle(Z, TypeParameters::New(type_parameter_count));
+ TypeArguments& type_parameters = TypeArguments::Handle(Z);
+ TypeParameter& parameter = TypeParameter::Handle(Z);
const Type& null_bound = Type::Handle(Z);
+ const Nullability nullability = (nnbd_mode == NNBDMode::kOptedInLib)
+ ? Nullability::kNonNullable
+ : Nullability::kLegacy;
+
+ // - Create array of [TypeParameter] objects (without bound).
+ // - Create array of [String] objects.
+ type_parameters = TypeArguments::New(type_parameter_count);
intptr_t offset = 0;
if (!parameterized_class.IsNull()) {
- ASSERT(parameterized_class.type_parameters() == TypeParameters::null());
+ ASSERT(parameterized_class.type_parameters() == TypeArguments::null());
parameterized_class.set_type_parameters(type_parameters);
} else {
- ASSERT(parameterized_signature.type_parameters() == TypeParameters::null());
+ ASSERT(parameterized_signature.type_parameters() == TypeArguments::null());
parameterized_signature.set_type_parameters(type_parameters);
offset = parameterized_signature.NumParentTypeArguments();
if (!function.IsNull()) {
@@ -3361,15 +3344,22 @@
const Library& lib = Library::Handle(Z, active_class->klass->library());
{
AlternativeReadingScope alt(&helper_->reader_);
+ String& name = String::Handle(Z);
for (intptr_t i = 0; i < type_parameter_count; i++) {
TypeParameterHelper helper(helper_);
helper.Finish();
- type_parameters.SetNameAt(i, H.DartIdentifier(lib, helper.name_index_));
- type_parameters.SetIsGenericCovariantImplAt(
- i, helper.IsGenericCovariantImpl());
+ if (parameterized_class.IsNull() && function.IsNull()) {
+ // Erase provided name and use a canonical one instead.
+ name = Symbols::NewFormatted(H.thread(), "X%" Pd, offset + i);
+ } else {
+ name = H.DartIdentifier(lib, helper.name_index_).ptr();
+ }
// Bounds are filled later in LoadAndSetupBounds as bound types may
// reference type parameters which are not created yet.
- type_parameters.SetBoundAt(i, null_bound);
+ parameter = TypeParameter::New(
+ parameterized_class, offset, offset + i, name, null_bound,
+ helper.IsGenericCovariantImpl(), nullability);
+ type_parameters.SetTypeAt(i, parameter);
}
}
}
@@ -3386,45 +3376,52 @@
return;
}
- const TypeParameters& type_parameters = TypeParameters::Handle(
- Z, !parameterized_class.IsNull()
- ? parameterized_class.type_parameters()
- : parameterized_signature.type_parameters());
+ const TypeArguments& type_parameters =
+ TypeArguments::Handle(Z, !parameterized_class.IsNull()
+ ? parameterized_class.type_parameters()
+ : parameterized_signature.type_parameters());
+ TypeParameter& parameter = TypeParameter::Handle(Z);
// Fill in the bounds and default arguments of all [TypeParameter]s.
for (intptr_t i = 0; i < type_parameter_count; i++) {
TypeParameterHelper helper(helper_);
helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+ parameter ^= type_parameters.TypeAt(i);
AbstractType& bound = BuildTypeWithoutFinalization(); // read ith bound.
- ASSERT(!bound.IsNull());
- type_parameters.SetBoundAt(i, bound);
+ parameter.set_bound(bound);
helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
AbstractType& default_arg = BuildTypeWithoutFinalization();
- ASSERT(!default_arg.IsNull());
- type_parameters.SetDefaultAt(i, default_arg);
+ parameter.set_default_argument(default_arg);
helper.Finish();
}
- // Fix bounds in all derived type parameters.
+ // Note that function.UpdateCachedDefaultTypeArguments() is called in
+ // function.set_signature() and is not required here.
+
+ // Fix bounds and default arguments in all derived type parameters (with
+ // different nullabilities).
const intptr_t offset = !parameterized_signature.IsNull()
? parameterized_signature.NumParentTypeArguments()
: 0;
if (active_class->derived_type_parameters != nullptr) {
auto& derived = TypeParameter::Handle(Z);
- auto& bound = AbstractType::Handle(Z);
+ auto& type = AbstractType::Handle(Z);
for (intptr_t i = 0, n = active_class->derived_type_parameters->Length();
i < n; ++i) {
derived ^= active_class->derived_type_parameters->At(i);
if (derived.bound() == AbstractType::null() &&
((!parameterized_class.IsNull() &&
- derived.parameterized_class_id() == parameterized_class.id()) ||
+ derived.parameterized_class() == parameterized_class.ptr()) ||
(!parameterized_signature.IsNull() &&
- derived.parameterized_class_id() == kFunctionCid &&
+ derived.parameterized_class() == Class::null() &&
derived.index() >= offset &&
derived.index() < offset + type_parameter_count))) {
- bound = type_parameters.BoundAt(derived.index() - offset);
- derived.set_bound(bound);
+ parameter ^= type_parameters.TypeAt(derived.index() - offset);
+ type = parameter.bound();
+ derived.set_bound(type);
+ type = parameter.default_argument();
+ derived.set_default_argument(type);
}
}
}
@@ -3438,18 +3435,8 @@
if (finalize_ || klass.is_type_finalized()) {
type = klass.DeclarationType();
} else {
- TypeArguments& type_args = TypeArguments::Handle(Z);
- const intptr_t num_type_params = klass.NumTypeParameters();
- if (num_type_params > 0) {
- type_args = TypeArguments::New(num_type_params);
- TypeParameter& type_param = TypeParameter::Handle();
- for (intptr_t i = 0; i < num_type_params; i++) {
- type_param = klass.TypeParameterAt(i);
- ASSERT(type_param.bound() != AbstractType::null());
- type_args.SetTypeAt(i, type_param);
- }
- }
- type = Type::New(klass, type_args, Nullability::kNonNullable);
+ type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
+ Nullability::kNonNullable);
}
return type;
}
@@ -3563,8 +3550,8 @@
if (!is_factory) {
type_parameter_count = helper_->ReadListLength();
LoadAndSetupTypeParameters(active_class_, function, Class::Handle(Z),
- signature, type_parameter_count);
- function_node_helper->SetJustRead(FunctionNodeHelper::kTypeParameters);
+ signature, type_parameter_count,
+ function.nnbd_mode());
}
ActiveTypeParametersScope scope(active_class_, function, &signature, Z);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 1bed607..087b9c1 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -1344,8 +1344,11 @@
return klass->NumTypeArguments();
}
- void RecordDerivedTypeParameter(Zone* zone, const TypeParameter& derived) {
- if (derived.bound() == AbstractType::null()) {
+ void RecordDerivedTypeParameter(Zone* zone,
+ const TypeParameter& original,
+ const TypeParameter& derived) {
+ if (original.ptr() != derived.ptr() &&
+ original.bound() == AbstractType::null()) {
if (derived_type_parameters == nullptr) {
derived_type_parameters = &GrowableObjectArray::Handle(
zone, GrowableObjectArray::New(Heap::kOld));
@@ -1439,14 +1442,14 @@
// Also, the enclosing signature is set to 'signature'.
ActiveTypeParametersScope(ActiveClass* active_class,
const FunctionType* innermost_signature,
+ const TypeArguments& new_params,
Zone* Z);
- ~ActiveTypeParametersScope();
+ ~ActiveTypeParametersScope() { *active_class_ = saved_; }
private:
ActiveClass* active_class_;
ActiveClass saved_;
- Zone* zone_;
DISALLOW_COPY_AND_ASSIGN(ActiveTypeParametersScope);
};
@@ -1473,7 +1476,8 @@
const Function& function,
const Class& parameterized_class,
const FunctionType& parameterized_signature,
- intptr_t type_parameter_count);
+ intptr_t type_parameter_count,
+ const NNBDMode nnbd_mode);
void LoadAndSetupBounds(ActiveClass* active_class,
const Function& function,
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index b3edbc9..c84b23c 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -1180,10 +1180,6 @@
return -kWordSize;
}
-word TypeParameters::NextFieldOffset() {
- return -kWordSize;
-}
-
word TypeArguments::NextFieldOffset() {
return -kWordSize;
}
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index c8cbc06..6c7d6db 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -922,6 +922,7 @@
public:
static word bound_offset();
static word flags_offset();
+ static word name_offset();
static word InstanceSize();
static word NextFieldOffset();
static word parameterized_class_id_offset();
@@ -1302,6 +1303,7 @@
class ClosureData : public AllStatic {
public:
+ static word default_type_arguments_offset();
static word default_type_arguments_kind_offset();
static word InstanceSize();
static word NextFieldOffset();
@@ -1371,16 +1373,6 @@
static word NextFieldOffset();
};
-class TypeParameters : public AllStatic {
- public:
- static word names_offset();
- static word flags_offset();
- static word bounds_offset();
- static word defaults_offset();
- static word InstanceSize();
- static word NextFieldOffset();
-};
-
class TypeArguments : public AllStatic {
public:
static word instantiations_offset();
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 653ef92..abe8cc9 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -134,7 +134,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 16;
+ ClosureData_default_type_arguments_offset = 16;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 20;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -427,23 +429,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 12;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 20;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 23;
+ TypeParameter_parameterized_class_id_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 32;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 25;
+ 35;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 4;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 4;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 16;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 16;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 34;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -475,7 +473,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 112;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
8;
@@ -538,8 +536,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 4;
static constexpr dart::compiler::target::word Type_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 20;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 36;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 12;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -673,7 +670,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 32;
+ ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -971,23 +970,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 43;
+ TypeParameter_parameterized_class_id_offset = 56;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 45;
+ 63;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 32;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 32;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -1020,7 +1015,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 192;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -1084,8 +1079,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 56;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -1217,7 +1211,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 16;
+ ClosureData_default_type_arguments_offset = 16;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 20;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -1510,23 +1506,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 12;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 20;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 23;
+ TypeParameter_parameterized_class_id_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 32;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 25;
+ 35;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 4;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 4;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 16;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 16;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 34;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -1555,7 +1547,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 112;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
8;
@@ -1618,8 +1610,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 4;
static constexpr dart::compiler::target::word Type_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 20;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 36;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 12;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -1753,7 +1744,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 32;
+ ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -2051,23 +2044,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 43;
+ TypeParameter_parameterized_class_id_offset = 56;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 45;
+ 63;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 32;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 32;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -2101,7 +2090,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 192;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -2165,8 +2154,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 56;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -2298,7 +2286,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 20;
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -2596,23 +2586,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 31;
+ TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 33;
+ 43;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
20;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 20;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 24;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
@@ -2645,7 +2631,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 120;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -2709,8 +2695,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 24;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -2842,7 +2827,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 20;
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -3140,23 +3127,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 31;
+ TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 33;
+ 43;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
20;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 20;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 24;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
@@ -3190,7 +3173,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 120;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -3254,8 +3237,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 24;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -3384,7 +3366,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 16;
+ ClosureData_default_type_arguments_offset = 16;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 20;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -3676,23 +3660,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 12;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 20;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 23;
+ TypeParameter_parameterized_class_id_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 32;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 25;
+ 35;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 4;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 4;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 16;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 16;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 34;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -3724,7 +3704,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 108;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
8;
@@ -3787,8 +3767,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 4;
static constexpr dart::compiler::target::word Type_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 20;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 36;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 12;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -3917,7 +3896,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 32;
+ ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -4214,23 +4195,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 43;
+ TypeParameter_parameterized_class_id_offset = 56;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 45;
+ 63;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 32;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 32;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -4263,7 +4240,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 184;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -4327,8 +4304,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 56;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -4455,7 +4431,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 16;
+ ClosureData_default_type_arguments_offset = 16;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 20;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -4747,23 +4725,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 12;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 20;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 23;
+ TypeParameter_parameterized_class_id_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 32;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 25;
+ 35;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 4;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 4;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 16;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 16;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 24;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 34;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -4792,7 +4766,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 108;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
8;
@@ -4855,8 +4829,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 4;
static constexpr dart::compiler::target::word Type_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 28;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 20;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 36;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 16;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 12;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 12;
@@ -4985,7 +4958,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 32;
+ ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -5282,23 +5257,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 40;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 43;
+ TypeParameter_parameterized_class_id_offset = 56;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 60;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 45;
+ 63;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 32;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 32;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 44;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 62;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -5332,7 +5303,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 184;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -5396,8 +5367,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 56;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 40;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 64;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -5524,7 +5494,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 20;
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -5821,23 +5793,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 31;
+ TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 33;
+ 43;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
20;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 20;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 24;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
@@ -5870,7 +5838,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 112;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -5934,8 +5902,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 24;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -6062,7 +6029,9 @@
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- ClosureData_default_type_arguments_kind_offset = 20;
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -6359,23 +6328,19 @@
static constexpr dart::compiler::target::word
FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- TypeParameter_parameterized_class_id_offset = 28;
-static constexpr dart::compiler::target::word TypeParameter_index_offset = 31;
+ TypeParameter_parameterized_class_id_offset = 36;
+static constexpr dart::compiler::target::word TypeParameter_index_offset = 40;
static constexpr dart::compiler::target::word TypeParameter_nullability_offset =
- 33;
+ 43;
static constexpr dart::compiler::target::word
TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_length_offset = 12;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
20;
static constexpr dart::compiler::target::word TypeArguments_types_offset = 24;
-static constexpr dart::compiler::target::word TypeParameters_names_offset = 8;
-static constexpr dart::compiler::target::word TypeParameters_flags_offset = 12;
-static constexpr dart::compiler::target::word TypeParameters_bounds_offset = 16;
-static constexpr dart::compiler::target::word TypeParameters_defaults_offset =
- 20;
-static constexpr dart::compiler::target::word TypeParameter_bound_offset = 24;
-static constexpr dart::compiler::target::word TypeParameter_flags_offset = 32;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 28;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 20;
static constexpr dart::compiler::target::word TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 20;
@@ -6409,7 +6374,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 112;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
16;
@@ -6473,8 +6438,7 @@
static constexpr dart::compiler::target::word
TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word Type_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 40;
-static constexpr dart::compiler::target::word TypeParameters_InstanceSize = 24;
+static constexpr dart::compiler::target::word TypeParameter_InstanceSize = 48;
static constexpr dart::compiler::target::word TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word TypedDataBase_InstanceSize = 24;
@@ -6616,7 +6580,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 4;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 16;
+ AOT_ClosureData_default_type_arguments_offset = 16;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 20;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 24;
@@ -6942,11 +6908,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 12;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 20;
+ AOT_TypeParameter_parameterized_class_id_offset = 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 23;
+ 32;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 25;
+ AOT_TypeParameter_nullability_offset = 35;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 4;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -6955,18 +6921,12 @@
AOT_TypeArguments_nullability_offset = 16;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
20;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 4;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 12;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 16;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 16;
+ 20;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 24;
+ 34;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 12;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
8;
@@ -7001,7 +6961,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 92;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 8;
@@ -7073,9 +7033,7 @@
AOT_TransferableTypedData_InstanceSize = 4;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 28;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 20;
+ 36;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 12;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -7218,7 +7176,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 32;
+ AOT_ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -7545,11 +7505,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 40;
+ AOT_TypeParameter_parameterized_class_id_offset = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 43;
+ 60;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 45;
+ AOT_TypeParameter_nullability_offset = 63;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -7558,18 +7518,12 @@
AOT_TypeArguments_nullability_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 16;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 24;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 32;
+ 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 44;
+ 62;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -7606,7 +7560,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 160;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -7678,9 +7632,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 48;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 40;
+ 64;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -7826,7 +7778,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 32;
+ AOT_ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -8153,11 +8107,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 40;
+ AOT_TypeParameter_parameterized_class_id_offset = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 43;
+ 60;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 45;
+ AOT_TypeParameter_nullability_offset = 63;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -8166,18 +8120,12 @@
AOT_TypeArguments_nullability_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 16;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 24;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 32;
+ 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 44;
+ 62;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -8215,7 +8163,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 160;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -8287,9 +8235,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 48;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 40;
+ 64;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -8432,7 +8378,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 20;
+ AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -8759,11 +8707,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 28;
+ AOT_TypeParameter_parameterized_class_id_offset = 36;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 31;
+ 40;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 33;
+ AOT_TypeParameter_nullability_offset = 43;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -8772,18 +8720,12 @@
AOT_TypeArguments_nullability_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
24;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 12;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 16;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 24;
+ 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 32;
+ 42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 20;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -8820,7 +8762,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 96;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -8892,9 +8834,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 24;
+ 48;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -9037,7 +8977,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 20;
+ AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -9364,11 +9306,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 28;
+ AOT_TypeParameter_parameterized_class_id_offset = 36;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 31;
+ 40;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 33;
+ AOT_TypeParameter_nullability_offset = 43;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -9377,18 +9319,12 @@
AOT_TypeArguments_nullability_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
24;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 12;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 16;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 24;
+ 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 32;
+ 42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 20;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -9426,7 +9362,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 96;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -9498,9 +9434,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 24;
+ 48;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -9639,7 +9573,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 4;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 16;
+ AOT_ClosureData_default_type_arguments_offset = 16;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 20;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 24;
@@ -9963,11 +9899,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 12;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 20;
+ AOT_TypeParameter_parameterized_class_id_offset = 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 23;
+ 32;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 25;
+ AOT_TypeParameter_nullability_offset = 35;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 4;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -9976,18 +9912,12 @@
AOT_TypeArguments_nullability_offset = 16;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
20;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 4;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 12;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 16;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 16;
+ 20;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 24;
+ 34;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 12;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
8;
@@ -10022,7 +9952,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 80;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 8;
@@ -10094,9 +10024,7 @@
AOT_TransferableTypedData_InstanceSize = 4;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 28;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 20;
+ 36;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 12;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -10234,7 +10162,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 32;
+ AOT_ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -10559,11 +10489,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 40;
+ AOT_TypeParameter_parameterized_class_id_offset = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 43;
+ 60;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 45;
+ AOT_TypeParameter_nullability_offset = 63;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -10572,18 +10502,12 @@
AOT_TypeArguments_nullability_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 16;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 24;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 32;
+ 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 44;
+ 62;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -10620,7 +10544,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 136;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -10692,9 +10616,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 48;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 40;
+ 64;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -10835,7 +10757,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 32;
+ AOT_ClosureData_default_type_arguments_offset = 32;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 40;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -11160,11 +11084,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 24;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 40;
+ AOT_TypeParameter_parameterized_class_id_offset = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 43;
+ 60;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 45;
+ AOT_TypeParameter_nullability_offset = 63;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -11173,18 +11097,12 @@
AOT_TypeArguments_nullability_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 16;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 24;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 32;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 32;
+ 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 44;
+ 62;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -11222,7 +11140,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 136;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 48;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -11294,9 +11212,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 48;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 40;
+ 64;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -11434,7 +11350,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 20;
+ AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -11759,11 +11677,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 28;
+ AOT_TypeParameter_parameterized_class_id_offset = 36;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 31;
+ 40;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 33;
+ AOT_TypeParameter_nullability_offset = 43;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -11772,18 +11690,12 @@
AOT_TypeArguments_nullability_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
24;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 12;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 16;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 24;
+ 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 32;
+ 42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 20;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -11820,7 +11732,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 88;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -11892,9 +11804,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 24;
+ 48;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
@@ -12032,7 +11942,9 @@
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
static constexpr dart::compiler::target::word
- AOT_ClosureData_default_type_arguments_kind_offset = 20;
+ AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_kind_offset = 24;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -12357,11 +12269,11 @@
static constexpr dart::compiler::target::word
AOT_FunctionType_type_parameters_offset = 20;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_parameterized_class_id_offset = 28;
+ AOT_TypeParameter_parameterized_class_id_offset = 36;
static constexpr dart::compiler::target::word AOT_TypeParameter_index_offset =
- 31;
+ 40;
static constexpr dart::compiler::target::word
- AOT_TypeParameter_nullability_offset = 33;
+ AOT_TypeParameter_nullability_offset = 43;
static constexpr dart::compiler::target::word
AOT_TypeArguments_instantiations_offset = 8;
static constexpr dart::compiler::target::word AOT_TypeArguments_length_offset =
@@ -12370,18 +12282,12 @@
AOT_TypeArguments_nullability_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
24;
-static constexpr dart::compiler::target::word AOT_TypeParameters_names_offset =
- 8;
-static constexpr dart::compiler::target::word AOT_TypeParameters_flags_offset =
- 12;
-static constexpr dart::compiler::target::word AOT_TypeParameters_bounds_offset =
- 16;
-static constexpr dart::compiler::target::word
- AOT_TypeParameters_defaults_offset = 20;
static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
- 24;
+ 28;
static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
- 32;
+ 42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 20;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 20;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -12419,7 +12325,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 88;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 32;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
AOT_CompressedStackMaps_HeaderSize = 16;
@@ -12491,9 +12397,7 @@
AOT_TransferableTypedData_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Type_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_TypeParameter_InstanceSize =
- 40;
-static constexpr dart::compiler::target::word AOT_TypeParameters_InstanceSize =
- 24;
+ 48;
static constexpr dart::compiler::target::word AOT_TypeRef_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_TypedData_HeaderSize = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_InstanceSize =
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 0af1b9e..75e1b54 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -110,6 +110,7 @@
FIELD(Closure, function_type_arguments_offset) \
FIELD(Closure, hash_offset) \
FIELD(Closure, instantiator_type_arguments_offset) \
+ FIELD(ClosureData, default_type_arguments_offset) \
FIELD(ClosureData, default_type_arguments_kind_offset) \
FIELD(Code, object_pool_offset) \
FIELD(Code, saved_instructions_offset) \
@@ -300,12 +301,9 @@
FIELD(TypeArguments, length_offset) \
FIELD(TypeArguments, nullability_offset) \
FIELD(TypeArguments, types_offset) \
- FIELD(TypeParameters, names_offset) \
- FIELD(TypeParameters, flags_offset) \
- FIELD(TypeParameters, bounds_offset) \
- FIELD(TypeParameters, defaults_offset) \
FIELD(TypeParameter, bound_offset) \
FIELD(TypeParameter, flags_offset) \
+ FIELD(TypeParameter, name_offset) \
FIELD(TypeRef, type_offset) \
FIELD(TypedDataBase, length_offset) \
FIELD(TypedDataView, data_offset) \
@@ -386,7 +384,6 @@
SIZEOF(TransferableTypedData, InstanceSize, UntaggedTransferableTypedData) \
SIZEOF(Type, InstanceSize, UntaggedType) \
SIZEOF(TypeParameter, InstanceSize, UntaggedTypeParameter) \
- SIZEOF(TypeParameters, InstanceSize, UntaggedTypeParameters) \
SIZEOF(TypeRef, InstanceSize, UntaggedTypeRef) \
SIZEOF(TypedData, HeaderSize, UntaggedTypedData) \
SIZEOF(TypedDataBase, InstanceSize, UntaggedTypedDataBase) \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index 2b5f9b2..604aeaa 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -597,8 +597,7 @@
// Resolve the type parameter to its instantiated type and tail call the
// instantiated type's TTS.
__ LoadFieldFromOffset(TypeTestABI::kScratchReg, TypeTestABI::kDstTypeReg,
- target::TypeParameter::index_offset(),
- kUnsignedByte);
+ target::TypeParameter::index_offset(), kTwoBytes);
__ LoadIndexedCompressed(TypeTestABI::kScratchReg, tav,
target::TypeArguments::types_offset(),
TypeTestABI::kScratchReg);
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index dc9d048..6d1de7d 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1328,19 +1328,20 @@
intptr_t num_vars = function().NumTypeArguments();
type_params_names.Grow(num_vars);
type_params_names.SetLength(num_vars);
- TypeParameters& type_params = TypeParameters::Handle();
+ TypeArguments& type_params = TypeArguments::Handle();
+ TypeParameter& type_param = TypeParameter::Handle();
Function& current = Function::Handle(function().ptr());
intptr_t mapping_offset = num_vars;
for (intptr_t i = 0; !current.IsNull(); i += current.NumTypeParameters(),
current = current.parent_function()) {
type_params = current.type_parameters();
- if (type_params.IsNull()) continue;
intptr_t size = current.NumTypeParameters();
- ASSERT(size > 0 && type_params.Length() == size);
+ ASSERT(size == 0 || type_params.Length() == size);
ASSERT(mapping_offset >= size);
mapping_offset -= size;
for (intptr_t j = 0; j < size; ++j) {
- name = type_params.NameAt(j);
+ type_param = TypeParameter::RawCast(type_params.TypeAt(j));
+ name = type_param.name();
// Write the names in backwards in terms of chain of functions.
// But keep the order of names within the same function. so they
// match up with the order of the types in 'type_arguments'.
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 1256780..442f8ce 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -703,13 +703,15 @@
}
const auto& type_params =
- TypeParameters::Handle(zone, function.type_parameters());
+ TypeArguments::Handle(zone, function.type_parameters());
if (!type_params.IsNull()) {
+ auto& type_param = TypeParameter::Handle(zone);
auto& bound = AbstractType::Handle(zone);
for (intptr_t i = 0, n = type_params.Length(); i < n; ++i) {
- bound = type_params.BoundAt(i);
+ type_param ^= type_params.TypeAt(i);
+ bound = type_param.bound();
if (!bound.IsTopTypeForSubtyping() &&
- !type_params.IsGenericCovariantImplAt(i)) {
+ !type_param.IsGenericCovariantImpl()) {
return true;
}
}
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 4b39508..f48bdaf 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -830,18 +830,6 @@
function.set_owner(real_class);
- ASSERT(real_class.is_finalized());
- // The owner class has already been marked as finalized so the signature of
- // this added function must be finalized here, since finalization of member
- // types will not be called anymore.
- FunctionType& signature = FunctionType::Handle(Z, function.signature());
- if (!function.is_static()) {
- // Patch the illegal receiver type (type class with kIllegalCid) to dynamic.
- signature.SetParameterTypeAt(0, Object::dynamic_type());
- }
- signature ^= ClassFinalizer::FinalizeType(signature);
- function.set_signature(signature);
-
return function.ptr();
}
@@ -1437,9 +1425,7 @@
// Set type parameters.
T.LoadAndSetupTypeParameters(&active_class_, Object::null_function(), *klass,
Object::null_function_type(),
- type_parameter_count);
-
- ActiveTypeParametersScope scope(&active_class_, nullptr, Z);
+ type_parameter_count, klass->nnbd_mode());
T.LoadAndSetupBounds(&active_class_, Object::null_function(), *klass,
Object::null_function_type(), type_parameter_count);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b013c63..64be54c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -143,7 +143,6 @@
ClassPtr Object::class_class_ = static_cast<ClassPtr>(RAW_NULL);
ClassPtr Object::dynamic_class_ = static_cast<ClassPtr>(RAW_NULL);
ClassPtr Object::void_class_ = static_cast<ClassPtr>(RAW_NULL);
-ClassPtr Object::type_parameters_class_ = static_cast<ClassPtr>(RAW_NULL);
ClassPtr Object::type_arguments_class_ = static_cast<ClassPtr>(RAW_NULL);
ClassPtr Object::patch_class_class_ = static_cast<ClassPtr>(RAW_NULL);
ClassPtr Object::function_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -786,9 +785,6 @@
}
// Allocate the remaining VM internal classes.
- cls = Class::New<TypeParameters, RTN::TypeParameters>(isolate_group);
- type_parameters_class_ = cls.ptr();
-
cls = Class::New<TypeArguments, RTN::TypeArguments>(isolate_group);
type_arguments_class_ = cls.ptr();
@@ -1240,7 +1236,6 @@
class_class_ = static_cast<ClassPtr>(RAW_NULL);
dynamic_class_ = static_cast<ClassPtr>(RAW_NULL);
void_class_ = static_cast<ClassPtr>(RAW_NULL);
- type_parameters_class_ = static_cast<ClassPtr>(RAW_NULL);
type_arguments_class_ = static_cast<ClassPtr>(RAW_NULL);
patch_class_class_ = static_cast<ClassPtr>(RAW_NULL);
function_class_ = static_cast<ClassPtr>(RAW_NULL);
@@ -1341,7 +1336,6 @@
SET_CLASS_NAME(class, Class);
SET_CLASS_NAME(dynamic, Dynamic);
SET_CLASS_NAME(void, Void);
- SET_CLASS_NAME(type_parameters, TypeParameters);
SET_CLASS_NAME(type_arguments, TypeArguments);
SET_CLASS_NAME(patch_class, PatchClass);
SET_CLASS_NAME(function, Function);
@@ -2175,7 +2169,6 @@
type.SetIsFinalized();
type ^= type.Canonicalize(thread, nullptr);
object_store->set_null_type(type);
- cls.set_declaration_type(type);
ASSERT(type.IsNullable());
// Consider removing when/if Null becomes an ordinary class.
@@ -3157,7 +3150,7 @@
untag()->set_library(value.ptr());
}
-void Class::set_type_parameters(const TypeParameters& value) const {
+void Class::set_type_parameters(const TypeArguments& value) const {
ASSERT((num_type_arguments() == kUnknownNumTypeArguments) ||
is_prefinalized());
untag()->set_type_parameters(value.ptr());
@@ -3192,11 +3185,11 @@
}
return 0;
}
- if (type_parameters() == TypeParameters::null()) {
+ if (type_parameters() == TypeArguments::null()) {
return 0;
}
REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
- TypeParameters& type_params = thread->TypeParametersHandle();
+ TypeArguments& type_params = thread->TypeArgumentsHandle();
type_params = type_parameters();
return type_params.Length();
}
@@ -3294,13 +3287,31 @@
#endif // defined(DART_PRECOMPILED_RUNTIME)
}
-TypeArgumentsPtr Class::InstantiateToBounds(Thread* thread) const {
- const auto& type_params =
- TypeParameters::Handle(thread->zone(), type_parameters());
- if (type_params.IsNull()) {
+static TypeArgumentsPtr InstantiateTypeArgumentsToBounds(
+ Thread* thread,
+ const TypeArguments& parameters) {
+ ASSERT(thread != nullptr);
+ if (parameters.IsNull()) {
return Object::empty_type_arguments().ptr();
}
- return type_params.defaults();
+ auto const zone = thread->zone();
+ const auto& result = TypeArguments::Handle(
+ zone, TypeArguments::New(parameters.Length(), Heap::kNew));
+ auto& param = TypeParameter::Handle(zone);
+ auto& type = AbstractType::Handle(zone);
+ for (intptr_t i = 0, n = parameters.Length(); i < n; i++) {
+ param ^= parameters.TypeAt(i);
+ type = param.default_argument();
+ ASSERT(type.IsFinalized());
+ result.SetTypeAt(i, type);
+ }
+ return result.Canonicalize(thread);
+}
+
+TypeArgumentsPtr Class::InstantiateToBounds(Thread* thread) const {
+ const auto& type_params =
+ TypeArguments::Handle(thread->zone(), type_parameters());
+ return InstantiateTypeArgumentsToBounds(thread, type_params);
}
ClassPtr Class::SuperClass(bool original_classes) const {
@@ -3328,19 +3339,28 @@
untag()->set_super_type(value.ptr());
}
-TypeParameterPtr Class::TypeParameterAt(intptr_t index,
- Nullability nullability) const {
- ASSERT(index >= 0 && index < NumTypeParameters());
- const TypeParameters& type_params = TypeParameters::Handle(type_parameters());
- const TypeArguments& bounds = TypeArguments::Handle(type_params.bounds());
- const AbstractType& bound = AbstractType::Handle(
- bounds.IsNull() ? Type::DynamicType() : bounds.TypeAt(index));
- TypeParameter& type_param = TypeParameter::Handle(
- TypeParameter::New(*this, 0, index, bound, nullability));
- if (is_type_finalized()) {
- type_param ^= ClassFinalizer::FinalizeType(type_param);
+TypeParameterPtr Class::LookupTypeParameter(const String& type_name) const {
+ ASSERT(!type_name.IsNull());
+ Thread* thread = Thread::Current();
+ REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
+ REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread);
+ REUSABLE_STRING_HANDLESCOPE(thread);
+ TypeArguments& type_params = thread->TypeArgumentsHandle();
+ TypeParameter& type_param = thread->TypeParameterHandle();
+ String& type_param_name = thread->StringHandle();
+
+ type_params = type_parameters();
+ if (!type_params.IsNull()) {
+ const intptr_t num_type_params = type_params.Length();
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ type_param_name = type_param.name();
+ if (type_param_name.Equals(type_name)) {
+ return type_param.ptr();
+ }
+ }
}
- return type_param.ptr();
+ return TypeParameter::null();
}
UnboxedFieldBitmap Class::CalculateFieldOffsets() const {
@@ -3381,7 +3401,9 @@
// parameterized, introduce a new type_arguments field.
if (host_type_args_field_offset == kNoTypeArguments) {
ASSERT(target_type_args_field_offset == RTN::Class::kNoTypeArguments);
- if (IsGeneric()) {
+ const TypeArguments& type_params = TypeArguments::Handle(type_parameters());
+ if (!type_params.IsNull()) {
+ ASSERT(type_params.Length() > 0);
// The instance needs a type_arguments field.
host_type_args_field_offset = host_offset;
target_type_args_field_offset = target_offset;
@@ -4845,8 +4867,6 @@
return Symbols::Never().ToCString();
case kClassCid:
return Symbols::Class().ToCString();
- case kTypeParametersCid:
- return Symbols::TypeParameters().ToCString();
case kTypeArgumentsCid:
return Symbols::TypeArguments().ToCString();
case kPatchClassCid:
@@ -5173,18 +5193,9 @@
// DeclarationType without checking its nullability. Therefore, we
// consistently cache the kNonNullable version of the type.
// The exception is type Null which is stored as kNullable.
- TypeArguments& type_args = TypeArguments::Handle();
- const intptr_t num_type_params = NumTypeParameters();
- if (num_type_params > 0) {
- type_args = TypeArguments::New(num_type_params);
- TypeParameter& type_param = TypeParameter::Handle();
- for (intptr_t i = 0; i < num_type_params; i++) {
- type_param = TypeParameterAt(i);
- type_args.SetTypeAt(i, type_param);
- }
- }
Type& type =
- Type::Handle(Type::New(*this, type_args, Nullability::kNonNullable));
+ Type::Handle(Type::New(*this, TypeArguments::Handle(type_parameters()),
+ Nullability::kNonNullable));
type ^= ClassFinalizer::FinalizeType(type);
set_declaration_type(type);
return type.ptr();
@@ -6008,191 +6019,6 @@
return result;
}
-intptr_t TypeParameters::Length() const {
- if (IsNull() || untag()->names() == Array::null()) return 0;
- return Smi::Value(untag()->names()->untag()->length());
-}
-
-void TypeParameters::set_names(const Array& value) const {
- ASSERT(!value.IsNull());
- untag()->set_names(value.ptr());
-}
-
-StringPtr TypeParameters::NameAt(intptr_t index) const {
- const Array& names_array = Array::Handle(names());
- return String::RawCast(names_array.At(index));
-}
-
-void TypeParameters::SetNameAt(intptr_t index, const String& value) const {
- const Array& names_array = Array::Handle(names());
- names_array.SetAt(index, value);
-}
-
-void TypeParameters::set_flags(const Array& value) const {
- untag()->set_flags(value.ptr());
-}
-
-void TypeParameters::set_bounds(const TypeArguments& value) const {
- // A null value represents a vector of dynamic.
- untag()->set_bounds(value.ptr());
-}
-
-AbstractTypePtr TypeParameters::BoundAt(intptr_t index) const {
- const TypeArguments& upper_bounds = TypeArguments::Handle(bounds());
- return upper_bounds.IsNull() ? Type::DynamicType()
- : upper_bounds.TypeAt(index);
-}
-
-void TypeParameters::SetBoundAt(intptr_t index,
- const AbstractType& value) const {
- const TypeArguments& upper_bounds = TypeArguments::Handle(bounds());
- upper_bounds.SetTypeAt(index, value);
-}
-
-bool TypeParameters::AllDynamicBounds() const {
- return bounds() == TypeArguments::null();
-}
-
-void TypeParameters::set_defaults(const TypeArguments& value) const {
- // The null value represents a vector of dynamic.
- untag()->set_defaults(value.ptr());
-}
-
-AbstractTypePtr TypeParameters::DefaultAt(intptr_t index) const {
- const TypeArguments& default_type_args = TypeArguments::Handle(defaults());
- return default_type_args.IsNull() ? Type::DynamicType()
- : default_type_args.TypeAt(index);
-}
-
-void TypeParameters::SetDefaultAt(intptr_t index,
- const AbstractType& value) const {
- const TypeArguments& default_type_args = TypeArguments::Handle(defaults());
- default_type_args.SetTypeAt(index, value);
-}
-
-bool TypeParameters::AllDynamicDefaults() const {
- return defaults() == TypeArguments::null();
-}
-
-void TypeParameters::AllocateFlags(Heap::Space space) const {
- const intptr_t len = (Length() + kFlagsPerSmiMask) >> kFlagsPerSmiShift;
- const Array& flags_array = Array::Handle(Array::New(len, space));
- // Initialize flags to 0.
- const Smi& zero = Smi::Handle(Smi::New(0));
- for (intptr_t i = 0; i < len; i++) {
- flags_array.SetAt(i, zero);
- }
- set_flags(flags_array);
-}
-
-void TypeParameters::OptimizeFlags() const {
- if (untag()->flags() == Array::null()) return; // Already optimized.
- const intptr_t len = (Length() + kFlagsPerSmiMask) >> kFlagsPerSmiShift;
- const Array& flags_array = Array::Handle(flags());
- const Smi& zero = Smi::Handle(Smi::New(0));
- for (intptr_t i = 0; i < len; i++) {
- if (flags_array.At(i) != zero.ptr()) return;
- }
- set_flags(Object::null_array());
-}
-
-bool TypeParameters::IsGenericCovariantImplAt(intptr_t index) const {
- if (untag()->flags() == Array::null()) return false;
- const intptr_t flag = Smi::Value(
- Smi::RawCast(Array::Handle(flags()).At(index >> kFlagsPerSmiShift)));
- return (flag >> (index & kFlagsPerSmiMask)) != 0;
-}
-
-void TypeParameters::SetIsGenericCovariantImplAt(intptr_t index,
- bool value) const {
- const Array& flg = Array::Handle(flags());
- intptr_t flag = Smi::Value(Smi::RawCast(flg.At(index >> kFlagsPerSmiShift)));
- if (value) {
- flag |= 1 << (index % kFlagsPerSmiMask);
- } else {
- flag &= ~(1 << (index % kFlagsPerSmiMask));
- }
- flg.SetAt(index >> kFlagsPerSmiShift, Smi::Handle(Smi::New(flag)));
-}
-
-void TypeParameters::Print(Thread* thread,
- Zone* zone,
- bool are_class_type_parameters,
- intptr_t base,
- NameVisibility name_visibility,
- BaseTextBuffer* printer) const {
- String& name = String::Handle(zone);
- AbstractType& type = AbstractType::Handle(zone);
- const intptr_t num_type_params = Length();
- for (intptr_t i = 0; i < num_type_params; i++) {
- if (are_class_type_parameters) {
- name = NameAt(i);
- printer->AddString(name.ToCString());
- } else {
- printer->AddString(TypeParameter::CanonicalNameCString(
- are_class_type_parameters, base, base + i));
- }
- if (!AllDynamicBounds()) {
- type = BoundAt(i);
- // Do not print default bound or non-nullable Object bound in weak mode.
- if (!type.IsNull() &&
- (!type.IsObjectType() ||
- (thread->isolate_group()->null_safety() && type.IsNonNullable()))) {
- printer->AddString(" extends ");
- type.PrintName(name_visibility, printer);
- if (FLAG_show_internal_names && !AllDynamicDefaults()) {
- type = DefaultAt(i);
- if (!type.IsNull() && !type.IsDynamicType()) {
- printer->AddString(" defaults to ");
- type.PrintName(name_visibility, printer);
- }
- }
- }
- }
- if (i != num_type_params - 1) {
- printer->AddString(", ");
- }
- }
-}
-
-const char* TypeParameters::ToCString() const {
- if (IsNull()) {
- return "TypeParameters: null";
- }
- auto thread = Thread::Current();
- auto zone = thread->zone();
- ZoneTextBuffer buffer(zone);
- buffer.AddString("TypeParameters: ");
- Print(thread, zone, true, 0, kInternalName, &buffer);
- return buffer.buffer();
-}
-
-TypeParametersPtr TypeParameters::New(Heap::Space space) {
- ASSERT(Object::type_parameters_class() != Class::null());
- ObjectPtr ptr = Object::Allocate(TypeParameters::kClassId,
- TypeParameters::InstanceSize(), space,
- /*compressed*/ false);
- return static_cast<TypeParametersPtr>(ptr);
-}
-
-TypeParametersPtr TypeParameters::New(intptr_t count, Heap::Space space) {
- const TypeParameters& result =
- TypeParameters::Handle(TypeParameters::New(space));
- // Create an [ Array ] of [ String ] objects to represent the names.
- // Create a [ TypeArguments ] vector representing the bounds.
- // Create a [ TypeArguments ] vector representing the defaults.
- // Create an [ Array ] of [ Smi] objects to represent the flags.
- const Array& names_array = Array::Handle(Array::New(count, space));
- result.set_names(names_array);
- TypeArguments& type_args = TypeArguments::Handle();
- type_args = TypeArguments::New(count, Heap::kNew); // Will get canonicalized.
- result.set_bounds(type_args);
- type_args = TypeArguments::New(count, Heap::kNew); // Will get canonicalized.
- result.set_defaults(type_args);
- result.AllocateFlags(space); // Will get optimized.
- return result.ptr();
-}
-
intptr_t TypeArguments::ComputeNullability() const {
if (IsNull()) return 0;
const intptr_t num_types = Length();
@@ -7317,47 +7143,97 @@
TypeArgumentsPtr Function::InstantiateToBounds(
Thread* thread,
DefaultTypeArgumentsKind* kind_out) const {
- if (type_parameters() == TypeParameters::null()) {
+ if (CachesDefaultTypeArguments()) {
+ // Always use the cached version, even if the type parameters are null,
+ // to catch cases where the cache isn't properly initialized.
+ return default_type_arguments(kind_out);
+ }
+ // No cached version, so just retrieve from the type parameters and return
+ // a canonicalized version..
+ if (type_parameters() == TypeArguments::null()) {
if (kind_out != nullptr) {
*kind_out = DefaultTypeArgumentsKind::kIsInstantiated;
}
return Object::empty_type_arguments().ptr();
}
- auto& type_params = TypeParameters::Handle(thread->zone(), type_parameters());
- auto& result = TypeArguments::Handle(thread->zone(), type_params.defaults());
+ auto& result = TypeArguments::Handle(thread->zone(), type_parameters());
+ result = InstantiateTypeArgumentsToBounds(thread, result);
if (kind_out != nullptr) {
- if (IsClosureFunction()) {
- *kind_out = default_type_arguments_kind();
- } else {
- // We just return is/is not instantiated if the value isn't cached, as
- // the other checks may be more overhead at runtime than just doing the
- // instantiation.
- *kind_out = result.IsNull() || result.IsInstantiated()
- ? DefaultTypeArgumentsKind::kIsInstantiated
- : DefaultTypeArgumentsKind::kNeedsInstantiation;
- }
+ // We just return is/is not instantiated if the value isn't cached, as
+ // the other checks may be more overhead at runtime than just doing the
+ // instantiation.
+ *kind_out = result.IsNull() || result.IsInstantiated()
+ ? DefaultTypeArgumentsKind::kIsInstantiated
+ : DefaultTypeArgumentsKind::kNeedsInstantiation;
}
return result.ptr();
}
-Function::DefaultTypeArgumentsKind Function::default_type_arguments_kind()
- const {
- if (!IsClosureFunction()) {
- UNREACHABLE();
+void Function::UpdateCachedDefaultTypeArguments(Thread* thread) const {
+ auto const zone = thread->zone();
+ auto& closure_function = Function::Handle(zone);
+ if (HasImplicitClosureFunction()) {
+ closure_function = ImplicitClosureFunction();
}
- const auto& closure_data = ClosureData::Handle(ClosureData::RawCast(data()));
- ASSERT(!closure_data.IsNull());
- return closure_data.default_type_arguments_kind();
+ if (CachesDefaultTypeArguments()) {
+ auto defaults = &Object::empty_type_arguments();
+ const FunctionType& sig = FunctionType::Handle(zone, signature());
+ if (sig.NumTypeParameters(thread) > 0) {
+ const auto& params = TypeArguments::Handle(zone, sig.type_parameters());
+ const intptr_t num_params = params.Length();
+ auto& new_defaults = TypeArguments::Handle(
+ zone, TypeArguments::New(num_params, Heap::kNew));
+ // Only canonicalize the result if all the default arguments have been
+ // canonicalized, to avoid premature canonicalization of the arguments.
+ bool all_canonical = true;
+ auto& type = AbstractType::Handle(zone);
+ for (intptr_t i = 0; i < num_params; i++) {
+ type = params.TypeAt(i);
+ type = TypeParameter::Cast(type).default_argument();
+ if (!type.IsCanonical()) {
+ all_canonical = false;
+ }
+ new_defaults.SetTypeAt(i, type);
+ }
+ if (all_canonical) {
+ new_defaults = new_defaults.Canonicalize(thread);
+ }
+ defaults = &new_defaults;
+ }
+ set_default_type_arguments(*defaults);
+ if (!closure_function.IsNull()) {
+ closure_function.set_default_type_arguments(*defaults);
+ }
+ } else if (!closure_function.IsNull()) {
+ closure_function.UpdateCachedDefaultTypeArguments(thread);
+ }
}
-void Function::set_default_type_arguments_kind(
- Function::DefaultTypeArgumentsKind value) const {
- if (!IsClosureFunction()) {
+TypeArgumentsPtr Function::default_type_arguments(
+ DefaultTypeArgumentsKind* kind_out) const {
+ if (!CachesDefaultTypeArguments()) {
UNREACHABLE();
}
const auto& closure_data = ClosureData::Handle(ClosureData::RawCast(data()));
ASSERT(!closure_data.IsNull());
- closure_data.set_default_type_arguments_kind(value);
+ if (kind_out != nullptr) {
+ *kind_out = closure_data.default_type_arguments_kind();
+ }
+ return closure_data.default_type_arguments();
+}
+
+void Function::set_default_type_arguments(const TypeArguments& value) const {
+ if (!CachesDefaultTypeArguments()) {
+ UNREACHABLE();
+ }
+ const auto& closure_data = ClosureData::Handle(ClosureData::RawCast(data()));
+ ASSERT(!closure_data.IsNull());
+ auto kind = DefaultTypeArgumentsKindFor(value);
+ ASSERT(kind != DefaultTypeArgumentsKind::kInvalid);
+ closure_data.set_default_type_arguments_kind(kind);
+ // We could just store null for the ksharesFunction/kSharesInstantiator cases,
+ // assuming all clients retrieve the DefaultTypeArgumentsKind to distinguish.
+ closure_data.set_default_type_arguments(value);
}
Function::DefaultTypeArgumentsKind Function::DefaultTypeArgumentsKindFor(
@@ -7636,32 +7512,10 @@
untag()->set_signature(value.ptr());
if (!value.IsNull()) {
ASSERT(NumImplicitParameters() == value.num_implicit_parameters());
- if (IsClosureFunction() && value.IsGeneric()) {
- const TypeParameters& type_params =
- TypeParameters::Handle(value.type_parameters());
- const TypeArguments& defaults =
- TypeArguments::Handle(type_params.defaults());
- auto kind = DefaultTypeArgumentsKindFor(defaults);
- ASSERT(kind != DefaultTypeArgumentsKind::kInvalid);
- set_default_type_arguments_kind(kind);
- }
+ UpdateCachedDefaultTypeArguments(Thread::Current());
}
}
-TypeParameterPtr FunctionType::TypeParameterAt(intptr_t index,
- Nullability nullability) const {
- ASSERT(index >= 0 && index < NumTypeParameters());
- const TypeParameters& type_params = TypeParameters::Handle(type_parameters());
- const AbstractType& bound = AbstractType::Handle(type_params.BoundAt(index));
- TypeParameter& type_param = TypeParameter::Handle(
- TypeParameter::New(Object::null_class(), NumParentTypeArguments(),
- NumParentTypeArguments() + index, bound, nullability));
- if (IsFinalized()) {
- type_param ^= ClassFinalizer::FinalizeType(type_param);
- }
- return type_param.ptr();
-}
-
void FunctionType::set_result_type(const AbstractType& value) const {
ASSERT(!value.IsNull());
untag()->set_result_type(value.ptr());
@@ -7849,7 +7703,7 @@
}
}
-void FunctionType::set_type_parameters(const TypeParameters& value) const {
+void FunctionType::set_type_parameters(const TypeArguments& value) const {
untag()->set_type_parameters(value.ptr());
}
@@ -7893,11 +7747,11 @@
}
intptr_t FunctionType::NumTypeParameters(Thread* thread) const {
- if (type_parameters() == TypeParameters::null()) {
+ if (type_parameters() == TypeArguments::null()) {
return 0;
}
- REUSABLE_TYPE_PARAMETERS_HANDLESCOPE(thread);
- TypeParameters& type_params = thread->TypeParametersHandle();
+ REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
+ TypeArguments& type_params = thread->TypeArgumentsHandle();
type_params = type_parameters();
// We require null to represent a non-generic signature.
ASSERT(type_params.Length() != 0);
@@ -7910,10 +7764,45 @@
return FunctionType::Handle(signature()).NumParentTypeArguments();
}
-TypeParameterPtr Function::TypeParameterAt(intptr_t index,
- Nullability nullability) const {
- const FunctionType& sig = FunctionType::Handle(signature());
- return sig.TypeParameterAt(index, nullability);
+TypeParameterPtr Function::LookupTypeParameter(const String& type_name,
+ intptr_t* function_level) const {
+ ASSERT(!type_name.IsNull());
+ Thread* thread = Thread::Current();
+ REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread);
+ REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread);
+ REUSABLE_STRING_HANDLESCOPE(thread);
+ REUSABLE_FUNCTION_HANDLESCOPE(thread);
+ TypeArguments& type_params = thread->TypeArgumentsHandle();
+ TypeParameter& type_param = thread->TypeParameterHandle();
+ String& type_param_name = thread->StringHandle();
+ Function& function = thread->FunctionHandle();
+
+ function = this->ptr();
+ while (!function.IsNull()) {
+ if (function.signature() != FunctionType::null()) {
+ type_params = function.type_parameters();
+ if (!type_params.IsNull()) {
+ const intptr_t num_type_params = type_params.Length();
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ type_param_name = type_param.name();
+ if (type_param_name.Equals(type_name)) {
+ return type_param.ptr();
+ }
+ }
+ }
+ }
+ if (function.IsImplicitClosureFunction()) {
+ // The parent function is not the enclosing function, but the closurized
+ // function with identical type parameters.
+ break;
+ }
+ function = function.parent_function();
+ if (function_level != NULL) {
+ (*function_level)--;
+ }
+ }
+ return TypeParameter::null();
}
void Function::set_kind(UntaggedFunction::Kind value) const {
@@ -8195,6 +8084,7 @@
const Function& function,
const Instance& receiver,
const TypeArguments& instantiator_type_args,
+ const TypeArguments& type_params,
const Array& args,
const ArgumentsDescriptor& args_desc) {
ASSERT(!function.IsNull());
@@ -8326,10 +8216,11 @@
receiver ^= args.At(args_desc.FirstArgIndex());
}
+ const auto& params = TypeArguments::Handle(zone, type_parameters());
const auto& function_type_arguments = TypeArguments::Handle(
zone, RetrieveFunctionTypeArguments(thread, zone, *this, receiver,
- instantiator_type_arguments, args,
- args_desc));
+ instantiator_type_arguments, params,
+ args, args_desc));
return Function::DoArgumentTypesMatch(
args, args_desc, instantiator_type_arguments, function_type_arguments);
}
@@ -8355,29 +8246,23 @@
const intptr_t kNumParentTypeArgs = NumParentTypeArguments();
ASSERT(function_type_arguments.HasCount(kNumParentTypeArgs +
kNumLocalTypeArgs));
- const auto& params = TypeParameters::Handle(zone, type_parameters());
- // No checks are needed if all bounds are dynamic.
- if (!params.AllDynamicBounds()) {
- auto& param = AbstractType::Handle(zone);
- auto& bound = AbstractType::Handle(zone);
- for (intptr_t i = 0; i < kNumLocalTypeArgs; i++) {
- bound = params.BoundAt(i);
- // Only perform non-covariant checks where the bound is not
- // the top type.
- if (params.IsGenericCovariantImplAt(i) ||
- bound.IsTopTypeForSubtyping()) {
- continue;
- }
- param = TypeParameterAt(i);
- if (!AbstractType::InstantiateAndTestSubtype(
- ¶m, &bound, instantiator_type_arguments,
- function_type_arguments)) {
- const auto& names = Array::Handle(zone, params.names());
- auto& name = String::Handle(zone);
- name ^= names.At(i);
- return Error::RawCast(
- ThrowTypeError(token_pos(), param, bound, name));
- }
+ const auto& params = TypeArguments::Handle(zone, type_parameters());
+ auto& parameter = TypeParameter::Handle(zone);
+ auto& type = AbstractType::Handle(zone);
+ auto& bound = AbstractType::Handle(zone);
+ for (intptr_t i = 0; i < kNumLocalTypeArgs; i++) {
+ parameter ^= params.TypeAt(i);
+ type = parameter.ptr();
+ bound = parameter.bound();
+ // Only perform non-covariant checks where the bound is not the top type.
+ if (parameter.IsGenericCovariantImpl() || bound.IsTopTypeForSubtyping()) {
+ continue;
+ }
+ if (!AbstractType::InstantiateAndTestSubtype(&type, &bound,
+ instantiator_type_arguments,
+ function_type_arguments)) {
+ const auto& name = String::Handle(zone, parameter.name());
+ return Error::RawCast(ThrowTypeError(token_pos(), type, bound, name));
}
}
} else {
@@ -8597,35 +8482,49 @@
FunctionType::New(remaining_parent_type_params, nullability(), space));
AbstractType& type = AbstractType::Handle(zone);
- // Copy the type parameters and instantiate their bounds and defaults.
+ // Copy the type parameters and instantiate their bounds (if necessary).
if (!delete_type_parameters) {
- const TypeParameters& type_params =
- TypeParameters::Handle(zone, type_parameters());
+ const TypeArguments& type_params =
+ TypeArguments::Handle(zone, type_parameters());
if (!type_params.IsNull()) {
- const TypeParameters& sig_type_params =
- TypeParameters::Handle(zone, TypeParameters::New());
- // No need to set names that are ignored in a signature, however, the
- // length of the names array defines the number of type parameters.
- sig_type_params.set_names(Array::Handle(zone, type_params.names()));
- sig_type_params.set_flags(Array::Handle(zone, type_params.flags()));
- TypeArguments& type_args = TypeArguments::Handle(zone);
- type_args = type_params.bounds();
- if (!type_args.IsNull() &&
- !type_args.IsInstantiated(kAny, num_free_fun_type_params)) {
- type_args = type_args.InstantiateFrom(
- instantiator_type_arguments, function_type_arguments,
- num_free_fun_type_params, space, trail);
+ TypeArguments& instantiated_type_params = TypeArguments::Handle(zone);
+ TypeParameter& type_param = TypeParameter::Handle(zone);
+ String& param_name = String::Handle(zone);
+ for (intptr_t i = 0; i < type_params.Length(); ++i) {
+ type_param ^= type_params.TypeAt(i);
+ ASSERT(type_param.index() == num_parent_type_args + i);
+ type = type_param.bound();
+ if (!type.IsInstantiated(kAny, num_free_fun_type_params)) {
+ type = type.InstantiateFrom(instantiator_type_arguments,
+ function_type_arguments,
+ num_free_fun_type_params, space, trail);
+ // A returned null type indicates a failed instantiation in dead code
+ // that must be propagated up to the caller, the optimizing compiler.
+ if (type.IsNull()) {
+ return FunctionType::null();
+ }
+ ASSERT(type_param.IsFinalized());
+ param_name = type_param.name();
+ type_param = TypeParameter::New(
+ Object::null_class(), type_param.base(), type_param.index(),
+ param_name, type, type_param.IsGenericCovariantImpl(),
+ type_param.nullability());
+ type_param.SetIsFinalized();
+ if (instantiated_type_params.IsNull()) {
+ instantiated_type_params = TypeArguments::New(type_params.Length());
+ for (intptr_t j = 0; j < i; ++j) {
+ type = type_params.TypeAt(j);
+ instantiated_type_params.SetTypeAt(j, type);
+ }
+ }
+ instantiated_type_params.SetTypeAt(i, type_param);
+ } else if (!instantiated_type_params.IsNull()) {
+ instantiated_type_params.SetTypeAt(i, type_param);
+ }
}
- sig_type_params.set_bounds(type_args);
- type_args = type_params.defaults();
- if (!type_args.IsNull() &&
- !type_args.IsInstantiated(kAny, num_free_fun_type_params)) {
- type_args = type_args.InstantiateFrom(
- instantiator_type_arguments, function_type_arguments,
- num_free_fun_type_params, space, trail);
- }
- sig_type_params.set_defaults(type_args);
- sig.set_type_parameters(sig_type_params);
+ sig.set_type_parameters(instantiated_type_params.IsNull()
+ ? type_params
+ : instantiated_type_params);
}
}
@@ -8708,56 +8607,20 @@
return false;
}
if (num_type_params > 0) {
- const TypeParameters& type_params =
- TypeParameters::Handle(zone, type_parameters());
+ const TypeArguments& type_params =
+ TypeArguments::Handle(zone, type_parameters());
ASSERT(!type_params.IsNull());
- const TypeParameters& other_type_params =
- TypeParameters::Handle(zone, other.type_parameters());
+ const TypeArguments& other_type_params =
+ TypeArguments::Handle(zone, other.type_parameters());
ASSERT(!other_type_params.IsNull());
- if (kind == TypeEquality::kInSubtypeTest) {
- if (!type_params.AllDynamicBounds() ||
- !other_type_params.AllDynamicBounds()) {
- AbstractType& bound = AbstractType::Handle(zone);
- AbstractType& other_bound = AbstractType::Handle(zone);
- for (intptr_t i = 0; i < num_type_params; i++) {
- bound = type_params.BoundAt(i);
- other_bound = other_type_params.BoundAt(i);
- // Bounds that are mutual subtypes are considered equal.
- if (!bound.IsSubtypeOf(other_bound, Heap::kOld) ||
- !other_bound.IsSubtypeOf(bound, Heap::kOld)) {
- return false;
- }
- }
- }
- } else {
- if (NumParentTypeArguments() != other.NumParentTypeArguments()) {
+ TypeParameter& type_param = TypeParameter::Handle(zone);
+ TypeParameter& other_type_param = TypeParameter::Handle(zone);
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ other_type_param ^= other_type_params.TypeAt(i);
+ if (!type_param.IsEquivalent(other_type_param, kind, trail)) {
return false;
}
- const TypeArguments& bounds =
- TypeArguments::Handle(zone, type_params.bounds());
- const TypeArguments& other_bounds =
- TypeArguments::Handle(zone, other_type_params.bounds());
- if (!bounds.IsEquivalent(other_bounds, kind, trail)) {
- return false;
- }
- if (kind == TypeEquality::kCanonical) {
- // Compare default arguments.
- const TypeArguments& defaults =
- TypeArguments::Handle(zone, type_params.defaults());
- const TypeArguments& other_defaults =
- TypeArguments::Handle(zone, other_type_params.defaults());
- if (defaults.IsNull()) {
- if (!other_defaults.IsNull()) {
- return false;
- }
- } else if (!defaults.IsEquivalent(other_defaults, kind, trail)) {
- return false;
- }
- }
- }
- // Compare flags (IsGenericCovariantImpl).
- if (!Array::Equals(type_params.flags(), other_type_params.flags())) {
- return false;
}
}
return true;
@@ -8949,6 +8812,11 @@
// in new space.
ASSERT(space == Heap::kOld);
}
+ if (result.CachesDefaultTypeArguments()) {
+ // Make sure the default type arguments are set consistently with the
+ // function type parameters (currently null).
+ result.set_default_type_arguments(Object::empty_type_arguments());
+ }
// Force-optimized functions are not debuggable because they cannot
// deoptimize.
@@ -9064,8 +8932,9 @@
// Its implicit closure function therefore has no generic parent function
// either. That is why it is safe to simply copy the type parameters.
closure_signature.set_type_parameters(
- TypeParameters::Handle(zone, type_parameters()));
+ TypeArguments::Handle(zone, type_parameters()));
closure_function.SetNumTypeParameters(NumTypeParameters());
+ closure_function.UpdateCachedDefaultTypeArguments(thread);
// Set closure function's result type to this result type.
closure_signature.set_result_type(AbstractType::Handle(zone, result_type()));
@@ -9299,15 +9168,39 @@
}
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
- const TypeParameters& type_params =
- TypeParameters::Handle(zone, type_parameters());
+ auto isolate_group = thread->isolate_group();
+ const TypeArguments& type_params =
+ TypeArguments::Handle(zone, type_parameters());
if (!type_params.IsNull()) {
+ const intptr_t num_type_params = type_params.Length();
+ ASSERT(num_type_params > 0);
+ TypeParameter& type_param = TypeParameter::Handle(zone);
+ String& name = String::Handle(zone);
+ AbstractType& bound = AbstractType::Handle(zone);
printer->AddString("<");
- const intptr_t base = NumParentTypeArguments();
- const bool kIsClassTypeParameter = false;
- // Type parameter names are meaningless after canonicalization.
- type_params.Print(thread, zone, kIsClassTypeParameter, base,
- name_visibility, printer);
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ name = type_param.name();
+ printer->AddString(name.ToCString());
+ bound = type_param.bound();
+ // Do not print default bound or non-nullable Object bound in weak mode.
+ if (!bound.IsNull() &&
+ (!bound.IsObjectType() ||
+ (isolate_group->null_safety() && bound.IsNonNullable()))) {
+ printer->AddString(" extends ");
+ bound.PrintName(name_visibility, printer);
+ if (FLAG_show_internal_names) {
+ bound = type_param.default_argument();
+ if (!bound.IsNull() && !bound.IsDynamicType()) {
+ printer->AddString(" defaults to ");
+ bound.PrintName(name_visibility, printer);
+ }
+ }
+ }
+ if (i < num_type_params - 1) {
+ printer->AddString(", ");
+ }
+ }
printer->AddString(">");
}
printer->AddString("(");
@@ -9355,16 +9248,13 @@
return false;
}
}
- const intptr_t num_type_params = NumTypeParameters();
- if (num_type_params > 0) {
- TypeParameters& type_params = TypeParameters::Handle(type_parameters());
- if (!type_params.AllDynamicBounds()) {
- for (intptr_t i = 0; i < type_params.Length(); ++i) {
- type = type_params.BoundAt(i);
- if (!type.IsInstantiated(genericity, num_free_fun_type_params, trail)) {
- return false;
- }
- }
+ TypeArguments& type_params = TypeArguments::Handle(type_parameters());
+ TypeParameter& type_param = TypeParameter::Handle();
+ for (intptr_t i = 0; i < type_params.Length(); ++i) {
+ type_param ^= type_params.TypeAt(i);
+ type = type_param.bound();
+ if (!type.IsInstantiated(genericity, num_free_fun_type_params, trail)) {
+ return false;
}
}
return true;
@@ -10058,6 +9948,10 @@
value, *original));
}
+void ClosureData::set_default_type_arguments(const TypeArguments& value) const {
+ untag()->set_default_type_arguments(value.ptr());
+}
+
ClosureData::DefaultTypeArgumentsKind ClosureData::default_type_arguments_kind()
const {
return LoadNonPointer(&untag()->default_type_arguments_kind_);
@@ -10092,6 +9986,13 @@
}
buffer.Printf(" implicit_static_closure: 0x%" Px "",
static_cast<uword>(implicit_static_closure()));
+ buffer.AddString(" default_type_arguments: ");
+ if (default_type_arguments() == TypeArguments::null()) {
+ buffer.AddString("null");
+ } else {
+ buffer.AddString(
+ TypeArguments::Handle(zone, default_type_arguments()).ToCString());
+ }
return buffer.buffer();
}
@@ -19675,9 +19576,16 @@
} else {
const intptr_t len = (*trail)->length();
ASSERT((len % 2) == 0);
+ const bool this_is_typeref = IsTypeRef();
+ const bool buddy_is_typeref = buddy.IsTypeRef();
+ // Note that at least one of 'this' and 'buddy' should be a typeref, with
+ // one exception, when the class of the 'this' type implements the 'call'
+ // method, thereby possibly creating a recursive type (see regress_29405).
for (intptr_t i = 0; i < len; i += 2) {
- if ((*trail)->At(i).ptr() == this->ptr() &&
- (*trail)->At(i + 1).ptr() == buddy.ptr()) {
+ if ((((*trail)->At(i).ptr() == this->ptr()) ||
+ (buddy_is_typeref && (*trail)->At(i).Equals(*this))) &&
+ (((*trail)->At(i + 1).ptr() == buddy.ptr()) ||
+ (this_is_typeref && (*trail)->At(i + 1).Equals(buddy)))) {
return true;
}
}
@@ -19789,8 +19697,7 @@
Class& cls = Class::Handle(zone);
if (IsTypeParameter()) {
const TypeParameter& type_param = TypeParameter::Cast(*this);
- // Type parameter names are meaningless after canonicalization.
- printer->AddString(type_param.CanonicalNameCString());
+ printer->AddString(String::Handle(type_param.name()).ToCString());
printer->AddString(NullabilitySuffix(name_visibility));
return;
}
@@ -20028,6 +19935,10 @@
}
const AbstractType& bound = AbstractType::Handle(zone, type_param.bound());
ASSERT(bound.IsFinalized());
+ // Avoid cycles with F-bounded types.
+ if (TestAndAddBuddyToTrail(&trail, other)) {
+ return true;
+ }
if (bound.IsSubtypeOf(other, space, trail)) {
return true;
}
@@ -20854,12 +20765,12 @@
AbstractType& type = AbstractType::Handle();
const intptr_t num_type_params = NumTypeParameters();
if (num_type_params > 0) {
- const TypeParameters& type_params =
- TypeParameters::Handle(type_parameters());
- const TypeArguments& bounds = TypeArguments::Handle(type_params.bounds());
- result = CombineHashes(result, bounds.Hash());
- // Since the default arguments are ignored when comparing two generic
- // function types for type equality, the hash does not depend on them.
+ const TypeArguments& type_params = TypeArguments::Handle(type_parameters());
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type = type_params.TypeAt(i);
+ type = TypeParameter::Cast(type).bound();
+ result = CombineHashes(result, type.Hash());
+ }
}
type = result_type();
result = CombineHashes(result, type.Hash());
@@ -20948,20 +20859,17 @@
}
bool FunctionType::IsRecursive(TrailPtr trail) const {
- if (IsGeneric()) {
- const TypeParameters& type_params =
- TypeParameters::Handle(type_parameters());
- TypeArguments& type_args = TypeArguments::Handle();
- type_args = type_params.bounds();
- if (type_args.IsRecursive(trail)) {
- return true;
- }
- type_args = type_params.defaults();
- if (type_args.IsRecursive(trail)) {
- return true;
+ AbstractType& type = AbstractType::Handle();
+ const intptr_t num_type_params = NumTypeParameters();
+ if (num_type_params > 0) {
+ const TypeArguments& type_params = TypeArguments::Handle(type_parameters());
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type = type_params.TypeAt(i);
+ if (type.IsRecursive(trail)) {
+ return true;
+ }
}
}
- AbstractType& type = AbstractType::Handle();
type = result_type();
if (type.IsRecursive(trail)) {
return true;
@@ -20986,23 +20894,23 @@
// its signature.
return false;
}
+ AbstractType& type = AbstractType::Handle(zone);
const intptr_t num_type_params = NumTypeParameters();
if (num_type_params > 0) {
- const TypeParameters& type_params =
- TypeParameters::Handle(type_parameters());
- TypeArguments& type_args = TypeArguments::Handle();
- type_args = type_params.bounds();
- if (type_args.RequireConstCanonicalTypeErasure(zone, 0, num_type_params,
- trail)) {
- return true;
- }
- type_args = type_params.defaults();
- if (type_args.RequireConstCanonicalTypeErasure(zone, 0, num_type_params,
- trail)) {
- return true;
+ const TypeArguments& type_params = TypeArguments::Handle(type_parameters());
+ TypeParameter& type_param = TypeParameter::Handle(zone);
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ type = type_param.bound();
+ if (type.RequireConstCanonicalTypeErasure(zone, trail)) {
+ return true;
+ }
+ type = type_param.default_argument();
+ if (type.RequireConstCanonicalTypeErasure(zone, trail)) {
+ return true;
+ }
}
}
- AbstractType& type = AbstractType::Handle(zone);
type = result_type();
if (type.RequireConstCanonicalTypeErasure(zone, trail)) {
return true;
@@ -21024,19 +20932,18 @@
if (IsCanonical()) {
#ifdef DEBUG
// Verify that all fields are allocated in old space and are canonical.
- if (IsGeneric()) {
- const TypeParameters& type_params =
- TypeParameters::Handle(zone, type_parameters());
- ASSERT(type_params.IsOld());
- TypeArguments& type_args = TypeArguments::Handle(zone);
- type_args = type_params.bounds();
- ASSERT(type_args.IsOld());
- ASSERT(type_args.IsCanonical());
- type_args = type_params.defaults();
- ASSERT(type_args.IsOld());
- ASSERT(type_args.IsCanonical());
- }
AbstractType& type = AbstractType::Handle(zone);
+ const intptr_t num_type_params = NumTypeParameters();
+ if (num_type_params > 0) {
+ const TypeArguments& type_params =
+ TypeArguments::Handle(zone, type_parameters());
+ ASSERT(type_params.IsOld());
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type = type_params.TypeAt(i);
+ ASSERT(type.IsOld());
+ ASSERT(type.IsCanonical());
+ }
+ }
type = result_type();
ASSERT(type.IsOld());
ASSERT(type.IsCanonical());
@@ -21064,22 +20971,19 @@
if (sig.IsNull()) {
// The function type was not found in the table. It is not canonical yet.
// Canonicalize its type parameters and types.
- if (IsGeneric()) {
- const TypeParameters& type_params =
- TypeParameters::Handle(zone, type_parameters());
+ const intptr_t num_type_params = NumTypeParameters();
+ if (num_type_params > 0) {
+ const TypeArguments& type_params =
+ TypeArguments::Handle(zone, type_parameters());
ASSERT(type_params.IsOld());
- TypeArguments& type_args = TypeArguments::Handle(zone);
- type_args = type_params.bounds();
- if (!type_args.IsCanonical()) {
- type_args = type_args.Canonicalize(thread, trail);
- type_params.set_bounds(type_args);
- SetHash(0);
- }
- type_args = type_params.defaults();
- if (!type_args.IsCanonical()) {
- type_args = type_args.Canonicalize(thread, trail);
- type_params.set_defaults(type_args);
- SetHash(0);
+ TypeParameter& type_param = TypeParameter::Handle(zone);
+ for (intptr_t i = 0; i < num_type_params; i++) {
+ type_param ^= type_params.TypeAt(i);
+ if (!type_param.IsCanonical()) {
+ type_param ^= type_param.Canonicalize(thread, trail);
+ type_params.SetTypeAt(i, type_param);
+ SetHash(0);
+ }
}
}
AbstractType& type = AbstractType::Handle(zone);
@@ -21231,7 +21135,7 @@
}
void TypeRef::set_type(const AbstractType& value) const {
- ASSERT(!value.IsTypeRef());
+ ASSERT(value.IsNull() || value.IsType() || value.IsFunctionType());
untag()->set_type(value.ptr());
}
@@ -21282,14 +21186,7 @@
// type arguments are set).
const AbstractType& ref_type = AbstractType::Handle(type());
ASSERT(!ref_type.IsNull());
- uint32_t result;
- if (ref_type.IsTypeParameter()) {
- result = TypeParameter::Cast(ref_type).parameterized_class_id();
- result = CombineHashes(result, TypeParameter::Cast(ref_type).index());
- } else {
- ASSERT(ref_type.IsType() || ref_type.IsFunctionType());
- result = ref_type.type_class_id();
- }
+ uint32_t result = ref_type.type_class_id();
// A legacy type should have the same hash as its non-nullable version to be
// consistent with the definition of type equality in Dart code.
Nullability ref_type_nullability = ref_type.nullability();
@@ -21345,6 +21242,11 @@
UntaggedTypeParameter::BeingFinalizedBit::update(true, untag()->flags_));
}
+void TypeParameter::SetGenericCovariantImpl(bool value) const {
+ set_flags(UntaggedTypeParameter::GenericCovariantImplBit::update(
+ value, untag()->flags_));
+}
+
void TypeParameter::set_nullability(Nullability value) const {
StoreNonPointer(&untag()->nullability_, static_cast<uint8_t>(value));
}
@@ -21384,9 +21286,15 @@
}
// Although the type parameter is instantiated, its bound may not be.
const AbstractType& upper_bound = AbstractType::Handle(bound());
- if (!upper_bound.IsInstantiated(genericity, num_free_fun_type_params,
- trail)) {
- return false;
+ ASSERT(!upper_bound.IsTypeRef());
+ if (upper_bound.IsTypeParameter() || upper_bound.IsFunctionType() ||
+ upper_bound.arguments() != TypeArguments::null()) {
+ // Use trail to break cycles created by bound referring to type parameter.
+ if (!TestAndAddToTrail(&trail) &&
+ !upper_bound.IsInstantiated(genericity, num_free_fun_type_params,
+ trail)) {
+ return false;
+ }
}
return true;
}
@@ -21437,11 +21345,34 @@
index() != other_type_param.index()) {
return false;
}
+ // Compare bounds.
+ if (TestAndAddBuddyToTrail(&trail, other_type_param)) {
+ return true;
+ }
AbstractType& type = AbstractType::Handle(bound());
AbstractType& other_type = AbstractType::Handle(other_type_param.bound());
if (!type.IsEquivalent(other_type, kind, trail)) {
return false;
}
+ if (kind == TypeEquality::kCanonical) {
+ // Compare names.
+ if (name() != other_type_param.name()) {
+ return false;
+ }
+ // Compare default arguments.
+ type = default_argument();
+ other_type = other_type_param.default_argument();
+ if (type.IsNull()) {
+ if (!other_type.IsNull()) {
+ return false;
+ }
+ } else if (!type.IsEquivalent(other_type, kind, trail)) {
+ return false;
+ }
+ }
+ }
+ if (IsGenericCovariantImpl() != other_type_param.IsGenericCovariantImpl()) {
+ return false;
}
} else {
if (!other_type_param.IsClassTypeParameter()) {
@@ -21454,7 +21385,8 @@
return false;
}
if (base() != other_type_param.base() ||
- index() != other_type_param.index()) {
+ index() != other_type_param.index() ||
+ name() != other_type_param.name()) {
return false;
}
} else {
@@ -21462,6 +21394,10 @@
return false;
}
}
+ // Compare bounds.
+ if (TestAndAddBuddyToTrail(&trail, other_type_param)) {
+ return true;
+ }
AbstractType& upper_bound = AbstractType::Handle(bound());
AbstractType& other_type_param_upper_bound =
AbstractType::Handle(other_type_param.bound());
@@ -21497,7 +21433,16 @@
}
bool TypeParameter::IsRecursive(TrailPtr trail) const {
- if (AbstractType::Handle(bound()).IsRecursive(trail)) {
+ if (TestAndAddToTrail(&trail)) {
+ return true;
+ }
+ AbstractType& type = AbstractType::Handle();
+ type = bound();
+ if (type.IsRecursive(trail)) {
+ return true;
+ }
+ type = default_argument();
+ if (type.IsRecursive(trail)) {
return true;
}
return false;
@@ -21541,11 +21486,21 @@
StoreNonPointer(&untag()->index_, value);
}
+void TypeParameter::set_name(const String& value) const {
+ ASSERT(value.IsSymbol());
+ untag()->set_name(value.ptr());
+}
+
void TypeParameter::set_bound(const AbstractType& value) const {
ASSERT(!IsCanonical());
untag()->set_bound(value.ptr());
}
+void TypeParameter::set_default_argument(const AbstractType& value) const {
+ ASSERT(!IsCanonical());
+ untag()->set_default_argument(value.ptr());
+}
+
AbstractTypePtr TypeParameter::GetFromTypeArguments(
const TypeArguments& instantiator_type_arguments,
const TypeArguments& function_type_arguments) const {
@@ -21571,6 +21526,13 @@
AbstractType& upper_bound = AbstractType::Handle(bound());
if (!upper_bound.IsInstantiated(kAny, num_free_fun_type_params,
nullptr)) {
+ // Use trail to break cycles created by bound referring to type param.
+ // The instantiation trail must contain pairs, so add itself as buddy.
+ if (TestAndAddBuddyToTrail(&trail, *this)) {
+ // If the type parameter is already in the trail, it is returned
+ // unchanged here and will be processed when returning from recursion.
+ return ptr();
+ }
upper_bound = upper_bound.InstantiateFrom(
instantiator_type_arguments, function_type_arguments,
num_free_fun_type_params, space, trail);
@@ -21620,9 +21582,13 @@
if (IsCanonical()) {
#ifdef DEBUG
// Verify that all fields are allocated in old space and are canonical.
- const AbstractType& upper_bound = AbstractType::Handle(zone, bound());
- ASSERT(upper_bound.IsOld());
- ASSERT(upper_bound.IsCanonical() || upper_bound.IsTypeRef());
+ AbstractType& type = AbstractType::Handle(zone);
+ type = bound();
+ ASSERT(type.IsOld());
+ ASSERT(type.IsCanonical());
+ type = default_argument();
+ ASSERT(type.IsOld());
+ ASSERT(type.IsCanonical());
#endif
return this->ptr();
}
@@ -21637,15 +21603,33 @@
ASSERT(object_store->canonical_type_parameters() == table.Release().ptr());
}
if (type_parameter.IsNull()) {
- AbstractType& upper_bound = AbstractType::Handle(zone, bound());
- upper_bound = upper_bound.Canonicalize(thread, trail);
+ // The type parameter was not found in the table. It is not canonical yet.
+ // Canonicalize its bound and default argument.
+ // However, if the type parameter is already being canonicalized, it is part
+ // of a cycle via its bound. Return it now and let the caller finish
+ // canonicalizing it.
+ if (TestAndAddToTrail(&trail)) {
+ return ptr();
+ }
+ AbstractType& type = AbstractType::Handle(zone);
+ type = bound();
+ type = type.Canonicalize(thread, trail);
if (IsCanonical()) {
- // Canonicalizing the bound canonicalized this type parameter
- // as a side effect.
+ // Canonicalizing bound or default argument canonicalized this type
+ // parameter as a side effect.
ASSERT(IsRecursive()); // Self-referring bound or default argument.
return ptr();
}
- set_bound(upper_bound);
+ set_bound(type);
+ type = default_argument();
+ type = type.Canonicalize(thread, trail);
+ if (IsCanonical()) {
+ // Canonicalizing bound or default argument canonicalized this type
+ // parameter as a side effect.
+ ASSERT(IsRecursive()); // Self-referring bound or default argument.
+ return this->ptr();
+ }
+ set_default_argument(type);
// Check to see if the type parameter got added to canonical table as part
// of the canonicalization of its bound and default argument.
SafepointMutexLocker ml(isolate_group->type_canonicalization_mutex());
@@ -21671,9 +21655,6 @@
#if defined(DEBUG)
bool TypeParameter::CheckIsCanonical(Thread* thread) const {
- if (IsRecursive()) {
- return true;
- }
Zone* zone = thread->zone();
auto isolate_group = thread->isolate_group();
@@ -21693,10 +21674,23 @@
uword TypeParameter::ComputeHash() const {
ASSERT(IsFinalized() || IsBeingFinalized()); // Bound may not be finalized.
uint32_t result = parameterized_class_id();
+ // Hashing the bound reduces collisions, but may also create cycles.
+ // Therefore, we only hash the type_class_id of the bound,
+ // and do not use its full hash, as we do for TypeRef.
const AbstractType& upper_bound = AbstractType::Handle(bound());
- result = CombineHashes(result, upper_bound.Hash()); // May be a TypeRef.
+ if (upper_bound.IsTypeParameter()) {
+ ASSERT(upper_bound.IsFinalized() || upper_bound.IsBeingFinalized());
+ result = CombineHashes(result, TypeParameter::Cast(upper_bound).index());
+ } else {
+ // Note that the bound may not be finalized yet.
+ result = CombineHashes(result, upper_bound.type_class_id());
+ }
+ // Since the default argument is ignored when comparing two generic function
+ // types for type equality, the hash does not depend on it.
+ result = CombineHashes(result, IsGenericCovariantImpl() ? 1 : 0);
result = CombineHashes(result, base());
result = CombineHashes(result, index());
+ result = CombineHashes(result, String::Handle(name()).Hash());
// A legacy type should have the same hash as its non-nullable version to be
// consistent with the definition of type equality in Dart code.
Nullability type_param_nullability = nullability();
@@ -21719,16 +21713,21 @@
TypeParameterPtr TypeParameter::New(const Class& parameterized_class,
intptr_t base,
intptr_t index,
+ const String& name,
const AbstractType& bound,
+ bool is_generic_covariant_impl,
Nullability nullability) {
Zone* Z = Thread::Current()->zone();
const TypeParameter& result = TypeParameter::Handle(Z, TypeParameter::New());
result.set_parameterized_class(parameterized_class);
result.set_base(base);
result.set_index(index);
+ result.set_name(name);
result.set_bound(bound);
+ result.set_default_argument(Object::dynamic_type());
result.set_flags(0);
result.set_nullability(nullability);
+ result.SetGenericCovariantImpl(is_generic_covariant_impl);
result.SetHash(0);
result.SetTypeTestingStub(
@@ -21740,28 +21739,12 @@
StoreNonPointer(&untag()->flags_, flags);
}
-const char* TypeParameter::CanonicalNameCString(bool is_class_type_parameter,
- intptr_t base,
- intptr_t index) {
- Thread* thread = Thread::Current();
- ZoneTextBuffer printer(thread->zone());
- const char* base_fmt = is_class_type_parameter ? "C%" Pd : "F%" Pd;
- const char* index_fmt = is_class_type_parameter ? "X%" Pd : "Y%" Pd;
- if (base != 0) {
- printer.Printf(base_fmt, base);
- }
- printer.Printf(index_fmt, index - base);
- return printer.buffer();
-}
-
const char* TypeParameter::ToCString() const {
- if (IsNull()) {
- return "TypeParameter: null";
- }
Thread* thread = Thread::Current();
- ZoneTextBuffer printer(thread->zone());
+ Zone* zone = thread->zone();
+ ZoneTextBuffer printer(zone);
printer.Printf("TypeParameter: ");
- printer.AddString(CanonicalNameCString());
+ printer.AddString(String::Handle(zone, name()).ToCString());
printer.AddString(NullabilitySuffix(kInternalName));
printer.Printf("; bound: ");
const AbstractType& upper_bound = AbstractType::Handle(bound());
@@ -21770,6 +21753,15 @@
} else {
upper_bound.PrintName(kInternalName, &printer);
}
+ if (FLAG_show_internal_names) {
+ printer.Printf("; default: ");
+ const AbstractType& default_arg = AbstractType::Handle(default_argument());
+ if (default_arg.IsNull()) {
+ printer.AddString("<null>");
+ } else {
+ default_arg.PrintName(kInternalName, &printer);
+ }
+ }
return printer.buffer();
}
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 29ed4b3..0a54c9d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -460,7 +460,6 @@
static ClassPtr class_class() { return class_class_; }
static ClassPtr dynamic_class() { return dynamic_class_; }
static ClassPtr void_class() { return void_class_; }
- static ClassPtr type_parameters_class() { return type_parameters_class_; }
static ClassPtr type_arguments_class() { return type_arguments_class_; }
static ClassPtr patch_class_class() { return patch_class_class_; }
static ClassPtr function_class() { return function_class_; }
@@ -775,14 +774,13 @@
static BoolPtr true_;
static BoolPtr false_;
- static ClassPtr class_class_; // Class of the Class vm object.
- static ClassPtr dynamic_class_; // Class of the 'dynamic' type.
- static ClassPtr void_class_; // Class of the 'void' type.
- static ClassPtr type_parameters_class_; // Class of TypeParameters vm object.
- static ClassPtr type_arguments_class_; // Class of TypeArguments vm object.
- static ClassPtr patch_class_class_; // Class of the PatchClass vm object.
- static ClassPtr function_class_; // Class of the Function vm object.
- static ClassPtr closure_data_class_; // Class of ClosureData vm obj.
+ static ClassPtr class_class_; // Class of the Class vm object.
+ static ClassPtr dynamic_class_; // Class of the 'dynamic' type.
+ static ClassPtr void_class_; // Class of the 'void' type.
+ static ClassPtr type_arguments_class_; // Class of TypeArguments vm object.
+ static ClassPtr patch_class_class_; // Class of the PatchClass vm object.
+ static ClassPtr function_class_; // Class of the Function vm object.
+ static ClassPtr closure_data_class_; // Class of ClosureData vm obj.
static ClassPtr ffi_trampoline_data_class_; // Class of FfiTrampolineData
// vm obj.
static ClassPtr field_class_; // Class of the Field vm object.
@@ -1105,22 +1103,21 @@
LibraryPtr library() const { return untag()->library(); }
void set_library(const Library& value) const;
- // The formal type parameters and their bounds (no defaults), are specified as
- // an object of type TypeParameters.
- TypeParametersPtr type_parameters() const {
+ // The type parameters (and their bounds) are specified as an array of
+ // TypeParameter.
+ TypeArgumentsPtr type_parameters() const {
ASSERT(is_declaration_loaded());
return untag()->type_parameters();
}
- void set_type_parameters(const TypeParameters& value) const;
+ void set_type_parameters(const TypeArguments& value) const;
intptr_t NumTypeParameters(Thread* thread) const;
intptr_t NumTypeParameters() const {
return NumTypeParameters(Thread::Current());
}
- // Return the type parameter declared at index.
- TypeParameterPtr TypeParameterAt(
- intptr_t index,
- Nullability nullability = Nullability::kNonNullable) const;
+ // Return a TypeParameter if the type_name is a type parameter of this class.
+ // Return null otherwise.
+ TypeParameterPtr LookupTypeParameter(const String& type_name) const;
// The type argument vector is flattened and includes the type arguments of
// the super class.
@@ -2617,9 +2614,9 @@
// are packed into SMIs, but omitted if they're 0.
bool IsRequiredAt(intptr_t index) const;
- // The formal type parameters, their bounds, and defaults, are specified as an
- // object of type TypeParameters stored in the signature.
- TypeParametersPtr type_parameters() const {
+ // The type parameters (and their bounds) are specified as an array of
+ // TypeParameter stored in the signature. They are part of the function type.
+ TypeArgumentsPtr type_parameters() const {
return untag()->signature()->untag()->type_parameters();
}
@@ -2638,10 +2635,12 @@
return NumParentTypeArguments() + NumTypeParameters();
}
- // Return the type parameter declared at index.
- TypeParameterPtr TypeParameterAt(
- intptr_t index,
- Nullability nullability = Nullability::kNonNullable) const;
+ // Return a TypeParameter if the type_name is a type parameter of this
+ // function or of one of its parent functions.
+ // Unless NULL, adjust function_level accordingly (in and out parameter).
+ // Return null otherwise.
+ TypeParameterPtr LookupTypeParameter(const String& type_name,
+ intptr_t* function_level) const;
// Return true if this function declares type parameters.
// Generic dispatchers only set the number without actual type parameters.
@@ -2736,9 +2735,21 @@
Thread* thread,
DefaultTypeArgumentsKind* kind_out = nullptr) const;
- // Only usable for closure functions.
- DefaultTypeArgumentsKind default_type_arguments_kind() const;
- void set_default_type_arguments_kind(DefaultTypeArgumentsKind value) const;
+ // Whether this function should have a cached type arguments vector for the
+ // instantiated-to-bounds version of the type parameters.
+ bool CachesDefaultTypeArguments() const { return IsClosureFunction(); }
+
+ // Updates the cached default type arguments vector for this function if it
+ // caches and for its implicit closure function if it has one. If the
+ // default arguments are all canonical, the cached default type arguments
+ // vector is canonicalized. Should be run any time the type parameters vector
+ // is changed or if the default arguments of any type parameters are updated.
+ void UpdateCachedDefaultTypeArguments(Thread* thread) const;
+
+ // These are only usable for functions that cache the default type arguments.
+ TypeArgumentsPtr default_type_arguments(
+ DefaultTypeArgumentsKind* kind_out = nullptr) const;
+ void set_default_type_arguments(const TypeArguments& value) const;
// Enclosing outermost function of this local function.
FunctionPtr GetOutermostFunction() const;
@@ -3776,6 +3787,9 @@
return RoundedAllocationSize(sizeof(UntaggedClosureData));
}
+ static intptr_t default_type_arguments_offset() {
+ return OFFSET_OF(UntaggedClosureData, default_type_arguments_);
+ }
static intptr_t default_type_arguments_kind_offset() {
return OFFSET_OF(UntaggedClosureData, default_type_arguments_kind_);
}
@@ -3802,6 +3816,11 @@
}
void set_implicit_static_closure(const Instance& closure) const;
+ TypeArgumentsPtr default_type_arguments() const {
+ return untag()->default_type_arguments();
+ }
+ void set_default_type_arguments(const TypeArguments& value) const;
+
DefaultTypeArgumentsKind default_type_arguments_kind() const;
void set_default_type_arguments_kind(DefaultTypeArgumentsKind value) const;
@@ -4203,7 +4222,7 @@
// Returns false if any value read from this field is guaranteed to be
// not null.
// Internally we is_nullable_ field contains either kNullCid (nullable) or
- // kIllegalCid (non-nullable) instead of boolean. This is done to simplify
+ // kInvalidCid (non-nullable) instead of boolean. This is done to simplify
// guarding sequence in the generated code.
bool is_nullable() const;
void set_is_nullable(bool val) const {
@@ -7464,90 +7483,6 @@
friend class Class;
};
-// TypeParameters represents a list of formal type parameters with their bounds
-// and their default values as calculated by CFE.
-class TypeParameters : public Object {
- public:
- intptr_t Length() const;
-
- static intptr_t names_offset() {
- return OFFSET_OF(UntaggedTypeParameters, names_);
- }
- StringPtr NameAt(intptr_t index) const;
- void SetNameAt(intptr_t index, const String& value) const;
-
- static intptr_t flags_offset() {
- return OFFSET_OF(UntaggedTypeParameters, flags_);
- }
-
- static intptr_t bounds_offset() {
- return OFFSET_OF(UntaggedTypeParameters, bounds_);
- }
- AbstractTypePtr BoundAt(intptr_t index) const;
- void SetBoundAt(intptr_t index, const AbstractType& value) const;
- bool AllDynamicBounds() const;
-
- static intptr_t defaults_offset() {
- return OFFSET_OF(UntaggedTypeParameters, defaults_);
- }
- AbstractTypePtr DefaultAt(intptr_t index) const;
- void SetDefaultAt(intptr_t index, const AbstractType& value) const;
- bool AllDynamicDefaults() const;
-
- // The isGenericCovariantImpl bits are packed into SMIs in the flags array,
- // but omitted if they're 0.
- bool IsGenericCovariantImplAt(intptr_t index) const;
- void SetIsGenericCovariantImplAt(intptr_t index, bool value) const;
-
- // The number of flags per Smi should be a power of 2 in order to simplify the
- // generated code accessing the flags array.
-#if !defined(DART_COMPRESSED_POINTERS)
- static const intptr_t kFlagsPerSmiShift = kBitsPerWordLog2 - 1;
-#else
- static const intptr_t kFlagsPerSmiShift = kBitsPerWordLog2 - 2;
-#endif
- static const intptr_t kFlagsPerSmi = 1LL << kFlagsPerSmiShift;
- COMPILE_ASSERT(kFlagsPerSmi < kSmiBits);
- static const intptr_t kFlagsPerSmiMask = kFlagsPerSmi - 1;
-
- void Print(Thread* thread,
- Zone* zone,
- bool are_class_type_parameters,
- intptr_t base,
- NameVisibility name_visibility,
- BaseTextBuffer* printer) const;
-
- static intptr_t InstanceSize() {
- return RoundedAllocationSize(sizeof(UntaggedTypeParameters));
- }
-
- static TypeParametersPtr New(Heap::Space space = Heap::kOld);
- static TypeParametersPtr New(intptr_t count, Heap::Space space = Heap::kOld);
-
- private:
- ArrayPtr names() const { return untag()->names(); }
- void set_names(const Array& value) const;
- ArrayPtr flags() const { return untag()->flags(); }
- void set_flags(const Array& value) const;
- TypeArgumentsPtr bounds() const { return untag()->bounds(); }
- void set_bounds(const TypeArguments& value) const;
- TypeArgumentsPtr defaults() const { return untag()->defaults(); }
- void set_defaults(const TypeArguments& value) const;
-
- // Allocate and initialize the flags array to zero.
- void AllocateFlags(Heap::Space space) const;
- // Reset the flags array to null if all flags are zero.
- void OptimizeFlags() const;
-
- FINAL_HEAP_OBJECT_IMPLEMENTATION(TypeParameters, Object);
- friend class Class;
- friend class ClassFinalizer;
- friend class Function;
- friend class FunctionType;
- friend class Object;
- friend class Precompiler;
-};
-
// A TypeArguments is an array of AbstractType.
class TypeArguments : public Instance {
public:
@@ -8372,8 +8307,6 @@
}
// Reexported so they can be used by the flow graph builders.
- using PackedNumParentTypeArguments =
- UntaggedFunctionType::PackedNumParentTypeArguments;
using PackedHasNamedOptionalParameters =
UntaggedFunctionType::PackedHasNamedOptionalParameters;
using PackedNumFixedParameters =
@@ -8381,11 +8314,6 @@
using PackedNumOptionalParameters =
UntaggedFunctionType::PackedNumOptionalParameters;
- // Return the type parameter declared at index.
- TypeParameterPtr TypeParameterAt(
- intptr_t index,
- Nullability nullability = Nullability::kNonNullable) const;
-
AbstractTypePtr result_type() const { return untag()->result_type(); }
void set_result_type(const AbstractType& value) const;
@@ -8441,12 +8369,12 @@
// parameters don't have flags.
static intptr_t NameArrayLengthIncludingFlags(intptr_t num_parameters);
- // The formal type parameters, their bounds, and defaults, are specified as an
- // object of type TypeParameters.
- TypeParametersPtr type_parameters() const {
+ // The type parameters (and their bounds) are specified as an array of
+ // TypeParameter.
+ TypeArgumentsPtr type_parameters() const {
return untag()->type_parameters();
}
- void set_type_parameters(const TypeParameters& value) const;
+ void set_type_parameters(const TypeArguments& value) const;
static intptr_t type_parameters_offset() {
return OFFSET_OF(UntaggedFunctionType, type_parameters_);
}
@@ -8608,6 +8536,11 @@
return UntaggedTypeParameter::BeingFinalizedBit::decode(untag()->flags_);
}
virtual void SetIsBeingFinalized() const;
+ bool IsGenericCovariantImpl() const {
+ return UntaggedTypeParameter::GenericCovariantImplBit::decode(
+ untag()->flags_);
+ }
+ void SetGenericCovariantImpl(bool value) const;
static intptr_t flags_offset() {
return OFFSET_OF(UntaggedTypeParameter, flags_);
}
@@ -8642,12 +8575,21 @@
return OFFSET_OF(UntaggedTypeParameter, index_);
}
+ StringPtr name() const { return untag()->name(); }
+ static intptr_t name_offset() {
+ return OFFSET_OF(UntaggedTypeParameter, name_);
+ }
AbstractTypePtr bound() const { return untag()->bound(); }
void set_bound(const AbstractType& value) const;
static intptr_t bound_offset() {
return OFFSET_OF(UntaggedTypeParameter, bound_);
}
+ AbstractTypePtr default_argument() const {
+ return untag()->default_argument();
+ }
+ void set_default_argument(const AbstractType& value) const;
+
virtual bool IsInstantiated(Genericity genericity = kAny,
intptr_t num_free_fun_type_params = kAllFree,
TrailPtr trail = nullptr) const;
@@ -8683,15 +8625,6 @@
const TypeArguments& instantiator_type_arguments,
const TypeArguments& function_type_arguments) const;
- // Return a constructed name for this nameless type parameter.
- const char* CanonicalNameCString() const {
- return CanonicalNameCString(IsClassTypeParameter(), base(), index());
- }
-
- static const char* CanonicalNameCString(bool is_class_type_parameter,
- intptr_t base,
- intptr_t index);
-
static intptr_t InstanceSize() {
return RoundedAllocationSize(sizeof(UntaggedTypeParameter));
}
@@ -8700,7 +8633,9 @@
static TypeParameterPtr New(const Class& parameterized_class,
intptr_t base,
intptr_t index,
+ const String& name,
const AbstractType& bound,
+ bool is_generic_covariant_impl,
Nullability nullability);
private:
@@ -9058,8 +8993,6 @@
return GetCachedHash(ptr()) != 0;
}
- bool IsRecursive() const { return false; } // Required by HashSet templates.
-
static intptr_t hash_offset() {
#if defined(HASH_IN_OBJECT_HEADER)
COMPILE_ASSERT(UntaggedObject::kHashTagPos % kBitsPerByte == 0);
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index cc858f5..7f3da19 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -169,15 +169,6 @@
}
}
-void TypeParameters::PrintJSONImpl(JSONStream* stream, bool ref) const {
- JSONObject jsobj(stream);
- jsobj.AddProperty("kind", "TypeParameters");
- jsobj.AddProperty("flags", Array::Handle(flags()));
- jsobj.AddProperty("names", Array::Handle(names()));
- jsobj.AddProperty("bounds", TypeArguments::Handle(bounds()));
- jsobj.AddProperty("defaults", TypeArguments::Handle(defaults()));
-}
-
void TypeArguments::PrintJSONImpl(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
// The index in the canonical_type_arguments table cannot be used as part of
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 0916e2a..2aa73d8 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -244,7 +244,6 @@
V(current_function, Function, CurrentFunction) \
V(current_num_processed, Smi, CurrentNumProcessed) \
V(current_param_index, Smi, CurrentParamIndex) \
- V(current_type_param, Dynamic, CurrentTypeParam) \
V(function_type_args, Dynamic, FunctionTypeArgs)
#define DEFINE_FIELD(Name, _, __) LocalVariable* Name = nullptr;
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 1cdaff0..d99acc8 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -572,7 +572,6 @@
COMPRESSED_VISITOR(UserTag)
REGULAR_VISITOR(SubtypeTestCache)
COMPRESSED_VISITOR(LoadingUnit)
-COMPRESSED_VISITOR(TypeParameters)
VARIABLE_COMPRESSED_VISITOR(TypeArguments,
Smi::Value(raw_obj->untag()->length()))
VARIABLE_COMPRESSED_VISITOR(LocalVarDescriptors, raw_obj->untag()->num_entries_)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 7c62065..b1d5767 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -954,7 +954,8 @@
COMPRESSED_POINTER_FIELD(ArrayPtr, interfaces) // Array of AbstractType.
COMPRESSED_POINTER_FIELD(ScriptPtr, script)
COMPRESSED_POINTER_FIELD(LibraryPtr, library)
- COMPRESSED_POINTER_FIELD(TypeParametersPtr, type_parameters)
+ // Array of TypeParameter.
+ COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, type_parameters)
COMPRESSED_POINTER_FIELD(AbstractTypePtr, super_type)
// Canonicalized const instances of this class.
COMPRESSED_POINTER_FIELD(ArrayPtr, constants)
@@ -1357,7 +1358,9 @@
#endif
// Closure object for static implicit closures.
COMPRESSED_POINTER_FIELD(InstancePtr, closure)
- VISIT_TO(CompressedObjectPtr, closure)
+ // Instantiate-to-bounds TAV for use when no TAV is provided.
+ COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, default_type_arguments)
+ VISIT_TO(CompressedObjectPtr, default_type_arguments)
enum class DefaultTypeArgumentsKind : uint8_t {
// Only here to make sure it's explicitly set appropriately.
@@ -1455,7 +1458,7 @@
TokenPosition end_token_pos_;
ClassIdTagType guarded_cid_;
ClassIdTagType is_nullable_; // kNullCid if field can contain null value and
- // kIllegalCid otherwise.
+ // kInvalidCid otherwise.
#if !defined(DART_PRECOMPILED_RUNTIME)
uint32_t kernel_offset_;
@@ -2500,25 +2503,6 @@
friend class SnapshotReader;
};
-class UntaggedTypeParameters : public UntaggedObject {
- private:
- RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameters);
-
- VISIT_FROM(CompressedObjectPtr, names)
- // Length of names reflects the number of type parameters.
- COMPRESSED_POINTER_FIELD(ArrayPtr, names)
- // flags: isGenericCovariantImpl and (todo) variance.
- COMPRESSED_POINTER_FIELD(ArrayPtr, flags)
- COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, bounds)
- // defaults is the instantiation to bounds (calculated by CFE).
- COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, defaults)
- VISIT_TO(CompressedObjectPtr, defaults)
- CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
-
- friend class Object;
- friend class SnapshotReader;
-};
-
class UntaggedAbstractType : public UntaggedInstance {
public:
enum TypeState {
@@ -2567,7 +2551,8 @@
RAW_HEAP_OBJECT_IMPLEMENTATION(FunctionType);
VISIT_FROM(CompressedObjectPtr, type_test_stub)
- COMPRESSED_POINTER_FIELD(TypeParametersPtr, type_parameters)
+ // Array of TypeParameter.
+ COMPRESSED_POINTER_FIELD(TypeArgumentsPtr, type_parameters)
COMPRESSED_POINTER_FIELD(AbstractTypePtr, result_type)
COMPRESSED_POINTER_FIELD(ArrayPtr, parameter_types)
COMPRESSED_POINTER_FIELD(ArrayPtr, parameter_names);
@@ -2639,13 +2624,21 @@
RAW_HEAP_OBJECT_IMPLEMENTATION(TypeParameter);
VISIT_FROM(CompressedObjectPtr, type_test_stub)
+ COMPRESSED_POINTER_FIELD(StringPtr, name)
COMPRESSED_POINTER_FIELD(SmiPtr, hash)
// ObjectType if no explicit bound specified.
COMPRESSED_POINTER_FIELD(AbstractTypePtr, bound)
- VISIT_TO(CompressedObjectPtr, bound)
+ // The instantiation to bounds of this parameter as calculated by the CFE.
+ //
+ // TODO(dartbug.com/43901): Once a separate TypeParameters class has been
+ // added, move these there and remove them from TypeParameter objects.
+ COMPRESSED_POINTER_FIELD(AbstractTypePtr, default_argument)
+ VISIT_TO(CompressedObjectPtr, default_argument)
ClassIdTagType parameterized_class_id_; // Or kFunctionCid for function tp.
- uint8_t base_; // Number of enclosing function type parameters.
- uint8_t index_; // Keep size in sync with BuildTypeParameterTypeTestStub.
+ // TODO(regis): Can we use uint8_t twice below? Or keep uint16_t?
+ // Warning: BuildTypeParameterTypeTestStub assumes uint16_t.
+ uint16_t base_; // Number of enclosing function type parameters.
+ uint16_t index_;
uint8_t flags_;
uint8_t nullability_;
@@ -2653,7 +2646,9 @@
using BeingFinalizedBit = BitField<decltype(flags_), bool, 0, 1>;
using FinalizedBit =
BitField<decltype(flags_), bool, BeingFinalizedBit::kNextBit, 1>;
- static constexpr intptr_t kFlagsBitSize = FinalizedBit::kNextBit;
+ using GenericCovariantImplBit =
+ BitField<decltype(flags_), bool, FinalizedBit::kNextBit, 1>;
+ static constexpr intptr_t kFlagsBitSize = GenericCovariantImplBit::kNextBit;
private:
CompressedObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 629d62b..faea10f 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -136,12 +136,9 @@
F(TypeRef, type_test_stub_) \
F(TypeRef, type_) \
F(TypeParameter, type_test_stub_) \
+ F(TypeParameter, name_) \
F(TypeParameter, hash_) \
F(TypeParameter, bound_) \
- F(TypeParameters, names_) \
- F(TypeParameters, flags_) \
- F(TypeParameters, bounds_) \
- F(TypeParameters, defaults_) \
F(Closure, instantiator_type_arguments_) \
F(Closure, function_type_arguments_) \
F(Closure, delayed_type_arguments_) \
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 606d930..924f0a4 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -230,8 +230,6 @@
reader->AddBackRef(object_id, &type_parameter, kIsDeserialized);
// Set all non object fields.
- type_parameter.set_base(reader->Read<uint8_t>());
- type_parameter.set_index(reader->Read<uint8_t>());
const uint8_t combined = reader->Read<uint8_t>();
type_parameter.set_flags(combined >> 4);
type_parameter.set_nullability(static_cast<Nullability>(combined & 0xf));
@@ -281,8 +279,8 @@
writer->WriteTags(writer->GetObjectTags(this));
// Write out all the non object pointer fields.
- writer->Write<uint8_t>(base_);
- writer->Write<uint8_t>(index_);
+ writer->Write<uint16_t>(base_);
+ writer->Write<uint16_t>(index_);
const uint8_t combined = (flags_ << 4) | nullability_;
ASSERT(flags_ == (combined >> 4));
ASSERT(nullability_ == (combined & 0xf));
@@ -298,43 +296,6 @@
writer->WriteObjectImpl(param_class, kAsReference);
}
-TypeParametersPtr TypeParameters::ReadFrom(SnapshotReader* reader,
- intptr_t object_id,
- intptr_t tags,
- Snapshot::Kind kind,
- bool as_reference) {
- ASSERT(reader != NULL);
-
- TypeParameters& type_parameters =
- TypeParameters::ZoneHandle(reader->zone(), TypeParameters::New());
- reader->AddBackRef(object_id, &type_parameters, kIsDeserialized);
-
- // Set all the object fields.
- READ_COMPRESSED_OBJECT_FIELDS(
- type_parameters, type_parameters.ptr()->untag()->from(),
- type_parameters.ptr()->untag()->to(), kAsReference);
-
- return type_parameters.ptr();
-}
-
-void UntaggedTypeParameters::WriteTo(SnapshotWriter* writer,
- intptr_t object_id,
- Snapshot::Kind kind,
- bool as_reference) {
- ASSERT(writer != NULL);
-
- // Write out the serialization header value for this object.
- writer->WriteInlinedObjectHeader(object_id);
-
- // Write out the class and tags information.
- writer->WriteVMIsolateObject(kTypeParametersCid);
- writer->WriteTags(writer->GetObjectTags(this));
-
- // Write out all the object pointer fields.
- SnapshotWriterVisitor visitor(writer, kAsReference);
- visitor.VisitCompressedPointers(heap_base(), from(), to());
-}
-
TypeArgumentsPtr TypeArguments::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index e2ac116..5b05ecc 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -109,8 +109,6 @@
ReusableSmiHandleScope reused_smi_handle(thread);
#define REUSABLE_STRING_HANDLESCOPE(thread) \
ReusableStringHandleScope reused_string_handle(thread);
-#define REUSABLE_TYPE_PARAMETERS_HANDLESCOPE(thread) \
- ReusableTypeArgumentsHandleScope reused_type_parameters_handle(thread);
#define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread) \
ReusableTypeArgumentsHandleScope reused_type_arguments_handle(thread);
#define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread) \
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 2eb5417..ba3f9a9 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -416,7 +416,6 @@
friend class Type;
friend class FunctionType;
friend class TypedDataView;
- friend class TypeParameters;
friend class TypeArguments;
friend class TypeParameter;
friend class TypeRef;
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index ef0270b..fd790e9 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -106,7 +106,6 @@
V(DynamicCallCurrentNumProcessedVar, ":dyn_call_current_num_processed") \
V(DynamicCallCurrentFunctionVar, ":dyn_call_current_function") \
V(DynamicCallCurrentParamIndexVar, ":dyn_call_current_param_index") \
- V(DynamicCallCurrentTypeParamVar, ":dyn_call_current_type_param") \
V(DynamicCallFunctionTypeArgsVar, ":dyn_call_function_type_args") \
V(DynamicPrefix, "dyn:") \
V(EntryPointsTemp, ":entry_points_temp") \
@@ -287,7 +286,6 @@
V(TypeArguments, "TypeArguments") \
V(TypeArgumentsParameter, ":type_arguments") \
V(TypeError, "_TypeError") \
- V(TypeParameters, "TypeParameters") \
V(TypeQuote, "type '") \
V(Uint16List, "Uint16List") \
V(Uint32List, "Uint32List") \
diff --git a/runtime/vm/tagged_pointer.h b/runtime/vm/tagged_pointer.h
index 582e207..4df36b4 100644
--- a/runtime/vm/tagged_pointer.h
+++ b/runtime/vm/tagged_pointer.h
@@ -324,7 +324,6 @@
DEFINE_TAGGED_POINTER(Instance, Object)
DEFINE_TAGGED_POINTER(LibraryPrefix, Instance)
DEFINE_TAGGED_POINTER(TypeArguments, Instance)
-DEFINE_TAGGED_POINTER(TypeParameters, Object)
DEFINE_TAGGED_POINTER(AbstractType, Instance)
DEFINE_TAGGED_POINTER(Type, AbstractType)
DEFINE_TAGGED_POINTER(FunctionType, AbstractType)
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index abbddba..9b4dfe3 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -83,7 +83,6 @@
V(PcDescriptors) \
V(Smi) \
V(String) \
- V(TypeParameters) \
V(TypeArguments) \
V(TypeParameter)
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 260517b..7b6f703 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -72,8 +72,8 @@
return concatenated;
} else if (type.IsTypeParameter()) {
- return AssemblerSafeName(
- OS::SCreate(Z, "%s", TypeParameter::Cast(type).CanonicalNameCString()));
+ string_ = TypeParameter::Cast(type).name();
+ return AssemblerSafeName(OS::SCreate(Z, "%s", string_.ToCString()));
} else {
return AssemblerSafeName(OS::SCreate(Z, "%s", type.ToCString()));
}
@@ -359,13 +359,18 @@
} else {
ASSERT(hi->CanUseGenericSubtypeRangeCheckFor(type));
+ const intptr_t num_type_parameters = type_class.NumTypeParameters();
const intptr_t num_type_arguments = type_class.NumTypeArguments();
+ const TypeArguments& tp =
+ TypeArguments::Handle(type_class.type_parameters());
+ ASSERT(tp.Length() == num_type_parameters);
+
const TypeArguments& ta = TypeArguments::Handle(type.arguments());
ASSERT(ta.Length() == num_type_arguments);
BuildOptimizedSubclassRangeCheckWithTypeArguments(assembler, hi, type,
- type_class, ta);
+ type_class, tp, ta);
}
if (Instance::NullIsAssignableTo(type)) {
@@ -406,6 +411,7 @@
HierarchyInfo* hi,
const Type& type,
const Class& type_class,
+ const TypeArguments& tp,
const TypeArguments& ta) {
// a) First we make a quick sub*class* cid-range check.
compiler::Label check_failed;
@@ -935,6 +941,7 @@
TypeParameterSet* parameters_tested_against) {
Class& klass = Class::Handle(zone_);
TypeParameter& param = TypeParameter::Handle(zone_);
+ TypeArguments& params = TypeArguments::Handle(zone_);
AbstractType& type = AbstractType::Handle(zone_);
// Because Object/dynamic are common values for type parameters, we add them
@@ -954,8 +961,9 @@
}
const intptr_t num_parameters = klass.NumTypeParameters();
+ params = klass.type_parameters();
for (intptr_t i = 0; i < num_parameters; ++i) {
- param = klass.TypeParameterAt(i);
+ param ^= params.TypeAt(i);
if (parameters_tested_against->HasKey(¶m)) {
TypeArgumentsSet& ta_set = instance_creation_arguments_[cid];
auto it = ta_set.GetIterator();
diff --git a/runtime/vm/type_testing_stubs.h b/runtime/vm/type_testing_stubs.h
index 7f97d5d..d8307b8 100644
--- a/runtime/vm/type_testing_stubs.h
+++ b/runtime/vm/type_testing_stubs.h
@@ -80,6 +80,7 @@
HierarchyInfo* hi,
const Type& type,
const Class& type_class,
+ const TypeArguments& type_parameters,
const TypeArguments& type_arguments);
static void BuildOptimizedSubclassRangeCheckWithTypeArguments(
@@ -87,6 +88,7 @@
HierarchyInfo* hi,
const Type& type,
const Class& type_class,
+ const TypeArguments& type_parameters,
const TypeArguments& type_arguments,
const Register class_id_reg,
const Register instance_type_args_reg);
diff --git a/runtime/vm/type_testing_stubs_test.cc b/runtime/vm/type_testing_stubs_test.cc
index 15c1682..18c90d1 100644
--- a/runtime/vm/type_testing_stubs_test.cc
+++ b/runtime/vm/type_testing_stubs_test.cc
@@ -461,7 +461,7 @@
auto& tav_dynamic_t = TypeArguments::Handle(TypeArguments::New(2));
tav_dynamic_t.SetTypeAt(0, type_dynamic);
tav_dynamic_t.SetTypeAt(
- 1, TypeParameter::Handle(GetClassTypeParameter(class_base, 0)));
+ 1, TypeParameter::Handle(GetClassTypeParameter(class_base, "T")));
CanonicalizeTAV(&tav_dynamic_t);
// We will generate specialized TTS for instantiated interface types
@@ -750,7 +750,7 @@
// <...> as Base<T> with T instantiantiator type parameter (T == int)
const auto& tav_baset = TypeArguments::Handle(TypeArguments::New(1));
tav_baset.SetTypeAt(
- 0, TypeParameter::Handle(GetClassTypeParameter(class_base, 0)));
+ 0, TypeParameter::Handle(GetClassTypeParameter(class_base, "T")));
auto& type_base_t = AbstractType::Handle(Type::New(class_base, tav_baset));
FinalizeAndCanonicalize(&type_base_t);
RunTTSTest(obj_base_int, type_base_t, tav_int, tav_null,
@@ -761,7 +761,7 @@
// <...> as Base<B> with B function type parameter
const auto& tav_baseb = TypeArguments::Handle(TypeArguments::New(1));
tav_baseb.SetTypeAt(
- 0, TypeParameter::Handle(GetFunctionTypeParameter(fun_generic, 1)));
+ 0, TypeParameter::Handle(GetFunctionTypeParameter(fun_generic, "B")));
auto& type_base_b = AbstractType::Handle(Type::New(class_base, tav_baseb));
FinalizeAndCanonicalize(&type_base_b);
// With B == int
@@ -797,8 +797,8 @@
// <...> as Base<A2<T>>
const auto& tav_t = TypeArguments::Handle(TypeArguments::New(1));
- tav_t.SetTypeAt(0,
- TypeParameter::Handle(GetClassTypeParameter(class_base, 0)));
+ tav_t.SetTypeAt(
+ 0, TypeParameter::Handle(GetClassTypeParameter(class_base, "T")));
auto& type_a2_t = Type::Handle(Type::New(class_a2, tav_t));
type_a2_t = type_a2_t.ToNullability(Nullability::kLegacy, Heap::kNew);
FinalizeAndCanonicalize(&type_a2_t);
@@ -855,7 +855,7 @@
// dst_type = B<T>
const auto& dst_tav = TypeArguments::Handle(TypeArguments::New(1));
dst_tav.SetTypeAt(0,
- TypeParameter::Handle(GetClassTypeParameter(class_b, 0)));
+ TypeParameter::Handle(GetClassTypeParameter(class_b, "T")));
auto& dst_type = Type::Handle(Type::New(class_b, dst_tav));
FinalizeAndCanonicalize(&dst_type);
const auto& cint_tav =
@@ -891,10 +891,10 @@
Function::Handle(GetFunction(root_library, "genericFun"));
const auto& dst_type_t =
- TypeParameter::Handle(GetClassTypeParameter(class_a, 0));
+ TypeParameter::Handle(GetClassTypeParameter(class_a, "T"));
const auto& dst_type_h =
- TypeParameter::Handle(GetFunctionTypeParameter(fun_generic, 0));
+ TypeParameter::Handle(GetFunctionTypeParameter(fun_generic, "H"));
const auto& aint = Object::Handle(Invoke(root_library, "createAInt"));
const auto& astring = Object::Handle(Invoke(root_library, "createAString"));
diff --git a/tests/language/regress/regress45763_test.dart b/tests/language/regress/regress45763_test.dart
deleted file mode 100644
index 1efd68d..0000000
--- a/tests/language/regress/regress45763_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// SharedOptions=--enable-experiment=generic-metadata
-
-import "package:expect/expect.dart";
-
-Type? capturedTypeArgument;
-Type typeOf<X>() => X;
-
-X captureTypeArgument<X>() {
- capturedTypeArgument = X;
- throw "";
-}
-
-typedef check = void Function<T>();
-
-void main() {
- void f(check Function<T>() g) => g();
- try {
- f(<T>() => captureTypeArgument());
- } catch (e) {}
- Expect.equals(typeOf<void Function<T>()>(), capturedTypeArgument);
-}
diff --git a/tests/lib/mirrors/class_mirror_type_variables_expect.dart b/tests/lib/mirrors/class_mirror_type_variables_expect.dart
index 3326b08..847bd7f 100644
--- a/tests/lib/mirrors/class_mirror_type_variables_expect.dart
+++ b/tests/lib/mirrors/class_mirror_type_variables_expect.dart
@@ -96,6 +96,9 @@
values.forEach((e) {
Expect.equals(true, e is TypeVariableMirror);
});
+ Expect.equals(#R, values.elementAt(0).simpleName);
+ Expect.equals(#S, values.elementAt(1).simpleName);
+ Expect.equals(#T, values.elementAt(2).simpleName);
}
void testE(Env env) {
diff --git a/tests/lib/mirrors/generic_bounded_by_type_parameter_test.dart b/tests/lib/mirrors/generic_bounded_by_type_parameter_test.dart
index fd7c9e9..46e731f 100644
--- a/tests/lib/mirrors/generic_bounded_by_type_parameter_test.dart
+++ b/tests/lib/mirrors/generic_bounded_by_type_parameter_test.dart
@@ -50,6 +50,13 @@
Expect.equals(reflectClass(Object), xFromGeneric.upperBound); // //# 02: continued
Expect.equals(reflectClass(Object), yFromGeneric.upperBound); // //# 02: continued
+ typeParameters(superDecl, [#T, #R]);
+ typeParameters(superOfNumAndInt, [#T, #R]);
+ typeParameters(genericDecl, [#X, #Y]); // //# 02: continued
+ typeParameters(superOfXAndY, [#T, #R]); // //# 02: continued
+ typeParameters(genericOfNumAndDouble, [#X, #Y]); // //# 02: continued
+ typeParameters(superOfNumAndDouble, [#T, #R]); // //# 02: continued
+
typeArguments(superDecl, []);
typeArguments(superOfNumAndInt, [reflectClass(num), reflectClass(int)]);
typeArguments(genericDecl, []); // //# 02: continued
diff --git a/tests/lib/mirrors/generic_bounded_test.dart b/tests/lib/mirrors/generic_bounded_test.dart
index 062780e..01301fb 100644
--- a/tests/lib/mirrors/generic_bounded_test.dart
+++ b/tests/lib/mirrors/generic_bounded_test.dart
@@ -49,6 +49,14 @@
Expect.equals(reflectClass(num), tFromSuper.upperBound);
Expect.equals(reflectClass(Object), rFromGeneric.upperBound); // //# 02: continued
+ typeParameters(superDecl, [#T]);
+ typeParameters(superOfInt, [#T]);
+ typeParameters(genericDecl, [#R]); // //# 02: continued
+ typeParameters(superOfR, [#T]); // //# 02: continued
+ typeParameters(genericOfDouble, [#R]); // //# 02: continued
+ typeParameters(superOfDouble, [#T]); // //# 02: continued
+ typeParameters(superOfString, [#T]); // //# 01: continued
+
typeArguments(superDecl, []);
typeArguments(superOfInt, [reflectClass(int)]);
typeArguments(genericDecl, []); // //# 02: continued
diff --git a/tests/lib/mirrors/generic_class_declaration_test.dart b/tests/lib/mirrors/generic_class_declaration_test.dart
index 2a2e4c6..79ebee1 100644
--- a/tests/lib/mirrors/generic_class_declaration_test.dart
+++ b/tests/lib/mirrors/generic_class_declaration_test.dart
@@ -81,4 +81,14 @@
.where((dm) => dm is MethodMirror && dm.isConstructor)
.map(stringify),
'constructors');
+
+ Expect.setEquals(
+ [
+ 'TypeVariable(s(T) in s(A), upperBound = Class(s(Object) in '
+ 's(dart.core), top-level))'
+ ],
+ cm.declarations.values
+ .where((dm) => dm is TypeVariableMirror)
+ .map(stringify),
+ 'type variables');
}
diff --git a/tests/lib/mirrors/generic_f_bounded_test.dart b/tests/lib/mirrors/generic_f_bounded_test.dart
index 408a8a3..5f84435 100644
--- a/tests/lib/mirrors/generic_f_bounded_test.dart
+++ b/tests/lib/mirrors/generic_f_bounded_test.dart
@@ -43,8 +43,13 @@
Expect.equals(magnitudeDecl, magnitudeOfR.originalDeclaration);
Expect.equals(rFromSorter, magnitudeOfR.typeArguments.single);
+ typeParameters(magnitudeDecl, [#T]);
typeParameters(realDecl, []);
+ typeParameters(sorterDecl, [#R]);
typeParameters(realSorterDecl, []);
+ typeParameters(magnitudeOfReal, [#T]);
+ typeParameters(sorterOfReal, [#R]);
+ typeParameters(magnitudeOfR, [#T]);
typeArguments(magnitudeDecl, []);
typeArguments(realDecl, []);
diff --git a/tests/lib/mirrors/generic_interface_test.dart b/tests/lib/mirrors/generic_interface_test.dart
index 061685d..8b38a3b 100644
--- a/tests/lib/mirrors/generic_interface_test.dart
+++ b/tests/lib/mirrors/generic_interface_test.dart
@@ -91,6 +91,21 @@
Expect.equals(reflectClass(Object), xFromGenericMixinApplication.upperBound);
Expect.equals(reflectClass(Object), yFromGenericClass.upperBound);
+ typeParameters(interfaceDecl, [#T]);
+ typeParameters(boundedDecl, [#S]);
+ typeParameters(interfaceOfInt, [#T]);
+ typeParameters(interfaceOfR, [#T]);
+ typeParameters(interfaceOfBool, [#T]);
+ typeParameters(boundedOfInt, [#S]);
+ typeParameters(boundedOfString, [#S]); // //# 01: continued
+ typeParameters(interfaceOfFBounded, [#T]);
+ typeParameters(interfaceOfInt2, [#T]);
+ typeParameters(interfaceOfX, [#T]);
+ typeParameters(interfaceOfDouble, [#T]);
+ typeParameters(interfaceOfInt3, [#T]);
+ typeParameters(interfaceOfY, [#T]);
+ typeParameters(interfaceOfDouble2, [#T]);
+
typeArguments(interfaceDecl, []);
typeArguments(boundedDecl, []);
typeArguments(interfaceOfInt, [reflectClass(int)]);
diff --git a/tests/lib/mirrors/generic_mixin_test.dart b/tests/lib/mirrors/generic_mixin_test.dart
index c52c756..238689b 100644
--- a/tests/lib/mirrors/generic_mixin_test.dart
+++ b/tests/lib/mirrors/generic_mixin_test.dart
@@ -35,6 +35,30 @@
main() {
TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;
+ typeParameters(reflectClass(NonGenericMixinApplication1).mixin, [#M]);
+ typeParameters(reflectClass(NonGenericMixinApplication2).mixin, [#M]);
+ typeParameters(reflectClass(GenericMixinApplication1).mixin, [#M]);
+ typeParameters(reflectClass(GenericMixinApplication2).mixin, [#M]);
+ typeParameters(reflectClass(NonGenericClass1).mixin, []);
+ typeParameters(reflectClass(NonGenericClass2).mixin, []);
+ typeParameters(reflectClass(GenericClass1).mixin, [#C]);
+ typeParameters(reflectClass(GenericClass2).mixin, [#C]);
+ typeParameters(reflectClass(NonGenericClass1).superclass!.mixin, [#M]);
+ typeParameters(reflectClass(NonGenericClass2).superclass!.mixin, [#M]);
+ typeParameters(reflectClass(GenericClass1).superclass!.mixin, [#M]);
+ typeParameters(reflectClass(GenericClass2).superclass!.mixin, [#M]);
+ typeParameters(reflectClass(GenericMultipleMixins).mixin, [#A, #B, #C]);
+ typeParameters(reflectClass(GenericMultipleMixins).superclass!.mixin, [#N]);
+ typeParameters(
+ reflectClass(GenericMultipleMixins).superclass!.superclass!.mixin, [#M]);
+ typeParameters(
+ reflectClass(GenericMultipleMixins)
+ .superclass!
+ .superclass!
+ .superclass!
+ .mixin,
+ [#S]);
+
typeArguments(
reflectClass(NonGenericMixinApplication1).mixin, [dynamicMirror]);
typeArguments(
@@ -69,8 +93,46 @@
.mixin,
[reflectClass(GenericMultipleMixins).typeVariables[0]]);
+ typeParameters(reflect(new NonGenericMixinApplication1()).type.mixin, [#M]);
+ typeParameters(reflect(new NonGenericMixinApplication2()).type.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericMixinApplication1<bool>()).type.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericMixinApplication2<bool>()).type.mixin, [#M]);
typeParameters(reflect(new NonGenericClass1()).type.mixin, []);
typeParameters(reflect(new NonGenericClass2()).type.mixin, []);
+ typeParameters(reflect(new GenericClass1<bool>()).type.mixin, [#C]);
+ typeParameters(reflect(new GenericClass2<bool>()).type.mixin, [#C]);
+ typeParameters(reflect(new NonGenericClass1()).type.superclass!.mixin, [#M]);
+ typeParameters(reflect(new NonGenericClass2()).type.superclass!.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericClass1<bool>()).type.superclass!.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericClass2<bool>()).type.superclass!.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>()).type.mixin,
+ [#A, #B, #C]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>())
+ .type
+ .superclass!
+ .mixin,
+ [#N]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>())
+ .type
+ .superclass!
+ .superclass!
+ .mixin,
+ [#M]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>())
+ .type
+ .superclass!
+ .superclass!
+ .superclass!
+ .mixin,
+ [#S]);
typeArguments(
reflect(new NonGenericMixinApplication1()).type.mixin, [dynamicMirror]);
diff --git a/tests/lib/mirrors/generics_substitution_test.dart b/tests/lib/mirrors/generics_substitution_test.dart
index 6ca6c54..9c2c0ae 100644
--- a/tests/lib/mirrors/generics_substitution_test.dart
+++ b/tests/lib/mirrors/generics_substitution_test.dart
@@ -36,12 +36,18 @@
Symbol t(ClassMirror cm) =>
(cm.declarations[#t] as MethodMirror).returnType.simpleName;
+ Expect.equals(#T, r(genericDecl.superclass!));
Expect.equals(#int, s(genericDecl.superclass!));
+ Expect.equals(#T, t(genericDecl));
Expect.equals(#String, r(genericOfString.superclass!));
Expect.equals(#int, s(genericOfString.superclass!));
Expect.equals(#String, t(genericOfString));
+ Expect.equals(#R, r(superGenericDecl));
+ Expect.equals(#S, s(superGenericDecl));
+
+ Expect.equals(#T, r(superOfTAndInt));
Expect.equals(#int, s(superOfTAndInt));
Expect.equals(#String, r(superOfStringAndInt));
diff --git a/tests/lib/mirrors/generics_test.dart b/tests/lib/mirrors/generics_test.dart
index be1ea8a..ce9d8f0 100644
--- a/tests/lib/mirrors/generics_test.dart
+++ b/tests/lib/mirrors/generics_test.dart
@@ -33,11 +33,15 @@
main() {
// Declarations.
+ typeParameters(reflectClass(A), [#T]);
typeParameters(reflectClass(G), []);
typeParameters(reflectClass(B), []);
typeParameters(reflectClass(C), []);
typeParameters(reflectClass(D), []);
+ typeParameters(reflectClass(E), [#S]);
+ typeParameters(reflectClass(F), [#R]);
typeParameters(reflectClass(G), []);
+ typeParameters(reflectClass(H), [#A, #B, #C]);
typeParameters(reflectClass(I), []);
typeArguments(reflectClass(A), []);
@@ -71,10 +75,14 @@
Expect.equals(reflectClass(I), reflectClass(I).originalDeclaration);
// Instantiations.
+ typeParameters(reflect(new A<num>()).type, [#T]);
typeParameters(reflect(new B()).type, []);
typeParameters(reflect(new C()).type, []);
typeParameters(reflect(new D()).type, []);
+ typeParameters(reflect(new E()).type, [#S]);
+ typeParameters(reflect(new F<num>()).type, [#R]);
typeParameters(reflect(new G()).type, []);
+ typeParameters(reflect(new H()).type, [#A, #B, #C]);
typeParameters(reflect(new I()).type, []);
var numMirror = reflectClass(num);
diff --git a/tests/lib/mirrors/parameter_test.dart b/tests/lib/mirrors/parameter_test.dart
index 2d9418f..2a5eff6 100644
--- a/tests/lib/mirrors/parameter_test.dart
+++ b/tests/lib/mirrors/parameter_test.dart
@@ -180,7 +180,24 @@
MethodMirror fooInC = cm.declarations[#foo] as MethodMirror;
expect('Method(s(foo) in s(C))', fooInC);
+ expect(
+ '[Parameter(s(a) in s(foo),'
+ ' type = Class(s(int) in s(dart.core), top-level)), '
+ 'Parameter(s(b) in s(foo),'
+ ' type = TypeVariable(s(S) in s(Null),'
+ ' upperBound = Class(s(int) in s(dart.core), top-level)))]',
+ fooInC.parameters);
MethodMirror barInC = cm.declarations[#bar] as MethodMirror;
expect('Method(s(bar) in s(C))', barInC);
+ expect(
+ '[Parameter(s(a) in s(bar),'
+ ' type = TypeVariable(s(S) in s(Null),'
+ ' upperBound = Class(s(int) in s(dart.core), top-level))), '
+ 'Parameter(s(b) in s(bar),'
+ ' type = TypeVariable(s(T) in s(Null),'
+ ' upperBound = Class(s(Object) in s(dart.core), top-level))), '
+ 'Parameter(s(c) in s(bar),'
+ ' type = Class(s(num) in s(dart.core), top-level))]',
+ barInC.parameters);
}
diff --git a/tests/lib/mirrors/type_argument_is_type_variable_test.dart b/tests/lib/mirrors/type_argument_is_type_variable_test.dart
index d26d803..2aa7118 100644
--- a/tests/lib/mirrors/type_argument_is_type_variable_test.dart
+++ b/tests/lib/mirrors/type_argument_is_type_variable_test.dart
@@ -27,6 +27,14 @@
TypeVariableMirror ssFromSuperSuper =
superOfSuperOfGeneric.typeVariables.single;
+ Expect.equals(#G, gFromGeneric.simpleName);
+ Expect.equals(#S, sFromSuper.simpleName);
+ Expect.equals(#SS, ssFromSuperSuper.simpleName);
+
+ typeParameters(generic, [#G]);
+ typeParameters(superOfGeneric, [#S]);
+ typeParameters(superOfSuperOfGeneric, [#SS]);
+
typeArguments(generic, []);
typeArguments(superOfGeneric, [gFromGeneric]);
typeArguments(superOfSuperOfGeneric, [gFromGeneric]);
@@ -36,6 +44,10 @@
ClassMirror superOfGenericWithInt = genericWithInt.superclass!;
ClassMirror superOfSuperOfGenericWithInt = superOfGenericWithInt.superclass!;
+ typeParameters(genericWithInt, [#G]);
+ typeParameters(superOfGenericWithInt, [#S]);
+ typeParameters(superOfSuperOfGenericWithInt, [#SS]);
+
typeArguments(genericWithInt, [reflectClass(int)]);
typeArguments(superOfGenericWithInt, [reflectClass(int)]);
typeArguments(superOfSuperOfGenericWithInt, [reflectClass(int)]);
diff --git a/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart b/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart
index 5adbd2d..cf30d1c 100644
--- a/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart
+++ b/tests/lib_2/mirrors/class_mirror_type_variables_expect.dart
@@ -98,9 +98,9 @@
values.forEach((e) {
Expect.equals(true, e is TypeVariableMirror);
});
-
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ Expect.equals(#R, values.elementAt(0).simpleName);
+ Expect.equals(#S, values.elementAt(1).simpleName);
+ Expect.equals(#T, values.elementAt(2).simpleName);
}
void testE(Env env) {
diff --git a/tests/lib_2/mirrors/generic_bounded_by_type_parameter_test.dart b/tests/lib_2/mirrors/generic_bounded_by_type_parameter_test.dart
index c4dbb66..8edb952 100644
--- a/tests/lib_2/mirrors/generic_bounded_by_type_parameter_test.dart
+++ b/tests/lib_2/mirrors/generic_bounded_by_type_parameter_test.dart
@@ -52,8 +52,12 @@
Expect.equals(reflectClass(Object), xFromGeneric.upperBound); // //# 02: continued
Expect.equals(reflectClass(Object), yFromGeneric.upperBound); // //# 02: continued
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ typeParameters(superDecl, [#T, #R]);
+ typeParameters(superOfNumAndInt, [#T, #R]);
+ typeParameters(genericDecl, [#X, #Y]); // //# 02: continued
+ typeParameters(superOfXAndY, [#T, #R]); // //# 02: continued
+ typeParameters(genericOfNumAndDouble, [#X, #Y]); // //# 02: continued
+ typeParameters(superOfNumAndDouble, [#T, #R]); // //# 02: continued
typeArguments(superDecl, []);
typeArguments(superOfNumAndInt, [reflectClass(num), reflectClass(int)]);
diff --git a/tests/lib_2/mirrors/generic_bounded_test.dart b/tests/lib_2/mirrors/generic_bounded_test.dart
index 3cd16fa..4e47e13 100644
--- a/tests/lib_2/mirrors/generic_bounded_test.dart
+++ b/tests/lib_2/mirrors/generic_bounded_test.dart
@@ -51,8 +51,13 @@
Expect.equals(reflectClass(num), tFromSuper.upperBound);
Expect.equals(reflectClass(Object), rFromGeneric.upperBound); // //# 02: continued
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ typeParameters(superDecl, [#T]);
+ typeParameters(superOfInt, [#T]);
+ typeParameters(genericDecl, [#R]); // //# 02: continued
+ typeParameters(superOfR, [#T]); // //# 02: continued
+ typeParameters(genericOfDouble, [#R]); // //# 02: continued
+ typeParameters(superOfDouble, [#T]); // //# 02: continued
+ typeParameters(superOfString, [#T]); // //# 01: continued
typeArguments(superDecl, []);
typeArguments(superOfInt, [reflectClass(int)]);
diff --git a/tests/lib_2/mirrors/generic_class_declaration_test.dart b/tests/lib_2/mirrors/generic_class_declaration_test.dart
index 353b48f..76b1c19 100644
--- a/tests/lib_2/mirrors/generic_class_declaration_test.dart
+++ b/tests/lib_2/mirrors/generic_class_declaration_test.dart
@@ -84,6 +84,13 @@
.map(stringify),
'constructors');
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ Expect.setEquals(
+ [
+ 'TypeVariable(s(T) in s(A), upperBound = Class(s(Object) in '
+ 's(dart.core), top-level))'
+ ],
+ cm.declarations.values
+ .where((dm) => dm is TypeVariableMirror)
+ .map(stringify),
+ 'type variables');
}
diff --git a/tests/lib_2/mirrors/generic_f_bounded_test.dart b/tests/lib_2/mirrors/generic_f_bounded_test.dart
index ccde8ae..ff86355 100644
--- a/tests/lib_2/mirrors/generic_f_bounded_test.dart
+++ b/tests/lib_2/mirrors/generic_f_bounded_test.dart
@@ -45,14 +45,13 @@
Expect.equals(magnitudeDecl, magnitudeOfR.originalDeclaration);
Expect.equals(rFromSorter, magnitudeOfR.typeArguments.single);
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
-
+ typeParameters(magnitudeDecl, [#T]);
typeParameters(realDecl, []);
+ typeParameters(sorterDecl, [#R]);
typeParameters(realSorterDecl, []);
-
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ typeParameters(magnitudeOfReal, [#T]);
+ typeParameters(sorterOfReal, [#R]);
+ typeParameters(magnitudeOfR, [#T]);
typeArguments(magnitudeDecl, []);
typeArguments(realDecl, []);
diff --git a/tests/lib_2/mirrors/generic_interface_test.dart b/tests/lib_2/mirrors/generic_interface_test.dart
index 7480523..a9ad011 100644
--- a/tests/lib_2/mirrors/generic_interface_test.dart
+++ b/tests/lib_2/mirrors/generic_interface_test.dart
@@ -93,8 +93,20 @@
Expect.equals(reflectClass(Object), xFromGenericMixinApplication.upperBound);
Expect.equals(reflectClass(Object), yFromGenericClass.upperBound);
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ typeParameters(interfaceDecl, [#T]);
+ typeParameters(boundedDecl, [#S]);
+ typeParameters(interfaceOfInt, [#T]);
+ typeParameters(interfaceOfR, [#T]);
+ typeParameters(interfaceOfBool, [#T]);
+ typeParameters(boundedOfInt, [#S]);
+ typeParameters(boundedOfString, [#S]); // //# 01: continued
+ typeParameters(interfaceOfFBounded, [#T]);
+ typeParameters(interfaceOfInt2, [#T]);
+ typeParameters(interfaceOfX, [#T]);
+ typeParameters(interfaceOfDouble, [#T]);
+ typeParameters(interfaceOfInt3, [#T]);
+ typeParameters(interfaceOfY, [#T]);
+ typeParameters(interfaceOfDouble2, [#T]);
typeArguments(interfaceDecl, []);
typeArguments(boundedDecl, []);
diff --git a/tests/lib_2/mirrors/generic_mixin_test.dart b/tests/lib_2/mirrors/generic_mixin_test.dart
index ccde91b..7ea8b4e 100644
--- a/tests/lib_2/mirrors/generic_mixin_test.dart
+++ b/tests/lib_2/mirrors/generic_mixin_test.dart
@@ -37,8 +37,29 @@
main() {
TypeMirror dynamicMirror = currentMirrorSystem().dynamicType;
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ typeParameters(reflectClass(NonGenericMixinApplication1).mixin, [#M]);
+ typeParameters(reflectClass(NonGenericMixinApplication2).mixin, [#M]);
+ typeParameters(reflectClass(GenericMixinApplication1).mixin, [#M]);
+ typeParameters(reflectClass(GenericMixinApplication2).mixin, [#M]);
+ typeParameters(reflectClass(NonGenericClass1).mixin, []);
+ typeParameters(reflectClass(NonGenericClass2).mixin, []);
+ typeParameters(reflectClass(GenericClass1).mixin, [#C]);
+ typeParameters(reflectClass(GenericClass2).mixin, [#C]);
+ typeParameters(reflectClass(NonGenericClass1).superclass.mixin, [#M]);
+ typeParameters(reflectClass(NonGenericClass2).superclass.mixin, [#M]);
+ typeParameters(reflectClass(GenericClass1).superclass.mixin, [#M]);
+ typeParameters(reflectClass(GenericClass2).superclass.mixin, [#M]);
+ typeParameters(reflectClass(GenericMultipleMixins).mixin, [#A, #B, #C]);
+ typeParameters(reflectClass(GenericMultipleMixins).superclass.mixin, [#N]);
+ typeParameters(
+ reflectClass(GenericMultipleMixins).superclass.superclass.mixin, [#M]);
+ typeParameters(
+ reflectClass(GenericMultipleMixins)
+ .superclass
+ .superclass
+ .superclass
+ .mixin,
+ [#S]);
typeArguments(
reflectClass(NonGenericMixinApplication1).mixin, [dynamicMirror]);
@@ -73,8 +94,46 @@
.mixin,
[reflectClass(GenericMultipleMixins).typeVariables[0]]);
+ typeParameters(reflect(new NonGenericMixinApplication1()).type.mixin, [#M]);
+ typeParameters(reflect(new NonGenericMixinApplication2()).type.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericMixinApplication1<bool>()).type.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericMixinApplication2<bool>()).type.mixin, [#M]);
typeParameters(reflect(new NonGenericClass1()).type.mixin, []);
typeParameters(reflect(new NonGenericClass2()).type.mixin, []);
+ typeParameters(reflect(new GenericClass1<bool>()).type.mixin, [#C]);
+ typeParameters(reflect(new GenericClass2<bool>()).type.mixin, [#C]);
+ typeParameters(reflect(new NonGenericClass1()).type.superclass.mixin, [#M]);
+ typeParameters(reflect(new NonGenericClass2()).type.superclass.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericClass1<bool>()).type.superclass.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericClass2<bool>()).type.superclass.mixin, [#M]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>()).type.mixin,
+ [#A, #B, #C]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>())
+ .type
+ .superclass
+ .mixin,
+ [#N]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>())
+ .type
+ .superclass
+ .superclass
+ .mixin,
+ [#M]);
+ typeParameters(
+ reflect(new GenericMultipleMixins<bool, String, int>())
+ .type
+ .superclass
+ .superclass
+ .superclass
+ .mixin,
+ [#S]);
typeArguments(
reflect(new NonGenericMixinApplication1()).type.mixin, [dynamicMirror]);
diff --git a/tests/lib_2/mirrors/generics_substitution_test.dart b/tests/lib_2/mirrors/generics_substitution_test.dart
index b07f509..8c89b03 100644
--- a/tests/lib_2/mirrors/generics_substitution_test.dart
+++ b/tests/lib_2/mirrors/generics_substitution_test.dart
@@ -38,15 +38,18 @@
Symbol t(ClassMirror cm) =>
(cm.declarations[#t] as MethodMirror).returnType.simpleName;
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
-
+ Expect.equals(#T, r(genericDecl.superclass));
Expect.equals(#int, s(genericDecl.superclass));
+ Expect.equals(#T, t(genericDecl));
Expect.equals(#String, r(genericOfString.superclass));
Expect.equals(#int, s(genericOfString.superclass));
Expect.equals(#String, t(genericOfString));
+ Expect.equals(#R, r(superGenericDecl));
+ Expect.equals(#S, s(superGenericDecl));
+
+ Expect.equals(#T, r(superOfTAndInt));
Expect.equals(#int, s(superOfTAndInt));
Expect.equals(#String, r(superOfStringAndInt));
diff --git a/tests/lib_2/mirrors/generics_test.dart b/tests/lib_2/mirrors/generics_test.dart
index a9dfb79..c0ec7fa 100644
--- a/tests/lib_2/mirrors/generics_test.dart
+++ b/tests/lib_2/mirrors/generics_test.dart
@@ -35,15 +35,15 @@
main() {
// Declarations.
-
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
-
+ typeParameters(reflectClass(A), [#T]);
typeParameters(reflectClass(G), []);
typeParameters(reflectClass(B), []);
typeParameters(reflectClass(C), []);
typeParameters(reflectClass(D), []);
+ typeParameters(reflectClass(E), [#S]);
+ typeParameters(reflectClass(F), [#R]);
typeParameters(reflectClass(G), []);
+ typeParameters(reflectClass(H), [#A, #B, #C]);
typeParameters(reflectClass(I), []);
typeArguments(reflectClass(A), []);
@@ -77,10 +77,14 @@
Expect.equals(reflectClass(I), reflectClass(I).originalDeclaration);
// Instantiations.
+ typeParameters(reflect(new A<num>()).type, [#T]);
typeParameters(reflect(new B()).type, []);
typeParameters(reflect(new C()).type, []);
typeParameters(reflect(new D()).type, []);
+ typeParameters(reflect(new E()).type, [#S]);
+ typeParameters(reflect(new F<num>()).type, [#R]);
typeParameters(reflect(new G()).type, []);
+ typeParameters(reflect(new H()).type, [#A, #B, #C]);
typeParameters(reflect(new I()).type, []);
var numMirror = reflectClass(num);
diff --git a/tests/lib_2/mirrors/parameter_test.dart b/tests/lib_2/mirrors/parameter_test.dart
index fe1b77a..47095dd 100644
--- a/tests/lib_2/mirrors/parameter_test.dart
+++ b/tests/lib_2/mirrors/parameter_test.dart
@@ -182,11 +182,24 @@
MethodMirror fooInC = cm.declarations[#foo] as MethodMirror;
expect('Method(s(foo) in s(C))', fooInC);
-
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
-
+ expect(
+ '[Parameter(s(a) in s(foo),'
+ ' type = Class(s(int) in s(dart.core), top-level)), '
+ 'Parameter(s(b) in s(foo),'
+ ' type = TypeVariable(s(S) in s(Null),'
+ ' upperBound = Class(s(int) in s(dart.core), top-level)))]',
+ fooInC.parameters);
MethodMirror barInC = cm.declarations[#bar] as MethodMirror;
expect('Method(s(bar) in s(C))', barInC);
+ expect(
+ '[Parameter(s(a) in s(bar),'
+ ' type = TypeVariable(s(S) in s(Null),'
+ ' upperBound = Class(s(int) in s(dart.core), top-level))), '
+ 'Parameter(s(b) in s(bar),'
+ ' type = TypeVariable(s(T) in s(Null),'
+ ' upperBound = Class(s(Object) in s(dart.core), top-level))), '
+ 'Parameter(s(c) in s(bar),'
+ ' type = Class(s(num) in s(dart.core), top-level))]',
+ barInC.parameters);
}
diff --git a/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart b/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart
index 733e575..ca11b17 100644
--- a/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart
+++ b/tests/lib_2/mirrors/type_argument_is_type_variable_test.dart
@@ -29,8 +29,13 @@
TypeVariableMirror ssFromSuperSuper =
superOfSuperOfGeneric.typeVariables.single;
- // Names of type variables are not preserved after type canonicalization
- // and are therefore not compared to expected names.
+ Expect.equals(#G, gFromGeneric.simpleName);
+ Expect.equals(#S, sFromSuper.simpleName);
+ Expect.equals(#SS, ssFromSuperSuper.simpleName);
+
+ typeParameters(generic, [#G]);
+ typeParameters(superOfGeneric, [#S]);
+ typeParameters(superOfSuperOfGeneric, [#SS]);
typeArguments(generic, []);
typeArguments(superOfGeneric, [gFromGeneric]);
@@ -41,6 +46,10 @@
ClassMirror superOfGenericWithInt = genericWithInt.superclass;
ClassMirror superOfSuperOfGenericWithInt = superOfGenericWithInt.superclass;
+ typeParameters(genericWithInt, [#G]);
+ typeParameters(superOfGenericWithInt, [#S]);
+ typeParameters(superOfSuperOfGenericWithInt, [#SS]);
+
typeArguments(genericWithInt, [reflectClass(int)]);
typeArguments(superOfGenericWithInt, [reflectClass(int)]);
typeArguments(superOfSuperOfGenericWithInt, [reflectClass(int)]);
diff --git a/tools/VERSION b/tools/VERSION
index 4be31de..a12e0b3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 81
+PRERELEASE 82
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/pub_integration_test.py b/tools/bots/pub_integration_test.py
index 7264279..cef43cc 100755
--- a/tools/bots/pub_integration_test.py
+++ b/tools/bots/pub_integration_test.py
@@ -44,11 +44,11 @@
pubspec_yaml.write(PUBSPEC)
exit_code = subprocess.call([pub, 'get'], cwd=working_dir, env=env)
- if exit_code is not 0:
+ if exit_code != 0:
return exit_code
exit_code = subprocess.call([pub, 'upgrade'], cwd=working_dir, env=env)
- if exit_code is not 0:
+ if exit_code != 0:
return exit_code
finally:
shutil.rmtree(working_dir)