Version 2.11.0-264.0.dev

Merge commit '6cee3b5fe121039aa4f6bd9b9a9a50c74a2c06bd' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 03a17e0a..b2ba0d5 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2020-10-20T23:33:25.579167",
+  "generated": "2020-10-26T09:42:07.748397",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -151,6 +151,12 @@
       "languageVersion": "2.0"
     },
     {
+      "name": "clock",
+      "rootUri": "../third_party/pkg/clock",
+      "packageUri": "lib/",
+      "languageVersion": "2.10"
+    },
+    {
       "name": "collection",
       "rootUri": "../third_party/pkg/collection",
       "packageUri": "lib/",
@@ -332,7 +338,7 @@
       "name": "intl",
       "rootUri": "../third_party/pkg/intl",
       "packageUri": "lib/",
-      "languageVersion": "2.5"
+      "languageVersion": "2.11"
     },
     {
       "name": "js",
@@ -510,12 +516,6 @@
       "languageVersion": "2.0"
     },
     {
-      "name": "quiver",
-      "rootUri": "../third_party/pkg/quiver",
-      "packageUri": "lib/",
-      "languageVersion": "2.0"
-    },
-    {
       "name": "resource",
       "rootUri": "../third_party/pkg/resource",
       "packageUri": "lib/",
diff --git a/.packages b/.packages
index ebac358..831d0f3 100644
--- a/.packages
+++ b/.packages
@@ -79,7 +79,6 @@
 protobuf:third_party/pkg/protobuf/protobuf/lib
 pub:third_party/pkg/pub/lib
 pub_semver:third_party/pkg/pub_semver/lib
-quiver:third_party/pkg/quiver/lib
 resource:third_party/pkg/resource/lib
 sdk_library_metadata:sdk/lib/_internal/sdk_library_metadata/lib
 shelf:third_party/pkg/shelf/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28b2ea5..c513296 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,8 +4,14 @@
 
 #### `dart:io`
 
-*   `HttpRequest` will now correctly follow HTTP 308 redirects
-    (`HttpStatus.permanentRedirect`).
+* `HttpRequest` will now correctly follow HTTP 308 redirects
+  (`HttpStatus.permanentRedirect`).
+
+#### `dart:isolate`
+
+* Added `debugName` positional parameter to `ReceivePort` and `RawReceivePort`
+  constructors, a name which can be associated with the port and displayed in
+  tooling.
 
 ### Dart VM
 
diff --git a/DEPS b/DEPS
index bab0f51..8d3fa01 100644
--- a/DEPS
+++ b/DEPS
@@ -76,6 +76,7 @@
   "charcode_rev": "bcd8a12c315b7a83390e4865ad847ecd9344cba2",
   "chrome_rev" : "19997",
   "cli_util_rev" : "335ed165887d0ec97c2a09173ebf22dcf56a6c4e",
+  "clock_rev" : "a494269254ba978e7ef8f192c5f7fec3fc05b9d3",
   "collection_rev": "60e6ee2228586980826b07ec1df633bd879f42ea",
   "convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
   "crypto_rev": "f7c48b334b1386bc5ab0f706fbcd6df8496a87fc",
@@ -110,7 +111,7 @@
   "http_throttle_tag" : "1.0.2",
   "icu_rev" : "79326efe26e5440f530963704c3c0ff965b3a4ac",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
-  "intl_tag": "0.16.1",
+  "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "8f189db8f0c299187a0e8fa959dba7e9b0254be5",
   "linter_tag": "0.1.121",
@@ -312,6 +313,8 @@
       Var("dart_git") + "charcode.git" + "@" + Var("charcode_rev"),
   Var("dart_root") + "/third_party/pkg/cli_util":
       Var("dart_git") + "cli_util.git" + "@" + Var("cli_util_rev"),
+  Var("dart_root") + "/third_party/pkg/clock":
+      Var("dart_git") + "clock.git" + "@" + Var("clock_rev"),
   Var("dart_root") + "/third_party/pkg/collection":
       Var("dart_git") + "collection.git" + "@" + Var("collection_rev"),
   Var("dart_root") + "/third_party/pkg/convert":
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index b70e8a4..9e9b8a6 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
 import 'package:path/path.dart' as path;
@@ -204,6 +205,12 @@
   }
 
   /// Validate that `path` entries reference valid paths.
+  ///
+  /// Valid paths are directories that:
+  ///
+  /// 1. exist,
+  /// 2. contain a pubspec.yaml file, and
+  /// 3. `lib` dir
   void _validatePathEntries(ErrorReporter reporter, YamlNode dependency) {
     if (dependency is YamlMap) {
       for (var node in dependency.nodes.entries) {
@@ -214,9 +221,18 @@
           var packageRoot = context.dirname(source.fullName);
           var dependencyPath =
               path.canonicalize(context.join(packageRoot, normalizedPath));
-          if (!provider.getFolder(dependencyPath).exists) {
+          var packageFolder = provider.getFolder(dependencyPath);
+          if (!packageFolder.exists) {
             _reportErrorForNode(reporter, node.value,
                 PubspecWarningCode.PATH_DOES_NOT_EXIST, [pathEntry]);
+          } else {
+            if (!packageFolder
+                .getChild(AnalysisEngine.PUBSPEC_YAML_FILE)
+                .exists) {
+              _reportErrorForNode(reporter, node.value,
+                  PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST, [pathEntry]);
+            }
+            // todo (pq): test for presence of a lib dir.
           }
         }
       }
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
index 5e68c9b..ecc7124 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
@@ -72,6 +72,17 @@
       correction:
           "Try creating the referenced path or using a path that exists.");
 
+  /// A code indicating that a specified path dependency points to a directory
+  /// that does not contain a pubspec.
+  ///
+  /// Parameters:
+  /// 0: the path to the dependency as given in the file.
+  static const PubspecWarningCode PATH_PUBSPEC_DOES_NOT_EXIST = PubspecWarningCode(
+      'PATH_PUBSPEC_DOES_NOT_EXIST',
+      "The directory {0} does not contain a pubspec.",
+      correction:
+          "Try creating a pubspec in the referenced directory or using a path that has a pubspec.");
+
   /// A code indicating that a package listed as a dev dependency is also listed
   /// as a normal dependency.
   ///
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index 161046c..32f7cf3 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -49,7 +49,7 @@
     validator = PubspecValidator(resourceProvider, source);
   }
 
-  test_assetDirectoryDoesExists_noError() {
+  test_assetDirectoryDoesExist_noError() {
     newFolder('/sample/assets/logos');
     assertNoErrors('''
 name: sample
@@ -208,17 +208,21 @@
 ''');
   }
 
-  test_dependencyPathDoesNotExist_path_error() {
+  test_dependencyPath_pubspecDoesNotExist() {
+    newFolder('/foo');
     assertErrors('''
 name: sample
 dependencies:
   foo:
-    path: does/not/exist
-''', [PubspecWarningCode.PATH_DOES_NOT_EXIST]);
+    path: /foo
+''', [PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST]);
   }
 
-  test_dependencyPathExists() {
+  test_dependencyPath_pubspecExists() {
     newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
     assertNoErrors('''
 name: sample
 dependencies:
@@ -227,8 +231,24 @@
 ''');
   }
 
-  test_dependencyPathRelativeExists() {
+  test_dependencyPath_valid_absolute() {
     newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+    assertNoErrors('''
+name: sample
+dependencies:
+  foo:
+    path: /foo
+''');
+  }
+
+  test_dependencyPath_valid_relative() {
+    newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
     assertNoErrors('''
 name: sample
 dependencies:
@@ -237,6 +257,15 @@
 ''');
   }
 
+  test_dependencyPathDoesNotExist_path_error() {
+    assertErrors('''
+name: sample
+dependencies:
+  foo:
+    path: does/not/exist
+''', [PubspecWarningCode.PATH_DOES_NOT_EXIST]);
+  }
+
   test_devDependenciesField_empty() {
     assertNoErrors('''
 name: sample
@@ -270,6 +299,9 @@
 
   test_devDependencyPathExists() {
     newFolder('/foo');
+    newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
     assertNoErrors('''
 name: sample
 dev_dependencies:
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 7fb1c29..4a8c027 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -6,8 +6,9 @@
 
 environment:
   sdk: "^2.7.0"
+
 dependencies:
-  analyzer: ^0.37.0
+  analyzer: any
   args: '>=0.13.0 <2.0.0'
   bazel_worker: ^0.1.0
   collection: ^1.14.1
@@ -17,8 +18,13 @@
   path: any
   pub_semver: ^1.4.2
   yaml: ^2.1.2
+
 dev_dependencies:
   pedantic: ^1.9.0
   protobuf: ^0.13.0
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
+
+dependency_overrides:
+  analyzer:
+    path: ../analyzer
diff --git a/pkg/async_helper/pubspec.yaml b/pkg/async_helper/pubspec.yaml
index 817b5fe..202f86b 100644
--- a/pkg/async_helper/pubspec.yaml
+++ b/pkg/async_helper/pubspec.yaml
@@ -1,11 +1,17 @@
 name: async_helper
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
+
 description: >-
  Async_helper is used for asynchronous tests that do not want to
  make use of the Dart unittest library - for example, the core
  language tests.
  Third parties are discouraged from using this, and should use
  the facilities provided in package:test.
+
+environment:
+  sdk: '>=2.0.0'
+
 dependencies:
-  expect: any
+  expect:
+    path: ../expect
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index 7bef2ba..b741a4b 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -9,7 +9,11 @@
   sdk: '>=2.1.0 <3.0.0'
 
 dependencies:
-  front_end: ^0.1.0
+  front_end: any
 
 dev_dependencies:
   test: any
+
+dependency_overrides:
+  front_end:
+    path: ../front_end
diff --git a/pkg/dartfix/pubspec.yaml b/pkg/dartfix/pubspec.yaml
index 8f39796..8b764a6 100644
--- a/pkg/dartfix/pubspec.yaml
+++ b/pkg/dartfix/pubspec.yaml
@@ -21,6 +21,6 @@
   pub_semver: ^1.4.4
 
 dev_dependencies:
-  analyzer: ^0.39.0
+  analyzer: ^0.40.0
   pedantic: ^1.8.0
   test: ^1.14.2
diff --git a/pkg/expect/pubspec.yaml b/pkg/expect/pubspec.yaml
index 60226bb..b1b5bd1 100644
--- a/pkg/expect/pubspec.yaml
+++ b/pkg/expect/pubspec.yaml
@@ -1,11 +1,15 @@
 name: expect
 # This package is not intended for consumption on pub.dev. DO NOT publish.
 publish_to: none
-description: >
+description: >-
  Expect is used for tests that do not want to make use of the
  Dart unit test library - for example, the core language tests.
  Third parties are discouraged from using this, and should use
  the expect() function in the unit test library instead for
  test assertions.
+
+environment:
+  sdk: '>=2.0.0'
+
 dependencies:
   meta: any
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index f81b308..3f3905b 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -7,15 +7,14 @@
 
 environment:
   sdk: '>=2.2.2 <3.0.0'
+
 dependencies:
-  _fe_analyzer_shared:
-    path: ../_fe_analyzer_shared/
-  kernel:
-    path: ../kernel/
-  package_config:
-    path: ../../third_party/pkg_tested/package_config/
+  _fe_analyzer_shared: any
+  kernel: any
+  package_config: any
+
 dev_dependencies:
-  analyzer: 0.39.1
+  analyzer: any
   args: '>=0.13.0 <2.0.0'
   async_helper:
     path: ../async_helper
@@ -40,3 +39,13 @@
     path: ../vm_service
   web_socket_channel: ^1.0.4
   yaml: '^2.1.12'
+
+dependency_overrides:
+  _fe_analyzer_shared:
+    path: ../_fe_analyzer_shared/
+  analyzer:
+    path: ../analyzer
+  kernel:
+    path: ../kernel/
+  package_config:
+    path: ../../third_party/pkg_tested/package_config/
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 26d0bc7..9a2d487 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -11,7 +11,7 @@
   build_integration:
     path: ../build_integration
   crypto: any
-  front_end: ^0.1.6
+  front_end: any
   kernel: ^0.3.6
   meta: any
   package_config: any
@@ -23,3 +23,7 @@
   path: any
   test: any
   web_socket_channel: any
+
+dependency_overrides:
+  front_end:
+    path: ../front_end
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 298e92e..588b90c 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -642,7 +642,7 @@
           "}\n");
 
       var fileBar = new File('${mytest.path}/bar.dart')..createSync();
-      fileBar.writeAsStringSync("class A<T> { int _a; }\n");
+      fileBar.writeAsStringSync("class A<T> { int _a = 0; }\n");
 
       var fileBaz = new File('${mytest.path}/baz.dart')..createSync();
       fileBaz.writeAsStringSync("import 'dart:isolate';\n"
@@ -703,7 +703,7 @@
       expect(reloadResult['details']['loadedLibraryCount'], equals(0));
 
       // Introduce a change that force VM to reject the change.
-      fileBar.writeAsStringSync("class A<T,U> { int _a; }\n");
+      fileBar.writeAsStringSync("class A<T,U> { int _a = 0; }\n");
       compiler.invalidate(fileBar.uri);
       component = await compiler.compile();
       await _writeProgramToFile(component, outputFile);
@@ -711,7 +711,7 @@
       expect(reloadResult['success'], isFalse);
 
       // Fix a change so VM is happy to accept the change.
-      fileBar.writeAsStringSync("class A<T> { int _a; hi() => _a; }\n");
+      fileBar.writeAsStringSync("class A<T> { int _a = 0; hi() => _a; }\n");
       compiler.invalidate(fileBar.uri);
       component = await compiler.compile();
       await _writeProgramToFile(component, outputFile);
@@ -1057,7 +1057,7 @@
         import 'dart:async';
         import 'helper.dart';
         main() {
-          int latestReloadTime;
+          int latestReloadTime = -1;
           int noChangeCount = 0;
           int numChanges = 0;
           new Timer.periodic(new Duration(milliseconds: 5), (timer) async {
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index ca07f4f..5efe660 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,4 +1,15 @@
 # Changelog
+## 5.4.0
+- Added support for `dart:io` extensions version 1.5.
+- Added combination getter/setter `socketProfilingEnabled`.
+- Deprecated `startSocketProfiling` and `pauseSocketProfiling`.
+
+## 5.4.0
+- Update to version `3.41.0` of the spec.
+- Added `PortList` class.
+- Added `getPorts` RPC.
+- Added optional properties `portId`, `allocationLocation`, and `debugName` to
+  `InstanceRef` and `Instance`.
 
 ## 5.3.0
 - Added support for `dart:io` extensions version 1.4.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index e2ae6d1..617bd7c 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -192,6 +192,7 @@
   if (obj == "MirrorReference") return obj;
   if (obj == "Null") return obj;
   if (obj == "PlainInstance") return obj;
+  if (obj == "ReceivePort") return obj;
   if (obj == "RegExp") return obj;
   if (obj == "StackTrace") return obj;
   if (obj == "String") return obj;
@@ -912,6 +913,13 @@
   return obj;
 }
 
+vms.PortList assertPortList(vms.PortList obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertListOfInstanceRef(obj.ports);
+  return obj;
+}
+
 vms.ProfileFunction assertProfileFunction(vms.ProfileFunction obj) {
   assertNotNull(obj);
   assertString(obj.kind);
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index ae6691f..8803d45 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -25,6 +25,7 @@
 src/org/dartlang/vm/service/consumer/InvokeConsumer.java
 src/org/dartlang/vm/service/consumer/KillConsumer.java
 src/org/dartlang/vm/service/consumer/PauseConsumer.java
+src/org/dartlang/vm/service/consumer/PortListConsumer.java
 src/org/dartlang/vm/service/consumer/ProcessMemoryUsageConsumer.java
 src/org/dartlang/vm/service/consumer/ProtocolListConsumer.java
 src/org/dartlang/vm/service/consumer/ReloadSourcesConsumer.java
@@ -95,6 +96,7 @@
 src/org/dartlang/vm/service/element/NullRef.java
 src/org/dartlang/vm/service/element/Obj.java
 src/org/dartlang/vm/service/element/ObjRef.java
+src/org/dartlang/vm/service/element/PortList.java
 src/org/dartlang/vm/service/element/ProcessMemoryItem.java
 src/org/dartlang/vm/service/element/ProcessMemoryUsage.java
 src/org/dartlang/vm/service/element/ProfileFunction.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index d0564a6..ae41aeb 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.40
+version=3.41
diff --git a/pkg/vm_service/lib/src/dart_io_extensions.dart b/pkg/vm_service/lib/src/dart_io_extensions.dart
index 886b947..6dbca6f4 100644
--- a/pkg/vm_service/lib/src/dart_io_extensions.dart
+++ b/pkg/vm_service/lib/src/dart_io_extensions.dart
@@ -7,6 +7,7 @@
 import 'dart:collection';
 
 import 'package:meta/meta.dart';
+import 'package:vm_service/vm_service.dart';
 
 import 'vm_service.dart';
 
@@ -28,14 +29,29 @@
 
   /// Start profiling new socket connections. Statistics for sockets created
   /// before profiling was enabled will not be recorded.
+  @Deprecated('Use socketProfilingEnabled instead')
   Future<Success> startSocketProfiling(String isolateId) =>
       _callHelper('ext.dart.io.startSocketProfiling', isolateId);
 
   /// Pause recording socket statistics. [clearSocketProfile] must be called in
   /// order for collected statistics to be cleared.
+  @Deprecated('Use socketProfilingEnabled instead')
   Future<Success> pauseSocketProfiling(String isolateId) =>
       _callHelper('ext.dart.io.pauseSocketProfiling', isolateId);
 
+  /// The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler
+  /// and query its current state. If `enabled` is provided, the profiler state will
+  /// be updated to reflect the value of `enabled`.
+  ///
+  /// If the state of the socket profiler is changed, a `SocketProfilingStateChange`
+  /// event will be sent on the `Extension` stream.
+  Future<SocketProfilingState> socketProfilingEnabled(String isolateId,
+      [bool enabled]) async {
+    return _callHelper('ext.dart.io.socketProfilingEnabled', isolateId, args: {
+      if (enabled != null) 'enabled': enabled,
+    });
+  }
+
   /// Removes all statistics associated with prior and current sockets.
   Future<Success> clearSocketProfile(String isolateId) =>
       _callHelper('ext.dart.io.clearSocketProfile', isolateId);
@@ -148,6 +164,7 @@
     addTypeFactory('@SpawnedProcess', SpawnedProcessRef.parse);
     addTypeFactory('SocketProfile', SocketProfile.parse);
     addTypeFactory('SocketStatistic', SocketStatistic.parse);
+    addTypeFactory('SocketProfilingState', SocketProfilingState.parse);
     _factoriesRegistered = true;
   }
 }
@@ -219,25 +236,43 @@
   }
 }
 
-/// A [HttpTimelineLoggingState] provides information about the current state of HTTP
-/// request logging for a given isolate.
-class HttpTimelineLoggingState extends Response {
-  static HttpTimelineLoggingState parse(Map json) =>
-      json == null ? null : HttpTimelineLoggingState._fromJson(json);
-
-  HttpTimelineLoggingState({@required this.enabled});
+/// A [Response] containing the enabled state of a service extension.
+abstract class State extends Response {
+  State({@required this.enabled});
 
   // TODO(bkonyi): make this part of the vm_service.dart library so we can
   // call super._fromJson.
-  HttpTimelineLoggingState._fromJson(Map<String, dynamic> json)
-      : enabled = json['enabled'] {
+  State._fromJson(Map<String, dynamic> json) : enabled = json['enabled'] {
     type = json['type'];
   }
 
-  /// Whether or not HttpClient.enableTimelineLogging is set to true for a given isolate.
   final bool enabled;
 }
 
+/// A [HttpTimelineLoggingState] provides information about the current state of HTTP
+/// request logging for a given isolate.
+class HttpTimelineLoggingState extends State {
+  static HttpTimelineLoggingState parse(Map json) =>
+      json == null ? null : HttpTimelineLoggingState._fromJson(json);
+
+  HttpTimelineLoggingState({@required bool enabled}) : super(enabled: enabled);
+
+  HttpTimelineLoggingState._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json);
+}
+
+/// A [SocketProfilingState] provides information about the current state of
+/// socket profiling for a given isolate.
+class SocketProfilingState extends State {
+  static SocketProfilingState parse(Map json) =>
+      json == null ? null : SocketProfilingState._fromJson(json);
+
+  SocketProfilingState({@required bool enabled}) : super(enabled: enabled);
+
+  SocketProfilingState._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json);
+}
+
 /// A [SpawnedProcessRef] contains identifying information about a spawned process.
 class SpawnedProcessRef {
   static SpawnedProcessRef parse(Map json) =>
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index fd20c5b..4dfc752 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.40.0';
+const String vmServiceVersion = '3.41.0';
 
 /// @optional
 const String optional = 'optional';
@@ -157,6 +157,7 @@
   'Null': NullVal.parse,
   '@Object': ObjRef.parse,
   'Object': Obj.parse,
+  'PortList': PortList.parse,
   'ProfileFunction': ProfileFunction.parse,
   'ProtocolList': ProtocolList.parse,
   'Protocol': Protocol.parse,
@@ -209,6 +210,7 @@
   'getIsolateGroupMemoryUsage': const ['MemoryUsage'],
   'getScripts': const ['ScriptList'],
   'getObject': const ['Obj'],
+  'getPorts': const ['PortList'],
   'getRetainingPath': const ['RetainingPath'],
   'getProcessMemoryUsage': const ['ProcessMemoryUsage'],
   'getStack': const ['Stack'],
@@ -688,6 +690,12 @@
     int count,
   });
 
+  /// The `getPorts` RPC is used to retrieve the list of `ReceivePort` instances
+  /// for a given isolate.
+  ///
+  /// See [PortList].
+  Future<PortList> getPorts(String isolateId);
+
   /// The `getRetainingPath` RPC is used to lookup a path from an object
   /// specified by `targetId` to a GC root (i.e., the object which is preventing
   /// this object from being garbage collected).
@@ -1318,6 +1326,11 @@
             count: params['count'],
           );
           break;
+        case 'getPorts':
+          response = await _serviceImplementation.getPorts(
+            params['isolateId'],
+          );
+          break;
         case 'getRetainingPath':
           response = await _serviceImplementation.getRetainingPath(
             params['isolateId'],
@@ -1771,6 +1784,10 @@
       });
 
   @override
+  Future<PortList> getPorts(String isolateId) =>
+      _call('getPorts', {'isolateId': isolateId});
+
+  @override
   Future<RetainingPath> getRetainingPath(
           String isolateId, String targetId, int limit) =>
       _call('getRetainingPath',
@@ -2432,6 +2449,9 @@
 
   /// An instance of the Dart class BoundedType.
   static const String kBoundedType = 'BoundedType';
+
+  /// An instance of the Dart class ReceivePort.
+  static const String kReceivePort = 'ReceivePort';
 }
 
 /// A `SentinelKind` is used to distinguish different kinds of `Sentinel`
@@ -4239,6 +4259,27 @@
   @optional
   ContextRef closureContext;
 
+  /// The port ID for a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  int portId;
+
+  /// The stack trace associated with the allocation of a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  InstanceRef allocationLocation;
+
+  /// A name associated with a ReceivePort used for debugging purposes.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  String debugName;
+
   InstanceRef({
     @required this.kind,
     @required this.classRef,
@@ -4252,6 +4293,9 @@
     this.pattern,
     this.closureFunction,
     this.closureContext,
+    this.portId,
+    this.allocationLocation,
+    this.debugName,
   }) : super(id: id);
 
   InstanceRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4269,6 +4313,10 @@
         createServiceObject(json['closureFunction'], const ['FuncRef']);
     closureContext =
         createServiceObject(json['closureContext'], const ['ContextRef']);
+    portId = json['portId'];
+    allocationLocation =
+        createServiceObject(json['allocationLocation'], const ['InstanceRef']);
+    debugName = json['debugName'];
   }
 
   @override
@@ -4288,6 +4336,9 @@
     _setIfNotNull(json, 'pattern', pattern?.toJson());
     _setIfNotNull(json, 'closureFunction', closureFunction?.toJson());
     _setIfNotNull(json, 'closureContext', closureContext?.toJson());
+    _setIfNotNull(json, 'portId', portId);
+    _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
+    _setIfNotNull(json, 'debugName', debugName);
     return json;
   }
 
@@ -4318,6 +4369,7 @@
   ///  - Double (suitable for passing to Double.parse())
   ///  - Int (suitable for passing to int.parse())
   ///  - String (value may be truncated)
+  ///  - StackTrace
   @optional
   String valueAsString;
 
@@ -4554,6 +4606,27 @@
   @optional
   InstanceRef bound;
 
+  /// The port ID for a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  int portId;
+
+  /// The stack trace associated with the allocation of a ReceivePort.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  InstanceRef allocationLocation;
+
+  /// A name associated with a ReceivePort used for debugging purposes.
+  ///
+  /// Provided for instance kinds:
+  ///  - ReceivePort
+  @optional
+  String debugName;
+
   Instance({
     @required this.kind,
     @required this.classRef,
@@ -4582,6 +4655,9 @@
     this.parameterIndex,
     this.targetType,
     this.bound,
+    this.portId,
+    this.allocationLocation,
+    this.debugName,
   }) : super(id: id);
 
   Instance._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4627,6 +4703,10 @@
     parameterIndex = json['parameterIndex'];
     targetType = createServiceObject(json['targetType'], const ['InstanceRef']);
     bound = createServiceObject(json['bound'], const ['InstanceRef']);
+    portId = json['portId'];
+    allocationLocation =
+        createServiceObject(json['allocationLocation'], const ['InstanceRef']);
+    debugName = json['debugName'];
   }
 
   @override
@@ -4663,6 +4743,9 @@
     _setIfNotNull(json, 'parameterIndex', parameterIndex);
     _setIfNotNull(json, 'targetType', targetType?.toJson());
     _setIfNotNull(json, 'bound', bound?.toJson());
+    _setIfNotNull(json, 'portId', portId);
+    _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
+    _setIfNotNull(json, 'debugName', debugName);
     return json;
   }
 
@@ -5743,6 +5826,37 @@
   String toString() => '[Obj type: ${type}, id: ${id}]';
 }
 
+/// A `PortList` contains a list of ports associated with some isolate.
+///
+/// See [getPort].
+class PortList extends Response {
+  static PortList parse(Map<String, dynamic> json) =>
+      json == null ? null : PortList._fromJson(json);
+
+  List<InstanceRef> ports;
+
+  PortList({
+    @required this.ports,
+  });
+
+  PortList._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    ports = List<InstanceRef>.from(
+        createServiceObject(json['ports'], const ['InstanceRef']) ?? []);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'PortList';
+    json.addAll({
+      'ports': ports.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[PortList type: ${type}, ports: ${ports}]';
+}
+
 /// A `ProfileFunction` contains profiling information about a Dart or native
 /// function.
 ///
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 690f8b6..0c77a68 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
 description: >-
   A library to communicate with a service implementing the Dart VM
   service protocol.
-version: 5.3.0
+version: 5.4.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
diff --git a/pkg/vm_service/test/network_profiling_test.dart b/pkg/vm_service/test/network_profiling_test.dart
index ecbad0d..bdb22a1 100644
--- a/pkg/vm_service/test/network_profiling_test.dart
+++ b/pkg/vm_service/test/network_profiling_test.dart
@@ -19,8 +19,36 @@
 const String kGetVersionRPC = 'ext.dart.io.getVersion';
 const String kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
 const String kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
+const String kSocketProfilingEnabledRPC = 'ext.dart.io.socketProfilingEnabled';
 const String localhost = '127.0.0.1';
 
+Future<void> waitForStreamEvent(
+    VmService service, IsolateRef isolateRef, bool state,
+    {bool useSetter = true}) async {
+  final completer = Completer<void>();
+  final isolateId = isolateRef.id;
+  StreamSubscription sub;
+  sub = service.onExtensionEvent.listen((event) {
+    expect(event.extensionKind, 'SocketProfilingStateChange');
+    expect(event.extensionData.data['isolateId'], isolateRef.id);
+    expect(event.extensionData.data['enabled'], state);
+    sub.cancel();
+    completer.complete();
+  });
+  await service.streamListen(EventStreams.kExtension);
+
+  if (useSetter) {
+    // ignore: deprecated_member_use_from_same_package
+    state
+        ? await service.startSocketProfiling(isolateId)
+        : await service.pauseSocketProfiling(isolateId);
+  } else {
+    await service.socketProfilingEnabled(isolateId, state);
+  }
+  await completer.future;
+  await service.streamCancel(EventStreams.kExtension);
+}
+
 Future<void> setup() async {}
 
 Future<void> socketTest() async {
@@ -63,6 +91,7 @@
     expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
     expect(isolate.extensionRPCs.contains(kStartSocketProfilingRPC), isTrue);
     expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
+    expect(isolate.extensionRPCs.contains(kSocketProfilingEnabledRPC), isTrue);
   },
 
   // Test getSocketProfiler
@@ -70,16 +99,34 @@
     final socketProfile = await service.getSocketProfile(isolateRef.id);
     expect(socketProfile.sockets.isEmpty, isTrue);
   },
-  // Exercise all methods naively
+  // Exercise methods naively
   (VmService service, IsolateRef isolateRef) async {
     final version = await service.getDartIOVersion(isolateRef.id);
     expect(version.major >= 1, true);
     expect(version.minor >= 0, true);
-    await service.startSocketProfiling(isolateRef.id);
-    await service.pauseSocketProfiling(isolateRef.id);
     await service.clearSocketProfile(isolateRef.id);
     await service.getSocketProfile(isolateRef.id);
   },
+  (VmService service, IsolateRef isolateRef) async {
+    final initial =
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+    await waitForStreamEvent(service, isolateRef, !initial);
+    expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
+        !initial);
+    await waitForStreamEvent(service, isolateRef, initial);
+    expect(
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+  },
+  (VmService service, IsolateRef isolateRef) async {
+    final initial =
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+    await waitForStreamEvent(service, isolateRef, !initial, useSetter: false);
+    expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
+        !initial);
+    await waitForStreamEvent(service, isolateRef, initial, useSetter: false);
+    expect(
+        (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+  }
   // TODO(bkonyi): fully port observatory test for socket profiling.
 ];
 
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index 7113f26..1ea506c 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -71,27 +71,4 @@
   return Smi::New(receiver.ComputeHash());
 }
 
-DEFINE_NATIVE_ENTRY(Closure_clone, 0, 1) {
-  const Closure& receiver =
-      Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
-  const TypeArguments& instantiator_type_arguments =
-      TypeArguments::Handle(zone, receiver.instantiator_type_arguments());
-  const TypeArguments& function_type_arguments =
-      TypeArguments::Handle(zone, receiver.function_type_arguments());
-  const Function& function = Function::Handle(zone, receiver.function());
-  const Context& context = Context::Handle(zone, receiver.context());
-  Context& cloned_context = Context::Handle(zone);
-  if (!context.IsNull()) {
-    cloned_context = Context::New(context.num_variables());
-    cloned_context.set_parent(Context::Handle(zone, context.parent()));
-    Object& instance = Object::Handle(zone);
-    for (int i = 0; i < context.num_variables(); i++) {
-      instance = context.At(i);
-      cloned_context.SetAt(i, instance);
-    }
-  }
-  return Closure::New(instantiator_type_arguments, function_type_arguments,
-                      function, cloned_context);
-}
-
 }  // namespace dart
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 4b381cb..905cb26 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -51,11 +51,12 @@
   return Smi::New(hash);
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 1) {
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 2) {
   ASSERT(
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
+  GET_NON_NULL_NATIVE_ARGUMENT(String, debug_name, arguments->NativeArgAt(1));
   Dart_Port port_id = PortMap::CreatePort(isolate->message_handler());
-  return ReceivePort::New(port_id, false /* not control port */);
+  return ReceivePort::New(port_id, debug_name, false /* not control port */);
 }
 
 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 0, 1) {
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index c2d8657..4b2afb9 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -224,4 +224,12 @@
   return stacktrace;
 }
 
+bool HasStack() {
+  Thread* thread = Thread::Current();
+  StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
+                            StackFrameIterator::kNoCrossThreadIteration);
+  StackFrame* frame = frames.NextFrame();
+  return frame != nullptr;
+}
+
 }  // namespace dart
diff --git a/runtime/lib/stacktrace.h b/runtime/lib/stacktrace.h
index 9c8abae..a804d62 100644
--- a/runtime/lib/stacktrace.h
+++ b/runtime/lib/stacktrace.h
@@ -21,6 +21,9 @@
 // Creates a StackTrace object to be attached to an exception.
 StackTracePtr GetStackTraceForException();
 
+// Returns false if there is no Dart stack available.
+bool HasStack();
+
 }  // namespace dart
 
 #endif  // RUNTIME_LIB_STACKTRACE_H_
diff --git a/runtime/observatory/lib/src/models/objects/instance.dart b/runtime/observatory/lib/src/models/objects/instance.dart
index ab8d6d6..a0400c5 100644
--- a/runtime/observatory/lib/src/models/objects/instance.dart
+++ b/runtime/observatory/lib/src/models/objects/instance.dart
@@ -120,6 +120,9 @@
 
   /// An instance of the Dart class TypeRef.
   typeRef,
+
+  /// An instance of the Dart class RawReceivePort
+  receivePort,
 }
 
 bool isTypedData(InstanceKind? kind) {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 7215ef7..8352f38 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -2781,6 +2781,8 @@
       return M.InstanceKind.typeParameter;
     case 'TypeRef':
       return M.InstanceKind.typeRef;
+    case 'ReceivePort':
+      return M.InstanceKind.receivePort;
   }
   var message = 'Unrecognized instance kind: $s';
   Logger.root.severe(message);
diff --git a/runtime/observatory/tests/service/get_ports_public_rpc_test.dart b/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
new file mode 100644
index 0000000..cc511f7
--- /dev/null
+++ b/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate' hide Isolate;
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+
+import 'test_helper.dart';
+
+var port1;
+var port2;
+var port3;
+
+void warmup() {
+  port1 = RawReceivePort(null, 'port1');
+  port2 = RawReceivePort((_) {});
+  port3 = RawReceivePort((_) {}, 'port3');
+  port3.close();
+  RawReceivePort((_) {}, 'port4');
+}
+
+int countNameMatches(ports, name) {
+  var matches = 0;
+  for (var port in ports) {
+    if (port['debugName'] == name) {
+      matches++;
+    }
+  }
+  return matches;
+}
+
+final tests = <IsolateTest>[
+  (Isolate isolate) async {
+    dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
+    expect(result['type'], 'PortList');
+    expect(result['ports'], isList);
+    final ports = result['ports'];
+    // There are at least three ports: the three created in warm up that
+    // weren't closed. Some OSes will have other ports open but we do not try
+    // and test for these.
+    expect(ports.length, greaterThanOrEqualTo(3));
+    expect(countNameMatches(ports, 'port1'), 1);
+    expect(countNameMatches(ports, 'port3'), 0);
+    expect(countNameMatches(ports, 'port4'), 1);
+    expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
+  },
+];
+
+main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 8b56393..c8b0244 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -9,12 +9,12 @@
 
 var tests = <VMTest>[
   (VM vm) async {
-    var result = await vm.invokeRpcNoUpgrade('getVersion', {});
-    expect(result['type'], equals('Version'));
-    expect(result['major'], equals(3));
-    expect(result['minor'], equals(40));
-    expect(result['_privateMajor'], equals(0));
-    expect(result['_privateMinor'], equals(0));
+    final result = await vm.invokeRpcNoUpgrade('getVersion', {});
+    expect(result['type'], 'Version');
+    expect(result['major'], 3);
+    expect(result['minor'], 41);
+    expect(result['_privateMajor'], 0);
+    expect(result['_privateMinor'], 0);
   },
 ];
 
diff --git a/runtime/observatory_2/lib/src/models/objects/instance.dart b/runtime/observatory_2/lib/src/models/objects/instance.dart
index 66965e9..e52cdd7 100644
--- a/runtime/observatory_2/lib/src/models/objects/instance.dart
+++ b/runtime/observatory_2/lib/src/models/objects/instance.dart
@@ -120,6 +120,9 @@
 
   /// An instance of the Dart class TypeRef.
   typeRef,
+
+  /// An instance of the Dart class RawReceivePort
+  receivePort,
 }
 
 bool isTypedData(InstanceKind kind) {
diff --git a/runtime/observatory_2/lib/src/service/object.dart b/runtime/observatory_2/lib/src/service/object.dart
index 046513d..9b6ac2d 100644
--- a/runtime/observatory_2/lib/src/service/object.dart
+++ b/runtime/observatory_2/lib/src/service/object.dart
@@ -2790,6 +2790,8 @@
       return M.InstanceKind.typeParameter;
     case 'TypeRef':
       return M.InstanceKind.typeRef;
+    case 'ReceivePort':
+      return M.InstanceKind.receivePort;
   }
   var message = 'Unrecognized instance kind: $s';
   Logger.root.severe(message);
diff --git a/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
new file mode 100644
index 0000000..179823f
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate' hide Isolate;
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+
+import 'test_helper.dart';
+
+var port1;
+var port2;
+var port3;
+
+void warmup() {
+  port1 = RawReceivePort(null, 'port1');
+  port2 = RawReceivePort((_) {});
+  port3 = RawReceivePort((_) {}, 'port3');
+  port3.close();
+  RawReceivePort((_) {}, 'port4');
+}
+
+int countNameMatches(ports, name) {
+  var matches = 0;
+  for (var port in ports) {
+    if (port['debugName'] == name) {
+      matches++;
+    }
+  }
+  return matches;
+}
+
+final tests = <IsolateTest>[
+  (Isolate isolate) async {
+    dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
+    expect(result['type'], 'PortList');
+    expect(result['ports'], isList);
+    final ports = result['ports'];
+    // There are at least three ports: the three created in warm up that
+    // weren't closed. Some OSes will have other ports open but we do not try
+    // and test for these.
+    expect(ports.length, greaterThanOrEqualTo(3));
+    expect(countNameMatches(ports, 'port1'), 1);
+    expect(countNameMatches(ports, 'port3'), 0);
+    expect(countNameMatches(ports, 'port4'), 1);
+    expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
+  },
+];
+
+main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index d5450e5..df37cb9 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(40));
+    expect(result['minor'], equals(41));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index a9e7f65..8b15f7b 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -27,7 +27,6 @@
   V(Function_apply, 2)                                                         \
   V(Closure_equals, 2)                                                         \
   V(Closure_computeHash, 1)                                                    \
-  V(Closure_clone, 1)                                                          \
   V(AbstractType_toString, 1)                                                  \
   V(Type_getHashCode, 1)                                                       \
   V(Type_equality, 2)                                                          \
@@ -55,7 +54,7 @@
   V(CapabilityImpl_factory, 1)                                                 \
   V(CapabilityImpl_equals, 2)                                                  \
   V(CapabilityImpl_get_hashcode, 1)                                            \
-  V(RawReceivePortImpl_factory, 1)                                             \
+  V(RawReceivePortImpl_factory, 2)                                             \
   V(RawReceivePortImpl_get_id, 1)                                              \
   V(RawReceivePortImpl_get_sendport, 1)                                        \
   V(RawReceivePortImpl_closeInternal, 1)                                       \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 475ad93..7af21bf 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -847,6 +847,7 @@
         type_param.set_default_argument(finalized_type);
       }
     }
+    function.UpdateCachedDefaultTypeArguments(Thread::Current());
   }
   // Finalize result type.
   type = function.result_type();
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 07e9e02..e32e798 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -289,7 +289,7 @@
 
 class ClassDeserializationCluster : public DeserializationCluster {
  public:
-  ClassDeserializationCluster() {}
+  ClassDeserializationCluster() : DeserializationCluster("Class") {}
   ~ClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -463,7 +463,8 @@
 
 class TypeArgumentsDeserializationCluster : public DeserializationCluster {
  public:
-  TypeArgumentsDeserializationCluster() {}
+  TypeArgumentsDeserializationCluster()
+      : DeserializationCluster("TypeArguments") {}
   ~TypeArgumentsDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -556,7 +557,7 @@
 
 class PatchClassDeserializationCluster : public DeserializationCluster {
  public:
-  PatchClassDeserializationCluster() {}
+  PatchClassDeserializationCluster() : DeserializationCluster("PatchClass") {}
   ~PatchClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -671,7 +672,7 @@
 
 class FunctionDeserializationCluster : public DeserializationCluster {
  public:
-  FunctionDeserializationCluster() {}
+  FunctionDeserializationCluster() : DeserializationCluster("Function") {}
   ~FunctionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -790,6 +791,8 @@
     s->Push(data->ptr()->parent_function_);
     s->Push(data->ptr()->signature_type_);
     s->Push(data->ptr()->closure_);
+    s->Push(data->ptr()->default_type_arguments_);
+    s->Push(data->ptr()->default_type_arguments_info_);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -813,6 +816,8 @@
       WriteField(data, parent_function_);
       WriteField(data, signature_type_);
       WriteField(data, closure_);
+      WriteField(data, default_type_arguments_);
+      WriteField(data, default_type_arguments_info_);
     }
   }
 
@@ -823,7 +828,7 @@
 
 class ClosureDataDeserializationCluster : public DeserializationCluster {
  public:
-  ClosureDataDeserializationCluster() {}
+  ClosureDataDeserializationCluster() : DeserializationCluster("ClosureData") {}
   ~ClosureDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -851,6 +856,10 @@
       data->ptr()->parent_function_ = static_cast<FunctionPtr>(d->ReadRef());
       data->ptr()->signature_type_ = static_cast<TypePtr>(d->ReadRef());
       data->ptr()->closure_ = static_cast<InstancePtr>(d->ReadRef());
+      data->ptr()->default_type_arguments_ =
+          static_cast<TypeArgumentsPtr>(d->ReadRef());
+      data->ptr()->default_type_arguments_info_ =
+          static_cast<SmiPtr>(d->ReadRef());
     }
   }
 };
@@ -893,7 +902,8 @@
 
 class SignatureDataDeserializationCluster : public DeserializationCluster {
  public:
-  SignatureDataDeserializationCluster() {}
+  SignatureDataDeserializationCluster()
+      : DeserializationCluster("SignatureData") {}
   ~SignatureDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -962,7 +972,8 @@
 
 class FfiTrampolineDataDeserializationCluster : public DeserializationCluster {
  public:
-  FfiTrampolineDataDeserializationCluster() {}
+  FfiTrampolineDataDeserializationCluster()
+      : DeserializationCluster("FfiTrampolineData") {}
   ~FfiTrampolineDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1027,7 +1038,8 @@
 
 class RedirectionDataDeserializationCluster : public DeserializationCluster {
  public:
-  RedirectionDataDeserializationCluster() {}
+  RedirectionDataDeserializationCluster()
+      : DeserializationCluster("RedirectionData") {}
   ~RedirectionDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1164,7 +1176,7 @@
 
 class FieldDeserializationCluster : public DeserializationCluster {
  public:
-  FieldDeserializationCluster() {}
+  FieldDeserializationCluster() : DeserializationCluster("Field") {}
   ~FieldDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1286,7 +1298,7 @@
 
 class ScriptDeserializationCluster : public DeserializationCluster {
  public:
-  ScriptDeserializationCluster() {}
+  ScriptDeserializationCluster() : DeserializationCluster("Script") {}
   ~ScriptDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1359,7 +1371,7 @@
 
 class LibraryDeserializationCluster : public DeserializationCluster {
  public:
-  LibraryDeserializationCluster() {}
+  LibraryDeserializationCluster() : DeserializationCluster("Library") {}
   ~LibraryDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1431,7 +1443,7 @@
 
 class NamespaceDeserializationCluster : public DeserializationCluster {
  public:
-  NamespaceDeserializationCluster() {}
+  NamespaceDeserializationCluster() : DeserializationCluster("Namespace") {}
   ~NamespaceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1496,7 +1508,8 @@
 // one will never need to read them from a full AOT snapshot.
 class KernelProgramInfoDeserializationCluster : public DeserializationCluster {
  public:
-  KernelProgramInfoDeserializationCluster() {}
+  KernelProgramInfoDeserializationCluster()
+      : DeserializationCluster("KernelProgramInfo") {}
   ~KernelProgramInfoDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1857,7 +1870,7 @@
 
 class CodeDeserializationCluster : public DeserializationCluster {
  public:
-  CodeDeserializationCluster() {}
+  CodeDeserializationCluster() : DeserializationCluster("Code") {}
   ~CodeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2009,7 +2022,7 @@
 
 class BytecodeDeserializationCluster : public DeserializationCluster {
  public:
-  BytecodeDeserializationCluster() {}
+  BytecodeDeserializationCluster() : DeserializationCluster("Bytecode") {}
   virtual ~BytecodeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2147,7 +2160,7 @@
 
 class ObjectPoolDeserializationCluster : public DeserializationCluster {
  public:
-  ObjectPoolDeserializationCluster() {}
+  ObjectPoolDeserializationCluster() : DeserializationCluster("ObjectPool") {}
   ~ObjectPoolDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2311,7 +2324,8 @@
 class WeakSerializationReferenceDeserializationCluster
     : public DeserializationCluster {
  public:
-  WeakSerializationReferenceDeserializationCluster() {}
+  WeakSerializationReferenceDeserializationCluster()
+      : DeserializationCluster("WeakSerializationReference") {}
   ~WeakSerializationReferenceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2383,7 +2397,8 @@
 
 class PcDescriptorsDeserializationCluster : public DeserializationCluster {
  public:
-  PcDescriptorsDeserializationCluster() {}
+  PcDescriptorsDeserializationCluster()
+      : DeserializationCluster("PcDescriptors") {}
   ~PcDescriptorsDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2476,7 +2491,7 @@
 
 class RODataDeserializationCluster : public DeserializationCluster {
  public:
-  RODataDeserializationCluster() {}
+  RODataDeserializationCluster() : DeserializationCluster("ROData") {}
   ~RODataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2546,7 +2561,8 @@
 
 class ExceptionHandlersDeserializationCluster : public DeserializationCluster {
  public:
-  ExceptionHandlersDeserializationCluster() {}
+  ExceptionHandlersDeserializationCluster()
+      : DeserializationCluster("ExceptionHandlers") {}
   ~ExceptionHandlersDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2634,7 +2650,7 @@
 
 class ContextDeserializationCluster : public DeserializationCluster {
  public:
-  ContextDeserializationCluster() {}
+  ContextDeserializationCluster() : DeserializationCluster("Context") {}
   ~ContextDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2710,7 +2726,8 @@
 
 class ContextScopeDeserializationCluster : public DeserializationCluster {
  public:
-  ContextScopeDeserializationCluster() {}
+  ContextScopeDeserializationCluster()
+      : DeserializationCluster("ContextScope") {}
   ~ContextScopeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2777,7 +2794,8 @@
 
 class ParameterTypeCheckDeserializationCluster : public DeserializationCluster {
  public:
-  ParameterTypeCheckDeserializationCluster() {}
+  ParameterTypeCheckDeserializationCluster()
+      : DeserializationCluster("ParameterTypeCheck") {}
   ~ParameterTypeCheckDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2842,7 +2860,8 @@
 
 class UnlinkedCallDeserializationCluster : public DeserializationCluster {
  public:
-  UnlinkedCallDeserializationCluster() {}
+  UnlinkedCallDeserializationCluster()
+      : DeserializationCluster("UnlinkedCall") {}
   ~UnlinkedCallDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2910,7 +2929,7 @@
 
 class ICDataDeserializationCluster : public DeserializationCluster {
  public:
-  ICDataDeserializationCluster() {}
+  ICDataDeserializationCluster() : DeserializationCluster("ICData") {}
   ~ICDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2974,7 +2993,8 @@
 
 class MegamorphicCacheDeserializationCluster : public DeserializationCluster {
  public:
-  MegamorphicCacheDeserializationCluster() {}
+  MegamorphicCacheDeserializationCluster()
+      : DeserializationCluster("MegamorphicCache") {}
   ~MegamorphicCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3064,7 +3084,8 @@
 
 class SubtypeTestCacheDeserializationCluster : public DeserializationCluster {
  public:
-  SubtypeTestCacheDeserializationCluster() {}
+  SubtypeTestCacheDeserializationCluster()
+      : DeserializationCluster("SubtypeTestCache") {}
   ~SubtypeTestCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3127,7 +3148,7 @@
 
 class LoadingUnitDeserializationCluster : public DeserializationCluster {
  public:
-  LoadingUnitDeserializationCluster() {}
+  LoadingUnitDeserializationCluster() : DeserializationCluster("LoadingUnit") {}
   ~LoadingUnitDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3196,7 +3217,8 @@
 
 class LanguageErrorDeserializationCluster : public DeserializationCluster {
  public:
-  LanguageErrorDeserializationCluster() {}
+  LanguageErrorDeserializationCluster()
+      : DeserializationCluster("LanguageError") {}
   ~LanguageErrorDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3262,7 +3284,8 @@
 
 class UnhandledExceptionDeserializationCluster : public DeserializationCluster {
  public:
-  UnhandledExceptionDeserializationCluster() {}
+  UnhandledExceptionDeserializationCluster()
+      : DeserializationCluster("UnhandledException") {}
   ~UnhandledExceptionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3386,7 +3409,8 @@
 
 class InstanceDeserializationCluster : public DeserializationCluster {
  public:
-  explicit InstanceDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit InstanceDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("Instance"), cid_(cid) {}
   ~InstanceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3483,7 +3507,8 @@
 
 class LibraryPrefixDeserializationCluster : public DeserializationCluster {
  public:
-  LibraryPrefixDeserializationCluster() {}
+  LibraryPrefixDeserializationCluster()
+      : DeserializationCluster("LibraryPrefix") {}
   ~LibraryPrefixDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3577,7 +3602,7 @@
 
 class TypeDeserializationCluster : public DeserializationCluster {
  public:
-  TypeDeserializationCluster() {}
+  TypeDeserializationCluster() : DeserializationCluster("Type") {}
   ~TypeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3676,7 +3701,7 @@
 
 class TypeRefDeserializationCluster : public DeserializationCluster {
  public:
-  TypeRefDeserializationCluster() {}
+  TypeRefDeserializationCluster() : DeserializationCluster("TypeRef") {}
   ~TypeRefDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3774,7 +3799,8 @@
 
 class TypeParameterDeserializationCluster : public DeserializationCluster {
  public:
-  TypeParameterDeserializationCluster() {}
+  TypeParameterDeserializationCluster()
+      : DeserializationCluster("TypeParameter") {}
   ~TypeParameterDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3878,7 +3904,7 @@
 
 class ClosureDeserializationCluster : public DeserializationCluster {
  public:
-  ClosureDeserializationCluster() {}
+  ClosureDeserializationCluster() : DeserializationCluster("Closure") {}
   ~ClosureDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3945,7 +3971,7 @@
 
 class MintDeserializationCluster : public DeserializationCluster {
  public:
-  MintDeserializationCluster() {}
+  MintDeserializationCluster() : DeserializationCluster("int") {}
   ~MintDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4025,7 +4051,7 @@
 
 class DoubleDeserializationCluster : public DeserializationCluster {
  public:
-  DoubleDeserializationCluster() {}
+  DoubleDeserializationCluster() : DeserializationCluster("double") {}
   ~DoubleDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4088,7 +4114,8 @@
 class GrowableObjectArrayDeserializationCluster
     : public DeserializationCluster {
  public:
-  GrowableObjectArrayDeserializationCluster() {}
+  GrowableObjectArrayDeserializationCluster()
+      : DeserializationCluster("GrowableObjectArray") {}
   ~GrowableObjectArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4160,7 +4187,8 @@
 
 class TypedDataDeserializationCluster : public DeserializationCluster {
  public:
-  explicit TypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit TypedDataDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("TypedData"), cid_(cid) {}
   ~TypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4237,7 +4265,8 @@
 
 class TypedDataViewDeserializationCluster : public DeserializationCluster {
  public:
-  explicit TypedDataViewDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit TypedDataViewDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("TypedDataView"), cid_(cid) {}
   ~TypedDataViewDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4316,7 +4345,8 @@
 
 class ExternalTypedDataDeserializationCluster : public DeserializationCluster {
  public:
-  explicit ExternalTypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit ExternalTypedDataDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("ExternalTypedData"), cid_(cid) {}
   ~ExternalTypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4388,7 +4418,7 @@
 
 class StackTraceDeserializationCluster : public DeserializationCluster {
  public:
-  StackTraceDeserializationCluster() {}
+  StackTraceDeserializationCluster() : DeserializationCluster("StackTrace") {}
   ~StackTraceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4453,7 +4483,7 @@
 
 class RegExpDeserializationCluster : public DeserializationCluster {
  public:
-  RegExpDeserializationCluster() {}
+  RegExpDeserializationCluster() : DeserializationCluster("RegExp") {}
   ~RegExpDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4517,7 +4547,8 @@
 
 class WeakPropertyDeserializationCluster : public DeserializationCluster {
  public:
-  WeakPropertyDeserializationCluster() {}
+  WeakPropertyDeserializationCluster()
+      : DeserializationCluster("WeakProperty") {}
   ~WeakPropertyDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4611,7 +4642,8 @@
 
 class LinkedHashMapDeserializationCluster : public DeserializationCluster {
  public:
-  LinkedHashMapDeserializationCluster() {}
+  LinkedHashMapDeserializationCluster()
+      : DeserializationCluster("LinkedHashMap") {}
   ~LinkedHashMapDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4716,7 +4748,8 @@
 
 class ArrayDeserializationCluster : public DeserializationCluster {
  public:
-  explicit ArrayDeserializationCluster(intptr_t cid) : cid_(cid) {}
+  explicit ArrayDeserializationCluster(intptr_t cid)
+      : DeserializationCluster("Array"), cid_(cid) {}
   ~ArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4793,7 +4826,8 @@
 
 class OneByteStringDeserializationCluster : public DeserializationCluster {
  public:
-  OneByteStringDeserializationCluster() {}
+  OneByteStringDeserializationCluster()
+      : DeserializationCluster("OneByteString") {}
   ~OneByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4885,7 +4919,8 @@
 
 class TwoByteStringDeserializationCluster : public DeserializationCluster {
  public:
-  TwoByteStringDeserializationCluster() {}
+  TwoByteStringDeserializationCluster()
+      : DeserializationCluster("TwoByteString") {}
   ~TwoByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d, bool is_canonical) {
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 535163d..c02f85f 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -110,7 +110,8 @@
 
 class DeserializationCluster : public ZoneAllocated {
  public:
-  DeserializationCluster() : start_index_(-1), stop_index_(-1) {}
+  explicit DeserializationCluster(const char* name)
+      : name_(name), start_index_(-1), stop_index_(-1) {}
   virtual ~DeserializationCluster() {}
 
   // Allocate memory for all objects in the cluster and write their addresses
@@ -126,7 +127,10 @@
                         const Array& refs,
                         bool is_canonical) {}
 
+  const char* name() const { return name_; }
+
  protected:
+  const char* name_;
   // The range of the ref array that belongs to this cluster.
   intptr_t start_index_;
   intptr_t stop_index_;
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index 135452e..61767d8 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -50,8 +50,7 @@
   const intptr_t stub_index =
       op.AddObject(stub, ObjectPool::Patchability::kPatchable);
   ASSERT((ic_data_index + 1) == stub_index);
-  __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                  ObjectPool::element_offset(ic_data_index));
+  __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, ic_data_index);
   __ ldr(LR, compiler::FieldAddress(
                  CODE_REG,
                  Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 9b963b6..b047850 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -796,6 +796,14 @@
     type = function.ParameterTypeAt(i);
     AddType(type);
   }
+  // 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);
+  }
   Code& code = Code::Handle(Z, function.CurrentCode());
   if (code.IsNull()) {
     ASSERT(function.kind() == FunctionLayout::kSignatureFunction);
@@ -834,18 +842,17 @@
   if (abstype.IsNull()) return;
 
   if (abstype.IsTypeParameter()) {
-    if (typeparams_to_retain_.HasKey(&TypeParameter::Cast(abstype))) return;
-    typeparams_to_retain_.Insert(
-        &TypeParameter::ZoneHandle(Z, TypeParameter::Cast(abstype).raw()));
+    const auto& param = TypeParameter::Cast(abstype);
+    if (typeparams_to_retain_.HasKey(&param)) return;
+    typeparams_to_retain_.Insert(&TypeParameter::ZoneHandle(Z, param.raw()));
 
-    const AbstractType& type =
-        AbstractType::Handle(Z, TypeParameter::Cast(abstype).bound());
+    auto& type = AbstractType::Handle(Z, param.bound());
     AddType(type);
-    const auto& function = Function::Handle(
-        Z, TypeParameter::Cast(abstype).parameterized_function());
+    type = param.default_argument();
+    AddType(type);
+    const auto& function = Function::Handle(Z, param.parameterized_function());
     AddTypesOf(function);
-    const Class& cls =
-        Class::Handle(Z, TypeParameter::Cast(abstype).parameterized_class());
+    const Class& cls = Class::Handle(Z, param.parameterized_class());
     AddTypesOf(cls);
     return;
   }
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index f1997a9..4b84af62 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -1514,12 +1514,15 @@
 }
 
 // Uses a code sequence that can easily be decoded.
-void Assembler::LoadWordFromPoolOffset(Register rd,
-                                       int32_t offset,
-                                       Register pp,
-                                       Condition cond) {
+void Assembler::LoadWordFromPoolIndex(Register rd,
+                                      intptr_t index,
+                                      Register pp,
+                                      Condition cond) {
   ASSERT((pp != PP) || constant_pool_allowed());
   ASSERT(rd != pp);
+  // PP is tagged on ARM.
+  const int32_t offset =
+      target::ObjectPool::element_offset(index) - kHeapObjectTag;
   int32_t offset_mask = 0;
   if (Address::CanHoldLoadOffset(kWord, offset, &offset_mask)) {
     ldr(rd, Address(pp, offset), cond);
@@ -1632,8 +1635,7 @@
   // object pool.
   const auto index = is_unique ? object_pool_builder().AddObject(object)
                                : object_pool_builder().FindObject(object);
-  const int32_t offset = target::ObjectPool::element_offset(index);
-  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
+  LoadWordFromPoolIndex(rd, index, pp, cond);
 }
 
 void Assembler::LoadObject(Register rd, const Object& object, Condition cond) {
@@ -1650,9 +1652,9 @@
                                 const ExternalLabel* label,
                                 ObjectPoolBuilderEntry::Patchability patchable,
                                 Condition cond) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindNativeFunction(label, patchable));
-  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
+  const intptr_t index =
+      object_pool_builder().FindNativeFunction(label, patchable);
+  LoadWordFromPoolIndex(rd, index, PP, cond);
 }
 
 void Assembler::PushObject(const Object& object) {
@@ -2207,6 +2209,7 @@
   switch (cid) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kWord;
     case kOneByteStringCid:
     case kExternalOneByteStringCid:
@@ -2580,9 +2583,9 @@
                        ObjectPoolBuilderEntry::Patchability patchable,
                        Register pp,
                        Condition cond) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, pp, cond);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index, pp, cond);
   Branch(FieldAddress(CODE_REG, target::Code::entry_point_offset()), cond);
 }
 
@@ -2597,9 +2600,9 @@
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
   // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index, PP, AL);
   ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
@@ -2621,9 +2624,9 @@
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
   // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), equivalence));
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), equivalence);
+  LoadWordFromPoolIndex(CODE_REG, index, PP, AL);
   ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 9707e07..1e9d2ff 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -835,10 +835,10 @@
 
   // Load word from pool from the given offset using encoding that
   // InstructionPattern::DecodeLoadWordFromPool can decode.
-  void LoadWordFromPoolOffset(Register rd,
-                              int32_t offset,
-                              Register pp,
-                              Condition cond = AL);
+  void LoadWordFromPoolIndex(Register rd,
+                             intptr_t index,
+                             Register pp = PP,
+                             Condition cond = AL);
 
   void LoadObject(Register rd, const Object& object, Condition cond = AL);
   void LoadUniqueObject(Register rd, const Object& object, Condition cond = AL);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 9e3c425..f8089ac 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -344,12 +344,14 @@
   set_constant_pool_allowed(pp == PP);
 }
 
-void Assembler::LoadWordFromPoolOffset(Register dst,
-                                       uint32_t offset,
-                                       Register pp) {
+void Assembler::LoadWordFromPoolIndex(Register dst,
+                                      intptr_t index,
+                                      Register pp) {
   ASSERT((pp != PP) || constant_pool_allowed());
   ASSERT(dst != pp);
   Operand op;
+  // PP is _un_tagged on ARM64.
+  const uint32_t offset = target::ObjectPool::element_offset(index);
   const uint32_t upper20 = offset & 0xfffff000;
   if (Address::CanHoldOffset(offset)) {
     ldr(dst, Address(pp, offset));
@@ -370,10 +372,12 @@
   }
 }
 
-void Assembler::LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset) {
+void Assembler::LoadWordFromPoolIndexFixed(Register dst, intptr_t index) {
   ASSERT(constant_pool_allowed());
   ASSERT(dst != PP);
   Operand op;
+  // PP is _un_tagged on ARM64.
+  const uint32_t offset = target::ObjectPool::element_offset(index);
   const uint32_t upper20 = offset & 0xfffff000;
   const uint32_t lower12 = offset & 0x00000fff;
   const Operand::OperandType ot =
@@ -384,16 +388,18 @@
   ldr(dst, Address(dst, lower12));
 }
 
-void Assembler::LoadDoubleWordFromPoolOffset(Register lower,
-                                             Register upper,
-                                             uint32_t offset) {
+void Assembler::LoadDoubleWordFromPoolIndex(Register lower,
+                                            Register upper,
+                                            intptr_t index) {
   // This implementation needs to be kept in sync with
   // [InstructionPattern::DecodeLoadDoubleWordFromPool].
   ASSERT(constant_pool_allowed());
   ASSERT(lower != PP && upper != PP);
-  ASSERT(offset < (1 << 24));
 
   Operand op;
+  // PP is _un_tagged on ARM64.
+  const uint32_t offset = target::ObjectPool::element_offset(index);
+  ASSERT(offset < (1 << 24));
   const uint32_t upper20 = offset & 0xfffff000;
   const uint32_t lower12 = offset & 0x00000fff;
   if (Address::CanHoldOffset(offset, Address::PairOffset)) {
@@ -450,9 +456,9 @@
     Register dst,
     const ExternalLabel* label,
     ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindNativeFunction(label, patchable));
-  LoadWordFromPoolOffset(dst, offset);
+  const intptr_t index =
+      object_pool_builder().FindNativeFunction(label, patchable);
+  LoadWordFromPoolIndex(dst, index);
 }
 
 void Assembler::LoadIsolate(Register dst) {
@@ -485,10 +491,9 @@
     }
   }
   if (CanLoadFromObjectPool(object)) {
-    const int32_t offset = target::ObjectPool::element_offset(
-        is_unique ? object_pool_builder().AddObject(object)
-                  : object_pool_builder().FindObject(object));
-    LoadWordFromPoolOffset(dst, offset);
+    const intptr_t index = is_unique ? object_pool_builder().AddObject(object)
+                                     : object_pool_builder().FindObject(object);
+    LoadWordFromPoolIndex(dst, index);
     return;
   }
   ASSERT(target::IsSmi(object));
@@ -570,9 +575,8 @@
 
   // Use constant pool if allowed, unless we can load imm with 2 instructions.
   if ((w1 != 0) && constant_pool_allowed()) {
-    const int32_t offset =
-        target::ObjectPool::element_offset(FindImmediate(imm));
-    LoadWordFromPoolOffset(reg, offset);
+    const intptr_t index = FindImmediate(imm);
+    LoadWordFromPoolIndex(reg, index);
     return;
   }
 
@@ -617,9 +621,9 @@
 void Assembler::Branch(const Code& target,
                        Register pp,
                        ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset, pp);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index, pp);
   ldr(TMP, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
   br(TMP);
 }
@@ -627,9 +631,9 @@
 void Assembler::BranchLink(const Code& target,
                            ObjectPoolBuilderEntry::Patchability patchable,
                            CodeEntryKind entry_kind) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), patchable));
-  LoadWordFromPoolOffset(CODE_REG, offset);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), patchable);
+  LoadWordFromPoolIndex(CODE_REG, index);
   ldr(TMP,
       FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blr(TMP);
@@ -643,9 +647,9 @@
 void Assembler::BranchLinkWithEquivalence(const Code& target,
                                           const Object& equivalence,
                                           CodeEntryKind entry_kind) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindObject(ToObject(target), equivalence));
-  LoadWordFromPoolOffset(CODE_REG, offset);
+  const intptr_t index =
+      object_pool_builder().FindObject(ToObject(target), equivalence);
+  LoadWordFromPoolIndex(CODE_REG, index);
   ldr(TMP,
       FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
   blr(TMP);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index b60f259..b74553e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -266,6 +266,7 @@
     switch (cid) {
       case kArrayCid:
       case kImmutableArrayCid:
+      case kTypeArgumentsCid:
         return kWord;
       case kOneByteStringCid:
       case kExternalOneByteStringCid:
@@ -1597,11 +1598,11 @@
   // InstructionPattern::DecodeLoadWordFromPool can decode.
   //
   // Note: the function never clobbers TMP, TMP2 scratch registers.
-  void LoadWordFromPoolOffset(Register dst, uint32_t offset, Register pp = PP);
+  void LoadWordFromPoolIndex(Register dst, intptr_t index, Register pp = PP);
 
-  void LoadDoubleWordFromPoolOffset(Register lower,
-                                    Register upper,
-                                    uint32_t offset);
+  void LoadDoubleWordFromPoolIndex(Register lower,
+                                   Register upper,
+                                   intptr_t index);
 
   void PushObject(const Object& object) {
     if (IsSameObject(compiler::NullObject(), object)) {
@@ -1839,7 +1840,7 @@
 
   bool constant_pool_allowed_;
 
-  void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset);
+  void LoadWordFromPoolIndexFixed(Register dst, intptr_t index);
 
   // Note: the function never clobbers TMP, TMP2 scratch registers.
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index b84015a..0a833cf 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -48,9 +48,9 @@
     Register dst,
     const ExternalLabel* label,
     ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = target::ObjectPool::element_offset(
-      object_pool_builder().FindNativeFunction(label, patchable));
-  LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
+  const intptr_t index =
+      object_pool_builder().FindNativeFunction(label, patchable);
+  LoadWordFromPoolIndex(dst, index);
 }
 
 void Assembler::call(const ExternalLabel* label) {
@@ -67,8 +67,7 @@
   ASSERT(constant_pool_allowed());
   const intptr_t idx = object_pool_builder().AddObject(
       ToObject(target), ObjectPoolBuilderEntry::kPatchable);
-  const int32_t offset = target::ObjectPool::element_offset(idx);
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  LoadWordFromPoolIndex(CODE_REG, idx);
   call(FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
 }
 
@@ -78,8 +77,7 @@
   ASSERT(constant_pool_allowed());
   const intptr_t idx =
       object_pool_builder().FindObject(ToObject(target), equivalence);
-  const int32_t offset = target::ObjectPool::element_offset(idx);
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  LoadWordFromPoolIndex(CODE_REG, idx);
   call(FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
 }
 
@@ -87,8 +85,7 @@
   ASSERT(constant_pool_allowed());
   const intptr_t idx = object_pool_builder().FindObject(
       ToObject(target), ObjectPoolBuilderEntry::kNotPatchable);
-  const int32_t offset = target::ObjectPool::element_offset(idx);
-  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  LoadWordFromPoolIndex(CODE_REG, idx);
   call(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
 }
 
@@ -1210,9 +1207,12 @@
   return true;
 }
 
-void Assembler::LoadWordFromPoolOffset(Register dst, int32_t offset) {
+void Assembler::LoadWordFromPoolIndex(Register dst, intptr_t idx) {
   ASSERT(constant_pool_allowed());
   ASSERT(dst != PP);
+  // PP is tagged on X64.
+  const int32_t offset =
+      target::ObjectPool::element_offset(idx) - kHeapObjectTag;
   // This sequence must be decodable by code_patcher_x64.cc.
   movq(dst, Address(PP, offset));
 }
@@ -1239,10 +1239,9 @@
     }
   }
   if (CanLoadFromObjectPool(object)) {
-    const int32_t offset = target::ObjectPool::element_offset(
-        is_unique ? object_pool_builder().AddObject(object)
-                  : object_pool_builder().FindObject(object));
-    LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
+    const intptr_t index = is_unique ? object_pool_builder().AddObject(object)
+                                     : object_pool_builder().FindObject(object);
+    LoadWordFromPoolIndex(dst, index);
     return;
   }
   ASSERT(target::IsSmi(object));
@@ -1315,9 +1314,8 @@
   } else if (imm.is_int32() || !constant_pool_allowed()) {
     movq(reg, imm);
   } else {
-    int32_t offset =
-        target::ObjectPool::element_offset(FindImmediate(imm.value()));
-    LoadWordFromPoolOffset(reg, offset - kHeapObjectTag);
+    const intptr_t idx = FindImmediate(imm.value());
+    LoadWordFromPoolIndex(reg, idx);
   }
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 5667c65..19bf03f 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -1033,7 +1033,7 @@
   intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
-  void LoadWordFromPoolOffset(Register dst, int32_t offset);
+  void LoadWordFromPoolIndex(Register dst, intptr_t index);
 
   void AluL(uint8_t modrm_opcode, Register dst, const Immediate& imm);
   void AluB(uint8_t modrm_opcode, const Address& dst, const Immediate& imm);
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index fc4cfbf..4cc16cf 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -1056,10 +1056,13 @@
     InstantiateTypeArgumentsInstr* instr) {
   const auto& type_arguments_obj =
       instr->type_arguments()->definition()->constant_value();
-  ASSERT(!type_arguments_obj.IsNull());
   if (IsUnknown(type_arguments_obj)) {
     return;
   }
+  if (type_arguments_obj.IsNull()) {
+    SetValue(instr, type_arguments_obj);
+    return;
+  }
   if (!type_arguments_obj.IsTypeArguments()) {
     SetValue(instr, non_constant_);
     return;
@@ -1078,14 +1081,13 @@
     if (IsUnknown(instantiator_type_args_obj)) {
       return;
     }
-    if (!instantiator_type_args_obj.IsTypeArguments()) {
+    if (!instantiator_type_args_obj.IsNull() &&
+        !instantiator_type_args_obj.IsTypeArguments()) {
       SetValue(instr, non_constant_);
       return;
     }
     instantiator_type_args ^= instantiator_type_args_obj.raw();
-    ASSERT(!instr->instantiator_class().IsNull());
-    if (type_arguments.CanShareInstantiatorTypeArguments(
-            instr->instantiator_class())) {
+    if (instr->CanShareInstantiatorTypeArguments()) {
       SetValue(instr, instantiator_type_args);
       return;
     }
@@ -1098,13 +1100,13 @@
     if (IsUnknown(function_type_args_obj)) {
       return;
     }
-    if (!function_type_args_obj.IsTypeArguments()) {
+    if (!function_type_args_obj.IsNull() &&
+        !function_type_args_obj.IsTypeArguments()) {
       SetValue(instr, non_constant_);
       return;
     }
     function_type_args ^= function_type_args_obj.raw();
-    ASSERT(!instr->function().IsNull());
-    if (type_arguments.CanShareFunctionTypeArguments(instr->function())) {
+    if (instr->CanShareFunctionTypeArguments()) {
       SetValue(instr, function_type_args);
       return;
     }
@@ -1424,6 +1426,11 @@
   SetValue(instr, non_constant_);
 }
 
+void ConstantPropagator::VisitBoxUint8(BoxUint8Instr* instr) {
+  // TODO(kmillikin): Handle box operation.
+  SetValue(instr, non_constant_);
+}
+
 void ConstantPropagator::VisitBoxUint32(BoxUint32Instr* instr) {
   // TODO(kmillikin): Handle box operation.
   SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 6a01f8a..2290612 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2303,29 +2303,178 @@
              : kTestTypeSixArgs;
 }
 
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
+#if !defined(TARGET_ARCH_IA32)
+// Generates an assignable check for a given object. Emits no code if the
+// destination type is known at compile time and is a top type. See
+// GenerateCallerChecksForAssertAssignable for other optimized cases.
+//
+// Inputs (preserved for successful checks):
+// - TypeTestABI::kInstanceReg: object.
+// - TypeTestABI::kDstTypeReg: destination type (if non-constant).
+// - TypeTestABI::kInstantiatorTypeArgumentsReg: instantiator type arguments.
+// - TypeTestABI::kFunctionTypeArgumentsReg: function type arguments.
+//
+// Throws:
+// - TypeError (on unsuccessful assignable checks)
+//
+// Performance notes: positive checks must be quick, negative checks can be slow
+// as they throw an exception.
+void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
+                                                 TokenPosition token_pos,
+                                                 intptr_t deopt_id,
+                                                 const String& dst_name,
+                                                 LocationSummary* locs) {
+  ASSERT(!token_pos.IsClassifying());
+  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
+
+  if (!locs->in(1).IsConstant()) {
+    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
+    UNREACHABLE();
+  }
+  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
+  ASSERT(dst_type.IsFinalized());
+
+  if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
+
+  compiler::Label done;
+
+  GenerateCallerChecksForAssertAssignable(receiver_type, dst_type, &done);
+
+  GenerateTTSCall(token_pos, deopt_id,
+                  dst_type.IsTypeParameter() ? TypeTestABI::kScratchReg
+                                             : TypeTestABI::kDstTypeReg,
+                  dst_type, dst_name, locs);
+  __ Bind(&done);
+}
+
+// Generates a call to the type testing stub for the type in [reg_with_type].
+// Provide a non-null [dst_type] and [dst_name] if they are known at compile
+// time.
+void FlowGraphCompiler::GenerateTTSCall(TokenPosition token_pos,
+                                        intptr_t deopt_id,
+                                        Register reg_with_type,
+                                        const AbstractType& dst_type,
+                                        const String& dst_name,
+                                        LocationSummary* locs) {
+  // For now, we don't allow dynamic (non-compile-time) dst_type/dst_name.
+  ASSERT(!dst_type.IsNull() && !dst_name.IsNull());
+  // We use 2 consecutive entries in the pool for the subtype cache and the
+  // destination name.  The second entry, namely [dst_name] seems to be unused,
+  // but it will be used by the code throwing a TypeError if the type test fails
+  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
+  // on the call site to find out at which pool index the destination name is
+  // located.
+  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
+      Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
+  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
+      dst_name, compiler::ObjectPoolBuilderEntry::kPatchable);
+  ASSERT((sub_type_cache_index + 1) == dst_name_index);
+  ASSERT(__ constant_pool_allowed());
+
+  // If the dst_type is known at compile time and instantiated, we know the
+  // target TTS stub and so can use a PC-relative call when available.
+  if (dst_type.IsInstantiated() && CanPcRelativeCall(dst_type)) {
+    __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                             sub_type_cache_index);
+    __ GenerateUnRelocatedPcRelativeCall();
+    AddPcRelativeTTSCallTypeTarget(dst_type);
+  } else {
+    GenerateIndirectTTSCall(reg_with_type, sub_type_cache_index);
+  }
+  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
+}
+
+// Optimize assignable type check by adding inlined tests for:
+// - non-null object -> return object (only if in null safe mode and type is
+//   non-nullable Object).
+// - Smi -> compile time subtype check (only if dst class is not parameterized).
+// - Class equality (only if class is not parameterized).
+//
+// Inputs (preserved):
+// - TypeTestABI::kInstanceReg: object.
+// - TypeTestABI::kInstantiatorTypeArgumentsReg: instantiator type arguments.
+// - TypeTestABI::kFunctionTypeArgumentsReg: function type arguments.
+//
+// Assumes:
+// - Destination type is not a top type.
+// - Object to check is not null, unless in null safe mode and destination type
+//   is not a nullable type.
+//
+// Outputs:
+// - TypeTestABI::kDstTypeReg: destination type
+// Additional output if dst_type is a TypeParameter:
+// - TypeTestABI::kScratchReg: type on which to call TTS stub.
+//
+// Performance notes: positive checks must be quick, negative checks can be slow
+// as they throw an exception.
+void FlowGraphCompiler::GenerateCallerChecksForAssertAssignable(
     CompileType* receiver_type,
     const AbstractType& dst_type,
-    const String& dst_name,
-    const Register dst_type_reg_to_call,
-    const Register scratch_reg,
     compiler::Label* done) {
-#if defined(TARGET_ARCH_IA32)
-  // ia32 does not have support for TypeTestingStubs.
-  UNREACHABLE();
-#else
-  TypeUsageInfo* type_usage_info = thread()->type_usage_info();
-
-  // Special case: non-nullable Object.
   // Top types should be handled by the caller and cannot reach here.
   ASSERT(!dst_type.IsTopTypeForSubtyping());
+
+  // Set this to avoid marking the type testing stub for optimization.
+  bool elide_info = false;
+  // Call before any return points to set the destination type register and
+  // mark the destination type TTS as needing optimization, unless it is
+  // unlikely to be called.
+  auto output_dst_type = [&]() -> void {
+    // If we haven't handled the positive case of the type check on the call
+    // site and we'll be using the TTS of the destination type, we want an
+    // optimized type testing stub and thus record it in the [TypeUsageInfo].
+    if (!elide_info) {
+      if (auto const type_usage_info = thread()->type_usage_info()) {
+        type_usage_info->UseTypeInAssertAssignable(dst_type);
+      } else {
+        ASSERT(!FLAG_precompiled_mode);
+      }
+    }
+    __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
+  };
+
+  // We can handle certain types and checks very efficiently on the call site,
+  // meaning those need not be checked within the stubs (which may involve
+  // a runtime call).
+
   if (dst_type.IsObjectType()) {
+    // Special case: non-nullable Object.
     ASSERT(dst_type.IsNonNullable() && isolate()->null_safety());
     __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
     __ BranchIf(NOT_EQUAL, done);
-    // Fall back to type testing stub.
-    __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
-    return;
+    // Fall back to type testing stub in caller to throw the exception.
+    return output_dst_type();
+  }
+
+  if (dst_type.IsTypeParameter()) {
+    // Special case: Instantiate the type parameter on the caller side, invoking
+    // the TTS of the corresponding type parameter in the caller.
+    const TypeParameter& type_param = TypeParameter::Cast(dst_type);
+    if (isolate()->null_safety() && !type_param.IsNonNullable()) {
+      // If the type parameter is nullable when running in strong mode, we need
+      // to handle null before calling the TTS because the type parameter may be
+      // instantiated with a non-nullable type, where the TTS rejects null.
+      __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
+      __ BranchIf(EQUAL, done);
+    }
+    const Register kTypeArgumentsReg =
+        type_param.IsClassTypeParameter()
+            ? TypeTestABI::kInstantiatorTypeArgumentsReg
+            : TypeTestABI::kFunctionTypeArgumentsReg;
+
+    // Check if type arguments are null, i.e. equivalent to vector of dynamic.
+    // If so, then the value is guaranteed assignable as dynamic is a top type.
+    __ CompareObject(kTypeArgumentsReg, Object::null_object());
+    __ BranchIf(EQUAL, done);
+    // Put the instantiated type parameter into the scratch register, so its
+    // TTS can be called by the caller.
+    __ LoadField(
+        TypeTestABI::kScratchReg,
+        compiler::FieldAddress(kTypeArgumentsReg,
+                               compiler::target::TypeArguments::type_at_offset(
+                                   type_param.index())));
+    elide_info = true;
+    return output_dst_type();
   }
 
   // If the int type is assignable to [dst_type] we special case it on the
@@ -2339,93 +2488,34 @@
     is_non_smi = true;
   }
 
-  // We use two type registers iff the dst type is a type parameter.
-  // We "dereference" the type parameter for the TTS call but leave the type
-  // parameter in the TypeTestABI::kDstTypeReg for fallback into
-  // SubtypeTestCache.
-  ASSERT(dst_type_reg_to_call == kNoRegister ||
-         (dst_type.IsTypeParameter() ==
-          (TypeTestABI::kDstTypeReg != dst_type_reg_to_call)));
+  if (auto const hi = thread()->hierarchy_info()) {
+    const Class& type_class = Class::Handle(zone(), dst_type.type_class());
 
-  // We can handle certain types very efficiently on the call site (with a
-  // bailout to the normal stub, which will do a runtime call).
-  if (dst_type.IsTypeParameter()) {
-    // In NNBD strong mode we need to handle null instance before calling TTS
-    // if type parameter is nullable or legacy because type parameter can be
-    // instantiated with a non-nullable type which rejects null.
-    // In NNBD weak mode or if type parameter is non-nullable or has
-    // undetermined nullability null instance is correctly handled by TTS.
-    if (isolate()->null_safety() &&
-        (dst_type.IsNullable() || dst_type.IsLegacy())) {
-      __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
-      __ BranchIf(EQUAL, done);
-    }
-    const TypeParameter& type_param = TypeParameter::Cast(dst_type);
-    const Register kTypeArgumentsReg =
-        type_param.IsClassTypeParameter()
-            ? TypeTestABI::kInstantiatorTypeArgumentsReg
-            : TypeTestABI::kFunctionTypeArgumentsReg;
-
-    // Check if type arguments are null, i.e. equivalent to vector of dynamic.
-    __ CompareObject(kTypeArgumentsReg, Object::null_object());
-    __ BranchIf(EQUAL, done);
-    __ LoadField(
-        dst_type_reg_to_call,
-        compiler::FieldAddress(kTypeArgumentsReg,
-                               compiler::target::TypeArguments::type_at_offset(
-                                   type_param.index())));
-    __ LoadObject(TypeTestABI::kDstTypeReg, type_param);
-    if (type_usage_info != NULL) {
-      type_usage_info->UseTypeInAssertAssignable(dst_type);
-    }
-  } else {
-    HierarchyInfo* hi = Thread::Current()->hierarchy_info();
-    if (hi != NULL) {
-      const Class& type_class = Class::Handle(zone(), dst_type.type_class());
-
-      bool check_handled_at_callsite = false;
-      bool used_cid_range_check = false;
-      const bool can_use_simple_cid_range_test =
-          hi->CanUseSubtypeRangeCheckFor(dst_type);
-      if (can_use_simple_cid_range_test) {
-        const CidRangeVector& ranges = hi->SubtypeRangesForClass(
-            type_class,
-            /*include_abstract=*/false,
-            /*exclude_null=*/!Instance::NullIsAssignableTo(dst_type));
-        if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
-          if (is_non_smi) {
-            __ LoadClassId(scratch_reg, TypeTestABI::kInstanceReg);
-          } else {
-            __ LoadClassIdMayBeSmi(scratch_reg, TypeTestABI::kInstanceReg);
-          }
-          GenerateCidRangesCheck(assembler(), scratch_reg, ranges, done);
-          used_cid_range_check = true;
-          check_handled_at_callsite = true;
-        }
-      }
-
-      if (!used_cid_range_check && can_use_simple_cid_range_test &&
-          IsListClass(type_class)) {
-        __ LoadClassIdMayBeSmi(scratch_reg, TypeTestABI::kInstanceReg);
-        GenerateListTypeCheck(scratch_reg, done);
-        used_cid_range_check = true;
-      }
-
-      // If we haven't handled the positive case of the type check on the
-      // call-site, we want an optimized type testing stub and therefore record
-      // it in the [TypeUsageInfo].
-      if (!check_handled_at_callsite) {
-        if (type_usage_info != NULL) {
-          type_usage_info->UseTypeInAssertAssignable(dst_type);
+    if (hi->CanUseSubtypeRangeCheckFor(dst_type)) {
+      const CidRangeVector& ranges = hi->SubtypeRangesForClass(
+          type_class,
+          /*include_abstract=*/false,
+          /*exclude_null=*/!Instance::NullIsAssignableTo(dst_type));
+      if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
+        if (is_non_smi) {
+          __ LoadClassId(TypeTestABI::kScratchReg, TypeTestABI::kInstanceReg);
         } else {
-          ASSERT(!FLAG_precompiled_mode);
+          __ LoadClassIdMayBeSmi(TypeTestABI::kScratchReg,
+                                 TypeTestABI::kInstanceReg);
         }
+        GenerateCidRangesCheck(assembler(), TypeTestABI::kScratchReg, ranges,
+                               done);
+        elide_info = true;
+      } else if (IsListClass(type_class)) {
+        __ LoadClassIdMayBeSmi(TypeTestABI::kScratchReg,
+                               TypeTestABI::kInstanceReg);
+        GenerateListTypeCheck(TypeTestABI::kScratchReg, done);
       }
     }
-    __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
   }
-#endif  // defined(TARGET_ARCH_IA32)
+  output_dst_type();
 }
+#endif  // !defined(TARGET_ARCH_IA32)
 
 #undef __
 
@@ -2470,14 +2560,16 @@
     rep = kTagged;
   }
   ASSERT(!is_optimizing());
-  ASSERT((rep == kTagged) || (rep == kUntagged) || (rep == kUnboxedUint32));
+  ASSERT((rep == kTagged) || (rep == kUntagged) || (rep == kUnboxedUint32) ||
+         (rep == kUnboxedUint8));
   ASSERT(rep != kUntagged || flow_graph_.IsIrregexpFunction());
   const auto& function = flow_graph_.parsed_function().function();
-  // Currently, we only allow unboxed uint32 on the stack in unoptimized code
-  // when building a dynamic closure call dispatcher, where any unboxed values
-  // on the stack are consumed before possible FrameStateIsSafeToCall() checks.
+  // Currently, we only allow unboxed uint8 and uint32 on the stack in
+  // unoptimized code  when building a dynamic closure call dispatcher, where
+  // any unboxed values on the stack are consumed before possible
+  // FrameStateIsSafeToCall() checks.
   // See FlowGraphBuilder::BuildDynamicCallVarsInit().
-  ASSERT(rep != kUnboxedUint32 ||
+  ASSERT((rep != kUnboxedUint32 && rep != kUnboxedUint8) ||
          function.IsDynamicClosureCallDispatcher(thread()));
   frame_state_.Add(rep);
 }
@@ -2512,8 +2604,11 @@
   }
   const bool use_shared_stub =
       instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
+  ASSERT(use_shared_stub == instruction()->locs()->call_on_shared_slow_path());
   const bool live_fpu_registers =
       instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
+  const intptr_t num_args =
+      use_shared_stub ? 0 : GetNumberOfArgumentsForRuntimeCall();
   __ Bind(entry_label());
   EmitCodeAtSlowPathEntry(compiler);
   LocationSummary* locs = instruction()->locs();
@@ -2522,26 +2617,19 @@
     EmitSharedStubCall(compiler, live_fpu_registers);
   } else {
     compiler->SaveLiveRegisters(locs);
-    intptr_t i = 0;
-    if (num_args_ % 2 != 0) {
-      __ PushRegister(locs->in(i).reg());
-      ++i;
-    }
-    for (; i < num_args_; i += 2) {
-      __ PushRegisterPair(locs->in(i + 1).reg(), locs->in(i).reg());
-    }
-    __ CallRuntime(runtime_entry_, num_args_);
+    PushArgumentsForRuntimeCall(compiler);
+    __ CallRuntime(runtime_entry_, num_args);
   }
   const intptr_t deopt_id = instruction()->deopt_id();
   compiler->AddDescriptor(PcDescriptorsLayout::kOther,
                           compiler->assembler()->CodeSize(), deopt_id,
                           instruction()->token_pos(), try_index_);
   AddMetadataForRuntimeCall(compiler);
-  compiler->RecordSafepoint(locs, num_args_);
+  compiler->RecordSafepoint(locs, num_args);
   if ((try_index_ != kInvalidTryIndex) ||
       (compiler->CurrentTryIndex() != kInvalidTryIndex)) {
     Environment* env =
-        compiler->SlowPathEnvironmentFor(instruction(), num_args_);
+        compiler->SlowPathEnvironmentFor(instruction(), num_args);
     if (FLAG_precompiled_mode) {
       compiler->RecordCatchEntryMoves(env, try_index_);
     } else if (env != nullptr) {
@@ -2611,6 +2699,42 @@
 #endif
 }
 
+void RangeErrorSlowPath::PushArgumentsForRuntimeCall(
+    FlowGraphCompiler* compiler) {
+  LocationSummary* locs = instruction()->locs();
+  __ PushRegisterPair(locs->in(CheckBoundBase::kIndexPos).reg(),
+                      locs->in(CheckBoundBase::kLengthPos).reg());
+}
+
+void LateInitializationErrorSlowPath::PushArgumentsForRuntimeCall(
+    FlowGraphCompiler* compiler) {
+  const Field& original_field = Field::ZoneHandle(
+      instruction()->AsLoadField()->slot().field().Original());
+  __ PushObject(original_field);
+}
+
+void LateInitializationErrorSlowPath::EmitSharedStubCall(
+    FlowGraphCompiler* compiler,
+    bool save_fpu_registers) {
+#if defined(TARGET_ARCH_IA32)
+  UNREACHABLE();
+#else
+  ASSERT(instruction()->locs()->temp(0).reg() ==
+         LateInitializationErrorABI::kFieldReg);
+  const Field& original_field = Field::ZoneHandle(
+      instruction()->AsLoadField()->slot().field().Original());
+  __ LoadObject(LateInitializationErrorABI::kFieldReg, original_field);
+  auto object_store = compiler->isolate()->object_store();
+  const auto& stub = Code::ZoneHandle(
+      compiler->zone(),
+      save_fpu_registers
+          ? object_store->late_initialization_error_stub_with_fpu_regs_stub()
+          : object_store
+                ->late_initialization_error_stub_without_fpu_regs_stub());
+  compiler->EmitCallToStub(stub);
+#endif
+}
+
 void FlowGraphCompiler::EmitNativeMove(
     const compiler::ffi::NativeLocation& destination,
     const compiler::ffi::NativeLocation& source,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index cff19a26..1965d97 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -283,11 +283,9 @@
  public:
   ThrowErrorSlowPathCode(Instruction* instruction,
                          const RuntimeEntry& runtime_entry,
-                         intptr_t num_args,
                          intptr_t try_index)
       : TemplateSlowPathCode(instruction),
         runtime_entry_(runtime_entry),
-        num_args_(num_args),
         try_index_(try_index) {}
 
   // This name appears in disassembly.
@@ -296,6 +294,10 @@
   // Subclasses can override these methods to customize slow path code.
   virtual void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) {}
   virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
+  virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler) {}
+
+  // Returns number of arguments for runtime call (if shared stub is not used).
+  virtual intptr_t GetNumberOfArgumentsForRuntimeCall() { return 0; }
 
   virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
                                   bool save_fpu_registers) {
@@ -306,18 +308,14 @@
 
  private:
   const RuntimeEntry& runtime_entry_;
-  const intptr_t num_args_;
   const intptr_t try_index_;
 };
 
 class NullErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   NullErrorSlowPath(CheckNullInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                GetRuntimeEntry(instruction->exception_type()),
-                               kNumberOfArguments,
                                try_index) {}
 
   CheckNullInstr::ExceptionType exception_type() const {
@@ -345,16 +343,38 @@
 
 class RangeErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kRangeErrorRuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
   virtual const char* name() { return "check bound"; }
 
-  virtual void EmitSharedStubCall(FlowGraphCompiler* compielr,
+  virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
+    return 2;  // length and index
+  }
+
+  virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler);
+
+  virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
+                                  bool save_fpu_registers);
+};
+
+class LateInitializationErrorSlowPath : public ThrowErrorSlowPathCode {
+ public:
+  LateInitializationErrorSlowPath(LoadFieldInstr* instruction,
+                                  intptr_t try_index)
+      : ThrowErrorSlowPathCode(instruction,
+                               kLateInitializationErrorRuntimeEntry,
+                               try_index) {}
+  virtual const char* name() { return "late initialization error"; }
+
+  virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
+    return 1;  // field
+  }
+
+  virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler);
+
+  virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
                                   bool save_fpu_registers);
 };
 
@@ -568,19 +588,21 @@
                                 const String& dst_name,
                                 LocationSummary* locs);
 
-  void GenerateAssertAssignableViaTypeTestingStub(CompileType* receiver_type,
-                                                  TokenPosition token_pos,
-                                                  intptr_t deopt_id,
-                                                  const String& dst_name,
-                                                  LocationSummary* locs);
+#if !defined(TARGET_ARCH_IA32)
+  void GenerateCallerChecksForAssertAssignable(CompileType* receiver_type,
+                                               const AbstractType& dst_type,
+                                               compiler::Label* done);
 
-  void GenerateAssertAssignableViaTypeTestingStub(
-      CompileType* receiver_type,
-      const AbstractType& dst_type,
-      const String& dst_name,
-      const Register dst_type_reg_to_call,
-      const Register scratch_reg,
-      compiler::Label* done);
+  void GenerateTTSCall(TokenPosition token_pos,
+                       intptr_t deopt_id,
+                       Register reg_with_type,
+                       const AbstractType& dst_type,
+                       const String& dst_name,
+                       LocationSummary* locs);
+
+  void GenerateIndirectTTSCall(Register reg_with_type,
+                               intptr_t sub_type_cache_index);
+#endif
 
   void GenerateRuntimeCall(TokenPosition token_pos,
                            intptr_t deopt_id,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 465352b..d1de64a 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -682,100 +682,16 @@
   __ Drop(2);
 }
 
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - R0: instance being type checked.
-// - R8: destination type (if non-constant).
-// - R2: instantiator type arguments or raw_null.
-// - R1: function type arguments or raw_null.
-// Returns:
-// - object in R0 for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
-                                                 TokenPosition token_pos,
-                                                 intptr_t deopt_id,
-                                                 const String& dst_name,
-                                                 LocationSummary* locs) {
-  ASSERT(!token_pos.IsClassifying());
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
-  if (locs->in(1).IsConstant()) {
-    const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-    ASSERT(dst_type.IsFinalized());
-
-    if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
-
-    GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
-                                               deopt_id, dst_name, locs);
-    return;
-  } else {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
-    CompileType* receiver_type,
-    TokenPosition token_pos,
-    intptr_t deopt_id,
-    const String& dst_name,
-    LocationSummary* locs) {
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-  // We must have a constant dst_type for generating a call to the stub.
-  ASSERT(locs->in(1).IsConstant());
-  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
-  // If the dst_type is instantiated we know the target TTS stub at
-  // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call =
-      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-
-  const Register kRegToCall =
-      use_pc_relative_call
-          ? kNoRegister
-          : (dst_type.IsTypeParameter() ? R9 : TypeTestABI::kDstTypeReg);
-  const Register kScratchReg = R4;
-
-  compiler::Label done;
-
-  GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
-                                             kRegToCall, kScratchReg, &done);
-
-  // We use 2 consecutive entries in the pool for the subtype cache and the
-  // destination name.  The second entry, namely [dst_name] seems to be unused,
-  // but it will be used by the code throwing a TypeError if the type test fails
-  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
-  // on the call site to find out at which pool index the destination name is
-  // located.
-  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
-      Object::null_object(), ObjectPool::Patchability::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      compiler::target::ObjectPool::element_offset(sub_type_cache_index) -
-      kHeapObjectTag;
-  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
-      dst_name, ObjectPool::Patchability::kPatchable);
-  ASSERT((sub_type_cache_index + 1) == dst_name_index);
-  ASSERT(__ constant_pool_allowed());
-
-  if (use_pc_relative_call) {
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset, PP);
-    __ GenerateUnRelocatedPcRelativeCall();
-    AddPcRelativeTTSCallTypeTarget(dst_type);
-  } else {
-    __ LoadField(R9, compiler::FieldAddress(
-                         kRegToCall, compiler::target::AbstractType::
-                                         type_test_stub_entry_point_offset()));
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset, PP);
-    __ blx(R9);
-  }
-  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
-  __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+                                                intptr_t sub_type_cache_index) {
+  __ LoadField(
+      R9,
+      compiler::FieldAddress(
+          reg_to_call,
+          compiler::target::AbstractType::type_test_stub_entry_point_offset()));
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
+  __ blx(R9);
 }
 
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index bc6983e..4ed5b4a 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -648,99 +648,16 @@
   __ Drop(2);
 }
 
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - R0: instance being type checked.
-// - R8: destination type (if non-constant).
-// - R2: instantiator type arguments or raw_null.
-// - R1: function type arguments or raw_null.
-// Returns:
-// - object in R0 for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
-                                                 TokenPosition token_pos,
-                                                 intptr_t deopt_id,
-                                                 const String& dst_name,
-                                                 LocationSummary* locs) {
-  ASSERT(!TokenPosition(token_pos).IsClassifying());
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
-  if (locs->in(1).IsConstant()) {
-    const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-    ASSERT(dst_type.IsFinalized());
-
-    if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
-
-    GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
-                                               deopt_id, dst_name, locs);
-    return;
-  } else {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
-    CompileType* receiver_type,
-    TokenPosition token_pos,
-    intptr_t deopt_id,
-    const String& dst_name,
-    LocationSummary* locs) {
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-  // We must have a constant dst_type for generating a call to the stub.
-  ASSERT(locs->in(1).IsConstant());
-  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
-  // If the dst_type is instantiated we know the target TTS stub at
-  // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call =
-      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-
-  const Register kRegToCall =
-      use_pc_relative_call
-          ? kNoRegister
-          : (dst_type.IsTypeParameter() ? R9 : TypeTestABI::kDstTypeReg);
-  const Register kScratchReg = R4;
-
-  compiler::Label done;
-
-  GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
-                                             kRegToCall, kScratchReg, &done);
-
-  // We use 2 consecutive entries in the pool for the subtype cache and the
-  // destination name.  The second entry, namely [dst_name] seems to be unused,
-  // but it will be used by the code throwing a TypeError if the type test fails
-  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
-  // on the call site to find out at which pool index the destination name is
-  // located.
-  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
-      Object::null_object(), ObjectPool::Patchability::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index);
-  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
-      dst_name, ObjectPool::Patchability::kPatchable);
-  ASSERT((sub_type_cache_index + 1) == dst_name_index);
-  ASSERT(__ constant_pool_allowed());
-
-  if (use_pc_relative_call) {
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset);
-    __ GenerateUnRelocatedPcRelativeCall();
-    AddPcRelativeTTSCallTypeTarget(dst_type);
-  } else {
-    __ LoadField(
-        R9, compiler::FieldAddress(
-                kRegToCall, AbstractType::type_test_stub_entry_point_offset()));
-    __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                              sub_type_cache_offset);
-    __ blr(R9);
-  }
-  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
-  __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+                                                intptr_t sub_type_cache_index) {
+  __ LoadField(
+      R9,
+      compiler::FieldAddress(
+          reg_to_call,
+          compiler::target::AbstractType::type_test_stub_entry_point_offset()));
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
+  __ blr(R9);
 }
 
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
@@ -1027,8 +944,7 @@
   const intptr_t stub_index =
       op.AddObject(stub, ObjectPool::Patchability::kPatchable);
   ASSERT((ic_data_index + 1) == stub_index);
-  __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                  ObjectPool::element_offset(ic_data_index));
+  __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, ic_data_index);
   const intptr_t entry_point_offset =
       entry_kind == Code::EntryKind::kNormal
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
@@ -1068,11 +984,9 @@
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
-    __ LoadDoubleWordFromPoolOffset(R5, LR,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, LR, data_index);
   } else {
-    __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, data_index);
     __ ldr(LR, compiler::FieldAddress(
                    CODE_REG,
                    Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
@@ -1139,11 +1053,9 @@
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
-    __ LoadDoubleWordFromPoolOffset(R5, LR,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, LR, data_index);
   } else {
-    __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                    ObjectPool::element_offset(data_index));
+    __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, data_index);
     const intptr_t entry_point_offset =
         entry_kind == Code::EntryKind::kNormal
             ? compiler::target::Code::entry_point_offset(
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 3f867c5..72a326f 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -663,93 +663,13 @@
   __ Bind(&done);
 }
 
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - RAX: object.
-// - RBX: destination type (if non-constant).
-// - RDX: instantiator type arguments or raw_null.
-// - RCX: function type arguments or raw_null.
-// Returns:
-// - object in RAX for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
-                                                 TokenPosition token_pos,
-                                                 intptr_t deopt_id,
-                                                 const String& dst_name,
-                                                 LocationSummary* locs) {
-  ASSERT(!token_pos.IsClassifying());
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
-  if (locs->in(1).IsConstant()) {
-    const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-    ASSERT(dst_type.IsFinalized());
-
-    if (dst_type.IsTopTypeForSubtyping()) return;  // No code needed.
-
-    GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
-                                               deopt_id, dst_name, locs);
-    return;
-  } else {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
-    CompileType* receiver_type,
-    TokenPosition token_pos,
-    intptr_t deopt_id,
-    const String& dst_name,
-    LocationSummary* locs) {
-  ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-  // We must have a constant dst_type for generating a call to the stub.
-  ASSERT(locs->in(1).IsConstant());
-  const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
-  // If the dst_type is instantiated we know the target TTS stub at
-  // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call =
-      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-  const Register kScratchReg =
-      dst_type.IsTypeParameter() ? RSI : TypeTestABI::kDstTypeReg;
-
-  const Register kRegToCall = use_pc_relative_call ? kNoRegister : kScratchReg;
-
-  compiler::Label done;
-
-  GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
-                                             kRegToCall, kScratchReg, &done);
-
-  // We use 2 consecutive entries in the pool for the subtype cache and the
-  // destination name.  The second entry, namely [dst_name] seems to be unused,
-  // but it will be used by the code throwing a TypeError if the type test fails
-  // (see runtime/vm/runtime_entry.cc:TypeCheck).  It will use pattern matching
-  // on the call site to find out at which pool index the destination name is
-  // located.
-  const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
-      Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index) - kHeapObjectTag;
-  const intptr_t dst_name_index = __ object_pool_builder().AddObject(
-      dst_name, compiler::ObjectPoolBuilderEntry::kPatchable);
-  ASSERT((sub_type_cache_index + 1) == dst_name_index);
-  ASSERT(__ constant_pool_allowed());
-
-  __ movq(TypeTestABI::kSubtypeTestCacheReg,
-          compiler::Address(PP, sub_type_cache_offset));
-  if (use_pc_relative_call) {
-    __ GenerateUnRelocatedPcRelativeCall();
-    AddPcRelativeTTSCallTypeTarget(dst_type);
-  } else {
-    __ call(compiler::FieldAddress(
-        kRegToCall, AbstractType::type_test_stub_entry_point_offset()));
-  }
-  EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
-  __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+                                                intptr_t sub_type_cache_index) {
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
+  __ Call(compiler::FieldAddress(
+      reg_to_call,
+      compiler::target::AbstractType::type_test_stub_entry_point_offset()));
 }
 
 void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 93da803..43937b0 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2719,6 +2719,7 @@
     case Slot::Kind::kArgumentsDescriptor_positional_count:
     case Slot::Kind::kArgumentsDescriptor_count:
     case Slot::Kind::kArgumentsDescriptor_size:
+    case Slot::Kind::kArrayElement:
     case Slot::Kind::kTypeArguments:
     case Slot::Kind::kTypedDataView_offset_in_bytes:
     case Slot::Kind::kTypedDataView_data:
@@ -2730,8 +2731,12 @@
     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::kClosureData_default_type_arguments_info:
     case Slot::Kind::kCapturedVariable:
     case Slot::Kind::kDartField:
+    case Slot::Kind::kFunction_data:
+    case Slot::Kind::kFunction_kind_tag:
     case Slot::Kind::kFunction_packed_fields:
     case Slot::Kind::kFunction_parameter_names:
     case Slot::Kind::kFunction_parameter_types:
@@ -2739,7 +2744,9 @@
     case Slot::Kind::kPointerBase_data_field:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
-    case Slot::Kind::kArrayElement:
+    case Slot::Kind::kTypeParameter_bound:
+    case Slot::Kind::kTypeParameter_flags:
+    case Slot::Kind::kTypeParameter_name:
     case Slot::Kind::kUnhandledException_exception:
     case Slot::Kind::kUnhandledException_stacktrace:
       return false;
@@ -2756,6 +2763,7 @@
   switch (cid) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return true;
     default:
       return false;
@@ -3779,6 +3787,9 @@
 
 BoxInstr* BoxInstr::Create(Representation from, Value* value) {
   switch (from) {
+    case kUnboxedUint8:
+      return new BoxUint8Instr(value);
+
     case kUnboxedInt32:
       return new BoxInt32Instr(value);
 
@@ -4310,6 +4321,18 @@
 void LoadFieldInstr::EmitNativeCodeForInitializerCall(
     FlowGraphCompiler* compiler) {
   ASSERT(calls_initializer());
+
+  if (throw_exception_on_initialization()) {
+    ThrowErrorSlowPathCode* slow_path =
+        new LateInitializationErrorSlowPath(this, compiler->CurrentTryIndex());
+    compiler->AddSlowPathCode(slow_path);
+
+    const Register result_reg = locs()->out(0).reg();
+    __ CompareObject(result_reg, Object::sentinel());
+    __ BranchIf(EQUAL, slow_path->entry_label());
+    return;
+  }
+
   ASSERT(locs()->in(0).reg() == InitInstanceFieldABI::kInstanceReg);
   ASSERT(locs()->out(0).reg() == InitInstanceFieldABI::kResultReg);
   ASSERT(slot().IsDartField());
@@ -5267,36 +5290,40 @@
 
 LocationSummary* AssertSubtypeInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
-  if (!sub_type()->BindsToConstant() || !super_type()->BindsToConstant()) {
-    // TODO(dartbug.com/40813): Handle setting up the non-constant case.
-    UNREACHABLE();
-  }
-  const intptr_t kNumInputs = 4;
+  const intptr_t kNumInputs = 5;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
-  summary->set_in(0, Location::RegisterLocation(
-                         TypeTestABI::kInstantiatorTypeArgumentsReg));
+  summary->set_in(kInstantiatorTAVPos,
+                  Location::RegisterLocation(
+                      AssertSubtypeABI::kInstantiatorTypeArgumentsReg));
   summary->set_in(
-      1, Location::RegisterLocation(TypeTestABI::kFunctionTypeArgumentsReg));
-  summary->set_in(2,
-                  Location::Constant(sub_type()->definition()->AsConstant()));
-  summary->set_in(3,
-                  Location::Constant(super_type()->definition()->AsConstant()));
+      kFunctionTAVPos,
+      Location::RegisterLocation(AssertSubtypeABI::kFunctionTypeArgumentsReg));
+  summary->set_in(kSubTypePos,
+                  Location::RegisterLocation(AssertSubtypeABI::kSubTypeReg));
+  summary->set_in(kSuperTypePos,
+                  Location::RegisterLocation(AssertSubtypeABI::kSuperTypeReg));
+  summary->set_in(kDstNamePos,
+                  Location::RegisterLocation(AssertSubtypeABI::kDstNameReg));
   return summary;
 }
 
 void AssertSubtypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ PushRegister(locs()->in(0).reg());
-  __ PushRegister(locs()->in(1).reg());
-  __ PushObject(locs()->in(2).constant());
-  __ PushObject(locs()->in(3).constant());
-  __ PushObject(dst_name());
-
+#if defined(TARGET_ARCH_IA32)
+  __ PushRegister(AssertSubtypeABI::kInstantiatorTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kFunctionTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kSubTypeReg);
+  __ PushRegister(AssertSubtypeABI::kSuperTypeReg);
+  __ PushRegister(AssertSubtypeABI::kDstNameReg);
   compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
                                 kSubtypeCheckRuntimeEntry, 5, locs());
 
   __ Drop(5);
+#else
+  compiler->GenerateStubCall(token_pos(), StubCode::AssertSubtype(),
+                             PcDescriptorsLayout::kOther, locs());
+#endif
 }
 
 LocationSummary* DeoptimizeInstr::MakeLocationSummary(Zone* zone,
@@ -5358,7 +5385,9 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new (zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSharedSlowPath);
+      zone, kNumInputs, kNumTemps,
+      UseSharedSlowPathStub(opt) ? LocationSummary::kCallOnSharedSlowPath
+                                 : LocationSummary::kCallOnSlowPath);
   locs->set_in(kLengthPos,
                Location::RegisterLocation(RangeErrorABI::kLengthReg));
   locs->set_in(kIndexPos, Location::RegisterLocation(RangeErrorABI::kIndexReg));
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index a6b4115..6e4fe72 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -504,6 +504,7 @@
   M(UnboxUint32, kNoGC)                                                        \
   M(BoxInt32, _)                                                               \
   M(UnboxInt32, kNoGC)                                                         \
+  M(BoxUint8, _)                                                               \
   M(IntConverter, _)                                                           \
   M(BitCast, _)                                                                \
   M(Deoptimize, kNoGC)                                                         \
@@ -3549,34 +3550,42 @@
 // Checks that one type is a subtype of another (e.g. for type parameter bounds
 // checking). Throws a TypeError otherwise. Both types are instantiated at
 // runtime as necessary.
-class AssertSubtypeInstr : public TemplateInstruction<4, Throws, Pure> {
+class AssertSubtypeInstr : public TemplateInstruction<5, Throws, Pure> {
  public:
+  enum {
+    kInstantiatorTAVPos = 0,
+    kFunctionTAVPos = 1,
+    kSubTypePos = 2,
+    kSuperTypePos = 3,
+    kDstNamePos = 4,
+  };
+
   AssertSubtypeInstr(TokenPosition token_pos,
                      Value* instantiator_type_arguments,
                      Value* function_type_arguments,
                      Value* sub_type,
                      Value* super_type,
-                     const String& dst_name,
+                     Value* dst_name,
                      intptr_t deopt_id)
-      : TemplateInstruction(deopt_id),
-        token_pos_(token_pos),
-        dst_name_(String::ZoneHandle(dst_name.raw())) {
-    ASSERT(!dst_name.IsNull());
-    SetInputAt(0, instantiator_type_arguments);
-    SetInputAt(1, function_type_arguments);
-    SetInputAt(2, sub_type);
-    SetInputAt(3, super_type);
+      : TemplateInstruction(deopt_id), token_pos_(token_pos) {
+    SetInputAt(kInstantiatorTAVPos, instantiator_type_arguments);
+    SetInputAt(kFunctionTAVPos, function_type_arguments);
+    SetInputAt(kSubTypePos, sub_type);
+    SetInputAt(kSuperTypePos, super_type);
+    SetInputAt(kDstNamePos, dst_name);
   }
 
   DECLARE_INSTRUCTION(AssertSubtype);
 
-  Value* instantiator_type_arguments() const { return inputs_[0]; }
-  Value* function_type_arguments() const { return inputs_[1]; }
-  Value* sub_type() const { return inputs_[2]; }
-  Value* super_type() const { return inputs_[3]; }
+  Value* instantiator_type_arguments() const {
+    return inputs_[kInstantiatorTAVPos];
+  }
+  Value* function_type_arguments() const { return inputs_[kFunctionTAVPos]; }
+  Value* sub_type() const { return inputs_[kSubTypePos]; }
+  Value* super_type() const { return inputs_[kSuperTypePos]; }
+  Value* dst_name() const { return inputs_[kDstNamePos]; }
 
   virtual TokenPosition token_pos() const { return token_pos_; }
-  const String& dst_name() const { return dst_name_; }
 
   virtual bool ComputeCanDeoptimize() const {
     return !CompilerState::Current().is_aot();
@@ -3592,7 +3601,6 @@
 
  private:
   const TokenPosition token_pos_;
-  const String& dst_name_;
 
   DISALLOW_COPY_AND_ASSIGN(AssertSubtypeInstr);
 };
@@ -6439,10 +6447,17 @@
       : TemplateDefinition(deopt_id),
         slot_(slot),
         token_pos_(token_pos),
-        calls_initializer_(calls_initializer) {
+        calls_initializer_(calls_initializer),
+        throw_exception_on_initialization_(false) {
     ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
     ASSERT(!calls_initializer || slot.IsDartField());
     SetInputAt(0, instance);
+    if (calls_initializer_) {
+      const Field& field = slot.field();
+      throw_exception_on_initialization_ = !field.needs_load_guard() &&
+                                           field.is_late() &&
+                                           !field.has_initializer();
+    }
   }
 
   Value* instance() const { return inputs_[0]; }
@@ -6453,6 +6468,15 @@
   bool calls_initializer() const { return calls_initializer_; }
   void set_calls_initializer(bool value) { calls_initializer_ = value; }
 
+  bool throw_exception_on_initialization() const {
+    return throw_exception_on_initialization_;
+  }
+
+  // Slow path is used if load throws exception on initialization.
+  virtual bool UseSharedSlowPathStub(bool is_optimizing) const {
+    return SlowPathSharingSupported(is_optimizing);
+  }
+
   virtual Representation representation() const;
 
   // Returns whether this instruction is an unboxed load from a _boxed_ Dart
@@ -6470,11 +6494,7 @@
   virtual bool ComputeCanDeoptimize() const { return calls_initializer(); }
 
   virtual bool HasUnknownSideEffects() const {
-    if (calls_initializer()) {
-      const Field& field = slot().field();
-      return field.needs_load_guard() || field.has_initializer();
-    }
-    return false;
+    return calls_initializer() && !throw_exception_on_initialization();
   }
 
   virtual bool CanTriggerGC() const { return calls_initializer(); }
@@ -6522,6 +6542,7 @@
   const Slot& slot_;
   const TokenPosition token_pos_;
   bool calls_initializer_;
+  bool throw_exception_on_initialization_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
 };
@@ -6574,15 +6595,9 @@
         token_pos_(token_pos),
         instantiator_class_(instantiator_class),
         function_(function) {
-    // These asserts hold for current uses.
-    ASSERT(type_arguments->BindsToConstant());
-    // Note: Non-dynamic uses never provide a null TypeArguments value.
-    ASSERT(!type_arguments->BoundConstant().IsNull());
-    ASSERT(type_arguments->BoundConstant().IsTypeArguments());
-    ASSERT(instantiator_class.IsZoneHandle());
-    ASSERT(!instantiator_class.IsNull());
-    ASSERT(function.IsZoneHandle());
-    ASSERT(!function.IsNull());
+    ASSERT(instantiator_class.IsReadOnlyHandle() ||
+           instantiator_class.IsZoneHandle());
+    ASSERT(function.IsReadOnlyHandle() || function.IsZoneHandle());
     SetInputAt(0, instantiator_type_arguments);
     SetInputAt(1, function_type_arguments);
     SetInputAt(2, type_arguments);
@@ -6605,20 +6620,35 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  const Code& GetStub() const {
-    bool with_runtime_check;
-    ASSERT(!instantiator_class().IsNull());
-    ASSERT(!function().IsNull());
-    ASSERT(type_arguments()->BindsToConstant());
-    ASSERT(type_arguments()->BoundConstant().IsTypeArguments());
+  bool CanShareInstantiatorTypeArguments(
+      bool* with_runtime_check = nullptr) const {
+    if (instantiator_class().IsNull() || !type_arguments()->BindsToConstant() ||
+        !type_arguments()->BoundConstant().IsTypeArguments()) {
+      return false;
+    }
     const auto& type_args =
         TypeArguments::Cast(type_arguments()->BoundConstant());
-    if (type_args.CanShareInstantiatorTypeArguments(instantiator_class(),
-                                                    &with_runtime_check)) {
+    return type_args.CanShareInstantiatorTypeArguments(instantiator_class(),
+                                                       with_runtime_check);
+  }
+
+  bool CanShareFunctionTypeArguments(bool* with_runtime_check = nullptr) const {
+    if (function().IsNull() || !type_arguments()->BindsToConstant() ||
+        !type_arguments()->BoundConstant().IsTypeArguments()) {
+      return false;
+    }
+    const auto& type_args =
+        TypeArguments::Cast(type_arguments()->BoundConstant());
+    return type_args.CanShareFunctionTypeArguments(function(),
+                                                   with_runtime_check);
+  }
+
+  const Code& GetStub() const {
+    bool with_runtime_check;
+    if (CanShareInstantiatorTypeArguments(&with_runtime_check)) {
       ASSERT(with_runtime_check);
       return StubCode::InstantiateTypeArgumentsMayShareInstantiatorTA();
-    } else if (type_args.CanShareFunctionTypeArguments(function(),
-                                                       &with_runtime_check)) {
+    } else if (CanShareFunctionTypeArguments(&with_runtime_check)) {
       ASSERT(with_runtime_check);
       return StubCode::InstantiateTypeArgumentsMayShareFunctionTA();
     }
@@ -6816,6 +6846,18 @@
   DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr);
 };
 
+class BoxUint8Instr : public BoxIntegerInstr {
+ public:
+  explicit BoxUint8Instr(Value* value)
+      : BoxIntegerInstr(kUnboxedUint8, value) {}
+
+  virtual bool ValueFitsSmi() const { return true; }
+
+  DECLARE_INSTRUCTION(BoxUint8)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BoxUint8Instr);
+};
 class BoxInteger32Instr : public BoxIntegerInstr {
  public:
   BoxInteger32Instr(Representation representation, Value* value)
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index a91b6e3..cbedc5b 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1717,6 +1717,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -2012,7 +2013,8 @@
     default: {
       const Register result = locs()->out(0).reg();
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ ldr(result, element_address);
       break;
     }
@@ -3197,35 +3199,17 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? (FLAG_precompiled_mode ? 0 : 1)
-                 : (IsPotentialUnboxedDartFieldLoad() ? 3 : 0));
-
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
+    ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     const size_t value_size =
         RepresentationUtils::ValueSize(slot().representation());
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (value_size <= compiler::target::kWordSize) {
       locs->set_out(0, Location::RequiresRegister());
     } else {
@@ -3233,23 +3217,60 @@
       locs->set_out(0, Location::Pair(Location::RequiresRegister(),
                                       Location::RequiresRegister()));
     }
+
   } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
+    ASSERT(!slot().field().is_non_nullable_integer());
+
+    const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (!FLAG_precompiled_mode) {
       locs->set_temp(0, Location::RequiresRegister());
     }
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 3;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, opt ? Location::RequiresFpuRegister()
                           : Location::FpuRegisterLocation(Q1));
     locs->set_temp(1, Location::RequiresRegister());
     locs->set_temp(2, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      const bool using_shared_stub = UseSharedSlowPathStub(opt);
+      const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+      locs = new (zone) LocationSummary(
+          zone, kNumInputs, kNumTemps,
+          using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                            : LocationSummary::kCallOnSlowPath);
+      if (using_shared_stub) {
+        locs->set_temp(0, Location::RegisterLocation(
+                              LateInitializationErrorABI::kFieldReg));
+      }
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
   return locs;
@@ -3281,6 +3302,13 @@
         __ LoadFieldFromOffset(kWord, result, instance_reg, OffsetInBytes());
         break;
       }
+      case kUnboxedUint8: {
+        const Register result = locs()->out(0).reg();
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ LoadFieldFromOffset(kUnsignedByte, result, instance_reg,
+                               OffsetInBytes());
+        break;
+      }
       default:
         UNIMPLEMENTED();
         break;
@@ -3483,27 +3511,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  const Register instantiator_type_args_reg = locs()->in(0).reg();
-  const Register function_type_args_reg = locs()->in(1).reg();
-  const Register result_reg = locs()->out(0).reg();
-
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
+  const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  const intptr_t len = type_args.Length();
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
+    //
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -4907,6 +4942,26 @@
   __ Bind(&done);
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+
+  __ AndImmediate(out, value, 0xff);
+  __ SmiTag(out);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
@@ -6888,12 +6943,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -7051,12 +7103,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 7ab2f6d..7cb909a 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1556,6 +1556,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -1712,7 +1713,8 @@
       break;
     default:
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ ldr(result, element_address);
       break;
   }
@@ -2733,50 +2735,69 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? (FLAG_precompiled_mode ? 0 : 1)
-                 : (IsPotentialUnboxedDartFieldLoad() ? 1 : 0));
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
     ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     ASSERT(RepresentationUtils::ValueSize(slot().representation()) <=
            compiler::target::kWordSize);
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
     ASSERT(!slot().field().is_non_nullable_integer());
+
+    const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (!FLAG_precompiled_mode) {
       locs->set_temp(0, Location::RequiresRegister());
     }
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 1;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      const bool using_shared_stub = UseSharedSlowPathStub(opt);
+      const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+      locs = new (zone) LocationSummary(
+          zone, kNumInputs, kNumTemps,
+          using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                            : LocationSummary::kCallOnSlowPath);
+      if (using_shared_stub) {
+        locs->set_temp(0, Location::RegisterLocation(
+                              LateInitializationErrorABI::kFieldReg));
+      }
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
   return locs;
@@ -2800,6 +2821,11 @@
         __ LoadFieldFromOffset(result_reg, instance_reg, OffsetInBytes(),
                                kUnsignedWord);
         break;
+      case kUnboxedUint8:
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ LoadFieldFromOffset(result_reg, instance_reg, OffsetInBytes(),
+                               kUnsignedByte);
+        break;
       default:
         UNIMPLEMENTED();
         break;
@@ -2984,27 +3010,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  const Register instantiator_type_args_reg = locs()->in(0).reg();
-  const Register function_type_args_reg = locs()->in(1).reg();
-  const Register result_reg = locs()->out(0).reg();
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
   const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
     compiler::Label non_null_type_args;
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -3017,6 +3050,7 @@
     __ Bind(&non_null_type_args);
   }
   // Lookup cache in stub before calling runtime.
+
   compiler->GenerateStubCall(token_pos(), GetStub(),
                              PcDescriptorsLayout::kOther, locs());
   __ Bind(&type_arguments_instantiated);
@@ -4140,6 +4174,30 @@
   __ Bind(&done);
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  ASSERT(kSmiTagSize == 1);
+  const intptr_t shift = kBitsPerWord - kBitsPerByte;
+  // TODO(vegorov) implement and use UBFM/SBFM for this.
+  __ LslImmediate(out, value, shift);
+  __ LsrImmediate(out, out, shift - kSmiTagSize);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
@@ -5638,8 +5696,6 @@
 
 class Int64DivideSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
                       Register divisor,
                       Range* divisor_range,
@@ -5648,7 +5704,6 @@
                       intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               kNumberOfArguments,
                                try_index),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
@@ -5992,12 +6047,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -6124,12 +6176,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 8344e7a..54356ba 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1419,6 +1419,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -1600,7 +1601,8 @@
     default: {
       const Register result = locs()->out(0).reg();
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ movl(result, element_address);
       break;
     }
@@ -2531,35 +2533,17 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? 1
-                 : ((IsPotentialUnboxedDartFieldLoad()) ? 2 : 0));
-
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
     ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     const size_t value_size =
         RepresentationUtils::ValueSize(slot().representation());
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (value_size <= compiler::target::kWordSize) {
       locs->set_out(0, Location::RequiresRegister());
     } else {
@@ -2567,23 +2551,51 @@
       locs->set_out(0, Location::Pair(Location::RequiresRegister(),
                                       Location::RequiresRegister()));
     }
+
   } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 2;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, opt ? Location::RequiresFpuRegister()
                           : Location::FpuRegisterLocation(XMM1));
     locs->set_temp(1, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      ASSERT(!UseSharedSlowPathStub(opt));
+      const intptr_t kNumTemps = 0;
+      locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                        LocationSummary::kCallOnSlowPath);
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
-
   return locs;
 }
 
@@ -2612,6 +2624,13 @@
         __ movl(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
         break;
       }
+      case kUnboxedUint8: {
+        const Register result = locs()->out(0).reg();
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ movzxb(result,
+                  compiler::FieldAddress(instance_reg, OffsetInBytes()));
+        break;
+      }
       default:
         UNIMPLEMENTED();
         break;
@@ -2779,27 +2798,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  Register instantiator_type_args_reg = locs()->in(0).reg();
-  Register function_type_args_reg = locs()->in(1).reg();
-  Register result_reg = locs()->out(0).reg();
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
   const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
     compiler::Label non_null_type_args;
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -3902,6 +3928,28 @@
   __ Bind(&done);
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  __ MoveRegister(out, value);
+  __ andl(out, compiler::Immediate(0xff));
+  __ SmiTag(out);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5898,12 +5946,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -6063,12 +6108,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 62b7000..6a3fc15 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -452,8 +452,9 @@
   sub_type()->PrintTo(f);
   f->AddString(", ");
   super_type()->PrintTo(f);
-  f->Printf(", '%s', ", dst_name().ToCString());
-  f->AddString(" instantiator_type_args(");
+  f->AddString(", ");
+  dst_name()->PrintTo(f);
+  f->AddString(", instantiator_type_args(");
   instantiator_type_arguments()->PrintTo(f);
   f->AddString("), function_type_args(");
   function_type_arguments()->PrintTo(f);
@@ -926,6 +927,8 @@
       return "double";
     case kUnboxedFloat:
       return "float";
+    case kUnboxedUint8:
+      return "uint8";
     case kUnboxedInt32:
       return "int32";
     case kUnboxedUint32:
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 1cd2a74..cdc4f79 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -2,6 +2,7 @@
 // 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.
 
+#include "platform/globals.h"
 #include "vm/globals.h"  // Needed here to get TARGET_ARCH_X64.
 #if defined(TARGET_ARCH_X64)
 
@@ -1552,6 +1553,7 @@
   switch (class_id_) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kTagged;
     case kOneByteStringCid:
     case kTwoByteStringCid:
@@ -1701,7 +1703,8 @@
       break;
     default:
       ASSERT(representation() == kTagged);
-      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+      ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+             (class_id() == kTypeArgumentsCid));
       __ movq(result, element_address);
       break;
   }
@@ -2752,53 +2755,71 @@
 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps =
-      (slot().representation() != kTagged)
-          ? 0
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? (FLAG_precompiled_mode ? 0 : 1)
-                 : (IsPotentialUnboxedDartFieldLoad() ? 2 : 0));
-  const auto contains_call =
-      (slot().representation() != kTagged)
-          ? LocationSummary::kNoCall
-          : ((IsUnboxedDartFieldLoad() && opt)
-                 ? LocationSummary::kNoCall
-                 : (IsPotentialUnboxedDartFieldLoad()
-                        ? LocationSummary::kCallOnSlowPath
-                        : (calls_initializer() ? LocationSummary::kCall
-                                               : LocationSummary::kNoCall)));
-
-  LocationSummary* locs =
-      new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
-  locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
-                                            InitInstanceFieldABI::kInstanceReg)
-                                      : Location::RequiresRegister());
-
+  LocationSummary* locs = nullptr;
   if (slot().representation() != kTagged) {
     ASSERT(!calls_initializer());
     ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
     ASSERT(RepresentationUtils::ValueSize(slot().representation()) <=
            compiler::target::kWordSize);
+
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
-  }
-  if (IsUnboxedDartFieldLoad() && opt) {
+
+  } else if (IsUnboxedDartFieldLoad() && opt) {
     ASSERT(!calls_initializer());
     ASSERT(!slot().field().is_non_nullable_integer());
+
+    const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     if (!FLAG_precompiled_mode) {
       locs->set_temp(0, Location::RequiresRegister());
     }
     locs->set_out(0, Location::RequiresFpuRegister());
+
   } else if (IsPotentialUnboxedDartFieldLoad()) {
     ASSERT(!calls_initializer());
+    const intptr_t kNumTemps = 2;
+    locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+                                      LocationSummary::kCallOnSlowPath);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_temp(0, opt ? Location::RequiresFpuRegister()
                           : Location::FpuRegisterLocation(XMM1));
     locs->set_temp(1, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
+
   } else if (calls_initializer()) {
-    locs->set_out(0,
-                  Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    if (throw_exception_on_initialization()) {
+      const bool using_shared_stub = UseSharedSlowPathStub(opt);
+      const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+      locs = new (zone) LocationSummary(
+          zone, kNumInputs, kNumTemps,
+          using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                            : LocationSummary::kCallOnSlowPath);
+      if (using_shared_stub) {
+        locs->set_temp(0, Location::RegisterLocation(
+                              LateInitializationErrorABI::kFieldReg));
+      }
+      locs->set_in(0, Location::RequiresRegister());
+      locs->set_out(0, Location::RequiresRegister());
+    } else {
+      const intptr_t kNumTemps = 0;
+      locs = new (zone)
+          LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+      locs->set_in(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+      locs->set_out(
+          0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+    }
   } else {
+    const intptr_t kNumTemps = 0;
+    locs = new (zone)
+        LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    locs->set_in(0, Location::RequiresRegister());
     locs->set_out(0, Location::RequiresRegister());
   }
   return locs;
@@ -2821,6 +2842,12 @@
         __ Comment("UnboxedUint32LoadFieldInstr");
         __ movl(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
         break;
+      case kUnboxedUint8: {
+        __ Comment("UnboxedUint8LoadFieldInstr");
+        __ movzxb(result,
+                  compiler::FieldAddress(instance_reg, OffsetInBytes()));
+        break;
+      }
       default:
         UNIMPLEMENTED();
         break;
@@ -3013,27 +3040,34 @@
 
 void InstantiateTypeArgumentsInstr::EmitNativeCode(
     FlowGraphCompiler* compiler) {
-  Register instantiator_type_args_reg = locs()->in(0).reg();
-  Register function_type_args_reg = locs()->in(1).reg();
-  Register result_reg = locs()->out(0).reg();
-
-  compiler::Label type_arguments_instantiated;
-  ASSERT(!instantiator_class().IsNull());
-  ASSERT(type_arguments()->BindsToConstant());
+  // We should never try and instantiate a TAV known at compile time to be null,
+  // so we can use a null value below for the dynamic case.
+  ASSERT(!type_arguments()->BindsToConstant() ||
+         !type_arguments()->BoundConstant().IsNull());
   const auto& type_args =
-      TypeArguments::Cast(type_arguments()->BoundConstant());
-  // 'instantiator_type_args_reg' is a TypeArguments object (or null).
-  // 'function_type_args_reg' is a TypeArguments object (or null).
-
-  // If both the instantiator and function type arguments are null and if the
-  // type argument vector instantiated from null becomes a vector of dynamic,
-  // then use null as the type arguments.
+      type_arguments()->BindsToConstant()
+          ? TypeArguments::Cast(type_arguments()->BoundConstant())
+          : Object::null_type_arguments();
   const intptr_t len = type_args.Length();
   const bool can_function_type_args_be_null =
       function_type_arguments()->CanBe(Object::null_object());
-  if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
-      can_function_type_args_be_null) {
+
+  compiler::Label type_arguments_instantiated;
+  if (type_args.IsNull()) {
+    // Currently we only create dynamic InstantiateTypeArguments instructions
+    // in cases where we know the type argument is uninstantiated at runtime,
+    // so there are no extra checks needed to call the stub successfully.
+  } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+             can_function_type_args_be_null) {
+    // If both the instantiator and function type arguments are null and if the
+    // type argument vector instantiated from null becomes a vector of dynamic,
+    // then use null as the type arguments.
     compiler::Label non_null_type_args;
+    // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+    // 'function_type_args_reg' is a TypeArguments object (or null).
+    const Register instantiator_type_args_reg = locs()->in(0).reg();
+    const Register function_type_args_reg = locs()->in(1).reg();
+    const Register result_reg = locs()->out(0).reg();
     ASSERT(result_reg != instantiator_type_args_reg &&
            result_reg != function_type_args_reg);
     __ LoadObject(result_reg, Object::null_object());
@@ -4415,6 +4449,27 @@
   }
 }
 
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+                                                    bool opt) const {
+  ASSERT(from_representation() == kUnboxedUint8);
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  __ movzxb(out, value);
+  __ SmiTag(out);
+}
+
 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   ASSERT((from_representation() == kUnboxedInt32) ||
@@ -5935,15 +5990,12 @@
 
 class Int64DivideSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
                       Register divisor,
                       Range* divisor_range,
                       intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               kNumberOfArguments,
                                try_index),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
@@ -6358,12 +6410,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "int64 shift"; }
@@ -6488,12 +6537,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  static const intptr_t kNumberOfArguments = 0;
-
   ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
       : ThrowErrorSlowPathCode(instruction,
                                kArgumentErrorUnboxedInt64RuntimeEntry,
-                               kNumberOfArguments,
                                try_index) {}
 
   const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 8f4c37f..1d29a39 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -27,6 +27,7 @@
 // All unboxed integer representations.
 // Format: (representation name, is unsigned, value type)
 #define FOR_EACH_INTEGER_REPRESENTATION_KIND(M)                                \
+  M(UnboxedUint8, true, uint8_t)                                               \
   M(UnboxedInt32, false, int32_t)                                              \
   M(UnboxedUint32, true, uint32_t)                                             \
   M(UnboxedInt64, false, int64_t)
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index f3a0880..4018099 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2670,6 +2670,7 @@
     case kTagged:
       return RangeBoundary::kRangeBoundarySmi;
     case kUnboxedInt32:
+    case kUnboxedUint8:  // Overapproximate Uint8 as Int32.
       return RangeBoundary::kRangeBoundaryInt32;
     case kUnboxedInt64:
     case kUnboxedUint32:  // Overapproximate Uint32 as Int64.
@@ -2689,12 +2690,17 @@
           RangeBoundary::FromConstant(compiler::target::Array::kMaxElements));
       break;
 
-    case Slot::Kind::kTypeArguments_length:
     case Slot::Kind::kTypedDataBase_length:
     case Slot::Kind::kTypedDataView_offset_in_bytes:
       *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
       break;
 
+    case Slot::Kind::kTypeArguments_length:
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(
+                         compiler::target::TypeArguments::kMaxElements));
+      break;
+
     case Slot::Kind::kString_length:
       *range = Range(
           RangeBoundary::FromConstant(0),
@@ -2717,6 +2723,8 @@
     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_parameter_names:
     case Slot::Kind::kFunction_parameter_types:
     case Slot::Kind::kFunction_type_parameters:
@@ -2724,6 +2732,8 @@
     case Slot::Kind::kTypedDataView_data:
     case Slot::Kind::kType_arguments:
     case Slot::Kind::kTypeArgumentsIndex:
+    case Slot::Kind::kTypeParameter_bound:
+    case Slot::Kind::kTypeParameter_name:
     case Slot::Kind::kUnhandledException_exception:
     case Slot::Kind::kUnhandledException_stacktrace:
       // Not an integer valued field.
@@ -2735,7 +2745,9 @@
       UNREACHABLE();
       break;
 
+    case Slot::Kind::kFunction_kind_tag:
     case Slot::Kind::kFunction_packed_fields:
+    case Slot::Kind::kTypeParameter_flags:
       *range = Range::Full(RepresentationToRangeSize(slot().representation()));
       break;
 
@@ -2752,6 +2764,12 @@
     case Slot::Kind::kArgumentsDescriptor_size:
       *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
       break;
+
+    case Slot::Kind::kClosureData_default_type_arguments_info:
+      *range = Range(
+          RangeBoundary::FromConstant(0),
+          RangeBoundary::FromConstant(
+              (1 << Function::NumParentTypeParametersField::kNextBit) - 1));
   }
 }
 
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index 9b03ce9..1c348aa 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -179,6 +179,9 @@
     case kImmutableArrayCid:
       return GetNativeSlot(Kind::kArray_length);
 
+    case kTypeArgumentsCid:
+      return GetNativeSlot(Kind::kTypeArguments_length);
+
     default:
       UNREACHABLE();
       return GetNativeSlot(Kind::kArray_length);
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 3a76cf1..8c24078 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -56,6 +56,8 @@
   V(Closure, ClosureLayout, instantiator_type_arguments, TypeArguments, FINAL) \
   V(Closure, ClosureLayout, delayed_type_arguments, TypeArguments, FINAL)      \
   V(Closure, ClosureLayout, function_type_arguments, TypeArguments, FINAL)     \
+  V(ClosureData, ClosureDataLayout, default_type_arguments, TypeArguments,     \
+    FINAL)                                                                     \
   V(Function, FunctionLayout, type_parameters, TypeArguments, FINAL)           \
   V(Type, TypeLayout, arguments, TypeArguments, FINAL)
 
@@ -77,6 +79,8 @@
   V(Closure, ClosureLayout, function, Function, FINAL)                         \
   V(Closure, ClosureLayout, context, Context, FINAL)                           \
   V(Closure, ClosureLayout, hash, Context, VAR)                                \
+  V(ClosureData, ClosureDataLayout, default_type_arguments_info, Smi, FINAL)   \
+  V(Function, FunctionLayout, data, Dynamic, FINAL)                            \
   V(Function, FunctionLayout, parameter_names, Array, FINAL)                   \
   V(Function, FunctionLayout, parameter_types, Array, FINAL)                   \
   V(GrowableObjectArray, GrowableObjectArrayLayout, length, Smi, VAR)          \
@@ -96,6 +100,8 @@
   V(ArgumentsDescriptor, ArrayLayout, size, Smi, FINAL)                        \
   V(PointerBase, PointerBaseLayout, data_field, Dynamic, FINAL)                \
   V(TypeArguments, TypeArgumentsLayout, length, Smi, FINAL)                    \
+  V(TypeParameter, TypeParameterLayout, bound, Dynamic, FINAL)                 \
+  V(TypeParameter, TypeParameterLayout, name, Dynamic, FINAL)                  \
   V(UnhandledException, UnhandledExceptionLayout, exception, Dynamic, FINAL)   \
   V(UnhandledException, UnhandledExceptionLayout, stacktrace, Dynamic, FINAL)
 
@@ -115,7 +121,9 @@
 //
 // Note: As the underlying field is unboxed, these slots cannot be nullable.
 #define UNBOXED_NATIVE_SLOTS_LIST(V)                                           \
-  V(Function, FunctionLayout, packed_fields, Uint32, FINAL)
+  V(Function, FunctionLayout, kind_tag, Uint32, FINAL)                         \
+  V(Function, FunctionLayout, packed_fields, Uint32, FINAL)                    \
+  V(TypeParameter, TypeParameterLayout, flags, Uint8, FINAL)
 
 // For uses that do not need the exact_type (boxed) or representation (unboxed)
 // or whether a boxed native slot is nullable. (Generally, such users only need
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 3877f45..8d96744 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1815,6 +1815,10 @@
       }
       return ComputeArrayElementType(array());
 
+    case kTypeArgumentsCid:
+      return CompileType::FromAbstractType(Object::dynamic_type(),
+                                           /*is_nullable=*/false);
+
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return CompileType::FromCid(kDoubleCid);
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 13b220d..06d5d73 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -367,27 +367,18 @@
   }
 }
 
-Fragment BaseFlowGraphBuilder::LoadIndexed(intptr_t index_scale) {
+Fragment BaseFlowGraphBuilder::LoadIndexed(classid_t class_id,
+                                           intptr_t index_scale,
+                                           bool index_unboxed) {
   Value* index = Pop();
+  // A C pointer if index_unboxed, otherwise a boxed Dart value.
   Value* array = Pop();
+
+  // We use C behavior when dereferencing pointers, so we use aligned access in
+  // all cases.
   LoadIndexedInstr* instr = new (Z) LoadIndexedInstr(
-      array, index, /*index_unboxed=*/false, index_scale, kArrayCid,
-      kAlignedAccess, DeoptId::kNone, TokenPosition::kNoSource);
-  Push(instr);
-  return Fragment(instr);
-}
-
-Fragment BaseFlowGraphBuilder::LoadIndexedTypedData(classid_t class_id,
-                                                    intptr_t index_scale,
-                                                    bool index_unboxed) {
-  // We use C behavior when dereferencing pointers, we assume alignment.
-  const AlignmentType alignment = kAlignedAccess;
-
-  Value* index = Pop();
-  Value* c_pointer = Pop();
-  LoadIndexedInstr* instr = new (Z)
-      LoadIndexedInstr(c_pointer, index, index_unboxed, index_scale, class_id,
-                       alignment, DeoptId::kNone, TokenPosition::kNoSource);
+      array, index, index_unboxed, index_scale, class_id, kAlignedAccess,
+      DeoptId::kNone, TokenPosition::kNoSource);
   Push(instr);
   return Fragment(instr);
 }
@@ -967,6 +958,19 @@
   return instructions;
 }
 
+Fragment BaseFlowGraphBuilder::InstantiateDynamicTypeArguments() {
+  Value* type_arguments = Pop();
+  Value* function_type_args = Pop();
+  Value* instantiator_type_args = Pop();
+  const Function& function = Object::null_function();
+  const Class& instantiator_class = Class::ZoneHandle(Z);
+  InstantiateTypeArgumentsInstr* instr = new (Z) InstantiateTypeArgumentsInstr(
+      TokenPosition::kNoSource, instantiator_type_args, function_type_args,
+      type_arguments, instantiator_class, function, GetNextDeoptId());
+  Push(instr);
+  return Fragment(instr);
+}
+
 Fragment BaseFlowGraphBuilder::LoadClassId() {
   LoadClassIdInstr* load = new (Z) LoadClassIdInstr(Pop());
   Push(load);
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 4753533..673375a 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -164,11 +164,10 @@
   Fragment LoadField(const Field& field, bool calls_initializer);
   Fragment LoadNativeField(const Slot& native_field,
                            bool calls_initializer = false);
-  Fragment LoadIndexed(intptr_t index_scale);
-  // Takes a [class_id] valid for StoreIndexed.
-  Fragment LoadIndexedTypedData(classid_t class_id,
-                                intptr_t index_scale,
-                                bool index_unboxed);
+  // Pass true for index_unboxed if indexing into external typed data.
+  Fragment LoadIndexed(classid_t class_id,
+                       intptr_t index_scale = compiler::target::kWordSize,
+                       bool index_unboxed = false);
 
   Fragment LoadUntagged(intptr_t offset);
   Fragment StoreUntagged(intptr_t offset);
@@ -339,6 +338,7 @@
   Fragment AllocateTypedData(TokenPosition position, classid_t class_id);
   Fragment InstantiateType(const AbstractType& type);
   Fragment InstantiateTypeArguments(const TypeArguments& type_arguments);
+  Fragment InstantiateDynamicTypeArguments();
   Fragment LoadClassId();
 
   // Returns true if we are building a graph for inlining of a call site that
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 1ce2b7a..41af858 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -1417,7 +1417,7 @@
 
   LoadStackSlots(5);
 
-  const String& dst_name = String::Cast(PopConstant().value());
+  Value* dst_name = Pop();
   Value* super_type = Pop();
   Value* sub_type = Pop();
   Value* function_type_args = Pop();
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 15f3dda..a6a4252 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -674,6 +674,7 @@
     // Do not set type parameters for factories, as VM uses class type
     // parameters instead.
     parameterized_function.set_type_parameters(type_parameters);
+    parameterized_function.UpdateCachedDefaultTypeArguments(thread_);
     if (parameterized_function.IsSignatureFunction()) {
       if (function_type_type_parameters_ == nullptr) {
         function_type_type_parameters_ = &type_parameters;
@@ -3136,6 +3137,7 @@
         type = type_args.TypeAt(i);
         param.set_default_argument(type);
       }
+      function.UpdateCachedDefaultTypeArguments(thread_);
     }
   }
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index da8192e..efc2994 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -542,12 +542,8 @@
       prologue += IntConstant(dart_function.NumTypeParameters() +
                               dart_function.NumParentTypeParameters());
 
-      const Library& dart_internal =
-          Library::Handle(Z, Library::InternalLibrary());
-      const Function& prepend_function =
-          Function::ZoneHandle(Z, dart_internal.LookupFunctionAllowPrivate(
-                                      Symbols::PrependTypeArguments()));
-      ASSERT(!prepend_function.IsNull());
+      const auto& prepend_function =
+          flow_graph_builder_->PrependTypeArgumentsFunction();
 
       prologue += StaticCall(TokenPosition::kNoSource, prepend_function, 4,
                              ICData::kStatic);
@@ -738,20 +734,17 @@
     Fragment* explicit_checks,
     Fragment* implicit_checks,
     Fragment* implicit_redefinitions) {
-  if (!dart_function.NeedsArgumentTypeChecks()) return;
-
-  // Check if parent function was annotated with no-dynamic-invocations.
-  const ProcedureAttributesMetadata attrs =
-      procedure_attributes_metadata_helper_.GetProcedureAttributes(
-          dart_function.kernel_offset());
-
-  AlternativeReadingScope _(&reader_);
-  SetOffset(type_parameters_offset);
-  B->BuildArgumentTypeChecks(
-      MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
-          ? TypeChecksToBuild::kCheckCovariantTypeParameterBounds
-          : TypeChecksToBuild::kCheckAllTypeParameterBounds,
-      explicit_checks, implicit_checks, implicit_redefinitions);
+  if (dart_function.NeedsTypeArgumentTypeChecks()) {
+    B->BuildTypeArgumentTypeChecks(
+        MethodCanSkipTypeChecksForNonCovariantTypeArguments(dart_function)
+            ? TypeChecksToBuild::kCheckCovariantTypeParameterBounds
+            : TypeChecksToBuild::kCheckAllTypeParameterBounds,
+        implicit_checks);
+  }
+  if (dart_function.NeedsArgumentTypeChecks()) {
+    B->BuildArgumentTypeChecks(explicit_checks, implicit_checks,
+                               implicit_redefinitions);
+  }
 }
 
 Fragment StreamingFlowGraphBuilder::ShortcutForUserDefinedEquals(
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 46daea0..4e9d36e 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -68,7 +68,9 @@
       switch_block_(NULL),
       try_catch_block_(NULL),
       try_finally_block_(NULL),
-      catch_block_(NULL) {
+      catch_block_(NULL),
+      prepend_type_arguments_(Function::ZoneHandle(zone_)),
+      throw_new_null_assertion_(Function::ZoneHandle(zone_)) {
   const Script& script =
       Script::Handle(Z, parsed_function->function().script());
   H.InitFromScript(script);
@@ -1282,8 +1284,8 @@
       body += LoadUntagged(compiler::target::PointerBase::data_field_offset());
       body += LoadLocal(arg_offset_not_null);
       body += UnboxTruncate(kUnboxedFfiIntPtr);
-      body += LoadIndexedTypedData(typed_data_cid, /*index_scale=*/1,
-                                   /*index_unboxed=*/true);
+      body += LoadIndexed(typed_data_cid, /*index_scale=*/1,
+                          /*index_unboxed=*/true);
       if (kind == MethodRecognizer::kFfiLoadFloat ||
           kind == MethodRecognizer::kFfiLoadDouble) {
         if (kind == MethodRecognizer::kFfiLoadFloat) {
@@ -1705,14 +1707,21 @@
 Fragment FlowGraphBuilder::AssertSubtype(TokenPosition position,
                                          const AbstractType& sub_type_value,
                                          const AbstractType& super_type_value,
-                                         const String& dst_name) {
+                                         const String& dst_name_value) {
   Fragment instructions;
-
   instructions += LoadInstantiatorTypeArguments();
   instructions += LoadFunctionTypeArguments();
-  instructions += Constant(AbstractType::ZoneHandle(sub_type_value.raw()));
-  instructions += Constant(AbstractType::ZoneHandle(super_type_value.raw()));
+  instructions += Constant(AbstractType::ZoneHandle(Z, sub_type_value.raw()));
+  instructions += Constant(AbstractType::ZoneHandle(Z, super_type_value.raw()));
+  instructions += Constant(String::ZoneHandle(Z, dst_name_value.raw()));
+  instructions += AssertSubtype(position);
+  return instructions;
+}
 
+Fragment FlowGraphBuilder::AssertSubtype(TokenPosition position) {
+  Fragment instructions;
+
+  Value* dst_name = Pop();
   Value* super_type = Pop();
   Value* sub_type = Pop();
   Value* function_type_args = Pop();
@@ -1726,11 +1735,8 @@
   return instructions;
 }
 
-void FlowGraphBuilder::BuildArgumentTypeChecks(
-    TypeChecksToBuild mode,
-    Fragment* explicit_checks,
-    Fragment* implicit_checks,
-    Fragment* implicit_redefinitions) {
+void FlowGraphBuilder::BuildTypeArgumentTypeChecks(TypeChecksToBuild mode,
+                                                   Fragment* implicit_checks) {
   const Function& dart_function = parsed_function_->function();
 
   const Function* forwarding_target = nullptr;
@@ -1796,6 +1802,19 @@
   } else {
     *implicit_checks += check_bounds;
   }
+}
+
+void FlowGraphBuilder::BuildArgumentTypeChecks(
+    Fragment* explicit_checks,
+    Fragment* implicit_checks,
+    Fragment* implicit_redefinitions) {
+  const Function& dart_function = parsed_function_->function();
+
+  const Function* forwarding_target = nullptr;
+  if (parsed_function_->is_forwarding_stub()) {
+    forwarding_target = parsed_function_->forwarding_stub_super_target();
+    ASSERT(!forwarding_target->IsNull());
+  }
 
   const intptr_t num_params = dart_function.NumParameters();
   for (intptr_t i = dart_function.NumImplicitParameters(); i < num_params;
@@ -2045,8 +2064,32 @@
   LocalVariable* has_named_params = nullptr;
   LocalVariable* parameter_names = nullptr;
   LocalVariable* type_parameters = nullptr;
+  LocalVariable* closure_data = nullptr;
+  LocalVariable* default_tav_info = nullptr;
+  LocalVariable* instantiator_type_args = nullptr;
+  LocalVariable* parent_function_type_args = nullptr;
 };
 
+Fragment FlowGraphBuilder::TestClosureFunctionGeneric(
+    const ClosureCallInfo& info,
+    Fragment generic,
+    Fragment not_generic) {
+  JoinEntryInstr* after_branch = BuildJoinEntry();
+
+  Fragment check;
+  check += LoadLocal(info.type_parameters);
+  TargetEntryInstr *is_not_generic, *is_generic;
+  check += BranchIfNull(&is_not_generic, &is_generic);
+
+  generic.Prepend(is_generic);
+  generic += Goto(after_branch);
+
+  not_generic.Prepend(is_not_generic);
+  not_generic += Goto(after_branch);
+
+  return Fragment(check.entry, after_branch);
+}
+
 Fragment FlowGraphBuilder::TestClosureFunctionNamedParameterRequired(
     const ClosureCallInfo& info,
     Fragment set,
@@ -2094,7 +2137,7 @@
   check_required.current = valid_index;
   check_required += LoadLocal(info.parameter_names);
   check_required += LoadLocal(flags_index);
-  check_required += LoadIndexed(compiler::target::kWordSize);
+  check_required += LoadIndexed(kArrayCid);
   check_required += LoadLocal(opt_index);
   check_required +=
       IntConstant(compiler::target::kNumParameterFlagsPerElement - 1);
@@ -2126,6 +2169,101 @@
   return check_required;
 }
 
+Fragment FlowGraphBuilder::BuildClosureCallDefaultTypeHandling(
+    const ClosureCallInfo& info) {
+  if (info.descriptor.TypeArgsLen() > 0) {
+    ASSERT(parsed_function_->function_type_arguments() != nullptr);
+    // A TAV was provided, so we don't need default type argument handling
+    // and can just take the arguments we were given.
+    Fragment store_provided;
+    store_provided += LoadLocal(parsed_function_->function_type_arguments());
+    store_provided += StoreLocal(info.vars->function_type_args);
+    store_provided += Drop();
+    return store_provided;
+  }
+
+  // Load the defaults, instantiating or replacing them with the other type
+  // arguments as appropriate.
+  Fragment store_default;
+  store_default += LoadLocal(info.default_tav_info);
+  static_assert(
+      Function::DefaultTypeArgumentsKindField::shift() == 0,
+      "Need to generate shift for DefaultTypeArgumentsKindField bit field");
+  store_default += IntConstant(Function::DefaultTypeArgumentsKindField::mask());
+  store_default += SmiBinaryOp(Token::kBIT_AND);
+  LocalVariable* default_tav_kind = MakeTemporary("default_tav_kind");
+
+  // One read-only stack values (default_tav_kind) that must be dropped after
+  // rejoining at done.
+  JoinEntryInstr* done = BuildJoinEntry();
+
+  store_default += LoadLocal(default_tav_kind);
+  TargetEntryInstr *is_instantiated, *is_not_instantiated;
+  store_default += IntConstant(static_cast<intptr_t>(
+      Function::DefaultTypeArgumentsKind::kIsInstantiated));
+  store_default += BranchIfEqual(&is_instantiated, &is_not_instantiated);
+  store_default.current = is_not_instantiated;  // Check next case.
+  store_default += LoadLocal(default_tav_kind);
+  TargetEntryInstr *needs_instantiation, *can_share;
+  store_default += IntConstant(static_cast<intptr_t>(
+      Function::DefaultTypeArgumentsKind::kNeedsInstantiation));
+  store_default += BranchIfEqual(&needs_instantiation, &can_share);
+  store_default.current = can_share;  // Check next case.
+  store_default += LoadLocal(default_tav_kind);
+  TargetEntryInstr *can_share_instantiator, *can_share_function;
+  store_default += IntConstant(static_cast<intptr_t>(
+      Function::DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments));
+  store_default += BranchIfEqual(&can_share_instantiator, &can_share_function);
+
+  Fragment instantiated(is_instantiated);
+  instantiated += LoadLocal(info.closure_data);
+  instantiated += LoadNativeField(Slot::ClosureData_default_type_arguments());
+  instantiated += StoreLocal(info.vars->function_type_args);
+  instantiated += Drop();
+  instantiated += Goto(done);
+
+  Fragment do_instantiation(needs_instantiation);
+  // Load the instantiator type arguments.
+  do_instantiation += LoadLocal(info.instantiator_type_args);
+  // Load the parent function type arguments. (No local function type arguments
+  // 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.closure_data);
+  do_instantiation +=
+      LoadNativeField(Slot::ClosureData_default_type_arguments());
+  do_instantiation += InstantiateDynamicTypeArguments();
+  do_instantiation += StoreLocal(info.vars->function_type_args);
+  do_instantiation += Drop();
+  do_instantiation += Goto(done);
+
+  Fragment share_instantiator(can_share_instantiator);
+  share_instantiator += LoadLocal(info.instantiator_type_args);
+  share_instantiator += StoreLocal(info.vars->function_type_args);
+  share_instantiator += Drop();
+  share_instantiator += Goto(done);
+
+  Fragment share_function(can_share_function);
+  // Since the defaults won't have local type parameters, these must all be
+  // from the parent function type arguments, so we can just use it.
+  share_function += LoadLocal(info.parent_function_type_args);
+  share_function += StoreLocal(info.vars->function_type_args);
+  share_function += Drop();
+  share_function += Goto(done);
+
+  store_default.current = done;  // Return here after branching.
+  store_default += DropTemporary(&default_tav_kind);
+
+  Fragment store_delayed;
+  store_delayed += LoadLocal(info.closure);
+  store_delayed += LoadNativeField(Slot::Closure_delayed_type_arguments());
+  store_delayed += StoreLocal(info.vars->function_type_args);
+  store_delayed += Drop();
+
+  // Use the delayed type args if present, else the default ones.
+  return TestDelayedTypeArgs(info.closure, store_delayed, store_default);
+}
+
 Fragment FlowGraphBuilder::BuildClosureCallNamedArgumentsCheck(
     const ClosureCallInfo& info) {
   // When no named arguments are provided, we just need to check for possible
@@ -2189,7 +2327,7 @@
   // First load the name we need to check against.
   loop_body += LoadLocal(info.parameter_names);
   loop_body += LoadLocal(info.vars->current_param_index);
-  loop_body += LoadIndexed(compiler::target::kWordSize);
+  loop_body += LoadIndexed(kArrayCid);
   LocalVariable* param_name = MakeTemporary("param_name");  // Read only.
 
   // One additional local value on the stack within the loop body (param_name)
@@ -2349,31 +2487,98 @@
   return check_entry;
 }
 
+Fragment FlowGraphBuilder::BuildClosureCallTypeArgumentsTypeCheck(
+    const ClosureCallInfo& info) {
+  JoinEntryInstr* done = BuildJoinEntry();
+  JoinEntryInstr* loop = BuildJoinEntry();
+
+  // 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;
+  // Loop over the type parameters array.
+  loop_init += IntConstant(0);
+  loop_init += StoreLocal(info.vars->current_param_index);
+  loop_init += Drop();
+  loop_init += Goto(loop);
+
+  Fragment loop_check(loop);
+  loop_check += LoadLocal(info.vars->current_param_index);
+  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_body(more);
+  loop_body += LoadLocal(info.type_parameters);
+  loop_body += LoadLocal(info.vars->current_param_index);
+  loop_body += LoadIndexed(kTypeArgumentsCid);
+  LocalVariable* current_param = MakeTemporary("current_param");  // Read-only.
+
+  // One read-only local variable on stack (param) to drop after joining.
+  JoinEntryInstr* next = BuildJoinEntry();
+
+  loop_body += LoadLocal(current_param);
+  loop_body += LoadNativeField(Slot::TypeParameter_flags());
+  loop_body += Box(kUnboxedUint8);
+  loop_body += IntConstant(
+      TypeParameterLayout::GenericCovariantImplBit::mask_in_place());
+  loop_body += SmiBinaryOp(Token::kBIT_AND);
+  loop_body += IntConstant(0);
+  TargetEntryInstr *is_noncovariant, *is_covariant;
+  loop_body += BranchIfEqual(&is_noncovariant, &is_covariant);
+
+  Fragment(is_covariant) + Goto(next);  // Continue if covariant.
+
+  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(&current_param);
+  loop_incr += LoadLocal(info.vars->current_param_index);
+  loop_incr += IntConstant(1);
+  loop_incr += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
+  loop_incr += StoreLocal(info.vars->current_param_index);
+  loop_incr += Drop();
+  loop_incr += Goto(loop);
+
+  return Fragment(loop_init.entry, done);
+}
+
 Fragment FlowGraphBuilder::BuildDynamicClosureCallChecks(
     LocalVariable* closure) {
   ClosureCallInfo info(closure, BuildThrowNoSuchMethod(),
                        saved_args_desc_array(),
                        parsed_function_->dynamic_closure_call_vars());
 
-  // We extract all the packed fields here so code generation that puts unboxed
-  // integers on the expression stack even in unoptimized code is in one place.
-  auto const rep = Slot::Function_packed_fields().representation();
-
   Fragment body;
   body += LoadLocal(info.closure);
   body += LoadNativeField(Slot::Closure_function());
   info.function = MakeTemporary("function");
 
   body += LoadLocal(info.function);
-  body += LoadNativeField(Slot::Function_packed_fields());
-  body +=
-      BuildExtractPackedFieldIntoSmi<Function::PackedNumFixedParameters>(rep);
+  body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+      Function::PackedNumFixedParameters>(Slot::Function_packed_fields());
   info.num_fixed_params = MakeTemporary("num_fixed_params");
 
   body += LoadLocal(info.function);
-  body += LoadNativeField(Slot::Function_packed_fields());
-  body += BuildExtractPackedFieldIntoSmi<Function::PackedNumOptionalParameters>(
-      rep);
+  body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+      Function::PackedNumOptionalParameters>(Slot::Function_packed_fields());
   info.num_opt_params = MakeTemporary("num_opt_params");
 
   body += LoadLocal(info.num_fixed_params);
@@ -2382,9 +2587,10 @@
   info.num_max_params = MakeTemporary("num_max_params");
 
   body += LoadLocal(info.function);
-  body += LoadNativeField(Slot::Function_packed_fields());
-  body += BuildExtractPackedFieldIntoSmi<
-      Function::PackedHasNamedOptionalParameters>(rep);
+  body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+      Function::PackedHasNamedOptionalParameters>(
+      Slot::Function_packed_fields());
+
   body += IntConstant(0);
   body += StrictCompare(Token::kNE_STRICT);
   info.has_named_params = MakeTemporary("has_named_params");
@@ -2395,21 +2601,86 @@
     info.parameter_names = MakeTemporary("parameter_names");
   }
 
-  if (info.descriptor.TypeArgsLen() > 0) {
-    body += LoadLocal(info.function);
-    body += LoadNativeField(Slot::Function_type_parameters());
-    info.type_parameters = MakeTemporary("type_parameters");
-  }
+  body += LoadLocal(info.function);
+  body += LoadNativeField(Slot::Function_type_parameters());
+  info.type_parameters = MakeTemporary("type_parameters");
 
-  // Check that the shape of the arguments generally matches what the
-  // closure function expects. The only remaining non-type check after this
-  // is that the names for optional arguments are valid.
+  body += LoadLocal(info.closure);
+  body += LoadNativeField(Slot::Closure_instantiator_type_arguments());
+  info.instantiator_type_args = MakeTemporary("instantiator_type_args");
+
+  body += LoadLocal(info.closure);
+  body += LoadNativeField(Slot::Closure_function_type_arguments());
+  info.parent_function_type_args = MakeTemporary("parent_function_type_args");
+
+  // At this point, all the read-only temporaries stored in the ClosureCallInfo
+  // should be either loaded or still nullptr, if not needed for this function.
+  // Now we check that the arguments to the closure call have the right shape.
   body += BuildClosureCallArgumentsValidCheck(info);
 
-  // TODO(dartbug.com/40813): Move checks that are currently compiled
-  // in the closure body to here, using the dynamic versions of
-  // AssertSubtype to typecheck the type arguments using the runtime types
-  // available in the closure object.
+  // If the closure function is not generic, there are no local function type
+  // args. Thus, use whatever was stored for the parent function type arguments,
+  // which has already been checked against any parent type parameter bounds.
+  Fragment not_generic;
+  not_generic += LoadLocal(info.parent_function_type_args);
+  not_generic += StoreLocal(info.vars->function_type_args);
+  not_generic += Drop();
+
+  // If the closure function is generic, then we first need to calculate the
+  // full set of function type arguments, then check the local function type
+  // arguments against the closure function's type parameter bounds.
+  Fragment generic;
+  generic += LoadLocal(info.function);
+  generic += LoadNativeField(Slot::Function_data());
+  info.closure_data = MakeTemporary("closure_data");
+  generic += LoadLocal(info.closure_data);
+  generic += LoadNativeField(Slot::ClosureData_default_type_arguments_info());
+  info.default_tav_info = MakeTemporary("default_tav_info");
+  // 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.default_tav_info);
+  static_assert(Function::NumParentTypeParametersField::shift() > 0,
+                "No need to shift for NumParentTypeParametersField bit field");
+  generic += IntConstant(Function::NumParentTypeParametersField::shift());
+  generic += SmiBinaryOp(Token::kSHR);
+  generic += IntConstant(Function::NumParentTypeParametersField::mask());
+  generic += SmiBinaryOp(Token::kBIT_AND);
+  // Load the number of total 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.
+  generic += StaticCall(TokenPosition::kNoSource,
+                        PrependTypeArgumentsFunction(), 4, ICData::kStatic);
+  generic += StoreLocal(info.vars->function_type_args);
+  generic += Drop();
+  generic += DropTemporary(&info.default_tav_info);
+  generic += DropTemporary(&info.closure_data);
+
+  // Now that we have the full set of function type arguments, check them
+  // against the type parameter bounds. However, if the local function type
+  // arguments are delayed type arguments, they have already been checked by
+  // the type system and need not be checked again at the call site.
+  auto const check_bounds = BuildClosureCallTypeArgumentsTypeCheck(info);
+  if (FLAG_eliminate_type_checks) {
+    generic += TestDelayedTypeArgs(info.closure, /*present=*/{},
+                                   /*absent=*/check_bounds);
+  } else {
+    generic += check_bounds;
+  }
+
+  // Call the appropriate fragment for setting up the function type arguments
+  // and performing any needed type argument checking.
+  body += TestClosureFunctionGeneric(info, generic, not_generic);
 
   // TODO(dartbug.com/40813): Move checks that are currently compiled
   // in the closure body to here, using the dynamic versions of
@@ -2417,9 +2688,9 @@
   // available in the closure object.
 
   // Drop all the read-only temporaries at the end of the fragment.
-  if (info.type_parameters != nullptr) {
-    body += DropTemporary(&info.type_parameters);
-  }
+  body += DropTemporary(&info.parent_function_type_args);
+  body += DropTemporary(&info.instantiator_type_args);
+  body += DropTemporary(&info.type_parameters);
   if (info.parameter_names != nullptr) {
     body += DropTemporary(&info.parameter_names);
   }
@@ -2579,9 +2850,13 @@
         kWordSize * compiler::target::frame_layout.param_end_from_fp);
   }
 
+  if (function.NeedsTypeArgumentTypeChecks()) {
+    BuildTypeArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+                                &body);
+  }
+
   if (function.NeedsArgumentTypeChecks()) {
-    BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
-                            &body, &body, nullptr);
+    BuildArgumentTypeChecks(&body, &body, nullptr);
   }
 
   body += MakeTemp();
@@ -2939,26 +3214,23 @@
 
   const Fragment default_type_handling = BuildDefaultTypeHandling(function);
 
-  // We're going to throw away the explicit checks because the target will
-  // always check them.
   Fragment implicit_checks;
-  if (function.NeedsArgumentTypeChecks()) {
+  if (function.NeedsTypeArgumentTypeChecks() &&
+      (target.is_static() ||
+       MethodCanSkipTypeChecksForNonCovariantTypeArguments(parent))) {
+    BuildTypeArgumentTypeChecks(
+        target.is_static()
+            ? TypeChecksToBuild::kCheckAllTypeParameterBounds
+            : TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds,
+        &implicit_checks);
+  }
+  if (function.NeedsArgumentTypeChecks() &&
+      (target.is_static() ||
+       MethodCanSkipTypeChecksForNonCovariantArguments(parent))) {
+    // We're going to throw away the explicit checks because the target will
+    // always check them.
     Fragment explicit_checks_unused;
-    if (target.is_static()) {
-      // Tearoffs of static methods needs to perform arguments checks since
-      // static methods they forward to don't do it themselves.
-      BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
-                              &explicit_checks_unused, &implicit_checks,
-                              nullptr);
-    } else {
-      if (MethodCanSkipTypeChecksForNonCovariantArguments(
-              parent, ProcedureAttributesMetadata())) {
-        // Generate checks that are skipped inside a body of a function.
-        BuildArgumentTypeChecks(
-            TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds,
-            &explicit_checks_unused, &implicit_checks, nullptr);
-      }
-    }
+    BuildArgumentTypeChecks(&explicit_checks_unused, &implicit_checks, nullptr);
   }
 
   Fragment body;
@@ -3187,9 +3459,9 @@
 
   // Build argument type checks that complement those that are emitted in the
   // target.
-  BuildArgumentTypeChecks(
-      TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds, &body, &body,
-      nullptr);
+  BuildTypeArgumentTypeChecks(
+      TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds, &body);
+  BuildArgumentTypeChecks(&body, &body, nullptr);
 
   // Push all arguments and invoke the original method.
 
@@ -3315,8 +3587,7 @@
   code += ConvertUnboxedToUntagged(kUnboxedIntPtr);
   code += IntConstant(compiler::target::LocalHandle::raw_offset());
   code += UnboxTruncate(kUnboxedIntPtr);
-  code += LoadIndexedTypedData(kArrayCid, /*index_scale=*/1,
-                               /*index_unboxed=*/true);
+  code += LoadIndexed(kArrayCid, /*index_scale=*/1, /*index_unboxed=*/true);
   return code;
 }
 
@@ -3477,8 +3748,10 @@
 
   const bool signature_contains_handles = marshaller.ContainsHandles();
 
-  BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
-                          &function_body, &function_body, &function_body);
+  ASSERT(function.CanReceiveDynamicInvocation());
+  BuildTypeArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+                              &function_body);
+  BuildArgumentTypeChecks(&function_body, &function_body, &function_body);
 
   // Null check arguments before we go into the try catch, so that we don't
   // catch our own null errors.
@@ -3699,18 +3972,6 @@
   code += NullConstant();
   code += BranchIfEqual(&then, &otherwise);
 
-  if (throw_new_null_assertion_ == nullptr) {
-    const Class& klass = Class::ZoneHandle(
-        Z, Library::LookupCoreClass(Symbols::AssertionError()));
-    ASSERT(!klass.IsNull());
-    const auto& error = klass.EnsureIsFinalized(H.thread());
-    ASSERT(error == Error::null());
-    throw_new_null_assertion_ =
-        &Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate(
-                                     Symbols::ThrowNewNullAssertion()));
-    ASSERT(!throw_new_null_assertion_->IsNull());
-  }
-
   const Script& script =
       Script::Handle(Z, parsed_function_->function().script());
   intptr_t line = -1;
@@ -3726,8 +3987,8 @@
   null_code += Constant(variable->name());
   null_code += IntConstant(line);
   null_code += IntConstant(column);
-  null_code += StaticCall(variable->token_pos(), *throw_new_null_assertion_, 3,
-                          ICData::kStatic);
+  null_code += StaticCall(variable->token_pos(),
+                          ThrowNewNullAssertionFunction(), 3, ICData::kStatic);
   null_code += ThrowException(TokenPosition::kNoSource);
   null_code += Drop();
 
@@ -3750,6 +4011,30 @@
   return code;
 }
 
+const Function& FlowGraphBuilder::ThrowNewNullAssertionFunction() {
+  if (throw_new_null_assertion_.IsNull()) {
+    const Class& klass = Class::ZoneHandle(
+        Z, Library::LookupCoreClass(Symbols::AssertionError()));
+    ASSERT(!klass.IsNull());
+    const auto& error = klass.EnsureIsFinalized(H.thread());
+    ASSERT(error == Error::null());
+    throw_new_null_assertion_ = klass.LookupStaticFunctionAllowPrivate(
+        Symbols::ThrowNewNullAssertion());
+    ASSERT(!throw_new_null_assertion_.IsNull());
+  }
+  return throw_new_null_assertion_;
+}
+
+const Function& FlowGraphBuilder::PrependTypeArgumentsFunction() {
+  if (prepend_type_arguments_.IsNull()) {
+    const auto& dart_internal = Library::Handle(Z, Library::InternalLibrary());
+    prepend_type_arguments_ = dart_internal.LookupFunctionAllowPrivate(
+        Symbols::PrependTypeArguments());
+    ASSERT(!prepend_type_arguments_.IsNull());
+  }
+  return prepend_type_arguments_;
+}
+
 }  // namespace kernel
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 173db75..cd23744 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -82,6 +82,12 @@
 
   struct ClosureCallInfo;
 
+  // Tests whether the closure function is generic and branches to the
+  // appropriate fragment.
+  Fragment TestClosureFunctionGeneric(const ClosureCallInfo& info,
+                                      Fragment generic,
+                                      Fragment not_generic);
+
   // Tests whether the function parameter at the given index is required and
   // branches to the appropriate fragment. Loads the parameter index to
   // check from info.vars->current_param_index.
@@ -90,6 +96,11 @@
       Fragment set,
       Fragment not_set);
 
+  // Builds a fragment that, if there are no provided function type arguments,
+  // calculates the appropriate TAV to use instead. Stores either the provided
+  // or calculated function type arguments in vars->function_type_args.
+  Fragment BuildClosureCallDefaultTypeHandling(const ClosureCallInfo& info);
+
   // The BuildClosureCall...Check methods differs from the checks built in the
   // PrologueBuilder in that they are built for invoke field dispatchers,
   // where the ArgumentsDescriptor is known at compile time but the specific
@@ -104,6 +115,11 @@
   // function retrieved at runtime from the closure.
   Fragment BuildClosureCallArgumentsValidCheck(const ClosureCallInfo& info);
 
+  // Builds checks that the type arguments of a call are consistent with the
+  // bounds of the closure function type parameters. Assumes that the closure
+  // function is generic.
+  Fragment BuildClosureCallTypeArgumentsTypeCheck(const ClosureCallInfo& info);
+
   // Main entry point for building checks.
   Fragment BuildDynamicClosureCallChecks(LocalVariable* closure);
 
@@ -215,6 +231,8 @@
                          const AbstractType& sub_type,
                          const AbstractType& super_type,
                          const String& dst_name);
+  // Assumes destination name, supertype, and subtype are the top of the stack.
+  Fragment AssertSubtype(TokenPosition position);
 
   bool NeedsDebugStepCheck(const Function& function, TokenPosition position);
   bool NeedsDebugStepCheck(Value* value, TokenPosition position);
@@ -278,6 +296,16 @@
 
   LocalVariable* LookupVariable(intptr_t kernel_offset);
 
+  // Build type argument type checks for the current function.
+  // ParsedFunction should have the following information:
+  //  - is_forwarding_stub()
+  //  - forwarding_stub_super_target()
+  // Scope should be populated with parameter variables including
+  //  - needs_type_check()
+  //  - is_explicit_covariant_parameter()
+  void BuildTypeArgumentTypeChecks(TypeChecksToBuild mode,
+                                   Fragment* implicit_checks);
+
   // Build argument type checks for the current function.
   // ParsedFunction should have the following information:
   //  - is_forwarding_stub()
@@ -285,8 +313,7 @@
   // Scope should be populated with parameter variables including
   //  - needs_type_check()
   //  - is_explicit_covariant_parameter()
-  void BuildArgumentTypeChecks(TypeChecksToBuild mode,
-                               Fragment* explicit_checks,
+  void BuildArgumentTypeChecks(Fragment* explicit_checks,
                                Fragment* implicit_checks,
                                Fragment* implicit_redefinitions);
 
@@ -390,19 +417,31 @@
   // on the top of the stack. Picks a sequence that keeps unboxed values on the
   // expression stack only as needed, switching to Smis as soon as possible.
   template <typename T>
-  Fragment BuildExtractPackedFieldIntoSmi(Representation rep) {
+  Fragment BuildExtractUnboxedSlotBitFieldIntoSmi(const Slot& slot) {
+    ASSERT(RepresentationUtils::IsUnboxedInteger(slot.representation()));
     Fragment instructions;
-    // Since kBIT_AND never throws or deoptimizes, we require that the result of
-    // masking the field in place fits into a Smi, so we can use Smi operations
-    // for the shift.
-    static_assert(T::mask_in_place() <= compiler::target::kSmiMax,
-                  "Cannot fit results of masking in place into a Smi");
-    instructions += UnboxedIntConstant(T::mask_in_place(), rep);
-    instructions += BinaryIntegerOp(Token::kBIT_AND, rep);
-    // Set the range of the definition that will be used as the value in the
-    // box so that ValueFitsSmi() can return true even in unoptimized code.
-    SetConstantRangeOfCurrentDefinition(instructions, 0, T::mask_in_place());
-    instructions += Box(rep);
+    if (!Boxing::RequiresAllocation(slot.representation())) {
+      // We don't need to allocate to box this value, so it already fits in
+      // a Smi (and thus the mask must also).
+      instructions += LoadNativeField(slot);
+      instructions += Box(slot.representation());
+      instructions += IntConstant(T::mask_in_place());
+      instructions += SmiBinaryOp(Token::kBIT_AND);
+    } else {
+      // Since kBIT_AND never throws or deoptimizes, we require that the result
+      // of masking the field in place fits into a Smi, so we can use Smi
+      // operations for the shift.
+      static_assert(T::mask_in_place() <= compiler::target::kSmiMax,
+                    "Cannot fit results of masking in place into a Smi");
+      instructions += LoadNativeField(slot);
+      instructions +=
+          UnboxedIntConstant(T::mask_in_place(), slot.representation());
+      instructions += BinaryIntegerOp(Token::kBIT_AND, slot.representation());
+      // Set the range of the definition that will be used as the value in the
+      // box so that ValueFitsSmi() returns true even in unoptimized code.
+      SetConstantRangeOfCurrentDefinition(instructions, 0, T::mask_in_place());
+      instructions += Box(slot.representation());
+    }
     if (T::shift() != 0) {
       // Only add the shift operation if it's necessary.
       instructions += IntConstant(T::shift());
@@ -476,8 +515,19 @@
 
   ActiveClass active_class_;
 
+  // Cached _PrependTypeArguments.
+  Function& prepend_type_arguments_;
+
+  // Returns the function _PrependTypeArguments from dart:_internal. If the
+  // cached version is null, retrieves it and updates the cache.
+  const Function& PrependTypeArgumentsFunction();
+
   // Cached _AssertionError._throwNewNullAssertion.
-  Function* throw_new_null_assertion_ = nullptr;
+  Function& throw_new_null_assertion_;
+
+  // Returns the function _AssertionError._throwNewNullAssertion. If the
+  // cached version is null, retrieves it and updates the cache.
+  const Function& ThrowNewNullAssertionFunction();
 
   friend class BreakableBlock;
   friend class CatchBlock;
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index b0af83b..59d6362 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -3356,10 +3356,13 @@
       default_arg = &BuildTypeWithoutFinalization();
     }
     parameter.set_default_argument(*default_arg);
-
     helper.Finish();
   }
 
+  if (set_on.IsFunction()) {
+    Function::Cast(set_on).UpdateCachedDefaultTypeArguments(Thread::Current());
+  }
+
   // Fix bounds and default arguments in all derived type parameters (with
   // different nullabilities).
   if (active_class->derived_type_parameters != nullptr) {
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index b829e8b..7fd8c35 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -349,7 +349,7 @@
               compiler::target::kWordSize);
           good += LoadLocal(tuple_diff);
           good += SmiBinaryOp(Token::kADD, /* truncate= */ true);
-          good += LoadIndexed(/* index_scale = */ compiler::target::kWordSize);
+          good += LoadIndexed(kArrayCid);
         }
         good += SmiBinaryOp(Token::kSUB, /* truncate= */ true);
         good += LoadFpRelativeSlot(
@@ -388,8 +388,7 @@
                         compiler::target::kWordSize);
         copy_args_prologue += LoadLocal(tuple_diff);
         copy_args_prologue += SmiBinaryOp(Token::kADD, /* truncate= */ true);
-        copy_args_prologue +=
-            LoadIndexed(/* index_scale = */ compiler::target::kWordSize);
+        copy_args_prologue += LoadIndexed(kArrayCid);
 
         // first name in sorted list of all names
         const String& param_name = String::ZoneHandle(
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 6e65b8d..c0ac9e9 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -15,11 +15,10 @@
 #define T (type_translator_)
 #define I Isolate::Current()
 
-// Returns true if the given method can skip type checks for all arguments
+// Returns true if the given method can skip type checks for all type arguments
 // that are not covariant or generic covariant in its implementation.
-bool MethodCanSkipTypeChecksForNonCovariantArguments(
-    const Function& method,
-    const ProcedureAttributesMetadata& attrs) {
+bool MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+    const Function& method) {
   // Dart 2 type system at non-dynamic call sites statically guarantees that
   // argument values match declarated parameter types for all non-covariant
   // and non-generic-covariant parameters. The same applies to type parameters
@@ -35,7 +34,28 @@
   // been fully moved out of closures.
   return !method.CanReceiveDynamicInvocation() &&
          !(method.IsClosureFunction() &&
-           Function::ClosureBodiesContainNonCovariantChecks());
+           Function::ClosureBodiesContainNonCovariantTypeArgumentChecks());
+}
+
+// Returns true if the given method can skip type checks for all arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantArguments(const Function& method) {
+  // Dart 2 type system at non-dynamic call sites statically guarantees that
+  // argument values match declarated parameter types for all non-covariant
+  // and non-generic-covariant parameters. The same applies to type parameters
+  // bounds for type parameters of generic functions.
+  //
+  // Normally dynamic call sites will call dyn:* forwarders which perform type
+  // checks.
+  //
+  // Though for some kinds of methods (e.g. ffi trampolines called from native
+  // code) we do have to perform type checks for all parameters.
+  //
+  // TODO(dartbug.com/40813): Remove the closure case when argument checks have
+  // been fully moved out of closures.
+  return !method.CanReceiveDynamicInvocation() &&
+         !(method.IsClosureFunction() &&
+           Function::ClosureBodiesContainNonCovariantArgumentChecks());
 }
 
 ScopeBuilder::ScopeBuilder(ParsedFunction* parsed_function)
@@ -229,8 +249,10 @@
       } else if (function.IsNonImplicitClosureFunction()) {
         type_check_mode = kTypeCheckAllParameters;
       } else if (function.IsImplicitClosureFunction()) {
-        if (MethodCanSkipTypeChecksForNonCovariantArguments(
-                Function::Handle(Z, function.parent_function()), attrs)) {
+        if (MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+                Function::Handle(Z, function.parent_function())) &&
+            MethodCanSkipTypeChecksForNonCovariantArguments(
+                Function::Handle(Z, function.parent_function()))) {
           // This is a tear-off of an instance method that can not be reached
           // from any dynamic invocation. The method would not check any
           // parameters except covariant ones and those annotated with
@@ -243,8 +265,9 @@
         if (function.is_static()) {
           // In static functions we don't check anything.
           type_check_mode = kTypeCheckForStaticFunction;
-        } else if (MethodCanSkipTypeChecksForNonCovariantArguments(function,
-                                                                   attrs)) {
+        } else if (MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+                       function) &&
+                   MethodCanSkipTypeChecksForNonCovariantArguments(function)) {
           // If the current function is never a target of a dynamic invocation
           // and this parameter is not marked with generic-covariant-impl
           // (which means that among all super-interfaces no type parameters
@@ -319,7 +342,8 @@
         scope_->InsertParameterAt(pos++, result_->setter_value);
 
         if (is_method &&
-            MethodCanSkipTypeChecksForNonCovariantArguments(function, attrs)) {
+            MethodCanSkipTypeChecksForNonCovariantTypeArguments(function) &&
+            MethodCanSkipTypeChecksForNonCovariantArguments(function)) {
           if (field.is_covariant()) {
             result_->setter_value->set_is_explicit_covariant_parameter();
           } else if (!field.is_generic_covariant_impl() ||
diff --git a/runtime/vm/compiler/frontend/scope_builder.h b/runtime/vm/compiler/frontend/scope_builder.h
index 4f53fbd..33e24b3 100644
--- a/runtime/vm/compiler/frontend/scope_builder.h
+++ b/runtime/vm/compiler/frontend/scope_builder.h
@@ -230,11 +230,14 @@
   DISALLOW_COPY_AND_ASSIGN(ScopeBuildingResult);
 };
 
+// Returns true if the given method can skip type checks for all type arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+    const Function& method);
+
 // Returns true if the given method can skip type checks for all arguments
 // that are not covariant or generic covariant in its implementation.
-bool MethodCanSkipTypeChecksForNonCovariantArguments(
-    const Function& method,
-    const ProcedureAttributesMetadata& attrs);
+bool MethodCanSkipTypeChecksForNonCovariantArguments(const Function& method);
 
 }  // namespace kernel
 }  // namespace dart
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 4c9c03c..e83406a 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -444,6 +444,8 @@
     case kArrayCid:
     case kImmutableArrayCid:
       return Array::data_offset();
+    case kTypeArgumentsCid:
+      return TypeArguments::types_offset();
     case kOneByteStringCid:
       return OneByteString::data_offset();
     case kTwoByteStringCid:
@@ -462,6 +464,7 @@
   switch (cid) {
     case kArrayCid:
     case kImmutableArrayCid:
+    case kTypeArgumentsCid:
       return kWordSize;
     case kOneByteStringCid:
       return dart::OneByteString::kBytesPerElement;
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 89d4a81..a7e9547 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -492,7 +492,9 @@
 class Function : public AllStatic {
  public:
   static word code_offset();
+  static word data_offset();
   static word entry_point_offset(CodeEntryKind kind = CodeEntryKind::kNormal);
+  static word kind_tag_offset();
   static word packed_fields_offset();
   static word parameter_names_offset();
   static word parameter_types_offset();
@@ -899,6 +901,9 @@
 
 class TypeParameter : public AllStatic {
  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();
@@ -1064,6 +1069,8 @@
   static word invoke_dart_code_stub_offset();
   static word interpret_call_entry_point_offset();
   static word invoke_dart_code_from_bytecode_stub_offset();
+  static word late_initialization_error_shared_without_fpu_regs_stub_offset();
+  static word late_initialization_error_shared_with_fpu_regs_stub_offset();
   static word null_error_shared_without_fpu_regs_stub_offset();
   static word null_error_shared_with_fpu_regs_stub_offset();
   static word null_arg_error_shared_without_fpu_regs_stub_offset();
@@ -1252,6 +1259,8 @@
 
 class ClosureData : public AllStatic {
  public:
+  static word default_type_arguments_offset();
+  static word default_type_arguments_info_offset();
   static word InstanceSize();
   static word NextFieldOffset();
 };
@@ -1326,8 +1335,11 @@
   static word length_offset();
   static word nullability_offset();
   static word type_at_offset(intptr_t i);
+  static word types_offset();
   static word InstanceSize();
   static word NextFieldOffset();
+
+  static const word kMaxElements;
 };
 
 class FreeListElement : public AllStatic {
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 7873607..e2196c5 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -59,6 +59,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -99,6 +101,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -124,8 +130,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     68;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -209,155 +217,159 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 384;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    724;
+    732;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    728;
+    736;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 204;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
+    Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 768;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 776;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+    320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    316;
+    324;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    240;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 360;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    744;
+    752;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 268;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 328;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    368;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 380;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    732;
+    740;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
+    Thread_interpret_call_entry_point_offset = 348;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    756;
+    764;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 316;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 220;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 736;
+    Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 744;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 740;
+    Thread_saved_shadow_call_stack_offset = 748;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    748;
+    756;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -370,10 +382,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 752;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 760;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -390,6 +402,10 @@
 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 TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+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;
@@ -419,7 +435,7 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
@@ -428,7 +444,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 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 = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 96;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -488,7 +504,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -565,6 +581,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -605,6 +623,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -630,8 +652,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -716,156 +740,160 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 736;
+    Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1456;
+    1472;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1464;
+    1480;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1528;
+    1544;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1544;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+    624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    616;
+    632;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    464;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    696;
+    712;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 688;
+    Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1496;
+    1512;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 720;
+    Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 712;
+    Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    704;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 728;
+    Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1472;
+    1488;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
+    Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1520;
+    1536;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1480;
+    Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1488;
+    Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1504;
+    1520;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -878,11 +906,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1512;
+    1528;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -900,6 +928,10 @@
 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 TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+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;
@@ -929,8 +961,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
+        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -939,7 +971,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 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 = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 176;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -999,7 +1031,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -1075,6 +1107,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -1115,6 +1149,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -1140,8 +1178,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     68;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -1225,155 +1265,159 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 384;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    692;
+    700;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 204;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 728;
+    Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 736;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 736;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 744;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+    320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    316;
+    324;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    240;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 360;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    712;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 268;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 328;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    368;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 380;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    700;
+    708;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
+    Thread_interpret_call_entry_point_offset = 348;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    724;
+    732;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 316;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 220;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 704;
+    Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 712;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 708;
+    Thread_saved_shadow_call_stack_offset = 716;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    716;
+    724;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -1386,10 +1430,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 720;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 728;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -1406,6 +1450,10 @@
 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 TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+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;
@@ -1441,7 +1489,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 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 = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 96;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -1501,7 +1549,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -1578,6 +1626,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -1618,6 +1668,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -1643,8 +1697,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -1729,156 +1785,160 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 736;
+    Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1528;
+    1544;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1536;
+    1552;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1600;
+    1616;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1616;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1632;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+    624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    616;
+    632;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    464;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    696;
+    712;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 688;
+    Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1568;
+    1584;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 720;
+    Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 712;
+    Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    704;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 728;
+    Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1544;
+    1560;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
+    Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1592;
+    1608;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1552;
+    Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1568;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1560;
+    Thread_saved_shadow_call_stack_offset = 1576;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1576;
+    1592;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -1891,11 +1951,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1584;
+    1600;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1913,6 +1973,10 @@
 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 TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+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;
@@ -1942,9 +2006,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
+        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -1953,7 +2017,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 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 = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 176;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -2013,7 +2077,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -2091,6 +2155,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -2129,6 +2195,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -2154,8 +2224,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     68;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -2238,155 +2310,159 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 384;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    724;
+    732;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    728;
+    736;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 204;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
+    Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 768;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 776;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+    320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    316;
+    324;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    240;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 360;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    744;
+    752;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 268;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 328;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    368;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 380;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    732;
+    740;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
+    Thread_interpret_call_entry_point_offset = 348;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    756;
+    764;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 316;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 220;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 736;
+    Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 744;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 740;
+    Thread_saved_shadow_call_stack_offset = 748;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    748;
+    756;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -2399,10 +2475,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 752;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 760;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -2419,6 +2495,10 @@
 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 TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+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;
@@ -2445,7 +2525,7 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word Array_header_size = 12;
@@ -2454,7 +2534,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 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 = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 76;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -2514,7 +2594,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -2591,6 +2671,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -2629,6 +2711,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -2654,8 +2740,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -2739,156 +2827,160 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 736;
+    Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1456;
+    1472;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1464;
+    1480;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1528;
+    1544;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1544;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+    624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    616;
+    632;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    464;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    696;
+    712;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 688;
+    Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1496;
+    1512;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 720;
+    Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 712;
+    Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    704;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 728;
+    Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1472;
+    1488;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
+    Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1520;
+    1536;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1480;
+    Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1488;
+    Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1504;
+    1520;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -2901,11 +2993,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1512;
+    1528;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -2923,6 +3015,10 @@
 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 TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+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;
@@ -2949,8 +3045,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
+        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -2959,7 +3055,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 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 = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 144;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -3019,7 +3115,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -3095,6 +3191,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -3133,6 +3231,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     24;
@@ -3158,8 +3260,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
 static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     68;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -3242,155 +3346,159 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 384;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    692;
+    700;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 268;
+    Thread_array_write_barrier_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 284;
+    Thread_allocate_object_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 192;
+    Thread_allocate_object_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 288;
+    Thread_allocate_object_parameterized_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 196;
+    Thread_allocate_object_parameterized_stub_offset = 204;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 292;
+    Thread_allocate_object_slow_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 728;
+    Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 736;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     96;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 272;
+    Thread_call_to_runtime_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 736;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 744;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+    320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    316;
+    324;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    232;
+    240;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 360;
 static constexpr dart::compiler::target::word Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 252;
+    Thread_enter_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    712;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 256;
+    Thread_exit_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 260;
+    Thread_call_native_through_safepoint_stub_offset = 268;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 320;
+    Thread_call_native_through_safepoint_entry_point_offset = 328;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 372;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    368;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 380;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    700;
+    708;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 340;
+    Thread_interpret_call_entry_point_offset = 348;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    724;
+    732;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     68;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 236;
+    Thread_lazy_deopt_from_return_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 240;
+    Thread_lazy_deopt_from_throw_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 248;
+    Thread_lazy_specialize_type_test_stub_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 304;
+    Thread_megamorphic_call_checked_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 308;
+    Thread_switchable_call_miss_entry_offset = 316;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 212;
+    Thread_switchable_call_miss_stub_offset = 220;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 704;
+    Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 712;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 708;
+    Thread_saved_shadow_call_stack_offset = 716;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    716;
+    724;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 244;
+    Thread_slow_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 324;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     60;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     80;
 static constexpr dart::compiler::target::word
@@ -3403,10 +3511,10 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     124;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 264;
+    Thread_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 720;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 728;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -3423,6 +3531,10 @@
 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 TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+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;
@@ -3455,7 +3567,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 128;
 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 = 28;
 static constexpr dart::compiler::target::word Code_InstanceSize = 76;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -3515,7 +3627,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
 static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -3592,6 +3704,8 @@
 static constexpr dart::compiler::target::word
     SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -3630,6 +3744,10 @@
 static constexpr dart::compiler::target::word Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word Code_saved_instructions_offset =
     48;
@@ -3655,8 +3773,10 @@
 static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
 static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
 static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
 static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
     8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
 static constexpr dart::compiler::target::word Function_packed_fields_offset =
     124;
 static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -3740,156 +3860,160 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 736;
+    Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1528;
+    1544;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1536;
+    1552;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 520;
+    Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_entry_point_offset = 552;
+    Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_stub_offset = 368;
+    Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_entry_point_offset = 560;
+    Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_parameterized_stub_offset = 376;
+    Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_entry_point_offset = 568;
+    Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    Thread_allocate_object_slow_stub_offset = 384;
+    Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1600;
+    1616;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     192;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 528;
+    Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1616;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1632;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+    624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    616;
+    632;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
-    448;
+    464;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    696;
+    712;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 688;
+    Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_enter_safepoint_stub_offset = 488;
+    Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1568;
+    1584;
 static constexpr dart::compiler::target::word
-    Thread_exit_safepoint_stub_offset = 496;
+    Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_stub_offset = 504;
+    Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    Thread_call_native_through_safepoint_entry_point_offset = 624;
+    Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 720;
+    Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 712;
+    Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    704;
+    720;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 728;
+    Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1544;
+    1560;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 664;
+    Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1592;
+    1608;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     136;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_return_stub_offset = 456;
+    Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_lazy_deopt_from_throw_stub_offset = 464;
+    Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_lazy_specialize_type_test_stub_offset = 480;
+    Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 592;
+    Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_entry_offset = 600;
+    Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    Thread_switchable_call_miss_stub_offset = 408;
+    Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1552;
+    Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1568;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1560;
+    Thread_saved_shadow_call_stack_offset = 1576;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1576;
+    1592;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_stub_offset = 472;
+    Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     120;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
     160;
 static constexpr dart::compiler::target::word
@@ -3902,11 +4026,11 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     232;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 512;
+    Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     80;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1584;
+    1600;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -3924,6 +4048,10 @@
 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 TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+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;
@@ -3950,9 +4078,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
+        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -3961,7 +4089,7 @@
 static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word Class_InstanceSize = 208;
 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 = 56;
 static constexpr dart::compiler::target::word Code_InstanceSize = 144;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -4021,7 +4149,7 @@
 static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
 static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
 static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -4100,6 +4228,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word
@@ -4141,6 +4271,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 24;
@@ -4167,8 +4301,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 52;
 static constexpr dart::compiler::target::word
@@ -4269,147 +4405,152 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 376;
+    AOT_Thread_AllocateArray_entry_point_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 724;
+    AOT_Thread_active_exception_offset = 732;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 728;
+    AOT_Thread_active_stacktrace_offset = 736;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 268;
+    AOT_Thread_array_write_barrier_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 284;
+    AOT_Thread_allocate_object_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 192;
+    AOT_Thread_allocate_object_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 288;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 196;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 204;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 292;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 200;
+    AOT_Thread_allocate_object_slow_stub_offset = 208;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    760;
+    768;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 96;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 272;
+    AOT_Thread_call_to_runtime_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 148;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    768;
+    776;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    312;
+    320;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    228;
+    236;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 316;
+    AOT_Thread_deoptimize_entry_offset = 324;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 232;
+    AOT_Thread_deoptimize_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 356;
+    AOT_Thread_double_abs_address_offset = 364;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 352;
+    AOT_Thread_double_negate_address_offset = 360;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 252;
+    AOT_Thread_enter_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 744;
+    AOT_Thread_execution_state_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 256;
+    AOT_Thread_exit_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 260;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 268;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 320;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 328;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 368;
+    AOT_Thread_float_absolute_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 364;
+    AOT_Thread_float_negate_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 360;
+    AOT_Thread_float_not_address_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 372;
+    AOT_Thread_float_zerow_address_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 732;
+    AOT_Thread_global_object_pool_offset = 740;
 static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 340;
+    AOT_Thread_interpret_call_entry_point_offset = 348;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 756;
+    AOT_Thread_exit_through_ffi_offset = 764;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 68;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 236;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 240;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 248;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 304;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 308;
+    AOT_Thread_switchable_call_miss_entry_offset = 316;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 212;
+    AOT_Thread_switchable_call_miss_stub_offset = 220;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 736;
+    AOT_Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 744;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 740;
+    AOT_Thread_saved_shadow_call_stack_offset = 748;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 748;
+    AOT_Thread_safepoint_state_offset = 756;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 244;
+    AOT_Thread_slow_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 324;
+    AOT_Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     36;
 static constexpr dart::compiler::target::word
@@ -4417,13 +4558,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 80;
 static constexpr dart::compiler::target::word
@@ -4437,11 +4578,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 124;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 264;
+    AOT_Thread_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    752;
+    760;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -4463,6 +4604,14 @@
     8;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 16;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    42;
+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;
@@ -4496,7 +4645,7 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
@@ -4505,7 +4654,7 @@
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
 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 = 28;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 88;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
@@ -4573,7 +4722,7 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     16;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 60;
@@ -4658,6 +4807,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -4699,6 +4850,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -4725,8 +4880,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -4827,148 +4984,153 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 736;
+    AOT_Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1456;
+    AOT_Thread_active_exception_offset = 1472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1464;
+    AOT_Thread_active_stacktrace_offset = 1480;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1528;
+    1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 280;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1544;
+    1560;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    624;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 632;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 696;
+    AOT_Thread_double_abs_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 688;
+    AOT_Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1496;
+    AOT_Thread_execution_state_offset = 1512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 720;
+    AOT_Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 712;
+    AOT_Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 704;
+    AOT_Thread_float_not_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 728;
+    AOT_Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1472;
+    AOT_Thread_global_object_pool_offset = 1488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
+    AOT_Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1520;
+    AOT_Thread_exit_through_ffi_offset = 1536;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 672;
+    AOT_Thread_predefined_symbols_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1480;
+    1496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1488;
+    AOT_Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1504;
+    AOT_Thread_safepoint_state_offset = 1520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -4976,13 +5138,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -4996,11 +5158,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1512;
+    1528;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5022,6 +5184,14 @@
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+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;
@@ -5055,8 +5225,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
+        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -5065,7 +5235,7 @@
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 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 = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -5133,7 +5303,7 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -5221,6 +5391,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -5262,6 +5434,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -5288,8 +5464,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -5390,148 +5568,153 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 736;
+    AOT_Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1528;
+    AOT_Thread_active_exception_offset = 1544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1536;
+    AOT_Thread_active_stacktrace_offset = 1552;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1600;
+    1616;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 280;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1616;
+    1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    624;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 632;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 696;
+    AOT_Thread_double_abs_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 688;
+    AOT_Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1568;
+    AOT_Thread_execution_state_offset = 1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 720;
+    AOT_Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 712;
+    AOT_Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 704;
+    AOT_Thread_float_not_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 728;
+    AOT_Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1544;
+    AOT_Thread_global_object_pool_offset = 1560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
+    AOT_Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1592;
+    AOT_Thread_exit_through_ffi_offset = 1608;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 672;
+    AOT_Thread_predefined_symbols_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1552;
+    1568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1560;
+    AOT_Thread_saved_shadow_call_stack_offset = 1576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1576;
+    AOT_Thread_safepoint_state_offset = 1592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -5539,13 +5722,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -5559,11 +5742,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1584;
+    1600;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5585,6 +5768,14 @@
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+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;
@@ -5618,9 +5809,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
+        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -5629,7 +5820,7 @@
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 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 = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -5697,7 +5888,7 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -5783,6 +5974,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    268435455;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 4;
 static constexpr dart::compiler::target::word
@@ -5822,6 +6015,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 24;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 24;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 24;
@@ -5848,8 +6045,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 52;
 static constexpr dart::compiler::target::word
@@ -5948,147 +6147,152 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 376;
+    AOT_Thread_AllocateArray_entry_point_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 724;
+    AOT_Thread_active_exception_offset = 732;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 728;
+    AOT_Thread_active_stacktrace_offset = 736;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 268;
+    AOT_Thread_array_write_barrier_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 284;
+    AOT_Thread_allocate_object_entry_point_offset = 292;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 192;
+    AOT_Thread_allocate_object_stub_offset = 200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 288;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 196;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 204;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 292;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 300;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 200;
+    AOT_Thread_allocate_object_slow_stub_offset = 208;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    760;
+    768;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 96;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 272;
+    AOT_Thread_call_to_runtime_entry_point_offset = 280;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 148;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    768;
+    776;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 48;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    312;
+    320;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    228;
+    236;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 316;
+    AOT_Thread_deoptimize_entry_offset = 324;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 232;
+    AOT_Thread_deoptimize_stub_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 356;
+    AOT_Thread_double_abs_address_offset = 364;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 352;
+    AOT_Thread_double_negate_address_offset = 360;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 252;
+    AOT_Thread_enter_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 744;
+    AOT_Thread_execution_state_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 256;
+    AOT_Thread_exit_safepoint_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 260;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 268;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 320;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 328;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 136;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 368;
+    AOT_Thread_float_absolute_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 364;
+    AOT_Thread_float_negate_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 360;
+    AOT_Thread_float_not_address_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 372;
+    AOT_Thread_float_zerow_address_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 732;
+    AOT_Thread_global_object_pool_offset = 740;
 static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 340;
+    AOT_Thread_interpret_call_entry_point_offset = 348;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 756;
+    AOT_Thread_exit_through_ffi_offset = 764;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 68;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 236;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 244;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 240;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 248;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 84;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 304;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 308;
+    AOT_Thread_switchable_call_miss_entry_offset = 316;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 212;
+    AOT_Thread_switchable_call_miss_stub_offset = 220;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 332;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        152;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 736;
+    AOT_Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 744;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 740;
+    AOT_Thread_saved_shadow_call_stack_offset = 748;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 748;
+    AOT_Thread_safepoint_state_offset = 756;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 244;
+    AOT_Thread_slow_type_test_stub_offset = 252;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 324;
+    AOT_Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     36;
 static constexpr dart::compiler::target::word
@@ -6096,13 +6300,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 64;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 80;
 static constexpr dart::compiler::target::word
@@ -6116,11 +6320,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 124;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 264;
+    AOT_Thread_write_barrier_entry_point_offset = 272;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    752;
+    760;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6142,6 +6346,14 @@
     8;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 16;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    42;
+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;
@@ -6172,7 +6384,7 @@
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+        700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
@@ -6181,7 +6393,7 @@
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
 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 = 28;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 64;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
@@ -6249,7 +6461,7 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     16;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 60;
@@ -6334,6 +6546,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -6373,6 +6587,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -6399,8 +6617,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -6499,148 +6719,153 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 736;
+    AOT_Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1456;
+    AOT_Thread_active_exception_offset = 1472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1464;
+    AOT_Thread_active_stacktrace_offset = 1480;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1528;
+    1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 280;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1544;
+    1560;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    624;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 632;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 696;
+    AOT_Thread_double_abs_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 688;
+    AOT_Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1496;
+    AOT_Thread_execution_state_offset = 1512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 720;
+    AOT_Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 712;
+    AOT_Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 704;
+    AOT_Thread_float_not_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 728;
+    AOT_Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1472;
+    AOT_Thread_global_object_pool_offset = 1488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
+    AOT_Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1520;
+    AOT_Thread_exit_through_ffi_offset = 1536;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 672;
+    AOT_Thread_predefined_symbols_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1480;
+    1496;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1488;
+    AOT_Thread_saved_shadow_call_stack_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1504;
+    AOT_Thread_safepoint_state_offset = 1520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -6648,13 +6873,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -6668,11 +6893,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1512;
+    1528;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6694,6 +6919,14 @@
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+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;
@@ -6724,8 +6957,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, -1,   -1,   1400, 1408,
-        1416, 1424, 1432, -1,   1440, 1448, -1,   -1};
+        1384, 1392, 1400, 1408, -1,   -1,   1416, 1424,
+        1432, 1440, 1448, -1,   1456, 1464, -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -6734,7 +6967,7 @@
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 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 = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -6802,7 +7035,7 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -6890,6 +7123,8 @@
     AOT_SubtypeTestCache_kTestEntryLength = 7;
 static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
     0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+    576460752303423487;
 static constexpr dart::compiler::target::word
     AOT_AbstractType_type_test_stub_entry_point_offset = 8;
 static constexpr dart::compiler::target::word
@@ -6929,6 +7164,10 @@
 static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
 static constexpr dart::compiler::target::word
     AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+    AOT_ClosureData_default_type_arguments_info_offset = 48;
 static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
 static constexpr dart::compiler::target::word
     AOT_Code_saved_instructions_offset = 48;
@@ -6955,8 +7194,10 @@
 static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
 static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
 static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
 static constexpr dart::compiler::target::word
     AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
 static constexpr dart::compiler::target::word
     AOT_Function_packed_fields_offset = 100;
 static constexpr dart::compiler::target::word
@@ -7055,148 +7296,153 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 736;
+    AOT_Thread_AllocateArray_entry_point_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1528;
+    AOT_Thread_active_exception_offset = 1544;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1536;
+    AOT_Thread_active_stacktrace_offset = 1552;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_array_write_barrier_entry_point_offset = 520;
+    AOT_Thread_array_write_barrier_entry_point_offset = 536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+    AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+    AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+    AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+    AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_entry_point_offset = 552;
+    AOT_Thread_allocate_object_entry_point_offset = 568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_stub_offset = 368;
+    AOT_Thread_allocate_object_stub_offset = 384;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+    AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+    AOT_Thread_allocate_object_parameterized_stub_offset = 392;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+    AOT_Thread_allocate_object_slow_entry_point_offset = 584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_allocate_object_slow_stub_offset = 384;
+    AOT_Thread_allocate_object_slow_stub_offset = 400;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1600;
+    1616;
 static constexpr dart::compiler::target::word
     AOT_Thread_async_stack_trace_offset = 192;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     224;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_to_runtime_entry_point_offset = 528;
+    AOT_Thread_call_to_runtime_entry_point_offset = 544;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 280;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1616;
+    1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 96;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
-    608;
+    624;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
-    440;
+    456;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_entry_offset = 616;
+    AOT_Thread_deoptimize_entry_offset = 632;
 static constexpr dart::compiler::target::word
-    AOT_Thread_deoptimize_stub_offset = 448;
+    AOT_Thread_deoptimize_stub_offset = 464;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 696;
+    AOT_Thread_double_abs_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 688;
+    AOT_Thread_double_negate_address_offset = 704;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_enter_safepoint_stub_offset = 488;
+    AOT_Thread_enter_safepoint_stub_offset = 504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1568;
+    AOT_Thread_execution_state_offset = 1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_safepoint_stub_offset = 496;
+    AOT_Thread_exit_safepoint_stub_offset = 512;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+    AOT_Thread_call_native_through_safepoint_stub_offset = 520;
 static constexpr dart::compiler::target::word
-    AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+    AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_allocation_stub_code_offset = 256;
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 720;
+    AOT_Thread_float_absolute_address_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 712;
+    AOT_Thread_float_negate_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 704;
+    AOT_Thread_float_not_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 728;
+    AOT_Thread_float_zerow_address_offset = 744;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1544;
+    AOT_Thread_global_object_pool_offset = 1560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_interpret_call_entry_point_offset = 664;
+    AOT_Thread_interpret_call_entry_point_offset = 680;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 264;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1592;
+    AOT_Thread_exit_through_ffi_offset = 1608;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 136;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+    AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+    AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
 static constexpr dart::compiler::target::word
-    AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+    AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
 static constexpr dart::compiler::target::word
     AOT_Thread_marking_stack_block_offset = 168;
 static constexpr dart::compiler::target::word
-    AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+    AOT_Thread_megamorphic_call_checked_entry_offset = 608;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_entry_offset = 600;
+    AOT_Thread_switchable_call_miss_entry_offset = 616;
 static constexpr dart::compiler::target::word
-    AOT_Thread_switchable_call_miss_stub_offset = 408;
+    AOT_Thread_switchable_call_miss_stub_offset = 424;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+    AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+    AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+        288;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+    AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+    AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+    AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
 static constexpr dart::compiler::target::word
-    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+    AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+    AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
 static constexpr dart::compiler::target::word
-    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+    AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+    AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 672;
+    AOT_Thread_predefined_symbols_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1552;
+    1568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1560;
+    AOT_Thread_saved_shadow_call_stack_offset = 1576;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1576;
+    AOT_Thread_safepoint_state_offset = 1592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_stub_offset = 472;
+    AOT_Thread_slow_type_test_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 648;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     72;
 static constexpr dart::compiler::target::word
@@ -7204,13 +7450,13 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_stack_overflow_flags_offset = 128;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+    AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+    AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
 static constexpr dart::compiler::target::word
     AOT_Thread_store_buffer_block_offset = 160;
 static constexpr dart::compiler::target::word
@@ -7224,11 +7470,11 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
-    AOT_Thread_write_barrier_entry_point_offset = 512;
+    AOT_Thread_write_barrier_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_mask_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1584;
+    1600;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -7250,6 +7496,14 @@
     16;
 static constexpr dart::compiler::target::word
     AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+    40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+    74;
+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;
@@ -7280,9 +7534,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
-        1456, 1464, 1472, 1480, -1,   -1,   -1,   -1,   1488, 1496, -1,
-        -1,   1504, 1512, 1520, -1,   -1,   -1,   -1,   -1,   -1};
+        1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+        1472, 1480, 1488, 1496, -1,   -1,   -1,   -1,   1504, 1512, -1,
+        -1,   1520, 1528, 1536, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -7291,7 +7545,7 @@
 static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
 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 = 56;
 static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
@@ -7359,7 +7613,7 @@
 static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
 static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 76eb49f..6039830 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -60,6 +60,7 @@
   CONSTANT(SubtypeTestCache, kInstantiatorTypeArguments)                       \
   CONSTANT(SubtypeTestCache, kTestEntryLength)                                 \
   CONSTANT(SubtypeTestCache, kTestResult)                                      \
+  CONSTANT(TypeArguments, kMaxElements)                                        \
   FIELD(AbstractType, type_test_stub_entry_point_offset)                       \
   FIELD(ArgumentsDescriptor, count_offset)                                     \
   FIELD(ArgumentsDescriptor, size_offset)                                      \
@@ -84,6 +85,8 @@
   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_info_offset)                       \
   FIELD(Code, object_pool_offset)                                              \
   FIELD(Code, saved_instructions_offset)                                       \
   FIELD(Code, owner_offset)                                                    \
@@ -102,8 +105,10 @@
   FIELD(Field, is_nullable_offset)                                             \
   FIELD(Field, kind_bits_offset)                                               \
   FIELD(Function, code_offset)                                                 \
+  FIELD(Function, data_offset)                                                 \
   RANGE(Function, entry_point_offset, CodeEntryKind, CodeEntryKind::kNormal,   \
         CodeEntryKind::kUnchecked, [](CodeEntryKind value) { return true; })   \
+  FIELD(Function, kind_tag_offset)                                             \
   FIELD(Function, packed_fields_offset)                                        \
   FIELD(Function, parameter_names_offset)                                      \
   FIELD(Function, parameter_types_offset)                                      \
@@ -217,6 +222,8 @@
   FIELD(Thread, switchable_call_miss_entry_offset)                             \
   FIELD(Thread, switchable_call_miss_stub_offset)                              \
   FIELD(Thread, no_scope_native_wrapper_entry_point_offset)                    \
+  FIELD(Thread, late_initialization_error_shared_with_fpu_regs_stub_offset)    \
+  FIELD(Thread, late_initialization_error_shared_without_fpu_regs_stub_offset) \
   FIELD(Thread, null_error_shared_with_fpu_regs_stub_offset)                   \
   FIELD(Thread, null_error_shared_without_fpu_regs_stub_offset)                \
   FIELD(Thread, null_arg_error_shared_with_fpu_regs_stub_offset)               \
@@ -264,6 +271,10 @@
   FIELD(TypeArguments, instantiations_offset)                                  \
   FIELD(TypeArguments, length_offset)                                          \
   FIELD(TypeArguments, nullability_offset)                                     \
+  FIELD(TypeArguments, types_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)                                            \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index dfa4d4f..547cf92 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -166,6 +166,19 @@
   __ Breakpoint();
 }
 
+void StubCodeCompiler::GenerateAssertSubtypeStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  __ PushRegister(AssertSubtypeABI::kInstantiatorTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kFunctionTypeArgumentsReg);
+  __ PushRegister(AssertSubtypeABI::kSubTypeReg);
+  __ PushRegister(AssertSubtypeABI::kSuperTypeReg);
+  __ PushRegister(AssertSubtypeABI::kDstNameReg);
+  __ CallRuntime(kSubtypeCheckRuntimeEntry, /*argument_count=*/5);
+  __ Drop(5);  // Drop unused result as well as arguments.
+  __ LeaveStubFrame();
+  __ Ret();
+}
+
 void StubCodeCompiler::GenerateInstanceOfStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for the result.
@@ -204,6 +217,106 @@
 CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATION_STUB)
 #undef TYPED_DATA_ALLOCATION_STUB
 
+void StubCodeCompiler::GenerateLateInitializationError(Assembler* assembler,
+                                                       bool with_fpu_regs) {
+  auto perform_runtime_call = [&]() {
+    __ PushRegister(LateInitializationErrorABI::kFieldReg);
+    __ CallRuntime(kLateInitializationErrorRuntimeEntry, /*argument_count=*/1);
+  };
+  GenerateSharedStubGeneric(
+      assembler, /*save_fpu_registers=*/with_fpu_regs,
+      with_fpu_regs
+          ? target::Thread::
+                late_initialization_error_shared_with_fpu_regs_stub_offset()
+          : target::Thread::
+                late_initialization_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false, perform_runtime_call);
+}
+
+void StubCodeCompiler::GenerateLateInitializationErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateLateInitializationError(assembler, /*with_fpu_regs=*/false);
+}
+
+void StubCodeCompiler::GenerateLateInitializationErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateLateInitializationError(assembler, /*with_fpu_regs=*/true);
+}
+
+void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
+      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
+      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
+      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
+      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
+      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
+      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
+      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
+      /*allow_return=*/true);
+}
+
+void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateSharedStub(
+      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
+      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
+      /*allow_return=*/true);
+}
+
+void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
+    Assembler* assembler) {
+  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
+}
+
+void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
+    Assembler* assembler) {
+  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
+}
+
 }  // namespace compiler
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/stub_code_compiler.h b/runtime/vm/compiler/stub_code_compiler.h
index d4a6fd0..5f3e09c 100644
--- a/runtime/vm/compiler/stub_code_compiler.h
+++ b/runtime/vm/compiler/stub_code_compiler.h
@@ -9,6 +9,8 @@
 #error "AOT runtime should not use compiler sources (including header files)"
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
+#include <functional>
+
 #include "vm/allocation.h"
 #include "vm/compiler/runtime_api.h"
 #include "vm/constants.h"
@@ -146,6 +148,30 @@
   // Common function for generating Allocate<TypedData>Array stubs.
   static void GenerateAllocateTypedDataArrayStub(Assembler* assembler,
                                                  intptr_t cid);
+
+  static void GenerateSharedStubGeneric(
+      Assembler* assembler,
+      bool save_fpu_registers,
+      intptr_t self_code_stub_offset_from_thread,
+      bool allow_return,
+      std::function<void()> perform_runtime_call);
+
+  // Generates shared slow path stub which saves registers and calls
+  // [target] runtime entry.
+  // If [store_runtime_result_in_result_register], then stub puts result into
+  // SharedSlowPathStubABI::kResultReg.
+  static void GenerateSharedStub(
+      Assembler* assembler,
+      bool save_fpu_registers,
+      const RuntimeEntry* target,
+      intptr_t self_code_stub_offset_from_thread,
+      bool allow_return,
+      bool store_runtime_result_in_result_register = false);
+
+  static void GenerateLateInitializationError(Assembler* assembler,
+                                              bool with_fpu_regs);
+
+  static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index b1744c7..fef56a0 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -165,11 +165,12 @@
   __ Ret();
 }
 
-void GenerateSharedStubGeneric(Assembler* assembler,
-                               bool save_fpu_registers,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               std::function<void()> perform_runtime_call) {
+void StubCodeCompiler::GenerateSharedStubGeneric(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    std::function<void()> perform_runtime_call) {
   // If the target CPU does not support VFP the caller should always use the
   // non-FPU stub.
   if (save_fpu_registers && !TargetCPUFeatures::vfp_supported()) {
@@ -199,24 +200,25 @@
   __ bx(LR);
 }
 
-static void GenerateSharedStub(Assembler* assembler,
-                               bool save_fpu_registers,
-                               const RuntimeEntry* target,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               bool store_runtime_result_in_r0 = false) {
-  ASSERT(!store_runtime_result_in_r0 || allow_return);
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
+  ASSERT(!store_runtime_result_in_result_register || allow_return);
   auto perform_runtime_call = [&]() {
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PushRegister(LR);
     }
     __ CallRuntime(*target, /*argument_count=*/0);
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PopRegister(R0);
-      __ str(
-          R0,
-          Address(FP, target::kWordSize *
-                          StubCodeCompiler::WordOffsetFromFpToCpuRegister(R0)));
+      __ str(R0,
+             Address(FP, target::kWordSize *
+                             StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+                                 SharedSlowPathStubABI::kResultReg)));
     }
   };
   GenerateSharedStubGeneric(assembler, save_fpu_registers,
@@ -491,55 +493,8 @@
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
   auto perform_runtime_call = [&]() {
     ASSERT(!GenericCheckBoundInstr::UseUnboxedRepresentation());
     __ PushRegister(RangeErrorABI::kLengthReg);
@@ -556,32 +511,6 @@
       /*allow_return=*/false, perform_runtime_call);
 }
 
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
 // Input parameters:
 //   LR : return address.
 //   SP : address of return value.
@@ -1211,12 +1140,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
                      /*allow_return=*/true,
-                     /*store_runtime_result_in_r0=*/true);
+                     /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called for allocation of Mint.
@@ -1231,12 +1161,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
       /*allow_return=*/true,
-      /*store_runtime_result_in_r0=*/true);
+      /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called when invoking Dart code from C++ (VM code).
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index fdb10212..6548ef8 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -181,7 +181,7 @@
   __ ret();
 }
 
-static void GenerateSharedStubGeneric(
+void StubCodeCompiler::GenerateSharedStubGeneric(
     Assembler* assembler,
     bool save_fpu_registers,
     intptr_t self_code_stub_offset_from_thread,
@@ -209,24 +209,25 @@
   __ ret(LR);
 }
 
-static void GenerateSharedStub(Assembler* assembler,
-                               bool save_fpu_registers,
-                               const RuntimeEntry* target,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               bool store_runtime_result_in_r0 = false) {
-  ASSERT(!store_runtime_result_in_r0 || allow_return);
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
+  ASSERT(!store_runtime_result_in_result_register || allow_return);
   auto perform_runtime_call = [&]() {
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PushRegister(NULL_REG);
     }
     __ CallRuntime(*target, /*argument_count=*/0);
-    if (store_runtime_result_in_r0) {
+    if (store_runtime_result_in_result_register) {
       __ PopRegister(R0);
-      __ str(
-          R0,
-          Address(FP, target::kWordSize *
-                          StubCodeCompiler::WordOffsetFromFpToCpuRegister(R0)));
+      __ str(R0,
+             Address(FP, target::kWordSize *
+                             StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+                                 SharedSlowPathStubABI::kResultReg)));
     }
   };
   GenerateSharedStubGeneric(assembler, save_fpu_registers,
@@ -545,55 +546,8 @@
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
   auto perform_runtime_call = [&]() {
     // If the generated code has unboxed index/length we need to box them before
     // calling the runtime entry.
@@ -640,32 +594,6 @@
       /*allow_return=*/false, perform_runtime_call);
 }
 
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
 // Input parameters:
 //   LR : return address.
 //   SP : address of return value.
@@ -1334,12 +1262,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
                      /*allow_return=*/true,
-                     /*store_runtime_result_in_r0=*/true);
+                     /*store_runtime_result_in_result_register=*/true);
 }
 
 void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
@@ -1353,12 +1282,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
       /*allow_return=*/true,
-      /*store_runtime_result_in_r0=*/true);
+      /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called when invoking Dart code from C++ (VM code).
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 369f95b..e3eeed6 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -298,61 +298,36 @@
 #endif
 }
 
-void StubCodeCompiler::GenerateDispatchTableNullErrorStub(
-    Assembler* assembler) {
+void StubCodeCompiler::GenerateSharedStubGeneric(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    std::function<void()> perform_runtime_call) {
   // Only used in AOT.
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
+  // Only used in AOT.
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
+  // Only used in AOT.
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
+void StubCodeCompiler::GenerateDispatchTableNullErrorStub(
     Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  // TODO(sjindel): implement.
-  __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  // TODO(sjindel): implement.
+  // Only used in AOT.
   __ Breakpoint();
 }
 
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index c5eeb8a..7af1a07 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -164,7 +164,7 @@
   __ ret();
 }
 
-static void GenerateSharedStubGeneric(
+void StubCodeCompiler::GenerateSharedStubGeneric(
     Assembler* assembler,
     bool save_fpu_registers,
     intptr_t self_code_stub_offset_from_thread,
@@ -202,22 +202,23 @@
   __ ret();
 }
 
-static void GenerateSharedStub(Assembler* assembler,
-                               bool save_fpu_registers,
-                               const RuntimeEntry* target,
-                               intptr_t self_code_stub_offset_from_thread,
-                               bool allow_return,
-                               bool store_runtime_result_in_rax = false) {
+void StubCodeCompiler::GenerateSharedStub(
+    Assembler* assembler,
+    bool save_fpu_registers,
+    const RuntimeEntry* target,
+    intptr_t self_code_stub_offset_from_thread,
+    bool allow_return,
+    bool store_runtime_result_in_result_register) {
   auto perform_runtime_call = [&]() {
-    if (store_runtime_result_in_rax) {
+    if (store_runtime_result_in_result_register) {
       __ PushImmediate(Immediate(0));
     }
     __ CallRuntime(*target, /*argument_count=*/0);
-    if (store_runtime_result_in_rax) {
+    if (store_runtime_result_in_result_register) {
       __ PopRegister(RAX);
-      __ movq(Address(RBP,
-                      target::kWordSize *
-                          StubCodeCompiler::WordOffsetFromFpToCpuRegister(RAX)),
+      __ movq(Address(RBP, target::kWordSize *
+                               StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+                                   SharedSlowPathStubABI::kResultReg)),
               RAX);
     }
   };
@@ -492,55 +493,8 @@
   __ Breakpoint();
 }
 
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
-      target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
-      target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
-      target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+                                          bool with_fpu_regs) {
   auto perform_runtime_call = [&]() {
     // If the generated code has unboxed index/length we need to box them before
     // calling the runtime entry.
@@ -589,32 +543,6 @@
       /*allow_return=*/false, perform_runtime_call);
 }
 
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
-    Assembler* assembler) {
-  GenerateSharedStub(
-      assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
-      target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
-      /*allow_return=*/true);
-}
-
 // Input parameters:
 //   RSP : points to return address.
 //   RSP + 8 : address of return value.
@@ -1258,12 +1186,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
                      &kAllocateMintRuntimeEntry,
                      target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
                      /*allow_return=*/true,
-                     /*store_runtime_result_in_rax=*/true);
+                     /*store_runtime_result_in_result_register=*/true);
 }
 
 void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
@@ -1277,12 +1206,13 @@
 
     __ Bind(&slow_case);
   }
-  COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+  COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+                 SharedSlowPathStubABI::kResultReg);
   GenerateSharedStub(
       assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
       target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
       /*allow_return=*/true,
-      /*store_runtime_result_in_rax=*/true);
+      /*store_runtime_result_in_result_register=*/true);
 }
 
 // Called when invoking Dart code from C++ (VM code).
diff --git a/runtime/vm/compiler/write_barrier_elimination_test.cc b/runtime/vm/compiler/write_barrier_elimination_test.cc
index a45ece7..f483b05 100644
--- a/runtime/vm/compiler/write_barrier_elimination_test.cc
+++ b/runtime/vm/compiler/write_barrier_elimination_test.cc
@@ -215,7 +215,7 @@
         final root = List<dynamic>.filled(128, null);
         List<dynamic> last = root;
         for (int i = 0; i < 10 * 1024; ++i) {
-          final nc = List(128);
+          final nc = List<dynamic>.filled(128, null);
           last[0] = nc;
           last = nc;
         }
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index d7f79a7..016d438 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -310,6 +310,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = R3;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = R0;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = R3;
@@ -337,6 +342,23 @@
   static const Register kResultReg = R0;
 };
 
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = R0;
+  static const Register kSuperTypeReg = R8;
+  static const Register kInstantiatorTypeArgumentsReg = R2;
+  static const Register kFunctionTypeArgumentsReg = R1;
+  static const Register kDstNameReg = R3;
+
+  static const intptr_t kAbiRegisters =
+      (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+      (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+      (1 << kDstNameReg);
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // Registers used inside the implementation of type testing stubs.
 struct TTSInternalRegs {
   static const Register kInstanceTypeArgumentsReg = R4;
@@ -366,6 +388,11 @@
   static const Register kScratchReg = R4;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = R9;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = R0;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 87dbb7f..39225df 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -142,6 +142,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = R1;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = R0;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = R3;
@@ -169,6 +174,23 @@
   static const Register kResultReg = R0;
 };
 
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = R0;
+  static const Register kSuperTypeReg = R8;
+  static const Register kInstantiatorTypeArgumentsReg = R2;
+  static const Register kFunctionTypeArgumentsReg = R1;
+  static const Register kDstNameReg = R3;
+
+  static const intptr_t kAbiRegisters =
+      (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+      (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+      (1 << kDstNameReg);
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // Registers used inside the implementation of type testing stubs.
 struct TTSInternalRegs {
   static const Register kInstanceTypeArgumentsReg = R7;
@@ -198,6 +220,11 @@
   static const Register kScratchReg = R4;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = R9;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = R0;
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 02ac81d..a8d5b46 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -91,6 +91,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = EDX;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = EAX;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = EBX;
@@ -116,6 +121,20 @@
   static const Register kResultReg = kNoRegister;
 };
 
+// Calling convention when calling kSubtypeCheckRuntimeEntry, to match other
+// architectures. We don't generate a call to the AssertSubtypeStub because we
+// need CODE_REG to store a fifth argument.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = EAX;
+  static const Register kSuperTypeReg = EBX;
+  static const Register kInstantiatorTypeArgumentsReg = EDX;
+  static const Register kFunctionTypeArgumentsReg = ECX;
+  static const Register kDstNameReg = EDI;  /// On ia32 we don't use CODE_REG.
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
   static const Register kFieldReg = EAX;
@@ -136,6 +155,11 @@
   static const Register kScratchReg = EDI;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = EDI;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = EAX;
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index b74b2b6..dc2e794 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -132,6 +132,11 @@
 // ABI for allocation stubs.
 const Register kAllocationStubTypeArgumentsReg = RDX;
 
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+  static const Register kResultReg = RAX;
+};
+
 // ABI for instantiation stubs.
 struct InstantiationABI {
   static const Register kUninstantiatedTypeArgumentsReg = RBX;
@@ -159,6 +164,23 @@
   static const Register kResultReg = RAX;
 };
 
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+  static const Register kSubTypeReg = RAX;
+  static const Register kSuperTypeReg = RBX;
+  static const Register kInstantiatorTypeArgumentsReg = RDX;
+  static const Register kFunctionTypeArgumentsReg = RCX;
+  static const Register kDstNameReg = R9;
+
+  static const intptr_t kAbiRegisters =
+      (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+      (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+      (1 << kDstNameReg);
+
+  // No result register, as AssertSubtype is only run for side effect
+  // (throws if the subtype check fails).
+};
+
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
   static const Register kFieldReg = RAX;
@@ -179,6 +201,11 @@
   static const Register kScratchReg = RSI;
 };
 
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+  static const Register kFieldReg = RSI;
+};
+
 // ABI for ThrowStub.
 struct ThrowABI {
   static const Register kExceptionReg = RAX;
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 0046562..cf7853f 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1966,7 +1966,7 @@
 
   const char* kScriptChars =
       "import 'dart:typed_data';\n"
-      "List main(int size) {\n"
+      "List testMain(int size) {\n"
       "  var a = new Int8List(size);\n"
       "  var view = new Int8List.view(a.buffer, 0, size);\n"
       "  return view;\n"
@@ -1977,7 +1977,7 @@
   // Test with a typed data view object.
   Dart_Handle dart_args[1];
   dart_args[0] = Dart_NewInteger(kSize);
-  Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+  Dart_Handle view_obj = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
   EXPECT_VALID(view_obj);
   for (intptr_t i = 0; i < kSize; ++i) {
     EXPECT_VALID(Dart_ListSetAt(view_obj, i, Dart_NewInteger(i & 0xff)));
@@ -1998,7 +1998,7 @@
 
   const char* kScriptChars =
       "import 'dart:typed_data';\n"
-      "List main(int size) {\n"
+      "List testMain(int size) {\n"
       "  var a = new Int8List(size);\n"
       "  var view = new Int8List.view(a.buffer, 0, size);\n"
       "  return view;\n"
@@ -2009,7 +2009,7 @@
   // Create a typed data view object.
   Dart_Handle dart_args[1];
   dart_args[0] = Dart_NewInteger(kSize);
-  Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+  Dart_Handle view_obj = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
   EXPECT_VALID(view_obj);
   // Test that the API considers it a TypedData object.
   EXPECT(Dart_IsTypedData(view_obj));
@@ -5524,9 +5524,6 @@
       "  factory MyClass.multiply(value) {\n"
       "    return new MyClass.named(value * 100);\n"
       "  }\n"
-      "  factory MyClass.nullo() {\n"
-      "    return null;\n"
-      "  }\n"
       "  var foo;\n"
       "}\n"
       "\n"
@@ -5687,11 +5684,6 @@
   EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
   EXPECT_EQ(1100, int_value);
 
-  // Invoke a factory constructor which returns null.
-  result = Dart_New(type, NewString("nullo"), 0, NULL);
-  EXPECT_VALID(result);
-  EXPECT(Dart_IsNull(result));
-
   // Pass an error class object.  Error is passed through.
   result = Dart_New(Dart_NewApiError("myerror"), NewString("named"), 1, args);
   EXPECT_ERROR(result, "myerror");
@@ -5967,6 +5959,13 @@
 
   // Null is always valid as the fill argument if we're creating an empty list.
   EXPECT_VALID(Dart_NewListOfTypeFilled(zxhandle_type, Dart_Null(), 0));
+
+  // Test creation of a non nullable list of strings.
+  Dart_Handle corelib = Dart_LookupLibrary(NewString("dart:core"));
+  EXPECT_VALID(corelib);
+  Dart_Handle string_type =
+      Dart_GetNonNullableType(corelib, NewString("String"), 0, NULL);
+  EXPECT_VALID(Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), 2));
 }
 
 static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) {
@@ -8626,7 +8625,7 @@
 
 TEST_CASE(DartAPI_ExternalStringIndexOf) {
   const char* kScriptChars =
-      "main(String pattern) {\n"
+      "testMain(String pattern) {\n"
       "  var str = 'Hello World';\n"
       "  return str.indexOf(pattern);\n"
       "}\n";
@@ -8641,7 +8640,7 @@
 
   Dart_Handle dart_args[1];
   dart_args[0] = ext8;
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+  Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
   int64_t value = 0;
   result = Dart_IntegerToInt64(result, &value);
   EXPECT_VALID(result);
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index aec36e8..89f06a9 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -750,6 +750,31 @@
   return result.raw();
 }
 
+ObjectPtr DartLibraryCalls::LookupOpenPorts() {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Function& function = Function::Handle(
+      zone, thread->isolate()->object_store()->lookup_open_ports());
+  const int kTypeArgsLen = 0;
+  const int kNumArguments = 0;
+  if (function.IsNull()) {
+    Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
+    ASSERT(!isolate_lib.IsNull());
+    const String& class_name = String::Handle(
+        zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
+    const String& function_name = String::Handle(
+        zone, isolate_lib.PrivateName(Symbols::_lookupOpenPorts()));
+    function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
+                                       kTypeArgsLen, kNumArguments,
+                                       Object::empty_array());
+    ASSERT(!function.IsNull());
+    thread->isolate()->object_store()->set_lookup_open_ports(function);
+  }
+  const Object& result = Object::Handle(
+      zone, DartEntry::InvokeFunction(function, Object::empty_array()));
+  return result.raw();
+}
+
 ObjectPtr DartLibraryCalls::HandleMessage(const Object& handler,
                                           const Instance& message) {
   Thread* thread = Thread::Current();
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 4f81b28..1527c11 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -284,6 +284,9 @@
   // Returns the handler if one has been registered for this port id.
   static ObjectPtr LookupHandler(Dart_Port port_id);
 
+  // Returns a list of open ReceivePorts.
+  static ObjectPtr LookupOpenPorts();
+
   // Returns null on success, a RawError on failure.
   static ObjectPtr HandleMessage(const Object& handler,
                                  const Instance& dart_message);
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 3d6c231..83ae8f5 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -420,11 +420,12 @@
 intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
   // Calls to the type testing stubs look like:
   //   ldr R9, ...
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blx R9
   // or
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blx pc+<offset>
+  // where Rn = TypeTestABI::kSubtypeTestCacheReg.
 
   // Ensure the caller of the type testing stub (whose return address is [pc_])
   // branched via `blx R9` or a pc-relative call.
@@ -440,7 +441,7 @@
   Register reg;
   intptr_t pool_index = -1;
   InstructionPattern::DecodeLoadWordFromPool(load_instr_end, &reg, &pool_index);
-  ASSERT(reg == R3);
+  ASSERT_EQUAL(reg, TypeTestABI::kSubtypeTestCacheReg);
   return pool_index;
 }
 
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 17b2243..2eed6c0 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -556,11 +556,12 @@
 intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
   // Calls to the type testing stubs look like:
   //   ldr R9, ...
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blr R9
   // or
-  //   ldr R3, [PP+idx]
+  //   ldr Rn, [PP+idx]
   //   blr pc+<offset>
+  // where Rn = TypeTestABI::kSubtypeTestCacheReg.
 
   // Ensure the caller of the type testing stub (whose return address is [pc_])
   // branched via `blr R9` or a pc-relative call.
@@ -576,7 +577,7 @@
   Register reg;
   intptr_t pool_index = -1;
   InstructionPattern::DecodeLoadWordFromPool(load_instr_end, &reg, &pool_index);
-  ASSERT(reg == R3);
+  ASSERT_EQUAL(reg, TypeTestABI::kSubtypeTestCacheReg);
   return pool_index;
 }
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3f7e002..03f4c83 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -2395,8 +2395,9 @@
     args.SetAt(2, Instance::Handle(state->BuildArgs(thread)));
     args.SetAt(3, Instance::Handle(state->BuildMessage(thread)));
     args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False());
-    args.SetAt(5, ReceivePort::Handle(ReceivePort::New(
-                      isolate->main_port(), true /* control port */)));
+    args.SetAt(5, ReceivePort::Handle(
+                      ReceivePort::New(isolate->main_port(), String::Handle(),
+                                       true /* control port */)));
     args.SetAt(6, capabilities);
 
     const Library& lib = Library::Handle(Library::IsolateLibrary());
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index eac771f..c373d3d 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -1096,12 +1096,12 @@
 
   const char* kScript =
       "main() {\n"
-      "  return importedFunc();\n"
+      "  return 'b';\n"
       "}\n";
   Dart_Handle result;
   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(lib);
-  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
+  EXPECT_STREQ("b", SimpleInvokeStr(lib, "main"));
 
   // Fail to find 'test:lib1' in the isolate.
   result = Dart_LookupLibrary(NewString("test:lib1"));
@@ -1122,7 +1122,7 @@
   result = Dart_LookupLibrary(NewString("test:lib1"));
   EXPECT(Dart_IsLibrary(result));
 
-  // Reload and remove 'dart:math' from isolate.
+  // Reload and remove 'test:lib1' from isolate.
   lib = TestCase::ReloadTestScript(kScript);
   EXPECT_VALID(lib);
 
@@ -1362,22 +1362,15 @@
       "}\n";
 
   EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
   const char* expected = "static";
   const char* result = SimpleInvokeStr(lib, "main");
   EXPECT_NOTNULL(result);
-
   // Bail out if we've already failed so we don't crash in StringEquals.
   if (result == NULL) {
     return;
   }
   EXPECT_STREQ(expected, result);
 
-  // Bail out if we've already failed so we don't crash in the tag handler.
-  if (strcmp(expected, result) != 0) {
-    return;
-  }
-
   lib = Dart_RootLibrary();
   EXPECT_NON_NULL(lib);
   EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
@@ -1390,7 +1383,6 @@
       "class C {\n"
       "  test() {\n"
       "    reloadTest();\n"
-      "    return new Foo();\n"
       "  }\n"
       "}\n"
       "main() {\n"
@@ -1480,19 +1472,7 @@
       "}\n";
 
   EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
-  const char* expected = "exception";
-  const char* result = SimpleInvokeStr(lib, "main");
-  EXPECT_STREQ(expected, result);
-
-  // Bail out if we've already failed so we don't crash in the tag handler.
-  if ((result == NULL) || (strcmp(expected, result) != 0)) {
-    return;
-  }
-
-  lib = Dart_RootLibrary();
-  EXPECT_NON_NULL(lib);
-  EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
+  EXPECT_ERROR(SimpleInvokeError(lib, "main"), "is abstract");
 }
 
 TEST_CASE(IsolateReload_PendingStaticCall_DefinedToNSM) {
@@ -1533,7 +1513,6 @@
       "}\n";
 
   EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
   const char* expected = "exception";
   const char* result = SimpleInvokeStr(lib, "main");
   EXPECT_NOTNULL(result);
@@ -1544,12 +1523,6 @@
   }
   EXPECT_STREQ(expected, result);
 
-  // Bail out if we've already failed so we don't crash in the tag handler.
-  if (strcmp(expected, result) != 0) {
-    return;
-  }
-
-  EXPECT_STREQ(expected, result);
   lib = Dart_RootLibrary();
   EXPECT_NON_NULL(lib);
   EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
@@ -1596,12 +1569,12 @@
 
   const char* expected = "static";
   const char* result = SimpleInvokeStr(lib, "main");
-  EXPECT_STREQ(expected, result);
 
   // Bail out if we've already failed so we don't crash in the tag handler.
-  if ((result == NULL) || (strcmp(expected, result) != 0)) {
+  if (result == NULL) {
     return;
   }
+  EXPECT_STREQ(expected, result);
 
   lib = Dart_RootLibrary();
   EXPECT_NON_NULL(lib);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a35ccf7..089354b 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "include/dart_api.h"
+#include "lib/stacktrace.h"
 #include "platform/assert.h"
 #include "platform/text_buffer.h"
 #include "platform/unaligned.h"
@@ -1207,6 +1208,8 @@
   ASSERT(empty_array_->IsArray());
   ASSERT(!zero_array_->IsSmi());
   ASSERT(zero_array_->IsArray());
+  ASSERT(!empty_type_arguments_->IsSmi());
+  ASSERT(empty_type_arguments_->IsTypeArguments());
   ASSERT(!empty_context_scope_->IsSmi());
   ASSERT(empty_context_scope_->IsContextScope());
   ASSERT(!empty_compressed_stackmaps_->IsSmi());
@@ -6035,6 +6038,19 @@
   printer->AddString(">");
 }
 
+void TypeArguments::PrintTo(BaseTextBuffer* buffer) const {
+  buffer->AddString("TypeArguments: ");
+  if (IsNull()) {
+    return buffer->AddString("null");
+  }
+  buffer->Printf("(H%" Px ")", Smi::Value(raw_ptr()->hash_));
+  auto& type_at = AbstractType::Handle();
+  for (intptr_t i = 0; i < Length(); i++) {
+    type_at = TypeAt(i);
+    buffer->Printf(" [%s]", type_at.IsNull() ? "null" : type_at.ToCString());
+  }
+}
+
 bool TypeArguments::IsSubvectorEquivalent(const TypeArguments& other,
                                           intptr_t from_index,
                                           intptr_t len,
@@ -6546,7 +6562,9 @@
     return this->raw();
   }
   const intptr_t num_types = Length();
-  if (IsRaw(0, num_types)) {
+  if (num_types == 0) {
+    return TypeArguments::empty_type_arguments().raw();
+  } else if (IsRaw(0, num_types)) {
     return TypeArguments::null();
   }
   Zone* zone = thread->zone();
@@ -6624,18 +6642,11 @@
 
 const char* TypeArguments::ToCString() const {
   if (IsNull()) {
-    return "TypeArguments: null";
+    return "TypeArguments: null";  // Optimizing the frequent case.
   }
-  Zone* zone = Thread::Current()->zone();
-  const char* prev_cstr = OS::SCreate(zone, "TypeArguments: (H%" Px ")",
-                                      Smi::Value(raw_ptr()->hash_));
-  for (int i = 0; i < Length(); i++) {
-    const AbstractType& type_at = AbstractType::Handle(zone, TypeAt(i));
-    const char* type_cstr = type_at.IsNull() ? "null" : type_at.ToCString();
-    char* chars = OS::SCreate(zone, "%s [%s]", prev_cstr, type_cstr);
-    prev_cstr = chars;
-  }
-  return prev_cstr;
+  ZoneTextBuffer buffer(Thread::Current()->zone());
+  PrintTo(&buffer);
+  return buffer.buffer();
 }
 
 const char* PatchClass::ToCString() const {
@@ -7037,10 +7048,121 @@
   }
 }
 
-TypeArgumentsPtr Function::InstantiateToBounds(Thread* thread) const {
-  const auto& type_params =
-      TypeArguments::Handle(thread->zone(), type_parameters());
-  return InstantiateTypeArgumentsToBounds(thread, type_params);
+TypeArgumentsPtr Function::InstantiateToBounds(
+    Thread* thread,
+    DefaultTypeArgumentsKind* kind_out) const {
+  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().raw();
+  }
+  auto& result = TypeArguments::Handle(thread->zone(), type_parameters());
+  result = InstantiateTypeArgumentsToBounds(thread, result);
+  if (kind_out != nullptr) {
+    // 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.raw();
+}
+
+void Function::UpdateCachedDefaultTypeArguments(Thread* thread) const {
+  auto const zone = thread->zone();
+  auto& closure_function = Function::Handle(zone);
+  if (HasImplicitClosureFunction()) {
+    closure_function = ImplicitClosureFunction();
+  }
+  if (CachesDefaultTypeArguments()) {
+    auto defaults = &Object::empty_type_arguments();
+    if (NumTypeParameters(thread) > 0) {
+      const auto& params = TypeArguments::Handle(zone, 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);
+  }
+}
+
+TypeArgumentsPtr Function::default_type_arguments(
+    DefaultTypeArgumentsKind* kind_out) const {
+  if (!CachesDefaultTypeArguments()) {
+    UNREACHABLE();
+  }
+  const auto& closure_data =
+      ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data_));
+  ASSERT(!closure_data.IsNull());
+  if (kind_out != nullptr) {
+    *kind_out = DefaultTypeArgumentsKindField::decode(
+        closure_data.default_type_arguments_info());
+  }
+  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(raw_ptr()->data_));
+  ASSERT(!closure_data.IsNull());
+  auto kind = DefaultTypeArgumentsKindFor(value);
+  ASSERT(kind != DefaultTypeArgumentsKind::kInvalid);
+  const intptr_t num_parent_type_params = NumParentTypeParameters();
+  const intptr_t default_type_args_info =
+      DefaultTypeArgumentsKindField::encode(kind) |
+      NumParentTypeParametersField::encode(num_parent_type_params);
+  closure_data.set_default_type_arguments_info(default_type_args_info);
+  // 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(
+    const TypeArguments& value) const {
+  if (value.IsNull() || value.IsInstantiated()) {
+    return DefaultTypeArgumentsKind::kIsInstantiated;
+  }
+  if (value.CanShareFunctionTypeArguments(*this)) {
+    return DefaultTypeArgumentsKind::kSharesFunctionTypeArguments;
+  }
+  const auto& cls = Class::Handle(Owner());
+  if (value.CanShareInstantiatorTypeArguments(cls)) {
+    return DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments;
+  }
+  return DefaultTypeArgumentsKind::kNeedsInstantiation;
 }
 
 FunctionPtr Function::GetGeneratedClosure() const {
@@ -7958,48 +8080,6 @@
   return true;
 }
 
-// Checks each supplied function type argument is a subtype of the corresponding
-// bound. Also takes the number of type arguments to skip over because they
-// belong to parent functions and are not included in the type parameters.
-// Returns null if all checks succeed, otherwise returns a non-null Error for
-// one of the failures.
-static ObjectPtr TypeArgumentsAreBoundSubtypes(
-    Zone* zone,
-    const TokenPosition& token_pos,
-    const TypeArguments& type_parameters,
-    intptr_t num_parent_type_args,
-    const TypeArguments& instantiator_type_arguments,
-    const TypeArguments& function_type_arguments) {
-  ASSERT(!type_parameters.IsNull());
-  const intptr_t kNumTypeArgs = type_parameters.Length() + num_parent_type_args;
-  ASSERT(function_type_arguments.HasCount(kNumTypeArgs));
-
-  // Don't bother allocating handles, there's nothing to check.
-  if (kNumTypeArgs - num_parent_type_args == 0) return Error::null();
-
-  auto& type = AbstractType::Handle(zone);
-  auto& bound = AbstractType::Handle(zone);
-  auto& name = String::Handle(zone);
-  for (intptr_t i = num_parent_type_args; i < kNumTypeArgs; i++) {
-    type = type_parameters.TypeAt(i - num_parent_type_args);
-    ASSERT(type.IsTypeParameter());
-    const auto& parameter = TypeParameter::Cast(type);
-    bound = parameter.bound();
-    name = parameter.name();
-    // 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)) {
-      return Error::RawCast(ThrowTypeError(token_pos, type, bound, name));
-    }
-  }
-
-  return Error::null();
-}
-
 // Retrieves the function type arguments, if any. This could be explicitly
 // passed type from the arguments array, delayed type arguments in closures,
 // or instantiated bounds for the type parameters if no other source for
@@ -8055,8 +8135,28 @@
     function_type_args ^= args.At(0);
   } else if (!has_delayed_type_args) {
     // We have no explicitly provided function type arguments, so instantiate
-    // the type parameters to bounds.
-    function_type_args = function.InstantiateToBounds(thread);
+    // the type parameters to bounds or replace as appropriate.
+    Function::DefaultTypeArgumentsKind kind;
+    function_type_args = function.InstantiateToBounds(thread, &kind);
+    switch (kind) {
+      case Function::DefaultTypeArgumentsKind::kInvalid:
+        // We shouldn't hit the invalid case.
+        UNREACHABLE();
+        break;
+      case Function::DefaultTypeArgumentsKind::kIsInstantiated:
+        // Nothing left to do.
+        break;
+      case Function::DefaultTypeArgumentsKind::kNeedsInstantiation:
+        function_type_args = function_type_args.InstantiateAndCanonicalizeFrom(
+            instantiator_type_args, parent_type_args);
+        break;
+      case Function::DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments:
+        function_type_args = instantiator_type_args.raw();
+        break;
+      case Function::DefaultTypeArgumentsKind::kSharesFunctionTypeArguments:
+        function_type_args = parent_type_args.raw();
+        break;
+    }
   }
 
   return function_type_args.Prepend(zone, parent_type_args, kNumParentTypeArgs,
@@ -8131,16 +8231,26 @@
   // arguments to make sure they are appropriate subtypes of the bounds.
   const intptr_t kNumLocalTypeArgs = NumTypeParameters(thread);
   if (kNumLocalTypeArgs > 0) {
-    const intptr_t kNumParentTypeArgs = NumParentTypeParameters();
     ASSERT(function_type_arguments.HasCount(kNumLocalTypeArgs +
-                                            kNumParentTypeArgs));
+                                            NumParentTypeParameters()));
     const auto& params = TypeArguments::Handle(zone, type_parameters());
-    const auto& result = Object::Handle(
-        zone, TypeArgumentsAreBoundSubtypes(
-                  zone, token_pos(), params, kNumParentTypeArgs,
-                  instantiator_type_arguments, function_type_arguments));
-    if (result.IsError()) {
-      return result.raw();
+    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.raw();
+      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 {
     ASSERT(function_type_arguments.HasCount(NumParentTypeParameters()));
@@ -8700,6 +8810,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.
@@ -8833,8 +8948,9 @@
   }
 
   // Set closure function's type parameters.
-  closure_function.set_type_parameters(
-      TypeArguments::Handle(zone, type_parameters()));
+  auto& type_args_handle = TypeArguments::Handle(zone, type_parameters());
+  closure_function.set_type_parameters(type_args_handle);
+  closure_function.UpdateCachedDefaultTypeArguments(thread);
 
   // Set closure function's result type to this result type.
   closure_function.set_result_type(AbstractType::Handle(zone, result_type()));
@@ -9733,7 +9849,8 @@
 
 bool Function::MayHaveUncheckedEntryPoint() const {
   return FLAG_enable_multiple_entrypoints &&
-         (NeedsArgumentTypeChecks() || IsImplicitClosureFunction());
+         (NeedsTypeArgumentTypeChecks() || NeedsArgumentTypeChecks() ||
+          IsImplicitClosureFunction());
 }
 
 const char* Function::ToCString() const {
@@ -9827,6 +9944,19 @@
   StorePointer(&raw_ptr()->signature_type_, value.raw());
 }
 
+void ClosureData::set_default_type_arguments(const TypeArguments& value) const {
+  StorePointer(&raw_ptr()->default_type_arguments_, value.raw());
+}
+
+intptr_t ClosureData::default_type_arguments_info() const {
+  return Smi::Value(raw_ptr()->default_type_arguments_info_);
+}
+
+void ClosureData::set_default_type_arguments_info(intptr_t value) const {
+  ASSERT(Smi::IsValid(value));
+  StorePointer(&raw_ptr()->default_type_arguments_info_, Smi::New(value));
+}
+
 ClosureDataPtr ClosureData::New() {
   ASSERT(Object::closure_data_class() != Class::null());
   ObjectPtr raw = Object::Allocate(ClosureData::kClassId,
@@ -9838,16 +9968,32 @@
   if (IsNull()) {
     return "ClosureData: null";
   }
-  const Function& parent = Function::Handle(parent_function());
-  const Type& type = Type::Handle(signature_type());
-  return OS::SCreate(Thread::Current()->zone(),
-                     "ClosureData: context_scope: 0x%" Px
-                     " parent_function: %s signature_type: %s"
-                     " implicit_static_closure: 0x%" Px,
-                     static_cast<uword>(context_scope()),
-                     parent.IsNull() ? "null" : parent.ToCString(),
-                     type.IsNull() ? "null" : type.ToCString(),
-                     static_cast<uword>(implicit_static_closure()));
+  auto const zone = Thread::Current()->zone();
+  ZoneTextBuffer buffer(zone);
+  buffer.Printf("ClosureData: context_scope: 0x%" Px "",
+                static_cast<uword>(context_scope()));
+  buffer.AddString(" parent_function: ");
+  if (parent_function() == Function::null()) {
+    buffer.AddString("null");
+  } else {
+    buffer.AddString(Function::Handle(zone, parent_function()).ToCString());
+  }
+  buffer.AddString(" signature_type: ");
+  if (signature_type() == Type::null()) {
+    buffer.AddString("null");
+  } else {
+    buffer.AddString(Type::Handle(zone, signature_type()).ToCString());
+  }
+  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();
 }
 
 void SignatureData::set_parent_function(const Function& value) const {
@@ -18985,6 +19131,8 @@
     case kArrayCid:
     case kImmutableArrayCid:
       return Array::kBytesPerElement;
+    case kTypeArgumentsCid:
+      return TypeArguments::ArrayTraits::kElementSize;
     case kOneByteStringCid:
       return OneByteString::kBytesPerElement;
     case kTwoByteStringCid:
@@ -19011,6 +19159,8 @@
     case kArrayCid:
     case kImmutableArrayCid:
       return Array::data_offset();
+    case kTypeArgumentsCid:
+      return TypeArguments::types_offset();
     case kOneByteStringCid:
       return OneByteString::data_offset();
     case kTwoByteStringCid:
@@ -24153,6 +24303,7 @@
 }
 
 ReceivePortPtr ReceivePort::New(Dart_Port id,
+                                const String& debug_name,
                                 bool is_control_port,
                                 Heap::Space space) {
   ASSERT(id != ILLEGAL_PORT);
@@ -24160,6 +24311,8 @@
   Zone* zone = thread->zone();
   const SendPort& send_port =
       SendPort::Handle(zone, SendPort::New(id, thread->isolate()->origin_id()));
+  const StackTrace& allocation_location_ =
+      HasStack() ? GetCurrentStackTrace(0) : StackTrace::Handle();
 
   ReceivePort& result = ReceivePort::Handle(zone);
   {
@@ -24168,6 +24321,9 @@
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StorePointer(&result.raw_ptr()->send_port_, send_port.raw());
+    result.StorePointer(&result.raw_ptr()->debug_name_, debug_name.raw());
+    result.StorePointer(&result.raw_ptr()->allocation_location_,
+                        allocation_location_.raw());
   }
   if (is_control_port) {
     PortMap::SetPortState(id, PortMap::kControlPort);
@@ -24250,16 +24406,18 @@
 }
 
 const char* Closure::ToCString() const {
-  Zone* zone = Thread::Current()->zone();
+  auto const thread = Thread::Current();
+  auto const zone = thread->zone();
+  ZoneTextBuffer buffer(zone);
+  buffer.AddString("Closure: ");
   const Function& fun = Function::Handle(zone, function());
-  const bool is_implicit_closure = fun.IsImplicitClosureFunction();
   const Function& sig_fun =
       Function::Handle(zone, GetInstantiatedSignature(zone));
-  const char* fun_sig =
-      String::Handle(zone, sig_fun.UserVisibleSignature()).ToCString();
-  const char* from = is_implicit_closure ? " from " : "";
-  const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
-  return OS::SCreate(zone, "Closure: %s%s%s", fun_sig, from, fun_desc);
+  sig_fun.PrintSignature(NameVisibility::kUserVisibleName, &buffer);
+  if (fun.IsImplicitClosureFunction()) {
+    buffer.Printf(" from %s", fun.ToCString());
+  }
+  return buffer.buffer();
 }
 
 int64_t Closure::ComputeHash() const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index c49817c..627fe0e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2771,9 +2771,65 @@
   // Enclosing function of this local function.
   FunctionPtr parent_function() const;
 
+  enum class DefaultTypeArgumentsKind : uint8_t {
+    // Only here to make sure it's explicitly set appropriately.
+    kInvalid = 0,
+    // Must instantiate the default type arguments before use.
+    kNeedsInstantiation,
+    // The default type arguments are already instantiated.
+    kIsInstantiated,
+    // Use the instantiator type arguments that would be used to instantiate
+    // the default type arguments, as instantiating produces the same result.
+    kSharesInstantiatorTypeArguments,
+    // Use the function type arguments that would be used to instantiate
+    // the default type arguments, as instantiating produces the same result.
+    kSharesFunctionTypeArguments,
+  };
+  static constexpr intptr_t kDefaultTypeArgumentsKindFieldSize = 3;
+  static_assert(static_cast<uint8_t>(
+                    DefaultTypeArgumentsKind::kSharesFunctionTypeArguments) <
+                    (1 << kDefaultTypeArgumentsKindFieldSize),
+                "Wrong bit size chosen for default TAV kind field");
+
+  // Fields encoded in an integer stored alongside a default TAV.
+  using DefaultTypeArgumentsKindField =
+      BitField<intptr_t,
+               DefaultTypeArgumentsKind,
+               0,
+               kDefaultTypeArgumentsKindFieldSize>;
+  // If more space is needed, we can almost certainly reduce the size of this
+  // field.
+  using NumParentTypeParametersField =
+      BitField<intptr_t,
+               uint16_t,
+               DefaultTypeArgumentsKindField::kNextBit,
+               kBitsPerByte * sizeof(uint16_t)>;
+
+  static_assert(NumParentTypeParametersField::kNextBit <=
+                    compiler::target::kSmiBits,
+                "Default TAV info does not fit in a target Smi");
+
   // Returns a canonicalized vector of the type parameters instantiated
   // to bounds. If non-generic, the empty type arguments vector is returned.
-  TypeArgumentsPtr InstantiateToBounds(Thread* thread) const;
+  TypeArgumentsPtr InstantiateToBounds(
+      Thread* thread,
+      DefaultTypeArgumentsKind* kind_out = nullptr) 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;
 
   // Enclosed generated closure function of this local function.
   // This will only work after the closure function has been allocated in the
@@ -2889,7 +2945,11 @@
     return (kind() == FunctionLayout::kConstructor) && is_static();
   }
 
-  static bool ClosureBodiesContainNonCovariantChecks() {
+  static bool ClosureBodiesContainNonCovariantTypeArgumentChecks() {
+    return FLAG_enable_interpreter;
+  }
+
+  static bool ClosureBodiesContainNonCovariantArgumentChecks() {
     return FLAG_precompiled_mode || FLAG_lazy_dispatchers;
   }
 
@@ -2961,7 +3021,14 @@
   bool IsInFactoryScope() const;
 
   bool NeedsArgumentTypeChecks() const {
-    return (IsClosureFunction() && ClosureBodiesContainNonCovariantChecks()) ||
+    return (IsClosureFunction() &&
+            ClosureBodiesContainNonCovariantArgumentChecks()) ||
+           !(is_static() || (kind() == FunctionLayout::kConstructor));
+  }
+
+  bool NeedsTypeArgumentTypeChecks() const {
+    return (IsClosureFunction() &&
+            ClosureBodiesContainNonCovariantTypeArgumentChecks()) ||
            !(is_static() || (kind() == FunctionLayout::kConstructor));
   }
 
@@ -3713,6 +3780,12 @@
 
   void SetWasExecuted(bool value) const { SetWasExecutedBit(value); }
 
+  static intptr_t data_offset() { return OFFSET_OF(FunctionLayout, data_); }
+
+  static intptr_t kind_tag_offset() {
+    return OFFSET_OF(FunctionLayout, kind_tag_);
+  }
+
   // static: Considered during class-side or top-level resolution rather than
   //         instance-side resolution.
   // const: Valid target of a const constructor call.
@@ -3787,11 +3860,6 @@
         value, raw_ptr()->packed_fields_));
   }
 
- private:
-  void set_parameter_names(const Array& value) const;
-  void set_ic_data_array(const Array& value) const;
-  void SetInstructionsSafe(const Code& value) const;
-
   enum KindTagBits {
     kKindTagPos = 0,
     kKindTagSize = 5,
@@ -3810,8 +3878,7 @@
   COMPILE_ASSERT(MethodRecognizer::kNumRecognizedMethods <
                  (1 << kRecognizedTagSize));
   COMPILE_ASSERT(kNumTagBits <=
-                 (kBitsPerByte *
-                  sizeof(static_cast<FunctionLayout*>(nullptr)->kind_tag_)));
+                 (kBitsPerByte * sizeof(decltype(FunctionLayout::kind_tag_))));
 
   class KindBits : public BitField<uint32_t,
                                    FunctionLayout::Kind,
@@ -3832,6 +3899,15 @@
   FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT)
 #undef DEFINE_BIT
 
+ private:
+  // Given the provided defaults type arguments, determines which
+  // DefaultTypeArgumentsKind applies.
+  DefaultTypeArgumentsKind DefaultTypeArgumentsKindFor(
+      const TypeArguments& defaults) const;
+
+  void set_parameter_names(const Array& value) const;
+  void set_ic_data_array(const Array& value) const;
+  void SetInstructionsSafe(const Code& value) const;
   void set_name(const String& value) const;
   void set_kind(FunctionLayout::Kind value) const;
   void set_parent_function(const Function& value) const;
@@ -3882,6 +3958,13 @@
     return RoundedAllocationSize(sizeof(ClosureDataLayout));
   }
 
+  static intptr_t default_type_arguments_offset() {
+    return OFFSET_OF(ClosureDataLayout, default_type_arguments_);
+  }
+  static intptr_t default_type_arguments_info_offset() {
+    return OFFSET_OF(ClosureDataLayout, default_type_arguments_info_);
+  }
+
  private:
   ContextScopePtr context_scope() const { return raw_ptr()->context_scope_; }
   void set_context_scope(const ContextScope& value) const;
@@ -3897,6 +3980,14 @@
   InstancePtr implicit_static_closure() const { return raw_ptr()->closure_; }
   void set_implicit_static_closure(const Instance& closure) const;
 
+  TypeArgumentsPtr default_type_arguments() const {
+    return raw_ptr()->default_type_arguments_;
+  }
+  void set_default_type_arguments(const TypeArguments& value) const;
+
+  intptr_t default_type_arguments_info() const;
+  void set_default_type_arguments_info(intptr_t value) const;
+
   static ClosureDataPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
@@ -7702,15 +7793,17 @@
   intptr_t Length() const;
   AbstractTypePtr TypeAt(intptr_t index) const;
   AbstractTypePtr TypeAtNullSafe(intptr_t index) const;
+  static intptr_t types_offset() {
+    return OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types);
+  }
   static intptr_t type_at_offset(intptr_t index) {
-    return OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types) +
-           index * kWordSize;
+    return types_offset() + index * kWordSize;
   }
   void SetTypeAt(intptr_t index, const AbstractType& value) const;
 
   struct ArrayTraits {
     static intptr_t elements_start_offset() {
-      return TypeArguments::type_at_offset(0);
+      return TypeArguments::types_offset();
     }
 
     static constexpr intptr_t kElementSize = kWordSize;
@@ -7756,6 +7849,7 @@
       NameVisibility name_visibility,
       BaseTextBuffer* printer,
       NameDisambiguation name_disambiguation = NameDisambiguation::kNo) const;
+  void PrintTo(BaseTextBuffer* printer) const;
 
   // Check if the subvector of length 'len' starting at 'from_index' of this
   // type argument vector consists solely of DynamicType.
@@ -8485,6 +8579,9 @@
   }
   virtual void SetIsFinalized() const;
   virtual bool IsBeingFinalized() const { return false; }
+  static intptr_t flags_offset() {
+    return OFFSET_OF(TypeParameterLayout, flags_);
+  }
   bool IsGenericCovariantImpl() const {
     return TypeParameterLayout::GenericCovariantImplBit::decode(
         raw_ptr()->flags_);
@@ -8520,6 +8617,9 @@
   }
 
   StringPtr name() const { return raw_ptr()->name_; }
+  static intptr_t name_offset() {
+    return OFFSET_OF(TypeParameterLayout, name_);
+  }
   intptr_t index() const { return raw_ptr()->index_; }
   void set_index(intptr_t value) const;
   AbstractTypePtr bound() const { return raw_ptr()->bound_; }
@@ -8528,6 +8628,9 @@
     return raw_ptr()->default_argument_;
   }
   void set_default_argument(const AbstractType& value) const;
+  static intptr_t bound_offset() {
+    return OFFSET_OF(TypeParameterLayout, bound_);
+  }
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated(Genericity genericity = kAny,
                               intptr_t num_free_fun_type_params = kAllFree,
@@ -10856,10 +10959,17 @@
   InstancePtr handler() const { return raw_ptr()->handler_; }
   void set_handler(const Instance& value) const;
 
+  StackTracePtr allocation_location() const {
+    return raw_ptr()->allocation_location_;
+  }
+
+  StringPtr debug_name() const { return raw_ptr()->debug_name_; }
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(ReceivePortLayout));
   }
   static ReceivePortPtr New(Dart_Port id,
+                            const String& debug_name,
                             bool is_control_port,
                             Heap::Space space = Heap::kNew);
 
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index fe34f62..3eb70c6 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -1557,7 +1557,15 @@
 }
 
 void ReceivePort::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  Instance::PrintJSONImpl(stream, ref);
+  JSONObject obj(stream);
+  Instance::PrintSharedInstanceJSON(&obj, ref);
+  const StackTrace& allocation_location_ =
+      StackTrace::Handle(allocation_location());
+  const String& debug_name_ = String::Handle(debug_name());
+  obj.AddProperty("kind", "ReceivePort");
+  obj.AddProperty("portId", static_cast<intptr_t>(Id()));
+  obj.AddProperty("debugName", debug_name_.ToCString());
+  obj.AddProperty("allocationLocation", allocation_location_);
 }
 
 void SendPort::PrintJSONImpl(JSONStream* stream, bool ref) const {
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index fa649a5..fe789af 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -160,6 +160,7 @@
   RW(Instance, stack_overflow)                                                 \
   RW(Instance, out_of_memory)                                                  \
   RW(Function, lookup_port_handler)                                            \
+  RW(Function, lookup_open_ports)                                              \
   RW(Function, handle_message_function)                                        \
   RW(Function, growable_list_factory)                                          \
   RW(Function, simple_instance_of_function)                                    \
@@ -180,6 +181,8 @@
   RW(GrowableObjectArray, megamorphic_cache_table)                             \
   RW(Code, build_method_extractor_code)                                        \
   RW(Code, dispatch_table_null_error_stub)                                     \
+  RW(Code, late_initialization_error_stub_with_fpu_regs_stub)                  \
+  RW(Code, late_initialization_error_stub_without_fpu_regs_stub)               \
   RW(Code, null_error_stub_with_fpu_regs_stub)                                 \
   RW(Code, null_error_stub_without_fpu_regs_stub)                              \
   RW(Code, null_arg_error_stub_with_fpu_regs_stub)                             \
@@ -242,6 +245,10 @@
 
 #define OBJECT_STORE_STUB_CODE_LIST(DO)                                        \
   DO(dispatch_table_null_error_stub, DispatchTableNullError)                   \
+  DO(late_initialization_error_stub_with_fpu_regs_stub,                        \
+     LateInitializationErrorSharedWithFPURegs)                                 \
+  DO(late_initialization_error_stub_without_fpu_regs_stub,                     \
+     LateInitializationErrorSharedWithoutFPURegs)                              \
   DO(null_error_stub_with_fpu_regs_stub, NullErrorSharedWithFPURegs)           \
   DO(null_error_stub_without_fpu_regs_stub, NullErrorSharedWithoutFPURegs)     \
   DO(null_arg_error_stub_with_fpu_regs_stub, NullArgErrorSharedWithFPURegs)    \
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index fefbb4a..4941d60 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -347,6 +347,9 @@
   if (dynamic_closure_call_vars_ != nullptr) return dynamic_closure_call_vars_;
   dynamic_closure_call_vars_ = new (zone()) DynamicClosureCallVars();
 
+  const auto& type_Dynamic = Object::dynamic_type();
+  const auto& type_Function =
+      Type::ZoneHandle(zone(), Type::DartFunctionType());
   const auto& type_Smi = Type::ZoneHandle(zone(), Type::SmiType());
 #define INIT_FIELD(Name, TypeName, Symbol)                                     \
   dynamic_closure_call_vars_->Name = new (zone())                              \
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 22ae1f4..42eaf4b 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -239,8 +239,10 @@
   // because they are both read and written to by the builders.
   struct DynamicClosureCallVars : ZoneAllocated {
 #define FOR_EACH_DYNAMIC_CLOSURE_CALL_VARIABLE(V)                              \
+  V(current_function, Function, CurrentFunction)                               \
   V(current_num_processed, Smi, CurrentNumProcessed)                           \
-  V(current_param_index, Smi, CurrentParamIndex)
+  V(current_param_index, Smi, CurrentParamIndex)                               \
+  V(function_type_args, Dynamic, FunctionTypeArgs)
 
 #define DEFINE_FIELD(Name, _, __) LocalVariable* Name = nullptr;
     FOR_EACH_DYNAMIC_CLOSURE_CALL_VARIABLE(DEFINE_FIELD)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 6436338..21aae8b 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1115,7 +1115,11 @@
   FunctionPtr parent_function_;  // Enclosing function of this local function.
   TypePtr signature_type_;
   InstancePtr closure_;  // Closure object for static implicit closures.
-  VISIT_TO(ObjectPtr, closure_);
+  // Instantiate-to-bounds TAV for use when no TAV is provided.
+  TypeArgumentsPtr default_type_arguments_;
+  // Additional information about the instantiate-to-bounds TAV.
+  SmiPtr default_type_arguments_info_;
+  VISIT_TO(ObjectPtr, default_type_arguments_info_);
 
   friend class Function;
 };
@@ -2302,6 +2306,7 @@
   uint8_t flags_;
   int8_t nullability_;
 
+ public:
   using FinalizedBit = BitField<decltype(flags_), bool, 0, 1>;
   using GenericCovariantImplBit =
       BitField<decltype(flags_), bool, FinalizedBit::kNextBit, 1>;
@@ -2309,6 +2314,7 @@
       BitField<decltype(flags_), bool, GenericCovariantImplBit::kNextBit, 1>;
   static constexpr intptr_t kFlagsBitSize = DeclarationBit::kNextBit;
 
+ private:
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class CidRewriteVisitor;
@@ -2782,6 +2788,8 @@
   VISIT_FROM(ObjectPtr, send_port_)
   SendPortPtr send_port_;
   InstancePtr handler_;
+  StringPtr debug_name_;
+  StackTracePtr allocation_location_;
   VISIT_TO(ObjectPtr, handler_)
 };
 
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 8b6b184..e3ad43d 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -182,6 +182,7 @@
   F(ExternalTypedData, length_)                                                \
   F(ReceivePort, send_port_)                                                   \
   F(ReceivePort, handler_)                                                     \
+  F(ReceivePort, allocation_location_)                                         \
   F(StackTrace, async_link_)                                                   \
   F(StackTrace, code_array_)                                                   \
   F(StackTrace, pc_offset_array_)                                              \
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 601befe..4219416 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -480,6 +480,10 @@
   ASSERT(!subtype.IsNull() && !subtype.IsTypeRef());
   ASSERT(!supertype.IsNull() && !supertype.IsTypeRef());
 
+  // Now that AssertSubtype may be checking types only available at runtime,
+  // we can't guarantee the supertype isn't the top type.
+  if (supertype.IsTopTypeForSubtyping()) return;
+
   // The supertype or subtype may not be instantiated.
   if (AbstractType::InstantiateAndTestSubtype(
           &subtype, &supertype, instantiator_type_args, function_type_args)) {
@@ -557,7 +561,7 @@
 }
 
 // Check that arguments are valid for the given closure.
-// Arg0: function
+// Arg0: closure
 // Arg1: arguments descriptor
 // Return value: whether the arguments are valid
 DEFINE_RUNTIME_ENTRY(ClosureArgumentsValid, 2) {
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 3a89d30..d144d8c 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3146,6 +3146,29 @@
   return true;
 }
 
+static const MethodParameter* get_ports_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+};
+
+static bool GetPorts(Thread* thread, JSONStream* js) {
+  // Ensure the array and handles created below are promptly destroyed.
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
+  const GrowableObjectArray& ports = GrowableObjectArray::Handle(
+      GrowableObjectArray::RawCast(DartLibraryCalls::LookupOpenPorts()));
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "PortList");
+  {
+    Instance& port = Instance::Handle(zone.GetZone());
+    JSONArray arr(&jsobj, "ports");
+    for (int i = 0; i < ports.Length(); ++i) {
+      port ^= ports.At(i);
+      arr.AddValue(port);
+    }
+  }
+  return true;
+}
+
 #if !defined(DART_PRECOMPILED_RUNTIME)
 static const char* const report_enum_names[] = {
     SourceReport::kCallSitesStr,
@@ -4393,12 +4416,12 @@
   return true;
 }
 
-static const MethodParameter* get_ports_params[] = {
+static const MethodParameter* get_ports_private_params[] = {
     RUNNABLE_ISOLATE_PARAMETER,
     NULL,
 };
 
-static bool GetPorts(Thread* thread, JSONStream* js) {
+static bool GetPortsPrivate(Thread* thread, JSONStream* js) {
   MessageHandler* message_handler = thread->isolate()->message_handler();
   PortMap::PrintPortsForMessageHandler(message_handler, js);
   return true;
@@ -5058,6 +5081,8 @@
     get_inbound_references_params },
   { "getInstances", GetInstances,
     get_instances_params },
+  { "getPorts", GetPorts,
+    get_ports_params },
   { "getIsolate", GetIsolate,
     get_isolate_params },
   { "_getIsolateObjectStore", GetIsolateObjectStore,
@@ -5078,8 +5103,8 @@
     get_object_store_params },
   { "_getPersistentHandles", GetPersistentHandles,
       get_persistent_handles_params, },
-  { "_getPorts", GetPorts,
-    get_ports_params },
+  { "_getPorts", GetPortsPrivate,
+    get_ports_private_params },
   { "getProcessMemoryUsage", GetProcessMemoryUsage,
     get_process_memory_usage_params },
   { "_getReachableSize", GetReachableSize,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index bf1d99b..9d09af1 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 40
+#define SERVICE_PROTOCOL_MINOR_VERSION 41
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index b8d0906..6fe2fb8 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.40
+# Dart VM Service Protocol 3.41
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.40_ of the Dart VM Service Protocol. This
+This document describes of _version 3.41_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -47,6 +47,7 @@
   - [getIsolateGroup](#getisolategroup)
   - [getMemoryUsage](#getmemoryusage)
   - [getObject](#getobject)
+  - [getPorts](#getports)
   - [getProcessMemoryUsage](#getprocessmemoryusage)
   - [getRetainingPath](#getretainingpath)
   - [getScripts](#getscripts)
@@ -113,6 +114,7 @@
   - [NativeFunction](#nativefunction)
   - [Null](#null)
   - [Object](#object)
+  - [PortList](#portlist)
   - [ReloadReport](#reloadreport)
   - [Response](#response)
   - [RetainingObject](#retainingobject)
@@ -936,6 +938,17 @@
 Float32x4List, and Float64x2List.  These parameters are otherwise
 ignored.
 
+### getPorts
+
+```
+PortList getPorts(string isolateId)
+```
+
+The _getPorts_ RPC is used to retrieve the list of `ReceivePort` instances for a
+given isolate.
+
+See [PortList](#portlist).
+
 ### getRetainingPath
 
 ```
@@ -2426,6 +2439,24 @@
   // Provided for instance kinds:
   //   Closure
   @Context closureContext [optional];
+
+  // The port ID for a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  int portId [optional];
+
+  // The stack trace associated with the allocation of a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  @Instance allocationLocation [optional];
+
+  // A name associated with a ReceivePort used for debugging purposes.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  string debugName [optional];
 }
 ```
 
@@ -2446,6 +2477,7 @@
   //   Double (suitable for passing to Double.parse())
   //   Int (suitable for passing to int.parse())
   //   String (value may be truncated)
+  //   StackTrace
   string valueAsString [optional];
 
   // The valueAsString for String references may be truncated. If so,
@@ -2658,6 +2690,24 @@
   //   BoundedType
   //   TypeParameter
   @Instance bound [optional];
+
+  // The port ID for a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  int portId [optional];
+
+  // The stack trace associated with the allocation of a ReceivePort.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  @Instance allocationLocation [optional];
+
+  // A name associated with a ReceivePort used for debugging purposes.
+  //
+  // Provided for instance kinds:
+  //   ReceivePort
+  string debugName [optional];
 }
 ```
 
@@ -2742,6 +2792,9 @@
 
   // An instance of the Dart class BoundedType.
   BoundedType,
+
+  // An instance of the Dart class ReceivePort.
+  ReceivePort,
 }
 ```
 
@@ -3184,6 +3237,18 @@
 
 An _Object_ is a  persistent object that is owned by some isolate.
 
+### PortList
+
+```
+class PortList extends Response {
+  @Instance[] ports;
+}
+```
+
+A _PortList_ contains a list of ports associated with some isolate.
+
+See [getPort](#getPort).
+
 ### ProfileFunction
 
 ```
@@ -3855,5 +3920,6 @@
 3.38 | Added `isSystemIsolate` property to `@Isolate` and `Isolate`, `isSystemIsolateGroup` property to `@IsolateGroup` and `IsolateGroup`, and properties `systemIsolates` and `systemIsolateGroups` to `VM`.
 3.39 | Removed the following deprecated RPCs and objects: `getClientName`, `getWebSocketTarget`, `setClientName`, `requireResumeApproval`, `ClientName`, and `WebSocketTarget`.
 3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`.
+3.41 | Added `PortList` object, `ReceivePort` `InstanceKind`, and `getPorts` RPC.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/service_extension.md b/runtime/vm/service/service_extension.md
index 5cb05ff..9f806c3 100644
--- a/runtime/vm/service/service_extension.md
+++ b/runtime/vm/service/service_extension.md
@@ -1,4 +1,4 @@
-# Dart VM Service Protocol Extension 1.4
+# Dart VM Service Protocol Extension 1.5
 
 This protocol describes service extensions that are made available through
 the Dart core libraries, but are not part of the core
@@ -10,7 +10,7 @@
 
 ## dart:io Extensions
 
-This section describes _version 1.4_ of the dart:io service protocol extensions.
+This section describes _version 1.5_ of the dart:io service protocol extensions.
 
 ### getVersion
 
@@ -22,9 +22,25 @@
 
 See [Version](#version).
 
+### socketProfilingEnabled
+
+```
+SocketProfilingState socketProfilingEnabled(string isolateId, bool enabled [optional])
+```
+
+The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler
+and query its current state. If `enabled` is provided, the profiler state will
+be updated to reflect the value of `enabled`.
+
+If the state of the socket profiler is changed, a `SocketProfilingStateChange`
+event will be sent on the `Extension` stream.
+
+See [SocketProfilingState](#socketprofilingstate).
+
 ### startSocketProfiling
 
 ```
+@Deprecated
 Success startSocketProfiling(string isolateId)
 ```
 
@@ -35,6 +51,7 @@
 ### pauseSocketProfiling
 
 ```
+@Deprecated
 Success pauseSocketProfiling(string isolateId)
 ```
 
@@ -196,6 +213,15 @@
 
 A _OpenFile_ contains information about reads and writes to a currently opened file.
 
+### HttpTimelineLoggingState
+
+```
+class HttpTimelineLoggingState extends State {
+}
+```
+
+See [httpEnableTimelineLogging](#httpenabletimelinelogging) and [State](#state).
+
 ### OpenFileList
 
 ```
@@ -205,6 +231,15 @@
 }
 ```
 
+### SocketProfilingState
+
+```
+class SocketProfilingState extends State {
+}
+```
+
+See [socketProfilingEnabled](#socketProfilingEnabled) and [State](#state)
+
 ### SpawnedProcess
 
 ```
@@ -323,6 +358,16 @@
 
 The _Success_ type is used to indicate that an operation completed successfully.
 
+### State
+
+```
+class State extends Response {
+  bool enabled;
+}
+```
+
+The _State_ type is used to represent a response to a state request.
+
 ### Version
 
 ```
@@ -345,3 +390,4 @@
 1.2 | Added `getOpenFiles`, `getOpenFileById`, `getSpawnedProcesses`, and `getSpawnedProcessById` RPCs and added `OpenFile` and `SpawnedProcess` objects.
 1.3 | Added `httpEnableTimelineLogging` RPC and `HttpTimelineLoggingStateChange` event, deprecated `getHttpEnableTimelineLogging` and `setHttpEnableTimelineLogging`.
 1.4 | Updated `httpEnableTimelineLogging` parameter `enable` to `enabled`. `enable` will continue to be accepted.
+1.5 | Added `socketProfilingEnabled` RPC and `SocketProfilingStateChanged` event, deprecated `startSocketProfiling` and `pauseSocketProfiling`.
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index 395676c..baf6507 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -76,6 +76,7 @@
   V(ZeroArgsUnoptimizedStaticCall)                                             \
   V(OneArgUnoptimizedStaticCall)                                               \
   V(TwoArgsUnoptimizedStaticCall)                                              \
+  V(AssertSubtype)                                                             \
   V(Subtype1TestCache)                                                         \
   V(Subtype2TestCache)                                                         \
   V(Subtype4TestCache)                                                         \
@@ -94,6 +95,8 @@
   V(AsynchronousGapMarker)                                                     \
   V(NotLoaded)                                                                 \
   V(DispatchTableNullError)                                                    \
+  V(LateInitializationErrorSharedWithFPURegs)                                  \
+  V(LateInitializationErrorSharedWithoutFPURegs)                               \
   V(NullErrorSharedWithFPURegs)                                                \
   V(NullErrorSharedWithoutFPURegs)                                             \
   V(NullArgErrorSharedWithFPURegs)                                             \
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 9db5e9b..55b1ba1 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -109,7 +109,9 @@
   V(Dynamic, "dynamic")                                                        \
   V(DynamicCall, "dyn:call")                                                   \
   V(DynamicCallCurrentNumProcessedVar, ":dyn_call_current_num_processed")      \
+  V(DynamicCallCurrentFunctionVar, ":dyn_call_current_function")               \
   V(DynamicCallCurrentParamIndexVar, ":dyn_call_current_param_index")          \
+  V(DynamicCallFunctionTypeArgsVar, ":dyn_call_function_type_args")            \
   V(DynamicPrefix, "dyn:")                                                     \
   V(EntryPointsTemp, ":entry_points_temp")                                     \
   V(EqualOperator, "==")                                                       \
@@ -447,6 +449,7 @@
   V(_handleMessage, "_handleMessage")                                          \
   V(_instanceOf, "_instanceOf")                                                \
   V(_lookupHandler, "_lookupHandler")                                          \
+  V(_lookupOpenPorts, "_lookupOpenPorts")                                      \
   V(_name, "_name")                                                            \
   V(_onData, "_onData")                                                        \
   V(_rehashObjects, "_rehashObjects")                                          \
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 8ec17a2..34a65d0 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -101,6 +101,10 @@
   V(CodePtr, invoke_dart_code_from_bytecode_stub_,                             \
     StubCode::InvokeDartCodeFromBytecode().raw(), nullptr)                     \
   V(CodePtr, call_to_runtime_stub_, StubCode::CallToRuntime().raw(), nullptr)  \
+  V(CodePtr, late_initialization_error_shared_without_fpu_regs_stub_,          \
+    StubCode::LateInitializationErrorSharedWithoutFPURegs().raw(), nullptr)    \
+  V(CodePtr, late_initialization_error_shared_with_fpu_regs_stub_,             \
+    StubCode::LateInitializationErrorSharedWithFPURegs().raw(), nullptr)       \
   V(CodePtr, null_error_shared_without_fpu_regs_stub_,                         \
     StubCode::NullErrorSharedWithoutFPURegs().raw(), nullptr)                  \
   V(CodePtr, null_error_shared_with_fpu_regs_stub_,                            \
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 60328d7..f86d082 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -525,7 +525,7 @@
   //
   //   Case b)
   //      type_arguments <- InstantiateTypeArguments(ita, fta, uta)
-  //      (where uta may or may not be a constant TypeArguments object)
+  //      (where uta may not be a constant non-null TypeArguments object)
   //
   //   Case c)
   //      type_arguments <- LoadField(vx)
@@ -544,11 +544,12 @@
     type_usage_info->UseTypeArgumentsInInstanceCreation(klass, type_arguments);
   } else if (InstantiateTypeArgumentsInstr* instantiate =
                  type_arguments->AsInstantiateTypeArguments()) {
-    ASSERT(instantiate->type_arguments()->BindsToConstant());
-    ASSERT(!instantiate->type_arguments()->BoundConstant().IsNull());
-    const auto& ta =
-        TypeArguments::Cast(instantiate->type_arguments()->BoundConstant());
-    type_usage_info->UseTypeArgumentsInInstanceCreation(klass, ta);
+    if (instantiate->type_arguments()->BindsToConstant() &&
+        !instantiate->type_arguments()->BoundConstant().IsNull()) {
+      const auto& ta =
+          TypeArguments::Cast(instantiate->type_arguments()->BoundConstant());
+      type_usage_info->UseTypeArgumentsInInstanceCreation(klass, ta);
+    }
   } else if (LoadFieldInstr* load_field = type_arguments->AsLoadField()) {
     Definition* instance = load_field->instance()->definition();
     intptr_t cid = instance->Type()->ToNullableCid();
diff --git a/runtime/vm/type_testing_stubs_test_arm.cc b/runtime/vm/type_testing_stubs_test_arm.cc
index 2970a03..0391fe9 100644
--- a/runtime/vm/type_testing_stubs_test_arm.cc
+++ b/runtime/vm/type_testing_stubs_test_arm.cc
@@ -45,8 +45,6 @@
 
   const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
       Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index) - kHeapObjectTag;
   const intptr_t dst_name_index = __ object_pool_builder().AddObject(
       Symbols::OptimizedOut(), compiler::ObjectPoolBuilderEntry::kPatchable);
   ASSERT((sub_type_cache_index + 1) == dst_name_index);
@@ -56,8 +54,8 @@
   __ ldr(R9, compiler::FieldAddress(
                  TypeTestABI::kDstTypeReg,
                  AbstractType::type_test_stub_entry_point_offset()));
-  __ ldr(TypeTestABI::kSubtypeTestCacheReg,
-         compiler::Address(PP, sub_type_cache_offset));
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
   __ blx(R9);
 
   // We have the guarantee that TTS preserve all registers except for one
diff --git a/runtime/vm/type_testing_stubs_test_arm64.cc b/runtime/vm/type_testing_stubs_test_arm64.cc
index 858cd33..39f7d36 100644
--- a/runtime/vm/type_testing_stubs_test_arm64.cc
+++ b/runtime/vm/type_testing_stubs_test_arm64.cc
@@ -45,8 +45,6 @@
 
   const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
       Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
-  const intptr_t sub_type_cache_offset =
-      ObjectPool::element_offset(sub_type_cache_index);
   const intptr_t dst_name_index = __ object_pool_builder().AddObject(
       Symbols::OptimizedOut(), compiler::ObjectPoolBuilderEntry::kPatchable);
   ASSERT((sub_type_cache_index + 1) == dst_name_index);
@@ -56,8 +54,8 @@
   __ ldr(R9, compiler::FieldAddress(
                  TypeTestABI::kDstTypeReg,
                  AbstractType::type_test_stub_entry_point_offset()));
-  __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
-                            sub_type_cache_offset);
+  __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+                           sub_type_cache_index);
   __ blr(R9);
 
   // We have the guarantee that TTS preserve all registers except for one
diff --git a/sdk/lib/_internal/js_runtime/pubspec.yaml b/sdk/lib/_internal/js_runtime/pubspec.yaml
index f42b2cd..6ab57e6 100644
--- a/sdk/lib/_internal/js_runtime/pubspec.yaml
+++ b/sdk/lib/_internal/js_runtime/pubspec.yaml
@@ -2,3 +2,6 @@
 # make it easier to develop on dart2js.
 name: js_runtime
 publish_to: none
+
+environment:
+  sdk: '>=2.2.2'
diff --git a/sdk/lib/_internal/vm/lib/function.dart b/sdk/lib/_internal/vm/lib/function.dart
index 1c99ca2..710f1ef 100644
--- a/sdk/lib/_internal/vm/lib/function.dart
+++ b/sdk/lib/_internal/vm/lib/function.dart
@@ -19,8 +19,6 @@
 
   _Closure get call => this;
 
-  _Closure _clone() native "Closure_clone";
-
   int _computeHash() native "Closure_computeHash";
 
   // No instance fields should be declared before the following fields whose
diff --git a/sdk/lib/_internal/vm/lib/isolate_patch.dart b/sdk/lib/_internal/vm/lib/isolate_patch.dart
index 91a567d..8f8b02c 100644
--- a/sdk/lib/_internal/vm/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/vm/lib/isolate_patch.dart
@@ -22,7 +22,8 @@
 @patch
 class ReceivePort {
   @patch
-  factory ReceivePort() => new _ReceivePortImpl();
+  factory ReceivePort([String debugName = '']) =>
+      new _ReceivePortImpl(debugName);
 
   @patch
   factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
@@ -62,15 +63,16 @@
    * event is received.
    */
   @patch
-  factory RawReceivePort([Function? handler]) {
-    _RawReceivePortImpl result = new _RawReceivePortImpl();
+  factory RawReceivePort([Function? handler, String debugName = '']) {
+    _RawReceivePortImpl result = new _RawReceivePortImpl(debugName);
     result.handler = handler;
     return result;
   }
 }
 
 class _ReceivePortImpl extends Stream implements ReceivePort {
-  _ReceivePortImpl() : this.fromRawReceivePort(new RawReceivePort());
+  _ReceivePortImpl([String debugName = ''])
+      : this.fromRawReceivePort(new RawReceivePort(null, debugName));
 
   _ReceivePortImpl.fromRawReceivePort(this._rawPort)
       : _controller = new StreamController(sync: true) {
@@ -128,11 +130,21 @@
 
 @pragma("vm:entry-point")
 class _RawReceivePortImpl implements RawReceivePort {
-  factory _RawReceivePortImpl() native "RawReceivePortImpl_factory";
+  factory _RawReceivePortImpl(String debugName) {
+    final port = _RawReceivePortImpl._(debugName);
+    _portMap[port._get_id()] = {
+      'port': port,
+      'handler': null,
+    };
+    return port;
+  }
+
+  factory _RawReceivePortImpl._(String debugName)
+      native "RawReceivePortImpl_factory";
 
   close() {
     // Close the port and remove it from the handler map.
-    _handlerMap.remove(this._closeInternal());
+    _portMap.remove(this._closeInternal());
   }
 
   SendPort get sendPort {
@@ -155,10 +167,15 @@
   // Called from the VM to retrieve the handler for a message.
   @pragma("vm:entry-point", "call")
   static _lookupHandler(int id) {
-    var result = _handlerMap[id];
+    var result = _portMap[id]?['handler'];
     return result;
   }
 
+  @pragma("vm:entry-point", "call")
+  static _lookupOpenPorts() {
+    return _portMap.values.map((e) => e['port']).toList();
+  }
+
   // Called from the VM to dispatch to the handler.
   @pragma("vm:entry-point", "call")
   static void _handleMessage(Function handler, var message) {
@@ -173,22 +190,18 @@
   _closeInternal() native "RawReceivePortImpl_closeInternal";
 
   void set handler(Function? value) {
-    _handlerMap[this._get_id()] = value;
+    final id = this._get_id();
+    if (!_portMap.containsKey(id)) {
+      _portMap[id] = {
+        'port': this,
+        'handler': value,
+      };
+    } else {
+      _portMap[id]!['handler'] = value;
+    }
   }
 
-  // TODO(iposva): Ideally keep this map in the VM.
-  // id to handler mapping.
-  static _initHandlerMap() {
-    // TODO(18511): Workaround bad CheckSmi hoisting.
-    var tempMap = new HashMap();
-    // Collect feedback that not all keys are Smis.
-    tempMap["."] = 1;
-    tempMap["."] = 2;
-
-    return new HashMap();
-  }
-
-  static final Map _handlerMap = _initHandlerMap();
+  static final _portMap = <dynamic, Map<String, dynamic>>{};
 }
 
 @pragma("vm:entry-point")
diff --git a/sdk/lib/io/network_profiling.dart b/sdk/lib/io/network_profiling.dart
index 5c1c620..95fa5a3 100644
--- a/sdk/lib/io/network_profiling.dart
+++ b/sdk/lib/io/network_profiling.dart
@@ -6,7 +6,7 @@
 
 // TODO(bkonyi): refactor into io_resource_info.dart
 const int _versionMajor = 1;
-const int _versionMinor = 4;
+const int _versionMinor = 5;
 
 const String _tcpSocket = 'tcp';
 const String _udpSocket = 'udp';
@@ -25,7 +25,11 @@
   // Socket relative RPCs
   static const _kClearSocketProfileRPC = 'ext.dart.io.clearSocketProfile';
   static const _kGetSocketProfileRPC = 'ext.dart.io.getSocketProfile';
+  static const _kSocketProfilingEnabledRPC =
+      'ext.dart.io.socketProfilingEnabled';
+  @Deprecated('Use socketProfilingEnabled instead')
   static const _kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
+  @Deprecated('Use socketProfilingEnabled instead')
   static const _kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
 
   // TODO(zichangguo): This version number represents the version of service
@@ -41,6 +45,7 @@
     registerExtension(_kGetSocketProfileRPC, _serviceExtensionHandler);
     registerExtension(_kStartSocketProfilingRPC, _serviceExtensionHandler);
     registerExtension(_kPauseSocketProfilingRPC, _serviceExtensionHandler);
+    registerExtension(_kSocketProfilingEnabledRPC, _serviceExtensionHandler);
     registerExtension(_kClearSocketProfileRPC, _serviceExtensionHandler);
     registerExtension(_kGetVersionRPC, _serviceExtensionHandler);
   }
@@ -73,6 +78,9 @@
         case _kGetSocketProfileRPC:
           responseJson = _SocketProfile.toJson();
           break;
+        case _kSocketProfilingEnabledRPC:
+          responseJson = _socketProfilingEnabled(parameters);
+          break;
         case _kStartSocketProfilingRPC:
           responseJson = _SocketProfile.start();
           break;
@@ -131,8 +139,35 @@
   return _success();
 }
 
+String _socketProfilingEnabled(Map<String, String> parameters) {
+  const String kEnabled = 'enabled';
+  if (parameters.containsKey(kEnabled)) {
+    final enable = parameters[kEnabled]!.toLowerCase();
+    if (enable != 'true' && enable != 'false') {
+      throw _invalidArgument(kEnabled, enable);
+    }
+    enable == 'true' ? _SocketProfile.start() : _SocketProfile.pause();
+  }
+  return json.encode({
+    'type': 'SocketProfilingState',
+    'enabled': _SocketProfile.enableSocketProfiling,
+  });
+}
+
 abstract class _SocketProfile {
   static const _kType = 'SocketProfile';
+  static set enableSocketProfiling(bool enabled) {
+    if (enabled != _enableSocketProfiling) {
+      postEvent('SocketProfilingStateChange', {
+        'isolateId': Service.getIsolateID(Isolate.current),
+        'enabled': enabled,
+      });
+      _enableSocketProfiling = enabled;
+    }
+  }
+
+  static bool get enableSocketProfiling => _enableSocketProfiling;
+
   static bool _enableSocketProfiling = false;
   static Map<int, _SocketStatistic> _idToSocketStatistic = {};
 
@@ -194,12 +229,12 @@
   }
 
   static String start() {
-    _enableSocketProfiling = true;
+    enableSocketProfiling = true;
     return _success();
   }
 
   static String pause() {
-    _enableSocketProfiling = false;
+    enableSocketProfiling = false;
     return _success();
   }
 
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 0c5747e..b7650dd 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -671,9 +671,12 @@
    * receive messages. See [Stream.asBroadcastStream] for transforming the port
    * to a broadcast stream.
    *
+   * The optional `debugName` parameter can be set to associate a name with
+   * this port that can be displayed in tooling.
+   *
    * A receive port is closed by canceling its subscription.
    */
-  external factory ReceivePort();
+  external factory ReceivePort([String debugName = '']);
 
   /**
    * Creates a [ReceivePort] from a [RawReceivePort].
@@ -718,8 +721,12 @@
    * A [RawReceivePort] is low level and does not work with [Zone]s. It
    * can not be paused. The data-handler must be set before the first
    * event is received.
+   *
+   * The optional `debugName` parameter can be set to associate a name with
+   * this port that can be displayed in tooling.
+   *
    */
-  external factory RawReceivePort([Function? handler]);
+  external factory RawReceivePort([Function? handler, String debugName = '']);
 
   /**
    * Sets the handler that is invoked for every incoming message.
diff --git a/tools/VERSION b/tools/VERSION
index d291217..35f23ff 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 263
+PRERELEASE 264
 PRERELEASE_PATCH 0
\ No newline at end of file