Version 2.15.0-226.0.dev

Merge commit 'e898eef6a24bcc5fb68084e9e5e7cd5c37506627' into 'dev'
diff --git a/DEPS b/DEPS
index 6fb957c..aea5e2a 100644
--- a/DEPS
+++ b/DEPS
@@ -139,7 +139,7 @@
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
-  "pub_rev": "0764437088fd58eb7af779ecef66bab40dfcf2e9",
+  "pub_rev": "35681b0126a1fb48bf2062dd09f74296715402c2",
   "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index af80e94..df2a706 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -407,6 +407,24 @@
     return false;
   }
 
+  bool _isConst(Expression expr) {
+    if (expr is Literal) {
+      return true;
+    }
+    if (expr is Identifier) {
+      final staticElm = expr.staticElement;
+      if (staticElm is ConstVariableElement) {
+        return true;
+      }
+      if (staticElm is PropertyAccessorElementImpl) {
+        if (staticElm.variable is ConstVariableElement) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   /// Returns `true` if [nativeType] is a C type that has a size.
   bool _isSized(DartType nativeType) {
     switch (_primitiveNativeType(nativeType)) {
@@ -510,12 +528,13 @@
     return false;
   }
 
-  // Get the const bool value of `expr` if it exists.
-  // Return null if it isn't a const bool.
+  /// Get the const bool value of [expr] if it exists.
+  /// Return null if it isn't a const bool.
   bool? _maybeGetBoolConstValue(Expression expr) {
     if (expr is BooleanLiteral) {
       return expr.value;
-    } else if (expr is Identifier) {
+    }
+    if (expr is Identifier) {
       final staticElm = expr.staticElement;
       if (staticElm is ConstVariableElement) {
         return staticElm.computeConstantValue()?.toBoolValue();
@@ -897,23 +916,26 @@
           FfiCode.MISSING_EXCEPTION_VALUE, node.methodName);
     } else {
       Expression e = node.argumentList.arguments[1];
-      // TODO(brianwilkerson) Validate that `e` is a constant expression.
       if (!_validateCompatibleNativeType(e.typeOrThrow, R, true)) {
         _errorReporter.reportErrorForNode(
             FfiCode.MUST_BE_A_SUBTYPE, e, [e.staticType, R, 'fromFunction']);
       }
+      if (!_isConst(e)) {
+        _errorReporter.reportErrorForNode(
+            FfiCode.ARGUMENT_MUST_BE_A_CONSTANT, e, ['exceptionalReturn']);
+      }
     }
   }
 
+  /// Ensure `isLeaf` is const as we need the value at compile time to know
+  /// which trampoline to generate.
   void _validateIsLeafIsConst(MethodInvocation node) {
-    // Ensure `isLeaf` is const as we need the value at compile time to know
-    // which trampoline to generate.
     final args = node.argumentList.arguments;
     if (args.isNotEmpty) {
       for (final arg in args) {
         if (arg is NamedExpression) {
           if (arg.element?.name == _isLeafParamName) {
-            if (_maybeGetBoolConstValue(arg.expression) == null) {
+            if (!_isConst(arg.expression)) {
               _errorReporter.reportErrorForNode(
                   FfiCode.ARGUMENT_MUST_BE_A_CONSTANT,
                   arg.expression,
diff --git a/pkg/analyzer/lib/src/lint/linter_visitor.dart b/pkg/analyzer/lib/src/lint/linter_visitor.dart
index 7fe8635..692f0c7 100644
--- a/pkg/analyzer/lib/src/lint/linter_visitor.dart
+++ b/pkg/analyzer/lib/src/lint/linter_visitor.dart
@@ -172,6 +172,12 @@
   }
 
   @override
+  void visitConstructorReference(ConstructorReference node) {
+    _runSubscriptions(node, registry._forConstructorReference);
+    super.visitConstructorReference(node);
+  }
+
+  @override
   void visitContinueStatement(ContinueStatement node) {
     _runSubscriptions(node, registry._forContinueStatement);
     super.visitContinueStatement(node);
@@ -795,6 +801,7 @@
   final List<_Subscription<ConstructorFieldInitializer>>
       _forConstructorFieldInitializer = [];
   final List<_Subscription<ConstructorName>> _forConstructorName = [];
+  final List<_Subscription<ConstructorReference>> _forConstructorReference = [];
   final List<_Subscription<ContinueStatement>> _forContinueStatement = [];
   final List<_Subscription<DeclaredIdentifier>> _forDeclaredIdentifier = [];
   final List<_Subscription<DefaultFormalParameter>> _forDefaultFormalParameter =
@@ -1020,6 +1027,11 @@
     _forConstructorName.add(_Subscription(linter, visitor, _getTimer(linter)));
   }
 
+  void addConstructorReference(LintRule linter, AstVisitor visitor) {
+    _forConstructorReference
+        .add(_Subscription(linter, visitor, _getTimer(linter)));
+  }
+
   void addContinueStatement(LintRule linter, AstVisitor visitor) {
     _forContinueStatement
         .add(_Subscription(linter, visitor, _getTimer(linter)));
diff --git a/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart b/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart
index 8db3c12..61dd571 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart
@@ -62,6 +62,20 @@
     ]);
   }
 
+  test_FromFunctionExceptionReturn() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+typedef NativeDoubleUnOp = Double Function(Double);
+double myTimesThree(double d) => d * 3;
+void testFromFunctionFunctionExceptionValueMustBeConst() {
+  final notAConst = 1.1;
+  Pointer.fromFunction<NativeDoubleUnOp>(myTimesThree, notAConst);
+}
+''', [
+      error(FfiCode.ARGUMENT_MUST_BE_A_CONSTANT, 250, 9),
+    ]);
+  }
+
   test_LookupFunctionIsLeaf() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0306312..cfb438c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -317,6 +317,7 @@
   Version? _enableNonNullableVersionInLibrary;
   Version? _enableConstructorTearoffsVersionInLibrary;
   Version? _enableExtensionTypesVersionInLibrary;
+  Version? _enableNamedArgumentsAnywhereVersionInLibrary;
   bool? _enableTripleShiftInLibrary;
   bool? _enableExtensionMethodsInLibrary;
   bool? _enableGenericMetadataInLibrary;
@@ -398,8 +399,17 @@
               ExperimentalFlag.extensionTypes, _packageUri ?? importUri);
 
   bool get enableNamedArgumentsAnywhereInLibrary =>
-      _enableNamedArgumentsAnywhereInLibrary ??=
-          loader.enableUnscheduledExperiments;
+      _enableNamedArgumentsAnywhereInLibrary ??= loader.target
+          .isExperimentEnabledInLibraryByVersion(
+              ExperimentalFlag.namedArgumentsAnywhere,
+              _packageUri ?? importUri,
+              languageVersion.version);
+
+  Version get enableNamedArgumentsAnywhereVersionInLibrary =>
+      _enableNamedArgumentsAnywhereVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.namedArgumentsAnywhere,
+              _packageUri ?? importUri);
 
   void _updateLibraryNNBDSettings() {
     library.isNonNullableByDefault = isNonNullableByDefault;
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.expect
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.expect
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.expect
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.outline.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.outline.expect
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.outline.expect
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
rename to pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/folder.options b/pkg/front_end/testcases/named_arguments_anywhere/folder.options
new file mode 100644
index 0000000..b97203b
--- /dev/null
+++ b/pkg/front_end/testcases/named_arguments_anywhere/folder.options
@@ -0,0 +1 @@
+--enable-experiment=named-arguments-anywhere
\ No newline at end of file
diff --git a/pkg/kernel/test/class_hierarchy_self_check.dart b/pkg/kernel/test/class_hierarchy_self_check.dart
deleted file mode 100644
index 404d074..0000000
--- a/pkg/kernel/test/class_hierarchy_self_check.dart
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2016, 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 'package:kernel/kernel.dart';
-import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/core_types.dart';
-import 'package:test/test.dart';
-import 'class_hierarchy_basic.dart';
-import 'dart:io';
-import 'dart:math';
-import 'self_check_util.dart';
-
-void main(List<String> args) {
-  runSelfCheck(args, (String filename) {
-    testClassHierarchyOnComponent(loadComponentFromBinary(filename));
-  });
-}
-
-void testClassHierarchyOnComponent(Component component, {bool verbose: false}) {
-  BasicClassHierarchy basic = new BasicClassHierarchy(component);
-  CoreTypes coreTypes = new CoreTypes(component);
-  ClosedWorldClassHierarchy classHierarchy =
-      new ClassHierarchy(component, coreTypes) as ClosedWorldClassHierarchy;
-  int total = classHierarchy.numberOfClasses;
-  int progress = 0;
-  for (var class1 in classHierarchy.classes) {
-    for (var class2 in classHierarchy.classes) {
-      bool isSubclass = classHierarchy.isSubclassOf(class1, class2);
-      bool isSubtype = classHierarchy.isSubtypeOf(class1, class2);
-      var asInstance = classHierarchy.getClassAsInstanceOf(class1, class2);
-      if (isSubclass != basic.isSubclassOf(class1, class2)) {
-        fail('isSubclassOf(${class1.name}, ${class2.name}) returned '
-            '$isSubclass but should be ${!isSubclass}');
-      }
-      if (isSubtype != basic.isSubtypeOf(class1, class2)) {
-        fail('isSubtypeOf(${class1.name}, ${class2.name}) returned '
-            '$isSubtype but should be ${!isSubtype}');
-      }
-      if (asInstance != basic.getClassAsInstanceOf(class1, class2)) {
-        fail('asInstanceOf(${class1.name}, ${class2.name}) returned '
-            '$asInstance but should be '
-            '${basic.getClassAsInstanceOf(class1, class2)}');
-      }
-    }
-    ++progress;
-    if (verbose) {
-      stdout.write('\rSubclass queries ${100 * progress ~/ total}%');
-    }
-  }
-  Set<Name> names = new Set<Name>();
-  for (var classNode in classHierarchy.classes) {
-    for (var member in classNode.members) {
-      names.add(member.name);
-    }
-  }
-  List<Name> nameList = names.toList();
-  progress = 0;
-  for (var classNode in classHierarchy.classes) {
-    Iterable<Name> candidateNames = <Iterable<Name>>[
-      basic.gettersAndCalls[classNode]!.keys,
-      basic.setters[classNode]!.keys,
-      pickRandom(nameList, 100)
-    ].expand((x) => x);
-    for (Name name in candidateNames) {
-      Member? expectedGetter =
-          basic.getDispatchTarget(classNode, name, setter: false);
-      Member? expectedSetter =
-          basic.getDispatchTarget(classNode, name, setter: true);
-      Member? actualGetter =
-          classHierarchy.getDispatchTarget(classNode, name, setter: false);
-      Member? actualSetter =
-          classHierarchy.getDispatchTarget(classNode, name, setter: true);
-      if (actualGetter != expectedGetter) {
-        fail('lookupGetter($classNode, $name) returned '
-            '$actualGetter but should be $expectedGetter');
-      }
-      if (actualSetter != expectedSetter) {
-        fail('lookupSetter($classNode, $name) returned '
-            '$actualSetter but should be $expectedSetter');
-      }
-    }
-    ++progress;
-    if (verbose) {
-      stdout.write('\rDispatch queries ${100 * progress ~/ total}%');
-    }
-  }
-  progress = 0;
-  for (var classNode in classHierarchy.classes) {
-    Iterable<Name> candidateNames = [
-      basic.interfaceGettersAndCalls[classNode]!.keys,
-      basic.interfaceSetters[classNode]!.keys,
-      pickRandom(nameList, 100)
-    ].expand((x) => x);
-    for (Name name in candidateNames) {
-      Member? expectedGetter =
-          basic.getInterfaceMember(classNode, name, setter: false);
-      Member? expectedSetter =
-          basic.getInterfaceMember(classNode, name, setter: true);
-      Member? actualGetter =
-          classHierarchy.getInterfaceMember(classNode, name, setter: false);
-      Member? actualSetter =
-          classHierarchy.getInterfaceMember(classNode, name, setter: true);
-      if (actualGetter != expectedGetter) {
-        fail('getInterfaceMember($classNode, $name) returned '
-            '$actualGetter but should be $expectedGetter');
-      }
-      if (actualSetter != expectedSetter) {
-        fail('getInterfaceMember($classNode, $name, setter: true) '
-            'returned $actualSetter but should be $expectedSetter');
-      }
-    }
-    ++progress;
-    if (verbose) {
-      stdout.write('\rInterface queries ${100 * progress ~/ total}%');
-    }
-  }
-  for (var classNode in classHierarchy.classes) {
-    String getHash(member, superMember, setter) {
-      String eq = setter ? '=' : '';
-      return '$member$eq overrides $superMember$eq';
-    }
-
-    Set<String> expectedOverrides = new Set<String>();
-    basic.forEachOverridePair(classNode, (member, superMember, setter) {
-      expectedOverrides.add(getHash(member, superMember, setter));
-    });
-    Set<String> actualOverrides = new Set<String>();
-    classHierarchy.forEachOverridePair(classNode,
-        (member, superMember, setter) {
-      actualOverrides.add(getHash(member, superMember, setter));
-    });
-    for (var actual in actualOverrides) {
-      if (!expectedOverrides.contains(actual)) {
-        fail("forEachOverridePair($classNode) should not report that $actual");
-      }
-    }
-    for (var expected in expectedOverrides) {
-      if (!actualOverrides.contains(expected)) {
-        fail("forEachOverridePair($classNode) did not report that $expected");
-      }
-    }
-  }
-  if (verbose) {
-    print('\rProgress 100%. Done.');
-  }
-}
-
-var random = new Random(12345);
-
-List<T> pickRandom<T>(List<T> items, int n) {
-  var result = <T>[];
-  for (int i = 0; i < n; ++i) {
-    result.add(items[random.nextInt(items.length)]);
-  }
-  return result;
-}
diff --git a/pkg/kernel/test/class_hierarchy_test_disabled.dart b/pkg/kernel/test/class_hierarchy_test_disabled.dart
deleted file mode 100644
index bef2d58..0000000
--- a/pkg/kernel/test/class_hierarchy_test_disabled.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2016, 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 'package:kernel/kernel.dart';
-import 'package:test/test.dart';
-import 'class_hierarchy_self_check.dart';
-
-void main() {
-  test('All-pairs class hierarchy tests on dart2js', () {
-    testClassHierarchyOnComponent(
-        loadComponentFromBinary('test/data/dart2js.dill'));
-  });
-}
diff --git a/pkg/kernel/test/round_trip.dart b/pkg/kernel/test/round_trip.dart
deleted file mode 100644
index 188a2a1..0000000
--- a/pkg/kernel/test/round_trip.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2016, 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.
-
-library kernel.round_trip;
-
-import 'dart:io';
-import 'package:kernel/binary/ast_from_binary.dart';
-import 'package:kernel/binary/ast_to_binary.dart';
-import 'binary/utils.dart';
-
-const String usage = '''
-Usage: round_trip.dart FILE.dill [sdk.dill]
-
-Deserialize and serialize the given component and check that the resulting byte
-sequence is identical to the original.
-''';
-
-void main(List<String> args) async {
-  if (args.length == 1) {
-    await testRoundTrip(new File(args[0]).readAsBytesSync(), null);
-  } else if (args.length == 2) {
-    await testRoundTrip(new File(args[0]).readAsBytesSync(),
-        new File(args[1]).readAsBytesSync());
-  } else {
-    print(usage);
-    exit(1);
-  }
-}
-
-Future<void> testRoundTrip(List<int> bytes, List<int>? sdkBytes) async {
-  var component = new Component();
-  if (sdkBytes != null) {
-    var sdk = new Component(nameRoot: component.root);
-    new BinaryBuilder(sdkBytes).readSingleFileComponent(sdk);
-  }
-  new BinaryBuilder(bytes).readSingleFileComponent(component);
-  ByteSink sink = new ByteSink();
-  new BinaryPrinter(sink).writeComponentFile(component);
-  List<int> writtenBytes = sink.builder.takeBytes();
-  if (bytes.length != writtenBytes.length) {
-    throw "Byte-lengths differ: ${bytes.length} vs ${writtenBytes.length}";
-  }
-  for (int i = 0; i < bytes.length; i++) {
-    if (bytes[i] != writtenBytes[i]) {
-      throw "Byte differs at index $i: "
-          "${show(bytes[i])} vs ${show(writtenBytes[i])}";
-    }
-  }
-  print("OK");
-}
-
-String show(int byte) {
-  return '$byte (0x${byte.toRadixString(16).padLeft(2, "0")})';
-}
diff --git a/pkg/kernel/test/round_trip_self_check.dart b/pkg/kernel/test/round_trip_self_check.dart
deleted file mode 100644
index 058cef8..0000000
--- a/pkg/kernel/test/round_trip_self_check.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2016, 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.
-
-library kernel.round_trip_test;
-
-import 'self_check_util.dart';
-import 'round_trip.dart' as cmd;
-
-void main(List<String> args) {
-  runSelfCheck(args, (String filename) {
-    cmd.main([filename]);
-  });
-}
diff --git a/pkg/kernel/test/self_check_util.dart b/pkg/kernel/test/self_check_util.dart
deleted file mode 100644
index d30640e..0000000
--- a/pkg/kernel/test/self_check_util.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2016, 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:async';
-
-import 'package:kernel/src/tool/batch_util.dart';
-
-/// Wraps a main() method for a test that should be runnable as a self-checking
-/// unit test.
-///
-/// These tests can be run like:
-///
-///    tools/test.py -cdartk -rself_check
-///
-/// The test can either be run with a single file passed on the command line
-/// or run in batch mode.
-void runSelfCheck(List<String> args, void runTest(String filename)) {
-  Future<CompilerOutcome> batchMain(List<String> arguments) async {
-    if (arguments.length != 1) {
-      throw 'Exactly one argument expected';
-    }
-    String filename = arguments[0];
-    if (!filename.endsWith('.dill')) {
-      throw 'File does not have expected .dill extension: $filename';
-    }
-    runTest(filename);
-    return CompilerOutcome.Ok;
-  }
-
-  if (args.length == 1 && args[0] == '--batch') {
-    runBatch(batchMain);
-  } else {
-    batchMain(args);
-  }
-}
diff --git a/pkg/kernel/test/verify_self_check.dart b/pkg/kernel/test/verify_self_check.dart
deleted file mode 100644
index ee84f9f..0000000
--- a/pkg/kernel/test/verify_self_check.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2016, 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 'package:kernel/kernel.dart';
-import 'package:kernel/verifier.dart';
-
-import 'self_check_util.dart';
-
-void main(List<String> args) {
-  runSelfCheck(args, (String filename) {
-    verifyComponent(loadComponentFromBinary(filename));
-  });
-}
diff --git a/pkg/smith/lib/configuration.dart b/pkg/smith/lib/configuration.dart
index 5861fbf..b1576bb7 100644
--- a/pkg/smith/lib/configuration.dart
+++ b/pkg/smith/lib/configuration.dart
@@ -688,7 +688,7 @@
         return const [Runtime.none];
       case Compiler.appJitk:
       case Compiler.dartk:
-        return const [Runtime.vm, Runtime.selfCheck];
+        return const [Runtime.vm];
       case Compiler.dartkp:
         return const [Runtime.dartPrecompiled];
       case Compiler.specParser:
@@ -805,7 +805,6 @@
   static const ie11 = Runtime._('ie11');
   static const edge = Runtime._('edge');
   static const chromeOnAndroid = Runtime._('chromeOnAndroid');
-  static const selfCheck = Runtime._('self_check');
   static const none = Runtime._('none');
 
   static final List<String> names = _all.keys.toList();
@@ -824,7 +823,6 @@
     ie11,
     edge,
     chromeOnAndroid,
-    selfCheck,
     none
   ], key: (runtime) => (runtime as Runtime).name);
 
@@ -881,9 +879,6 @@
       case chromeOnAndroid:
         return Compiler.dart2js;
 
-      case selfCheck:
-        return Compiler.dartk;
-
       case none:
         // If we aren't running it, we probably just want to analyze it.
         return Compiler.dart2analyzer;
diff --git a/pkg/test_runner/lib/src/command.dart b/pkg/test_runner/lib/src/command.dart
index 8ba9f27..da28355 100644
--- a/pkg/test_runner/lib/src/command.dart
+++ b/pkg/test_runner/lib/src/command.dart
@@ -499,39 +499,6 @@
       VMCommandOutput(this, exitCode, timedOut, stdout, stderr, time, pid);
 }
 
-class VMBatchCommand extends ProcessCommand implements VMCommand {
-  final String dartFile;
-  final bool checked;
-
-  VMBatchCommand(String executable, this.dartFile, List<String> arguments,
-      Map<String, String> environmentOverrides,
-      {this.checked = true, int index = 0})
-      : super('vm-batch', executable, arguments, environmentOverrides, null,
-            index);
-
-  VMBatchCommand indexedCopy(int index) =>
-      VMBatchCommand(executable, dartFile, arguments, environmentOverrides,
-          checked: checked, index: index);
-
-  @override
-  List<String> get batchArguments =>
-      checked ? ['--checked', dartFile] : [dartFile];
-
-  @override
-  bool _equal(VMBatchCommand other) {
-    return super._equal(other) &&
-        dartFile == other.dartFile &&
-        checked == other.checked;
-  }
-
-  @override
-  void _buildHashCode(HashCodeBuilder builder) {
-    super._buildHashCode(builder);
-    builder.addJson(dartFile);
-    builder.addJson(checked);
-  }
-}
-
 // Run a VM test under RR, and copy the trace if it crashes. Using a helper
 // script like the precompiler does not work because the RR traces are large
 // and we must diligently erase them for non-crashes even if the test times
diff --git a/pkg/test_runner/lib/src/configuration.dart b/pkg/test_runner/lib/src/configuration.dart
index bf842a4..2201710 100644
--- a/pkg/test_runner/lib/src/configuration.dart
+++ b/pkg/test_runner/lib/src/configuration.dart
@@ -44,7 +44,6 @@
       this.reportFailures,
       this.reportInJson,
       this.resetBrowser,
-      this.skipCompilation,
       this.writeDebugLog,
       this.writeResults,
       this.writeLogs,
@@ -97,7 +96,6 @@
   final bool reportFailures;
   final bool reportInJson;
   final bool resetBrowser;
-  final bool skipCompilation;
   final bool writeDebugLog;
   final bool writeResults;
   final bool writeLogs;
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index ae9b857..fe3b012 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -133,11 +133,6 @@
 ie11:
 chromeOnAndroid:  Run JavaScript in the specified browser.
 
-self_check:       Pass each test or its compiled output to every file under
-                  `pkg` whose name ends with `_self_check.dart`. Each test is
-                  given to the self_check tester as a filename on stdin using
-                  the batch-mode protocol.
-
 none:             No runtime, compile only.''',
         abbr: 'r',
         values: Runtime.names),
@@ -343,15 +338,6 @@
         '''Exclude suites from default selector, only works when no selector
 has been specified on the command line.''',
         hide: true),
-    _Option.bool(
-        'skip_compilation',
-        '''
-Skip the compilation step, using the compilation artifacts left in
-the output folder from a previous run. This flag will often cause
-false positives and negatives, but can be useful for quick and
-dirty offline testing when not making changes that affect the
-compiler.''',
-        hide: true),
     _Option.bool('print_passing_stdout',
         'Print the stdout of passing, as well as failing, tests.',
         hide: true)
@@ -772,7 +758,6 @@
           reportFailures: data["report_failures"] as bool,
           reportInJson: data["report_in_json"] as bool,
           resetBrowser: data["reset_browser_configuration"] as bool,
-          skipCompilation: data["skip_compilation"] as bool,
           writeDebugLog: data["write_debug_log"] as bool,
           writeResults: data["write_results"] as bool,
           writeLogs: data["write_logs"] as bool,
diff --git a/pkg/test_runner/lib/src/process_queue.dart b/pkg/test_runner/lib/src/process_queue.dart
index 3c8e5bb..2943b26 100644
--- a/pkg/test_runner/lib/src/process_queue.dart
+++ b/pkg/test_runner/lib/src/process_queue.dart
@@ -600,10 +600,6 @@
           adbDevicePool.releaseDevice(device);
         }
       });
-    } else if (command is VMBatchCommand) {
-      var name = command.displayName;
-      return _getBatchRunner(command.displayName + command.dartFile)
-          .runCommand(name, command, timeout, command.arguments);
     } else if (command is CompilationCommand &&
         command.displayName == 'babel') {
       return RunningProcess(command, timeout,
diff --git a/pkg/test_runner/lib/src/runtime_configuration.dart b/pkg/test_runner/lib/src/runtime_configuration.dart
index 27623e3..1810702 100644
--- a/pkg/test_runner/lib/src/runtime_configuration.dart
+++ b/pkg/test_runner/lib/src/runtime_configuration.dart
@@ -59,9 +59,6 @@
           );
         }
         break;
-
-      case Runtime.selfCheck:
-        return SelfCheckRuntimeConfiguration();
     }
     throw "unreachable";
   }
@@ -431,37 +428,6 @@
   }
 }
 
-class SelfCheckRuntimeConfiguration extends DartVmRuntimeConfiguration {
-  final List<String> selfCheckers = <String>[];
-
-  SelfCheckRuntimeConfiguration() {
-    searchForSelfCheckers();
-  }
-
-  void searchForSelfCheckers() {
-    var pkg = Repository.uri.resolve('pkg');
-    for (var entry in Directory.fromUri(pkg).listSync(recursive: true)) {
-      if (entry is File && entry.path.endsWith('_self_check.dart')) {
-        selfCheckers.add(entry.path);
-      }
-    }
-  }
-
-  List<Command> computeRuntimeCommands(
-      CommandArtifact artifact,
-      List<String> arguments,
-      Map<String, String> environmentOverrides,
-      List<String> extraLibs,
-      bool isCrashExpected) {
-    var executable = dartVmBinaryFileName;
-    return selfCheckers
-        .map((String tester) => VMBatchCommand(
-            executable, tester, arguments, environmentOverrides,
-            checked: _configuration.isChecked))
-        .toList();
-  }
-}
-
 /// Temporary runtime configuration for browser runtimes that haven't been
 /// migrated yet.
 // TODO(ahe): Remove this class.
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index f926645..9a5d685 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -811,9 +811,7 @@
 
     var compilationArtifact = compilerConfiguration.computeCompilationArtifact(
         tempDir, compileTimeArguments, environmentOverrides);
-    if (!configuration.skipCompilation) {
-      commands.addAll(compilationArtifact.commands);
-    }
+    commands.addAll(compilationArtifact.commands);
 
     if ((testFile.hasCompileError || testFile.isStaticErrorTest) &&
         compilerConfiguration.hasCompiler &&
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index 63727a5..c39a22f 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -31,7 +31,7 @@
   kUint8,
   kUint16,
   kUint32,
-  kUnit64,
+  kUint64,
   kIntptr,
   kFloat,
   kDouble,
@@ -41,59 +41,68 @@
   kHandle,
 }
 
-const NativeType kNativeTypeIntStart = NativeType.kInt8;
-const NativeType kNativeTypeIntEnd = NativeType.kIntptr;
+const Set<NativeType> nativeIntTypes = <NativeType>{
+  NativeType.kInt8,
+  NativeType.kInt16,
+  NativeType.kInt32,
+  NativeType.kInt64,
+  NativeType.kUint8,
+  NativeType.kUint16,
+  NativeType.kUint32,
+  NativeType.kUint64,
+  NativeType.kIntptr,
+};
 
-/// The [NativeType] class names, indexed by [NativeType].
-const List<String> nativeTypeClassNames = [
-  'NativeType',
-  '_NativeInteger',
-  '_NativeDouble',
-  'Pointer',
-  'NativeFunction',
-  'Int8',
-  'Int16',
-  'Int32',
-  'Int64',
-  'Uint8',
-  'Uint16',
-  'Uint32',
-  'Uint64',
-  'IntPtr',
-  'Float',
-  'Double',
-  'Void',
-  'Opaque',
-  'Struct',
-  'Handle'
-];
+/// The [NativeType] class names.
+const Map<NativeType, String> nativeTypeClassNames = <NativeType, String>{
+  NativeType.kNativeType: 'NativeType',
+  NativeType.kNativeInteger: '_NativeInteger',
+  NativeType.kNativeDouble: '_NativeDouble',
+  NativeType.kPointer: 'Pointer',
+  NativeType.kNativeFunction: 'NativeFunction',
+  NativeType.kInt8: 'Int8',
+  NativeType.kInt16: 'Int16',
+  NativeType.kInt32: 'Int32',
+  NativeType.kInt64: 'Int64',
+  NativeType.kUint8: 'Uint8',
+  NativeType.kUint16: 'Uint16',
+  NativeType.kUint32: 'Uint32',
+  NativeType.kUint64: 'Uint64',
+  NativeType.kIntptr: 'IntPtr',
+  NativeType.kFloat: 'Float',
+  NativeType.kDouble: 'Double',
+  NativeType.kVoid: 'Void',
+  NativeType.kOpaque: 'Opaque',
+  NativeType.kStruct: 'Struct',
+  NativeType.kHandle: 'Handle',
+};
 
 const int UNKNOWN = 0;
 const int WORD_SIZE = -1;
 
-/// The [NativeType] sizes in bytes, indexed by [NativeType].
-const List<int> nativeTypeSizes = [
-  UNKNOWN, // NativeType
-  UNKNOWN, // NativeInteger
-  UNKNOWN, // NativeDouble
-  WORD_SIZE, // Pointer
-  UNKNOWN, // NativeFunction
-  1, // Int8
-  2, // Int16
-  4, // Int32
-  8, // Int64
-  1, // Uint8
-  2, // Uint16
-  4, // Uint32
-  8, // Uint64
-  WORD_SIZE, // IntPtr
-  4, // Float
-  8, // Double
-  UNKNOWN, // Void
-  UNKNOWN, // Opaque
-  UNKNOWN, // Struct
-  WORD_SIZE, // Handle
-];
+/// The [NativeType] sizes in bytes.
+const Map<NativeType, int> nativeTypeSizes = <NativeType, int>{
+  NativeType.kNativeType: UNKNOWN,
+  NativeType.kNativeInteger: UNKNOWN,
+  NativeType.kNativeDouble: UNKNOWN,
+  NativeType.kPointer: WORD_SIZE,
+  NativeType.kNativeFunction: UNKNOWN,
+  NativeType.kInt8: 1,
+  NativeType.kInt16: 2,
+  NativeType.kInt32: 4,
+  NativeType.kInt64: 8,
+  NativeType.kUint8: 1,
+  NativeType.kUint16: 2,
+  NativeType.kUint32: 4,
+  NativeType.kUint64: 8,
+  NativeType.kIntptr: WORD_SIZE,
+  NativeType.kFloat: 4,
+  NativeType.kDouble: 8,
+  NativeType.kVoid: UNKNOWN,
+  NativeType.kOpaque: UNKNOWN,
+  NativeType.kStruct: UNKNOWN,
+  NativeType.kHandle: WORD_SIZE,
+};
 
 /// The struct layout in various ABIs.
 ///
@@ -145,7 +154,7 @@
   Abi.wordSize32Align32: {
     NativeType.kDouble: 4,
     NativeType.kInt64: 4,
-    NativeType.kUnit64: 4
+    NativeType.kUint64: 4
   },
 
   // The default for MSVC x86:
@@ -176,7 +185,7 @@
   NativeType.kUint8,
   NativeType.kUint16,
   NativeType.kUint32,
-  NativeType.kUnit64,
+  NativeType.kUint64,
   NativeType.kIntptr,
   NativeType.kFloat,
   NativeType.kDouble,
@@ -296,7 +305,8 @@
   late final InterfaceType pointerVoidType;
 
   /// Classes corresponding to [NativeType], indexed by [NativeType].
-  final List<Class> nativeTypesClasses;
+  final Map<NativeType, Class> nativeTypesClasses;
+  final Map<Class, NativeType> classNativeTypes;
 
   Library? _currentLibrary;
   Library get currentLibrary => _currentLibrary!;
@@ -431,31 +441,32 @@
             index.getTopLevelProcedure('dart:ffi', '_pointerFromFunction'),
         nativeCallbackFunctionProcedure =
             index.getTopLevelProcedure('dart:ffi', '_nativeCallbackFunction'),
-        nativeTypesClasses = nativeTypeClassNames
-            .map((name) => index.getClass('dart:ffi', name))
-            .toList(),
+        nativeTypesClasses = nativeTypeClassNames.map((nativeType, name) =>
+            MapEntry(nativeType, index.getClass('dart:ffi', name))),
+        classNativeTypes = nativeTypeClassNames.map((nativeType, name) =>
+            MapEntry(index.getClass('dart:ffi', name), nativeType)),
         loadMethods = Map.fromIterable(optimizedTypes, value: (t) {
-          final name = nativeTypeClassNames[t.index];
+          final name = nativeTypeClassNames[t];
           return index.getTopLevelProcedure('dart:ffi', "_load$name");
         }),
         loadUnalignedMethods =
             Map.fromIterable(unalignedLoadsStores, value: (t) {
-          final name = nativeTypeClassNames[t.index];
+          final name = nativeTypeClassNames[t];
           return index.getTopLevelProcedure(
               'dart:ffi', "_load${name}Unaligned");
         }),
         storeMethods = Map.fromIterable(optimizedTypes, value: (t) {
-          final name = nativeTypeClassNames[t.index];
+          final name = nativeTypeClassNames[t];
           return index.getTopLevelProcedure('dart:ffi', "_store$name");
         }),
         storeUnalignedMethods =
             Map.fromIterable(unalignedLoadsStores, value: (t) {
-          final name = nativeTypeClassNames[t.index];
+          final name = nativeTypeClassNames[t];
           return index.getTopLevelProcedure(
               'dart:ffi', "_store${name}Unaligned");
         }),
         elementAtMethods = Map.fromIterable(optimizedTypes, value: (t) {
-          final name = nativeTypeClassNames[t.index];
+          final name = nativeTypeClassNames[t];
           return index.getTopLevelProcedure('dart:ffi', "_elementAt$name");
         }),
         memCopy = index.getTopLevelProcedure('dart:ffi', '_memCopy'),
@@ -473,7 +484,7 @@
             index.getTopLevelProcedure('dart:_internal', 'reachabilityFence') {
     nativeFieldWrapperClass1Type = nativeFieldWrapperClass1Class.getThisType(
         coreTypes, Nullability.nonNullable);
-    voidType = nativeTypesClasses[NativeType.kVoid.index]
+    voidType = nativeTypesClasses[NativeType.kVoid]!
         .getThisType(coreTypes, Nullability.nonNullable);
     pointerVoidType =
         InterfaceType(pointerClass, Nullability.nonNullable, [voidType]);
@@ -538,8 +549,7 @@
     if (nativeType_ == NativeType.kPointer) {
       return nativeType;
     }
-    if (kNativeTypeIntStart.index <= nativeType_.index &&
-        nativeType_.index <= kNativeTypeIntEnd.index) {
+    if (nativeIntTypes.contains(nativeType_)) {
       return InterfaceType(intClass, Nullability.legacy);
     }
     if (nativeType_ == NativeType.kFloat || nativeType_ == NativeType.kDouble) {
@@ -579,11 +589,7 @@
   /// The [NativeType] corresponding to [c]. Returns `null` for user-defined
   /// structs.
   NativeType? getType(Class c) {
-    final int index = nativeTypesClasses.indexOf(c);
-    if (index == -1) {
-      return null;
-    }
-    return NativeType.values[index];
+    return classNativeTypes[c];
   }
 
   InterfaceType _listOfIntType() => InterfaceType(
@@ -731,8 +737,8 @@
     }
     if (!env.isSubtypeOf(
         type,
-        InterfaceType(nativeTypesClasses[NativeType.kNativeType.index],
-            Nullability.legacy),
+        InterfaceType(
+            nativeTypesClasses[NativeType.kNativeType]!, Nullability.legacy),
         SubtypeCheckMode.ignoringNullabilities)) {
       return false;
     }
@@ -756,8 +762,8 @@
     return env.isSubtypeOf(
         type,
         InterfaceType(pointerClass, Nullability.legacy, [
-          InterfaceType(nativeTypesClasses[NativeType.kNativeType.index],
-              Nullability.legacy)
+          InterfaceType(
+              nativeTypesClasses[NativeType.kNativeType]!, Nullability.legacy)
         ]),
         SubtypeCheckMode.ignoringNullabilities);
   }
@@ -772,8 +778,8 @@
     return env.isSubtypeOf(
         type,
         InterfaceType(arrayClass, Nullability.legacy, [
-          InterfaceType(nativeTypesClasses[NativeType.kNativeType.index],
-              Nullability.legacy)
+          InterfaceType(
+              nativeTypesClasses[NativeType.kNativeType]!, Nullability.legacy)
         ]),
         SubtypeCheckMode.ignoringNullabilities);
   }
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 29b58fc..f9ef464 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -441,7 +441,7 @@
         success = false;
       } else {
         final DartType nativeType = InterfaceType(
-            nativeTypesClasses[_getFieldType(nativeTypeAnnos.first)!.index],
+            nativeTypesClasses[_getFieldType(nativeTypeAnnos.first)!]!,
             Nullability.legacy);
         final DartType? shouldBeDartType = convertNativeTypeToDartType(
             nativeType,
@@ -1075,7 +1075,7 @@
 
   @override
   Map<Abi, int> get size {
-    final int size = nativeTypeSizes[nativeType.index];
+    final int size = nativeTypeSizes[nativeType]!;
     if (size == WORD_SIZE) {
       return wordSize;
     }
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index eb17eb0..403feb9 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -405,7 +405,7 @@
           .firstWhere((function) => function.name == Name('#sizeOf'));
       return StaticGet(sizeOfGetter);
     }
-    final int size = nativeTypeSizes[nt.index];
+    final int size = nativeTypeSizes[nt]!;
     if (size == WORD_SIZE) {
       return runtimeBranchOnLayout(wordSize);
     }
@@ -790,7 +790,7 @@
         klass == opaqueClass ||
         klass == structClass ||
         klass == unionClass ||
-        nativeTypesClasses.contains(klass)) {
+        classNativeTypes[klass] != null) {
       return null;
     }
 
@@ -809,7 +809,7 @@
       }
     }
 
-    for (final parent in nativeTypesClasses) {
+    for (final parent in nativeTypesClasses.values) {
       if (hierarchy.isSubtypeOf(klass, parent)) {
         return parent;
       }
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index de8b15b..c7e818c 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -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.
 # Flaky failures
+async_generator_breakpoint_test: Pass, Slow # Uses --stacktrace-every=...
 dds_log_history_size_gigantic_test: Pass, Slow # Involves processing lots of logs
 field_script_test: Pass, RuntimeError
 get_allocation_samples_test: Pass, RuntimeError # Inconsistent stack trace
@@ -22,10 +23,6 @@
 [ $compiler == dart2analyzer ]
 developer_extension_test: SkipByDesign
 
-# The _1 versions of this test can be slow due to stress testing flags.
-[ $mode == debug ]
-async_generator_breakpoint_test: Pass, Slow
-
 # Service protocol is not supported in product mode.
 [ $mode == product ]
 *: SkipByDesign
diff --git a/runtime/tests/concurrency/run_stress_test_shards.dart b/runtime/tests/concurrency/run_stress_test_shards.dart
index d1d1d80..5f29e01 100644
--- a/runtime/tests/concurrency/run_stress_test_shards.dart
+++ b/runtime/tests/concurrency/run_stress_test_shards.dart
@@ -14,6 +14,14 @@
 
 int crashCounter = 0;
 
+final Map<String, String> environmentForTests = (() {
+  final env = Map<String, String>.from(Platform.environment);
+  final testMatrix =
+      json.decode(File('tools/bots/test_matrix.json').readAsStringSync());
+  env.addAll(testMatrix['sanitizer_options'].cast<String, String>());
+  return env;
+})();
+
 void forwardStream(Stream<List<int>> input, IOSink output) {
   // Print the information line-by-line.
   input
@@ -34,7 +42,8 @@
 Future<bool> run(
     String executable, List<String> args, List<PotentialCrash> crashes) async {
   print('Running "$executable ${args.join(' ')}"');
-  final Process process = await Process.start(executable, args);
+  final Process process =
+      await Process.start(executable, args, environment: environmentForTests);
   forwardStream(process.stdout, stdout);
   forwardStream(process.stderr, stderr);
   final int exitCode = await process.exitCode;
diff --git a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
index f68d1cc..6cc3be4 100644
--- a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
@@ -606,6 +606,7 @@
   }
 
   Future testWeakProperty() async {
+    print('testWeakProperty');
     final key = Object();
     final expando1 = Expando();
     final expando2 = Expando();
diff --git a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
index 77947cb..79de0c5 100644
--- a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
@@ -608,6 +608,7 @@
   }
 
   Future testWeakProperty() async {
+    print('testWeakProperty');
     final key = Object();
     final expando1 = Expando();
     final expando2 = Expando();
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index be755ef..c8cbcec 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -5473,7 +5473,7 @@
   kUint8,
   kUint16,
   kUint32,
-  kUnit64,
+  kUint64,
   kIntptr,
   kFloat,
   kDouble,
@@ -5488,7 +5488,7 @@
   Abi.wordSize32Align32: {
     NativeType.kDouble: 4,
     NativeType.kInt64: 4,
-    NativeType.kUnit64: 4
+    NativeType.kUint64: 4
   },
   Abi.wordSize32Align64: {},
 };
@@ -5498,7 +5498,7 @@
   Abi.wordSize32Align32: {
     NativeType.kDouble: 4,
     NativeType.kInt64: 4,
-    NativeType.kUnit64: 4
+    NativeType.kUint64: 4
   },
   Abi.wordSize32Align64: {},
 };
diff --git a/tests/ffi/vmspecific_static_checks_test.dart b/tests/ffi/vmspecific_static_checks_test.dart
index 9dca0e7..e77b941 100644
--- a/tests/ffi/vmspecific_static_checks_test.dart
+++ b/tests/ffi/vmspecific_static_checks_test.dart
@@ -36,6 +36,7 @@
   testFromFunctionClosure();
   testFromFunctionTearOff();
   testFromFunctionAbstract();
+  testFromFunctionFunctionExceptionValueMustBeConst();
   testLookupFunctionGeneric();
   testLookupFunctionGeneric2();
   testLookupFunctionWrongNativeFunctionSignature();
@@ -274,6 +275,12 @@
       testFromFunctionAbstract); //# 76: compile-time error
 }
 
+void testFromFunctionFunctionExceptionValueMustBeConst() {
+  final notAConst = 1.1;
+  Pointer<NativeFunction<NativeDoubleUnOp>> p;
+  p = Pointer.fromFunction(myTimesThree, notAConst); //# 77: compile-time error
+}
+
 void testLookupFunctionGeneric() {
   Function generic<T extends Function>() {
     DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
@@ -714,13 +721,16 @@
 void testLookupFunctionIsLeafMustBeConst() {
   bool notAConst = false;
   DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
-  l.lookupFunction<NativeDoubleUnOp, DoubleUnOp>("timesFour", isLeaf:notAConst); //# 1500: compile-time error
+  l.lookupFunction< //# 1500: compile-time error
+          NativeDoubleUnOp, //# 1500: compile-time error
+          DoubleUnOp>("timesFour", //# 1500: compile-time error
+      isLeaf: notAConst); //# 1500: compile-time error
 }
 
 void testAsFunctionIsLeafMustBeConst() {
   bool notAConst = false;
   Pointer<NativeFunction<Int8UnOp>> p = Pointer.fromAddress(1337);
-  IntUnOp f = p.asFunction(isLeaf:notAConst); //# 1501: compile-time error
+  IntUnOp f = p.asFunction(isLeaf: notAConst); //# 1501: compile-time error
 }
 
 typedef NativeTakesHandle = Void Function(Handle);
@@ -728,12 +738,16 @@
 
 void testLookupFunctionTakesHandle() {
   DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
-  l.lookupFunction<NativeTakesHandle, TakesHandle>("takesHandle", isLeaf:true); //# 1502: compile-time error
+  l.lookupFunction< //# 1502: compile-time error
+          NativeTakesHandle, //# 1502: compile-time error
+          TakesHandle>("takesHandle", //# 1502: compile-time error
+      isLeaf: true); //# 1502: compile-time error
 }
 
 void testAsFunctionTakesHandle() {
-  Pointer<NativeFunction<NativeTakesHandle>> p = Pointer.fromAddress(1337); //# 1503: compile-time error
-  TakesHandle f = p.asFunction(isLeaf:true); //# 1503: compile-time error
+  Pointer<NativeFunction<NativeTakesHandle>> p = //# 1503: compile-time error
+      Pointer.fromAddress(1337); //# 1503: compile-time error
+  TakesHandle f = p.asFunction(isLeaf: true); //# 1503: compile-time error
 }
 
 typedef NativeReturnsHandle = Handle Function();
@@ -741,12 +755,16 @@
 
 void testLookupFunctionReturnsHandle() {
   DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
-  l.lookupFunction<NativeReturnsHandle, ReturnsHandle>("returnsHandle", isLeaf:true); //# 1504: compile-time error
+  l.lookupFunction< //# 1504: compile-time error
+          NativeReturnsHandle, //# 1504: compile-time error
+          ReturnsHandle>("returnsHandle", //# 1504: compile-time error
+      isLeaf: true); //# 1504: compile-time error
 }
 
 void testAsFunctionReturnsHandle() {
-  Pointer<NativeFunction<NativeReturnsHandle>> p = Pointer.fromAddress(1337); //# 1505: compile-time error
-  ReturnsHandle f = p.asFunction(isLeaf:true); //# 1505: compile-time error
+  Pointer<NativeFunction<NativeReturnsHandle>> p = //# 1505: compile-time error
+      Pointer.fromAddress(1337); //# 1505: compile-time error
+  ReturnsHandle f = p.asFunction(isLeaf: true); //# 1505: compile-time error
 }
 
 @Packed(1)
diff --git a/tests/ffi_2/vmspecific_static_checks_test.dart b/tests/ffi_2/vmspecific_static_checks_test.dart
index 112455c..165b25c 100644
--- a/tests/ffi_2/vmspecific_static_checks_test.dart
+++ b/tests/ffi_2/vmspecific_static_checks_test.dart
@@ -38,6 +38,7 @@
   testFromFunctionClosure();
   testFromFunctionTearOff();
   testFromFunctionAbstract();
+  testFromFunctionFunctionExceptionValueMustBeConst();
   testLookupFunctionGeneric();
   testLookupFunctionGeneric2();
   testLookupFunctionWrongNativeFunctionSignature();
@@ -276,6 +277,12 @@
       testFromFunctionAbstract); //# 76: compile-time error
 }
 
+void testFromFunctionFunctionExceptionValueMustBeConst() {
+  final notAConst = 1.1;
+  Pointer<NativeFunction<NativeDoubleUnOp>> p;
+  p = Pointer.fromFunction(myTimesThree, notAConst); //# 77: compile-time error
+}
+
 void testLookupFunctionGeneric() {
   Function generic<T extends Function>() {
     DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
@@ -714,13 +721,16 @@
 void testLookupFunctionIsLeafMustBeConst() {
   bool notAConst = false;
   DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
-  l.lookupFunction<NativeDoubleUnOp, DoubleUnOp>("timesFour", isLeaf:notAConst); //# 1500: compile-time error
+  l.lookupFunction< //# 1500: compile-time error
+          NativeDoubleUnOp, //# 1500: compile-time error
+          DoubleUnOp>("timesFour", //# 1500: compile-time error
+      isLeaf: notAConst); //# 1500: compile-time error
 }
 
 void testAsFunctionIsLeafMustBeConst() {
   bool notAConst = false;
   Pointer<NativeFunction<Int8UnOp>> p = Pointer.fromAddress(1337);
-  IntUnOp f = p.asFunction(isLeaf:notAConst); //# 1501: compile-time error
+  IntUnOp f = p.asFunction(isLeaf: notAConst); //# 1501: compile-time error
 }
 
 typedef NativeTakesHandle = Void Function(Handle);
@@ -728,12 +738,16 @@
 
 void testLookupFunctionTakesHandle() {
   DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
-  l.lookupFunction<NativeTakesHandle, TakesHandle>("takesHandle", isLeaf:true); //# 1502: compile-time error
+  l.lookupFunction< //# 1502: compile-time error
+          NativeTakesHandle, //# 1502: compile-time error
+          TakesHandle>("takesHandle", //# 1502: compile-time error
+      isLeaf: true); //# 1502: compile-time error
 }
 
 void testAsFunctionTakesHandle() {
-  Pointer<NativeFunction<NativeTakesHandle>> p = Pointer.fromAddress(1337); //# 1503: compile-time error
-  TakesHandle f = p.asFunction(isLeaf:true); //# 1503: compile-time error
+  Pointer<NativeFunction<NativeTakesHandle>> p = //# 1503: compile-time error
+      Pointer.fromAddress(1337); //# 1503: compile-time error
+  TakesHandle f = p.asFunction(isLeaf: true); //# 1503: compile-time error
 }
 
 typedef NativeReturnsHandle = Handle Function();
@@ -741,12 +755,16 @@
 
 void testLookupFunctionReturnsHandle() {
   DynamicLibrary l = dlopenPlatformSpecific("ffi_test_dynamic_library");
-  l.lookupFunction<NativeReturnsHandle, ReturnsHandle>("returnsHandle", isLeaf:true); //# 1504: compile-time error
+  l.lookupFunction< //# 1504: compile-time error
+          NativeReturnsHandle, //# 1504: compile-time error
+          ReturnsHandle>("returnsHandle", //# 1504: compile-time error
+      isLeaf: true); //# 1504: compile-time error
 }
 
 void testAsFunctionReturnsHandle() {
-  Pointer<NativeFunction<NativeReturnsHandle>> p = Pointer.fromAddress(1337); //# 1505: compile-time error
-  ReturnsHandle f = p.asFunction(isLeaf:true); //# 1505: compile-time error
+  Pointer<NativeFunction<NativeReturnsHandle>> p = //# 1505: compile-time error
+      Pointer.fromAddress(1337); //# 1505: compile-time error
+  ReturnsHandle f = p.asFunction(isLeaf: true); //# 1505: compile-time error
 }
 
 @Packed(1)
diff --git a/tools/VERSION b/tools/VERSION
index 6ccaf6a..dc7ef35 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 225
+PRERELEASE 226
 PRERELEASE_PATCH 0
\ No newline at end of file