diff --git a/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart b/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart
index 828e28e..561d209 100644
--- a/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart
+++ b/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/completion/yaml/producer.dart';
+import 'package:analysis_server/src/utilities/extensions/yaml.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:yaml/yaml.dart';
 
@@ -182,62 +183,3 @@
         replacementOffset = 0,
         replacementLength = 0;
 }
-
-extension on YamlMap {
-  /// Return the node representing the key that corresponds to the value
-  /// represented by the [value] node.
-  YamlNode keyAtValue(YamlNode value) {
-    for (var entry in nodes.entries) {
-      if (entry.value == value) {
-        return entry.key;
-      }
-    }
-    return null;
-  }
-}
-
-extension on YamlNode {
-  /// Return the child of this node that contains the given [offset], or `null`
-  /// if none of the children contains the offset.
-  YamlNode childContainingOffset(int offset) {
-    var node = this;
-    if (node is YamlList) {
-      for (var element in node.nodes) {
-        if (element.containsOffset(offset)) {
-          return element;
-        }
-      }
-      for (var element in node.nodes) {
-        if (element is YamlScalar && element.value == null) {
-          // TODO(brianwilkerson) Testing for a null value probably gets
-          //  confused when there are multiple null values.
-          return element;
-        }
-      }
-    } else if (node is YamlMap) {
-      for (var entry in node.nodes.entries) {
-        if ((entry.key as YamlNode).containsOffset(offset)) {
-          return entry.key;
-        }
-        var value = entry.value;
-        if (value.containsOffset(offset) ||
-            (value is YamlScalar && value.value == null)) {
-          // TODO(brianwilkerson) Testing for a null value probably gets
-          //  confused when there are multiple null values or when there is a
-          //  null value before the node that actually contains the offset.
-          return entry.value;
-        }
-      }
-    }
-    return null;
-  }
-
-  /// Return `true` if this node contains the given [offset].
-  bool containsOffset(int offset) {
-    // TODO(brianwilkerson) Nodes at the end of the file contain any trailing
-    //  whitespace. This needs to be accounted for, here or elsewhere.
-    var nodeOffset = span.start.offset;
-    var nodeEnd = nodeOffset + span.length;
-    return nodeOffset <= offset && offset <= nodeEnd;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index 5b57f61..351608c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -1033,18 +1033,3 @@
     }
   }
 }
-
-extension on YamlMap {
-  // TODO(brianwilkerson) Copied from YamlCompletionGenerator. Refactor to a
-  //  utility file that is shared between them.
-  /// Return the node representing the key that corresponds to the value
-  /// represented by the [value] node.
-  YamlNode keyAtValue(YamlNode value) {
-    for (var entry in nodes.entries) {
-      if (entry.value == value) {
-        return entry.key;
-      }
-    }
-    return null;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart b/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart
index 0107f62..6ce971a 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart
@@ -5,6 +5,17 @@
 import 'package:yaml/yaml.dart';
 
 extension YamlMapExtensions on YamlMap {
+  /// Return the node representing the key that corresponds to the value
+  /// represented by the [value] node.
+  YamlNode keyAtValue(YamlNode value) {
+    for (var entry in nodes.entries) {
+      if (entry.value == value) {
+        return entry.key;
+      }
+    }
+    return null;
+  }
+
   /// Return the value associated with the key whose value matches the given
   /// [key], or `null` if there is no matching key.
   YamlNode valueAt(String key) {
@@ -16,3 +27,49 @@
     return null;
   }
 }
+
+extension YamlNodeExtensions on YamlNode {
+  /// Return the child of this node that contains the given [offset], or `null`
+  /// if none of the children contains the offset.
+  YamlNode childContainingOffset(int offset) {
+    var node = this;
+    if (node is YamlList) {
+      for (var element in node.nodes) {
+        if (element.containsOffset(offset)) {
+          return element;
+        }
+      }
+      for (var element in node.nodes) {
+        if (element is YamlScalar && element.value == null) {
+          // TODO(brianwilkerson) Testing for a null value probably gets
+          //  confused when there are multiple null values.
+          return element;
+        }
+      }
+    } else if (node is YamlMap) {
+      for (var entry in node.nodes.entries) {
+        if ((entry.key as YamlNode).containsOffset(offset)) {
+          return entry.key;
+        }
+        var value = entry.value;
+        if (value.containsOffset(offset) ||
+            (value is YamlScalar && value.value == null)) {
+          // TODO(brianwilkerson) Testing for a null value probably gets
+          //  confused when there are multiple null values or when there is a
+          //  null value before the node that actually contains the offset.
+          return entry.value;
+        }
+      }
+    }
+    return null;
+  }
+
+  /// Return `true` if this node contains the given [offset].
+  bool containsOffset(int offset) {
+    // TODO(brianwilkerson) Nodes at the end of the file contain any trailing
+    //  whitespace. This needs to be accounted for, here or elsewhere.
+    var nodeOffset = span.start.offset;
+    var nodeEnd = nodeOffset + span.length;
+    return nodeOffset <= offset && offset <= nodeEnd;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index ae9ae5d..2efd369 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -5950,11 +5950,12 @@
     if (builder?.next != null) {
       // Duplicated name, already reported.
       return <Initializer>[
-        new LocalInitializer(new VariableDeclaration.forValue(buildProblem(
-            fasta.templateDuplicatedDeclarationUse.withArguments(name),
-            fieldNameOffset,
-            name.length)))
-          ..fileOffset = fieldNameOffset
+        buildInvalidInitializer(
+            buildProblem(
+                fasta.templateDuplicatedDeclarationUse.withArguments(name),
+                fieldNameOffset,
+                name.length),
+            fieldNameOffset)
       ];
     } else if (builder is FieldBuilder && builder.isDeclarationInstanceMember) {
       initializedFields ??= <String, int>{};
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.expect
index 02fa4fc..92572f2 100644
--- a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* a) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
   A(this.a);
-         ^", super core::Object::•()
+         ^"
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.transformed.expect
index 02fa4fc..92572f2 100644
--- a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* a) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
   A(this.a);
-         ^", super core::Object::•()
+         ^"
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/issue38938.dart.strong.expect b/pkg/front_end/testcases/general/issue38938.dart.strong.expect
index ffb21f8..2ed9c3f 100644
--- a/pkg/front_end/testcases/general/issue38938.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue38938.dart.strong.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* v) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue38938.dart:8:10: Error: Can't use 'v' because it is declared more than once.
   A(this.v);
-         ^", super core::Object::•()
+         ^"
     ;
   constructor second() → self::A*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/general/issue38938.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue38938.dart.strong.transformed.expect
index ffb21f8..2ed9c3f 100644
--- a/pkg/front_end/testcases/general/issue38938.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue38938.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* v) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue38938.dart:8:10: Error: Can't use 'v' because it is declared more than once.
   A(this.v);
-         ^", super core::Object::•()
+         ^"
     ;
   constructor second() → self::A*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/general/issue43363.dart b/pkg/front_end/testcases/general/issue43363.dart
new file mode 100644
index 0000000..86d91ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43363.dart
@@ -0,0 +1,16 @@
+// 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.
+
+class E {
+  final int x;
+  final int y;
+  E() : this.named(),
+        this.x = 1;
+        this.y = 2;
+
+  E.named() : this.x = 5,
+              this.y = 6;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue43363.dart.outline.expect b/pkg/front_end/testcases/general/issue43363.dart.outline.expect
new file mode 100644
index 0000000..e44f548
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43363.dart.outline.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'.
+//         this.y = 2;
+//         ^^^^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'.
+//         this.y = 2;
+//             ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//         this.y = 2;
+//              ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope.
+//         this.y = 2;
+//              ^
+// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'.
+//   final int y;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* x;
+  final field core::int* y;
+  constructor •() → self::E*
+    ;
+  constructor named() → self::E*
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue43363.dart.strong.expect b/pkg/front_end/testcases/general/issue43363.dart.strong.expect
new file mode 100644
index 0000000..b4cfb49
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43363.dart.strong.expect
@@ -0,0 +1,60 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'.
+//         this.y = 2;
+//         ^^^^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'.
+//         this.y = 2;
+//             ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//         this.y = 2;
+//              ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope.
+//         this.y = 2;
+//              ^
+// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'.
+//   final int y;
+//             ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers.
+//         this.x = 1;
+//                ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once.
+//               this.y = 6;
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* x;
+  final field core::int* y = null;
+  constructor •() → self::E*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers.
+        this.x = 1;
+               ^", this self::E::named()
+    ;
+  constructor named() → self::E*
+    : self::E::x = 5, final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once.
+              this.y = 6;
+                   ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue43363.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue43363.dart.strong.transformed.expect
new file mode 100644
index 0000000..b4cfb49
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43363.dart.strong.transformed.expect
@@ -0,0 +1,60 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'.
+//         this.y = 2;
+//         ^^^^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'.
+//         this.y = 2;
+//             ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//         this.y = 2;
+//              ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope.
+//         this.y = 2;
+//              ^
+// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'.
+//   final int y;
+//             ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers.
+//         this.x = 1;
+//                ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once.
+//               this.y = 6;
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* x;
+  final field core::int* y = null;
+  constructor •() → self::E*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers.
+        this.x = 1;
+               ^", this self::E::named()
+    ;
+  constructor named() → self::E*
+    : self::E::x = 5, final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once.
+              this.y = 6;
+                   ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue43363.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue43363.dart.textual_outline.expect
new file mode 100644
index 0000000..f2bf39e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43363.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+class E {
+  final int x;
+  final int y;
+  E() : this.named(), this.x = 1;
+  this.
+  y = 2;
+  E.named() : this.x = 5, this.y = 6;
+}
+main() {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.expect
index 02b4a69..64e0ad7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* a) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart:10:10: Error: Can't use 'a' because it is declared more than once.
   A(this.a);
-         ^", super core::Object::•()
+         ^"
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.transformed.expect
index 02b4a69..64e0ad7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* a) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/duplicated_field_initializer.dart:10:10: Error: Can't use 'a' because it is declared more than once.
   A(this.a);
-         ^", super core::Object::•()
+         ^"
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.expect
index c592b47..227ba25 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* v) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart:10:10: Error: Can't use 'v' because it is declared more than once.
   A(this.v);
-         ^", super core::Object::•()
+         ^"
     ;
   constructor second() → self::A*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.transformed.expect
index c592b47..227ba25 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
   constructor •(core::int* v) → self::A*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/issue38938.dart:10:10: Error: Can't use 'v' because it is declared more than once.
   A(this.v);
-         ^", super core::Object::•()
+         ^"
     ;
   constructor second() → self::A*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index ab8fac6..0553975 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -118,6 +118,7 @@
 general/invalid_operator: FormatterCrash
 general/issue40242: FormatterCrash
 general/issue42997: FormatterCrash
+general/issue43363: FormatterCrash
 general/many_errors: FormatterCrash
 general/null_safety_invalid_experiment_and_language_version: FormatterCrash
 general/type_parameter_usage_in_static_method_in_extension: FormatterCrash
@@ -169,9 +170,9 @@
 late_lowering/later: FormatterCrash
 late_lowering/override: FormatterCrash
 late_lowering/override_getter_setter: FormatterCrash
+late_lowering/skip_late_final_uninitialized_instance_fields/main: FormatterCrash
 late_lowering/uninitialized_non_nullable_late_fields: FormatterCrash
 late_lowering_sentinel/late_fields: FormatterCrash
-late_lowering/skip_late_final_uninitialized_instance_fields/main: FormatterCrash
 nnbd/abstract_field_errors: FormatterCrash
 nnbd/covariant_late_field: FormatterCrash
 nnbd/definitely_unassigned: FormatterCrash
@@ -260,3 +261,4 @@
 variance/generic_covariance_sound_variance: FormatterCrash
 variance/mixin_type_parameter_modifier: FormatterCrash
 variance/unconstrained_inference: FormatterCrash
+
diff --git a/pkg/nnbd_migration/lib/migration_cli.dart b/pkg/nnbd_migration/lib/migration_cli.dart
index db90835..4dff755 100644
--- a/pkg/nnbd_migration/lib/migration_cli.dart
+++ b/pkg/nnbd_migration/lib/migration_cli.dart
@@ -615,7 +615,18 @@
 
   @override
   void onException(String detail) {
-    if (_hasExceptions) return;
+    if (_hasExceptions) {
+      if (!options.ignoreExceptions) {
+        // Our intention is to exit immediately when an exception occurred.  We
+        // tried, but failed (probably due to permissive mode logic in the
+        // migration tool itself catching the MigrationExit exception).  The
+        // stack has now been unwound further, so throw again.
+        throw MigrationExit(1);
+      }
+      // We're not exiting immediately when an exception occurs.  We've already
+      // reported that an exception happened.  So do nothing further.
+      return;
+    }
     _hasExceptions = true;
     if (options.ignoreExceptions) {
       logger.stdout('''
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 5fac352..7003df0 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -2144,15 +2144,20 @@
   }
 
   DecoratedType _dispatch(AstNode node, {bool skipNullCheckHint = false}) {
-    var type = node?.accept(this);
-    if (!skipNullCheckHint &&
-        node is Expression &&
-        // A /*!*/ hint following an AsExpression should be interpreted as a
-        // nullability hint for the type, not a null-check hint.
-        node is! AsExpression) {
-      type = _handleNullCheckHint(node, type);
+    try {
+      var type = node?.accept(this);
+      if (!skipNullCheckHint &&
+          node is Expression &&
+          // A /*!*/ hint following an AsExpression should be interpreted as a
+          // nullability hint for the type, not a null-check hint.
+          node is! AsExpression) {
+        type = _handleNullCheckHint(node, type);
+      }
+      return type;
+    } catch (exception, stackTrace) {
+      listener.reportException(source, node, exception, stackTrace);
+      return null;
     }
-    return type;
   }
 
   void _dispatchList(NodeList nodeList) {
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index 16f8003..d746ac6 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -692,7 +692,12 @@
   }
 
   test_lifecycle_exception_handling_ignore() async {
-    var projectContents = simpleProject(sourceText: 'main() { print(0); }');
+    var projectContents = simpleProject(sourceText: '''
+main() {
+  print(0);
+  int x = null;
+}
+''');
     var projectDir = createProjectDir(projectContents);
     injectArtificialException = true;
     var cli = _createCli();
@@ -707,6 +712,14 @@
               ' of --ignore-exceptions.'));
       expect(output, contains('re-run without --ignore-exceptions'));
       await assertPreviewServerResponsive(url);
+      await _tellPreviewToApplyChanges(url);
+      assertProjectContents(
+          projectDir, simpleProject(migrated: true, sourceText: '''
+main() {
+  print(0);
+  int? x = null;
+}
+'''));
     });
     expect(logger.stderrBuffer.toString(), isEmpty);
   }
@@ -982,14 +995,7 @@
       expect(
           logger.stdoutBuffer.toString(), contains('No analysis issues found'));
       await assertPreviewServerResponsive(url);
-      var uri = Uri.parse(url);
-      var authToken = uri.queryParameters['authToken'];
-      var response = await httpPost(
-          uri.replace(
-              path: PreviewSite.applyMigrationPath,
-              queryParameters: {'authToken': authToken}),
-          headers: {'Content-Type': 'application/json; charset=UTF-8'});
-      assertHttpSuccess(response);
+      await _tellPreviewToApplyChanges(url);
       expect(applyHookCalled, true);
     });
   }
@@ -2113,6 +2119,17 @@
   ArgResults _parseArgs(List<String> args) {
     return MigrationCli.createParser().parse(args);
   }
+
+  Future<void> _tellPreviewToApplyChanges(String url) async {
+    var uri = Uri.parse(url);
+    var authToken = uri.queryParameters['authToken'];
+    var response = await httpPost(
+        uri.replace(
+            path: PreviewSite.applyMigrationPath,
+            queryParameters: {'authToken': authToken}),
+        headers: {'Content-Type': 'application/json; charset=UTF-8'});
+    assertHttpSuccess(response);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 6cd97fc..52a98e6 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -134,9 +134,7 @@
   /// If [getAllSources] is false it will ask specifically for report
   /// (and thus hits) for "lib1.dart" only.
   Future<Set<int>> collectAndCheckCoverageData(int port, bool getAllSources,
-      {bool resume: true,
-      bool onGetAllVerifyCount: true,
-      Set<int> coverageForLines}) async {
+      {bool resume: true}) async {
     RemoteVm remoteVm = new RemoteVm(port);
 
     // Wait for the script to have finished.
@@ -191,7 +189,7 @@
         }
         i++;
       }
-      if (getAllSources && onGetAllVerifyCount) {
+      if (getAllSources) {
         expect(scriptIdToIndex.length >= 2, isTrue);
       }
 
@@ -228,16 +226,12 @@
             }
           }
           for (int pos in coverage["misses"]) positions.add(pos);
-          if (range["possibleBreakpoints"] != null) {
-            for (int pos in range["possibleBreakpoints"]) positions.add(pos);
-          }
+          for (int pos in range["possibleBreakpoints"]) positions.add(pos);
           Map script = scriptIndexToScript[range["scriptIndex"]];
           Set<int> knownPositions = new Set<int>();
-          Map<int, int> tokenPosToLine = {};
           if (script["tokenPosTable"] != null) {
             for (List tokenPosTableLine in script["tokenPosTable"]) {
               for (int i = 1; i < tokenPosTableLine.length; i += 2) {
-                tokenPosToLine[tokenPosTableLine[i]] = tokenPosTableLine[0];
                 knownPositions.add(tokenPosTableLine[i]);
               }
             }
@@ -250,14 +244,6 @@
                   "line and column.");
             }
           }
-
-          if (coverageForLines != null) {
-            for (int pos in coverage["hits"]) {
-              if (lib1scriptIndices.contains(range["scriptIndex"])) {
-                coverageForLines.add(tokenPosToLine[pos]);
-              }
-            }
-          }
         }
       }
     }
@@ -500,243 +486,6 @@
     });
   });
 
-  group('multiple kernels constant coverage', () {
-    Directory mytest;
-    File main;
-    File lib1;
-    int lineForUnnamedConstructor;
-    int lineForNamedConstructor;
-    Process vm;
-    setUpAll(() {
-      mytest = Directory.systemTemp.createTempSync('incremental');
-      main = new File('${mytest.path}/main.dart')..createSync();
-      main.writeAsStringSync("""
-        // This file - combined with the lib - should have coverage for both
-        // constructors of Foo.
-        import 'lib1.dart' as lib1;
-
-        void testFunction() {
-          const foo = lib1.Foo.named();
-          const foo2 = lib1.Foo.named();
-          if (!identical(foo, foo2)) throw "what?";
-        }
-
-        main() {
-          lib1.testFunction();
-          testFunction();
-          print("main");
-        }
-      """);
-      lib1 = new File('${mytest.path}/lib1.dart')..createSync();
-      lib1.writeAsStringSync("""
-        // Compiling this file should mark the default constructor - but not the
-        // named constructor - as having coverage.
-        class Foo {
-          final int x;
-          const Foo([int? x]) : this.x = x ?? 42;
-          const Foo.named([int? x]) : this.x = x ?? 42;
-        }
-
-        void testFunction() {
-          const foo = Foo();
-          const foo2 = Foo();
-          if (!identical(foo, foo2)) throw "what?";
-        }
-
-        main() {
-          testFunction();
-          print("lib1");
-        }
-      """);
-      lineForUnnamedConstructor = 5;
-      lineForNamedConstructor = 6;
-    });
-
-    tearDownAll(() {
-      try {
-        mytest.deleteSync(recursive: true);
-      } catch (_) {
-        // Ignore errors;
-      }
-      try {
-        vm.kill();
-      } catch (_) {
-        // Ignore errors;
-      }
-    });
-
-    Future<Set<int>> runAndGetLineCoverage(
-        File list, String expectStdoutContains) async {
-      vm = await Process.start(Platform.resolvedExecutable, <String>[
-        "--pause-isolates-on-exit",
-        "--enable-vm-service:0",
-        "--disable-service-auth-codes",
-        "--disable-dart-dev",
-        list.path
-      ]);
-
-      const kObservatoryListening = 'Observatory listening on ';
-      final RegExp observatoryPortRegExp =
-          new RegExp("Observatory listening on http://127.0.0.1:\([0-9]*\)");
-      int port;
-      final splitter = new LineSplitter();
-      Completer<String> portLineCompleter = new Completer<String>();
-      Set<int> coverageLines = {};
-      bool foundExpectedString = false;
-      vm.stdout
-          .transform(utf8.decoder)
-          .transform(splitter)
-          .listen((String s) async {
-        if (s == expectStdoutContains) {
-          foundExpectedString = true;
-        }
-        if (s.startsWith(kObservatoryListening)) {
-          expect(observatoryPortRegExp.hasMatch(s), isTrue);
-          final match = observatoryPortRegExp.firstMatch(s);
-          port = int.parse(match.group(1));
-          await collectAndCheckCoverageData(port, true,
-              onGetAllVerifyCount: false, coverageForLines: coverageLines);
-          if (!portLineCompleter.isCompleted) {
-            portLineCompleter.complete("done");
-          }
-        }
-        print("vm stdout: $s");
-      });
-      vm.stderr.transform(utf8.decoder).transform(splitter).listen((String s) {
-        print("vm stderr: $s");
-      });
-      await portLineCompleter.future;
-      print("Compiler terminated with ${await vm.exitCode} exit code");
-      expect(foundExpectedString, isTrue);
-      return coverageLines;
-    }
-
-    test('compile seperatly, check coverage', () async {
-      Directory dir = mytest.createTempSync();
-
-      // First compile lib, run and verify coverage (un-named constructor
-      // covered, but not the named constructor).
-      // Note that it's called 'lib1' to match with expectations from coverage
-      // collector helper in this file.
-      File libDill = File(p.join(dir.path, p.basename(lib1.path + ".dill")));
-      IncrementalCompiler compiler = new IncrementalCompiler(options, lib1.uri);
-      Component component = await compiler.compile();
-      expect(component.libraries.length, equals(1));
-      expect(component.libraries.single.fileUri, equals(lib1.uri));
-      IOSink sink = libDill.openWrite();
-      BinaryPrinter printer = new BinaryPrinter(sink);
-      printer.writeComponentFile(component);
-      await sink.flush();
-      await sink.close();
-      File list = new File(p.join(dir.path, 'dill.list'))..createSync();
-      list.writeAsStringSync("#@dill\n${libDill.path}\n");
-      Set<int> lineCoverage = await runAndGetLineCoverage(list, "lib1");
-      // Expect coverage for unnamed constructor but not for the named one.
-      expect(
-          lineCoverage.intersection(
-              {lineForUnnamedConstructor, lineForNamedConstructor}),
-          equals({lineForUnnamedConstructor}));
-
-      try {
-        vm.kill();
-      } catch (_) {
-        // Ignore errors;
-      }
-      // Accept the compile to not include the lib again.
-      compiler.accept();
-
-      // Then compile lib, run and verify coverage (un-named constructor
-      // covered, and the named constructor coveraged too).
-      File mainDill = File(p.join(dir.path, p.basename(main.path + ".dill")));
-      component = await compiler.compile(entryPoint: main.uri);
-      expect(component.libraries.length, equals(1));
-      expect(component.libraries.single.fileUri, equals(main.uri));
-      sink = mainDill.openWrite();
-      printer = new BinaryPrinter(sink);
-      printer.writeComponentFile(component);
-      await sink.flush();
-      await sink.close();
-      list.writeAsStringSync("#@dill\n${mainDill.path}\n${libDill.path}\n");
-      lineCoverage = await runAndGetLineCoverage(list, "main");
-
-      // Expect coverage for both unnamed constructor and for the named one.
-      expect(
-          lineCoverage.intersection(
-              {lineForUnnamedConstructor, lineForNamedConstructor}),
-          equals({lineForUnnamedConstructor, lineForNamedConstructor}));
-
-      try {
-        vm.kill();
-      } catch (_) {
-        // Ignore errors;
-      }
-      // Accept the compile to not include the lib again.
-      compiler.accept();
-
-      // Finally, change lib to shift the constructors so the old line numbers
-      // doesn't match. Compile lib by itself, compile lib, run with the old
-      // main and verify coverage is still correct (both un-named constructor
-      // and named constructor (at new line numbers) are covered, and the old
-      // line numbers are not coverage.
-
-      lib1.writeAsStringSync("""
-        //
-        // Shift lines down by five
-        // lines so the original
-        // lines can't be coverred
-        //
-        class Foo {
-          final int x;
-          const Foo([int? x]) : this.x = x ?? 42;
-          const Foo.named([int? x]) : this.x = x ?? 42;
-        }
-
-        void testFunction() {
-          const foo = Foo();
-          const foo2 = Foo();
-          if (!identical(foo, foo2)) throw "what?";
-        }
-
-        main() {
-          testFunction();
-          print("lib1");
-        }
-      """);
-      int newLineForUnnamedConstructor = 8;
-      int newLineForNamedConstructor = 9;
-      compiler.invalidate(lib1.uri);
-      component = await compiler.compile(entryPoint: lib1.uri);
-      expect(component.libraries.length, equals(1));
-      expect(component.libraries.single.fileUri, equals(lib1.uri));
-      sink = libDill.openWrite();
-      printer = new BinaryPrinter(sink);
-      printer.writeComponentFile(component);
-      await sink.flush();
-      await sink.close();
-      list.writeAsStringSync("#@dill\n${mainDill.path}\n${libDill.path}\n");
-      lineCoverage = await runAndGetLineCoverage(list, "main");
-
-      // Expect coverage for both unnamed constructor and for the named one on
-      // the new positions, but no coverage on the old positions.
-      expect(
-          lineCoverage.intersection({
-            lineForUnnamedConstructor,
-            lineForNamedConstructor,
-            newLineForUnnamedConstructor,
-            newLineForNamedConstructor
-          }),
-          equals({newLineForUnnamedConstructor, newLineForNamedConstructor}));
-
-      try {
-        vm.kill();
-      } catch (_) {
-        // Ignore errors;
-      }
-      // Accept the compile to not include the lib again.
-      compiler.accept();
-    });
-  });
-
   group('multiple kernels 2', () {
     Directory mytest;
     File main;
diff --git a/runtime/observatory/tests/service/get_source_report_const_coverage_lib.dart b/runtime/observatory/tests/service/get_source_report_const_coverage_lib.dart
deleted file mode 100644
index b0f078d..0000000
--- a/runtime/observatory/tests/service/get_source_report_const_coverage_lib.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// 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 "get_source_report_const_coverage_test.dart";
-
-void testFunction() {
-  const namedFoo = Foo.named3();
-  const namedFoo2 = Foo.named3();
-  const namedIdentical = identical(namedFoo, namedFoo2);
-  print("namedIdentical: $namedIdentical");
-}
diff --git a/runtime/observatory/tests/service/get_source_report_const_coverage_test.dart b/runtime/observatory/tests/service/get_source_report_const_coverage_test.dart
deleted file mode 100644
index 32cb035..0000000
--- a/runtime/observatory/tests/service/get_source_report_const_coverage_test.dart
+++ /dev/null
@@ -1,129 +0,0 @@
-// 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 'package:observatory/service_io.dart';
-import 'package:test/test.dart';
-import 'test_helper.dart';
-import 'service_test_common.dart';
-import 'dart:developer';
-
-import 'get_source_report_const_coverage_lib.dart' as lib;
-
-const String filename = "get_source_report_const_coverage_test";
-const Set<int> expectedLinesHit = {20, 22, 26};
-const Set<int> expectedLinesNotHit = {24};
-
-class Foo {
-  final int x;
-  // Expect this constructor to be coverage by coverage.
-  const Foo([int? x]) : this.x = x ?? 42;
-  // Expect this constructor to be coverage by coverage too.
-  const Foo.named1([int? x]) : this.x = x ?? 42;
-  // Expect this constructor to *NOT* be coverage by coverage.
-  const Foo.named2([int? x]) : this.x = x ?? 42;
-  // Expect this constructor to be coverage by coverage too (from lib).
-  const Foo.named3([int? x]) : this.x = x ?? 42;
-}
-
-void testFunction() {
-  const foo = Foo();
-  const foo2 = Foo();
-  const fooIdentical = identical(foo, foo2);
-  print(fooIdentical);
-
-  const namedFoo = Foo.named1();
-  const namedFoo2 = Foo.named1();
-  const namedIdentical = identical(namedFoo, namedFoo2);
-  print(fooIdentical);
-
-  debugger();
-
-  // That this is called after (or at all) is not relevent for the code
-  // coverage of constants.
-  lib.testFunction();
-
-  print("Done");
-}
-
-var tests = <IsolateTest>[
-  hasStoppedAtBreakpoint,
-  (Isolate isolate) async {
-    final stack = await isolate.getStack();
-
-    // Make sure we are in the right place.
-    expect(stack.type, equals('Stack'));
-    expect(stack['frames'].length, greaterThanOrEqualTo(1));
-    expect(stack['frames'][0].function.name, equals('testFunction'));
-
-    final List<Script> scripts = await isolate.getScripts();
-    Script? foundScript;
-    for (Script script in scripts) {
-      if (script.uri.contains(filename)) {
-        foundScript = script;
-        break;
-      }
-    }
-
-    Set<int> hits;
-    {
-      // Get report for everything; then collect for this library.
-      final Map<String, Object> params = {
-        'reports': ['Coverage'],
-      };
-      final coverage =
-          await isolate.invokeRpcNoUpgrade('getSourceReport', params);
-      hits = getHitsFor(coverage, filename);
-      await foundScript!.load();
-      final Set<int> lines = {};
-      for (int hit in hits) {
-        // We expect every hit to be translatable to line
-        // (i.e. tokenToLine to return non-null).
-        lines.add(foundScript.tokenToLine(hit)!);
-      }
-      print("Token position hits: $hits --- line hits: $lines");
-      expect(lines.intersection(expectedLinesHit), equals(expectedLinesHit));
-      expect(lines.intersection(expectedLinesNotHit), isEmpty);
-    }
-    {
-      // Now get report for the this file only.
-      final Map<String, Object> params = {
-        'reports': ['Coverage'],
-        'scriptId': foundScript.id!
-      };
-      final coverage =
-          await isolate.invokeRpcNoUpgrade('getSourceReport', params);
-      final Set<int> localHits = getHitsFor(coverage, filename);
-      expect(localHits.length, equals(hits.length));
-      expect(hits.toList()..sort(), equals(localHits.toList()..sort()));
-      print(localHits);
-    }
-  },
-];
-
-Set<int> getHitsFor(Map coverage, String uriContains) {
-  final List scripts = coverage["scripts"];
-  final Set<int> scriptIdsWanted = {};
-  for (int i = 0; i < scripts.length; i++) {
-    final Map script = scripts[i];
-    final String scriptUri = script["uri"];
-    if (scriptUri.contains(uriContains)) {
-      scriptIdsWanted.add(i);
-    }
-  }
-  final List ranges = coverage["ranges"];
-  final Set<int> hits = {};
-  for (int i = 0; i < ranges.length; i++) {
-    final Map range = ranges[i];
-    if (scriptIdsWanted.contains(range["scriptIndex"])) {
-      if (range["coverage"] != null) {
-        for (int hit in range["coverage"]["hits"]) {
-          hits.add(hit);
-        }
-      }
-    }
-  }
-  return hits;
-}
-
-main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction);
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index a1d5206..adea481 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -91,7 +91,7 @@
     final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
 
-    expect(numRanges, equals(11));
+    expect(numRanges, equals(10));
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
@@ -106,7 +106,7 @@
     };
     coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, 12);
+    expect(coverage['ranges'].length, 11);
     expect(allRangesCompiled(coverage), isTrue);
 
     // One function
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index c92c5e5..7a297eb 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -109,7 +109,6 @@
 get_allocation_samples_test: Skip, Timeout
 get_isolate_after_language_error_test: CompileTimeError
 get_object_rpc_test: SkipByDesign
-get_source_report_const_coverage_test: SkipByDesign
 get_source_report_test: Skip, Timeout
 get_source_report_with_mixin_test: Skip, Timeout
 get_stack_limit_rpc_test: Skip, Timeout
diff --git a/runtime/observatory_2/tests/service_2/get_source_report_const_coverage_lib.dart b/runtime/observatory_2/tests/service_2/get_source_report_const_coverage_lib.dart
deleted file mode 100644
index b0f078d..0000000
--- a/runtime/observatory_2/tests/service_2/get_source_report_const_coverage_lib.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// 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 "get_source_report_const_coverage_test.dart";
-
-void testFunction() {
-  const namedFoo = Foo.named3();
-  const namedFoo2 = Foo.named3();
-  const namedIdentical = identical(namedFoo, namedFoo2);
-  print("namedIdentical: $namedIdentical");
-}
diff --git a/runtime/observatory_2/tests/service_2/get_source_report_const_coverage_test.dart b/runtime/observatory_2/tests/service_2/get_source_report_const_coverage_test.dart
deleted file mode 100644
index 7c6af16..0000000
--- a/runtime/observatory_2/tests/service_2/get_source_report_const_coverage_test.dart
+++ /dev/null
@@ -1,129 +0,0 @@
-// 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 'package:observatory_2/service_io.dart';
-import 'package:test/test.dart';
-import 'test_helper.dart';
-import 'service_test_common.dart';
-import 'dart:developer';
-
-import 'get_source_report_const_coverage_lib.dart' as lib;
-
-const String filename = "get_source_report_const_coverage_test";
-const Set<int> expectedLinesHit = {20, 22, 26};
-const Set<int> expectedLinesNotHit = {24};
-
-class Foo {
-  final int x;
-  // Expect this constructor to be coverage by coverage.
-  const Foo([int x]) : this.x = x ?? 42;
-  // Expect this constructor to be coverage by coverage too.
-  const Foo.named1([int x]) : this.x = x ?? 42;
-  // Expect this constructor to *NOT* be coverage by coverage.
-  const Foo.named2([int x]) : this.x = x ?? 42;
-  // Expect this constructor to be coverage by coverage too (from lib).
-  const Foo.named3([int x]) : this.x = x ?? 42;
-}
-
-void testFunction() {
-  const foo = Foo();
-  const foo2 = Foo();
-  const fooIdentical = identical(foo, foo2);
-  print(fooIdentical);
-
-  const namedFoo = Foo.named1();
-  const namedFoo2 = Foo.named1();
-  const namedIdentical = identical(namedFoo, namedFoo2);
-  print(fooIdentical);
-
-  debugger();
-
-  // That this is called after (or at all) is not relevent for the code
-  // coverage of constants.
-  lib.testFunction();
-
-  print("Done");
-}
-
-var tests = <IsolateTest>[
-  hasStoppedAtBreakpoint,
-  (Isolate isolate) async {
-    final stack = await isolate.getStack();
-
-    // Make sure we are in the right place.
-    expect(stack.type, equals('Stack'));
-    expect(stack['frames'].length, greaterThanOrEqualTo(1));
-    expect(stack['frames'][0].function.name, equals('testFunction'));
-
-    final List<Script> scripts = await isolate.getScripts();
-    Script foundScript;
-    for (Script script in scripts) {
-      if (script.uri.contains(filename)) {
-        foundScript = script;
-        break;
-      }
-    }
-
-    Set<int> hits;
-    {
-      // Get report for everything; then collect for this library.
-      final Map<String, Object> params = {
-        'reports': ['Coverage'],
-      };
-      final coverage =
-          await isolate.invokeRpcNoUpgrade('getSourceReport', params);
-      hits = getHitsFor(coverage, filename);
-      await foundScript.load();
-      final Set<int> lines = {};
-      for (int hit in hits) {
-        // We expect every hit to be translatable to line
-        // (i.e. tokenToLine to return non-null).
-        lines.add(foundScript.tokenToLine(hit));
-      }
-      print("Token position hits: $hits --- line hits: $lines");
-      expect(lines.intersection(expectedLinesHit), equals(expectedLinesHit));
-      expect(lines.intersection(expectedLinesNotHit), isEmpty);
-    }
-    {
-      // Now get report for the this file only.
-      final Map<String, Object> params = {
-        'reports': ['Coverage'],
-        'scriptId': foundScript.id
-      };
-      final coverage =
-          await isolate.invokeRpcNoUpgrade('getSourceReport', params);
-      final Set<int> localHits = getHitsFor(coverage, filename);
-      expect(localHits.length, equals(hits.length));
-      expect(hits.toList()..sort(), equals(localHits.toList()..sort()));
-      print(localHits);
-    }
-  },
-];
-
-Set<int> getHitsFor(Map coverage, String uriContains) {
-  final List scripts = coverage["scripts"];
-  final Set<int> scriptIdsWanted = {};
-  for (int i = 0; i < scripts.length; i++) {
-    final Map script = scripts[i];
-    final String scriptUri = script["uri"];
-    if (scriptUri.contains(uriContains)) {
-      scriptIdsWanted.add(i);
-    }
-  }
-  final List ranges = coverage["ranges"];
-  final Set<int> hits = {};
-  for (int i = 0; i < ranges.length; i++) {
-    final Map range = ranges[i];
-    if (scriptIdsWanted.contains(range["scriptIndex"])) {
-      if (range["coverage"] != null) {
-        for (int hit in range["coverage"]["hits"]) {
-          hits.add(hit);
-        }
-      }
-    }
-  }
-  return hits;
-}
-
-main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction);
diff --git a/runtime/observatory_2/tests/service_2/get_source_report_test.dart b/runtime/observatory_2/tests/service_2/get_source_report_test.dart
index 78ea471..97606de 100644
--- a/runtime/observatory_2/tests/service_2/get_source_report_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_source_report_test.dart
@@ -91,7 +91,7 @@
     final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
 
-    expect(numRanges, equals(11));
+    expect(numRanges, equals(10));
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
@@ -106,7 +106,7 @@
     };
     coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, 12);
+    expect(coverage['ranges'].length, 11);
     expect(allRangesCompiled(coverage), isTrue);
 
     // One function
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index e8d4784..d8996be 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -109,7 +109,6 @@
 get_allocation_samples_test: Skip, Timeout
 get_isolate_after_language_error_test: CompileTimeError
 get_object_rpc_test: SkipByDesign
-get_source_report_const_coverage_test: SkipByDesign
 get_source_report_test: Skip, Timeout
 get_source_report_with_mixin_test: Skip, Timeout
 get_stack_limit_rpc_test: Skip, Timeout
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 83f434f..15d0a86 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -891,9 +891,7 @@
   Fragment implicit_type_checks;
   if (dart_function.NeedsTypeArgumentTypeChecks()) {
     B->BuildTypeArgumentTypeChecks(
-        dart_function.CanReceiveDynamicInvocation()
-            ? TypeChecksToBuild::kCheckAllTypeParameterBounds
-            : TypeChecksToBuild::kCheckCovariantTypeParameterBounds,
+        TypeChecksToBuild::kCheckCovariantTypeParameterBounds,
         &implicit_type_checks);
   }
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 1620bbf..105feaa 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -3749,10 +3749,9 @@
 
   const bool signature_contains_handles = marshaller.ContainsHandles();
 
-  ASSERT(function.CanReceiveDynamicInvocation());
-  BuildTypeArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
-                              &function_body);
-  BuildArgumentTypeChecks(&function_body, &function_body, &function_body);
+  // FFI trampolines are accessed via closures, so non-covariant argument types
+  // and type arguments are either statically checked by the type system or
+  // dynamically checked via dynamic closure call dispatchers.
 
   // Null check arguments before we go into the try catch, so that we don't
   // catch our own null errors.
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 6cc0183..e706302 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2807,33 +2807,6 @@
   return H.DartString(reader_.BufferAt(ReaderOffset()), size, Heap::kOld);
 }
 
-ExternalTypedDataPtr KernelReaderHelper::GetConstantCoverageFor(
-    intptr_t index) {
-  AlternativeReadingScope alt(&reader_);
-  SetOffset(GetOffsetForSourceInfo(index));
-  SkipBytes(ReadUInt());                         // skip uri.
-  SkipBytes(ReadUInt());                         // skip source.
-  const intptr_t line_start_count = ReadUInt();  // read number of line start
-                                                 // entries.
-  for (intptr_t i = 0; i < line_start_count; ++i) {
-    ReadUInt();
-  }
-
-  SkipBytes(ReadUInt());  // skip import uri.
-
-  intptr_t start_offset = ReaderOffset();
-
-  // Read past "constant coverage constructors".
-  const intptr_t constant_coverage_constructors = ReadUInt();
-  for (intptr_t i = 0; i < constant_coverage_constructors; ++i) {
-    ReadUInt();
-  }
-
-  intptr_t end_offset = ReaderOffset();
-
-  return reader_.ExternalDataFromTo(start_offset, end_offset);
-}
-
 intptr_t ActiveClass::MemberTypeParameterCount(Zone* zone) {
   ASSERT(member != NULL);
   if (member->IsFactory()) {
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 28877d0..d725cf7 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -1244,7 +1244,6 @@
   const String& GetSourceFor(intptr_t index);
   TypedDataPtr GetLineStartsFor(intptr_t index);
   String& SourceTableImportUriFor(intptr_t index, uint32_t binaryVersion);
-  ExternalTypedDataPtr GetConstantCoverageFor(intptr_t index);
 
   Zone* zone_;
   TranslationHelper& translation_helper_;
@@ -1283,8 +1282,6 @@
   friend class ObfuscationProhibitionsMetadataHelper;
   friend class LoadingUnitsMetadataHelper;
   friend bool NeedsDynamicInvocationForwarder(const Function& function);
-  friend ArrayPtr CollectConstConstructorCoverageFrom(
-      const Script& interesting_script);
 
  private:
   DISALLOW_COPY_AND_ASSIGN(KernelReaderHelper);
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index bc1808e..64fb780 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -40,7 +40,6 @@
 
 bool PrologueBuilder::HasEmptyPrologue(const Function& function) {
   return !function.HasOptionalParameters() && !function.IsGeneric() &&
-         !function.CanReceiveDynamicInvocation() &&
          !function.IsClosureFunction();
 }
 
@@ -53,26 +52,12 @@
 
   const bool load_optional_arguments = function_.HasOptionalParameters();
   const bool expect_type_args = function_.IsGeneric();
-  const bool check_shapes = function_.CanReceiveDynamicInvocation();
 
   Fragment prologue = Fragment(entry);
 
-  // We only check for bad argument shapes and throw NSM in functions that
-  // can receive dynamic invocation. Otherwise, the NSM block is never used
-  // and so there's no need to create it. The helper methods can only throw
-  // NSM in appropriate spots if one was created.
-  JoinEntryInstr* nsm = nullptr;
-  if (check_shapes) {
-    nsm = BuildThrowNoSuchMethod();
-    Fragment f = BuildTypeArgumentsLengthCheck(nsm, expect_type_args);
-    if (link) prologue += f;
-  }
   if (load_optional_arguments) {
-    Fragment f = BuildOptionalParameterHandling(
-        nsm, parsed_function_->expression_temp_var());
-    if (link) prologue += f;
-  } else if (check_shapes) {
-    Fragment f = BuildFixedParameterLengthChecks(nsm);
+    Fragment f =
+        BuildOptionalParameterHandling(parsed_function_->expression_temp_var());
     if (link) prologue += f;
   }
   if (function_.IsClosureFunction()) {
@@ -80,7 +65,7 @@
     if (!compiling_for_osr_) prologue += f;
   }
   if (expect_type_args) {
-    Fragment f = BuildTypeArgumentsHandling(nsm);
+    Fragment f = BuildTypeArgumentsHandling();
     if (link) prologue += f;
   }
 
@@ -103,57 +88,8 @@
   }
 }
 
-Fragment PrologueBuilder::BuildTypeArgumentsLengthCheck(JoinEntryInstr* nsm,
-                                                        bool expect_type_args) {
-  ASSERT(nsm != nullptr);
-  Fragment check_type_args;
-  JoinEntryInstr* done = BuildJoinEntry();
-
-  // Type args are always optional, so length can always be zero.
-  // If expect_type_args, a non-zero length must match the declaration length.
-  TargetEntryInstr *then, *fail;
-  check_type_args += LoadArgDescriptor();
-  check_type_args += LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
-  if (expect_type_args) {
-    JoinEntryInstr* join2 = BuildJoinEntry();
-
-    LocalVariable* len = MakeTemporary();
-
-    TargetEntryInstr* otherwise;
-    check_type_args += LoadLocal(len);
-    check_type_args += IntConstant(0);
-    check_type_args += BranchIfEqual(&then, &otherwise);
-
-    TargetEntryInstr* then2;
-    Fragment check_len(otherwise);
-    check_len += LoadLocal(len);
-    check_len += IntConstant(function_.NumTypeParameters());
-    check_len += BranchIfEqual(&then2, &fail);
-
-    Fragment(then) + Goto(join2);
-    Fragment(then2) + Goto(join2);
-
-    Fragment(join2) + Drop() + Goto(done);
-    Fragment(fail) + Goto(nsm);
-  } else {
-    check_type_args += IntConstant(0);
-    check_type_args += BranchIfEqual(&then, &fail);
-    Fragment(then) + Goto(done);
-    Fragment(fail) + Goto(nsm);
-  }
-
-  return Fragment(check_type_args.entry, done);
-}
-
 Fragment PrologueBuilder::BuildOptionalParameterHandling(
-    JoinEntryInstr* nsm,
     LocalVariable* temp_var) {
-  // We only need to check the shape of the arguments (correct parameter count
-  // and correct names/provided required arguments) when the function can be
-  // invoked dynamically. The caller only provides a non-nullptr nsm block if
-  // dynamic invocation is possible.
-  const bool check_arguments_shape = nsm != nullptr;
-
   Fragment copy_args_prologue;
   const int num_fixed_params = function_.num_fixed_parameters();
   const int num_opt_pos_params = function_.NumOptionalPositionalParameters();
@@ -168,39 +104,15 @@
   // Check that min_num_pos_args <= num_pos_args <= max_num_pos_args,
   // where num_pos_args is the number of positional arguments passed in.
   const int min_num_pos_args = num_fixed_params;
-  const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
 
   copy_args_prologue += LoadArgDescriptor();
   copy_args_prologue +=
       LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
-  LocalVariable* positional_count_var = MakeTemporary();
 
   copy_args_prologue += LoadArgDescriptor();
   copy_args_prologue += LoadNativeField(Slot::ArgumentsDescriptor_count());
   LocalVariable* count_var = MakeTemporary();
 
-  if (check_arguments_shape) {
-    // Ensure the caller provided at least [min_num_pos_args] arguments.
-    copy_args_prologue += IntConstant(min_num_pos_args);
-    copy_args_prologue += LoadLocal(positional_count_var);
-    copy_args_prologue += SmiRelationalOp(Token::kLTE);
-    TargetEntryInstr *success1, *fail1;
-    copy_args_prologue += BranchIfTrue(&success1, &fail1);
-    copy_args_prologue = Fragment(copy_args_prologue.entry, success1);
-
-    // Ensure the caller provided at most [max_num_pos_args] arguments.
-    copy_args_prologue += LoadLocal(positional_count_var);
-    copy_args_prologue += IntConstant(max_num_pos_args);
-    copy_args_prologue += SmiRelationalOp(Token::kLTE);
-    TargetEntryInstr *success2, *fail2;
-    copy_args_prologue += BranchIfTrue(&success2, &fail2);
-    copy_args_prologue = Fragment(copy_args_prologue.entry, success2);
-
-    // Link up the argument check failing code.
-    Fragment(fail1) + Goto(nsm);
-    Fragment(fail2) + Goto(nsm);
-  }
-
   copy_args_prologue += LoadLocal(count_var);
   copy_args_prologue += IntConstant(min_num_pos_args);
   copy_args_prologue += SmiBinaryOp(Token::kSUB, /* truncate= */ true);
@@ -290,19 +202,6 @@
     }
     copy_args_prologue += Goto(next_missing /* join good/not_good flows */);
     copy_args_prologue.current = next_missing;
-
-    if (check_arguments_shape) {
-      // Check for unprocessed arguments and throw NSM if there are any.
-      TargetEntryInstr *done, *unknown_named_arg_passed;
-      copy_args_prologue += LoadLocal(positional_count_var);
-      copy_args_prologue += LoadLocal(count_var);
-      copy_args_prologue += BranchIfEqual(&done, &unknown_named_arg_passed);
-      copy_args_prologue.current = done;
-      {
-        Fragment f(unknown_named_arg_passed);
-        f += Goto(nsm);
-      }
-    }
   } else {
     ASSERT(num_opt_named_params > 0);
 
@@ -375,10 +274,7 @@
       const bool required = check_required_params &&
                             function_.IsRequiredAt(opt_param_position[i]);
 
-      // If this function cannot be invoked dynamically and this is a required
-      // named argument, then we can just add this fragment directly without
-      // checking the name to ensure it was provided.
-      if (required && !check_arguments_shape) {
+      if (required) {
         copy_args_prologue += good;
       } else {
         // name = arg_desc[names_offset + arg_desc_name_index + nameOffset]
@@ -410,42 +306,22 @@
         good.Prepend(supplied);
         good += Goto(join);
 
-        // We had no match. If the param is required, throw a NoSuchMethod
-        // error. Otherwise just load the default constant.
+        // We had no match, so load the default constant.
         Fragment not_good(missing);
-        if (required) {
-          ASSERT(nsm != nullptr);
-          not_good += Goto(nsm);
-        } else {
-          not_good += Constant(DefaultParameterValueAt(opt_param_position[i] -
-                                                       num_fixed_params));
+        not_good += Constant(
+            DefaultParameterValueAt(opt_param_position[i] - num_fixed_params));
 
-          // Copy down with default value.
-          not_good += StoreLocalRaw(TokenPosition::kNoSource,
-                                    ParameterVariable(opt_param_position[i]));
-          not_good += Drop();
-          not_good += Goto(join);
-        }
+        // Copy down with default value.
+        not_good += StoreLocalRaw(TokenPosition::kNoSource,
+                                  ParameterVariable(opt_param_position[i]));
+        not_good += Drop();
+        not_good += Goto(join);
 
         copy_args_prologue.current = join;
       }
 
       copy_args_prologue += Drop();  // tuple_diff
     }
-
-    if (check_arguments_shape) {
-      // Check for unprocessed arguments and throw NSM if there are any.
-      TargetEntryInstr *done, *unknown_named_arg_passed;
-      copy_args_prologue += LoadLocal(optional_count_var);
-      copy_args_prologue += LoadLocal(optional_count_vars_processed);
-      copy_args_prologue += BranchIfEqual(&done, &unknown_named_arg_passed);
-      copy_args_prologue.current = done;
-
-      {
-        Fragment f(unknown_named_arg_passed);
-        f += Goto(nsm);
-      }
-    }
   }
 
   copy_args_prologue += Drop();  // optional_count_var
@@ -455,32 +331,6 @@
   return copy_args_prologue;
 }
 
-Fragment PrologueBuilder::BuildFixedParameterLengthChecks(JoinEntryInstr* nsm) {
-  Fragment check_args;
-  JoinEntryInstr* done = BuildJoinEntry();
-
-  check_args += LoadArgDescriptor();
-  check_args += LoadNativeField(Slot::ArgumentsDescriptor_count());
-  LocalVariable* count = MakeTemporary();
-
-  TargetEntryInstr *then, *fail;
-  check_args += LoadLocal(count);
-  check_args += IntConstant(function_.num_fixed_parameters());
-  check_args += BranchIfEqual(&then, &fail);
-
-  TargetEntryInstr *then2, *fail2;
-  Fragment check_len(then);
-  check_len += LoadArgDescriptor();
-  check_len += LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
-  check_len += BranchIfEqual(&then2, &fail2);
-
-  Fragment(fail) + Goto(nsm);
-  Fragment(fail2) + Goto(nsm);
-  Fragment(then2) + Goto(done);
-
-  return Fragment(check_args.entry, done);
-}
-
 Fragment PrologueBuilder::BuildClosureContextHandling() {
   LocalVariable* closure_parameter = parsed_function_->ParameterVariable(0);
   LocalVariable* context = parsed_function_->current_context_var();
@@ -495,13 +345,7 @@
   return populate_context;
 }
 
-Fragment PrologueBuilder::BuildTypeArgumentsHandling(JoinEntryInstr* nsm) {
-  // We only need to check the shape of the arguments (correct parameter count
-  // and correct names/provided required arguments) when the function can be
-  // invoked dynamically. The caller only provides a non-nullptr nsm block if
-  // dynamic invocation is possible.
-  const bool check_argument_shapes = nsm != nullptr;
-
+Fragment PrologueBuilder::BuildTypeArgumentsHandling() {
   LocalVariable* type_args_var = parsed_function_->RawTypeArgumentsVariable();
   ASSERT(type_args_var != nullptr);
 
@@ -539,15 +383,9 @@
         StoreLocal(TokenPosition::kNoSource, type_args_var);
     use_delayed_type_args += Drop();
 
-    handling += TestDelayedTypeArgs(
-        closure,
-        /*present=*/
-        // No need to check the type arguments length if this function cannot
-        // be invoked dynamically, and thus we are not checking argument shapes.
-        check_argument_shapes
-            ? TestTypeArgsLen(use_delayed_type_args, Goto(nsm), 0)
-            : use_delayed_type_args,
-        /*absent=*/Fragment());
+    handling += TestDelayedTypeArgs(closure,
+                                    /*present=*/use_delayed_type_args,
+                                    /*absent=*/Fragment());
   }
 
   return handling;
diff --git a/runtime/vm/compiler/frontend/prologue_builder.h b/runtime/vm/compiler/frontend/prologue_builder.h
index 58923f9..c8d629d 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.h
+++ b/runtime/vm/compiler/frontend/prologue_builder.h
@@ -49,8 +49,7 @@
   BlockEntryInstr* BuildPrologue(BlockEntryInstr* entry,
                                  PrologueInfo* prologue_info);
 
-  Fragment BuildOptionalParameterHandling(JoinEntryInstr* nsm,
-                                          LocalVariable* temp_var);
+  Fragment BuildOptionalParameterHandling(LocalVariable* temp_var);
 
   static bool HasEmptyPrologue(const Function& function);
   static bool PrologueSkippableOnUncheckedEntry(const Function& function);
@@ -58,14 +57,9 @@
   intptr_t last_used_block_id() const { return last_used_block_id_; }
 
  private:
-  Fragment BuildTypeArgumentsLengthCheck(JoinEntryInstr* nsm,
-                                         bool expect_type_args);
-
-  Fragment BuildFixedParameterLengthChecks(JoinEntryInstr* nsm);
-
   Fragment BuildClosureContextHandling();
 
-  Fragment BuildTypeArgumentsHandling(JoinEntryInstr* nsm);
+  Fragment BuildTypeArgumentsHandling();
 
   LocalVariable* ParameterVariable(intptr_t index) {
     return parsed_function_->RawParameterVariable(index);
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 8ca008e..ea6b457 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -213,12 +213,6 @@
         // arguments and dynamic targets do their own covariant checking.
         // Thus, implicit closure functions perform no checking internally.
         type_check_mode = kTypeCheckForImplicitClosureFunction;
-      } else if (function.CanReceiveDynamicInvocation()) {
-        // If the current function can be the direct target of a dynamic
-        // invocation, that is, dynamic calls do not go through a dynamic
-        // invocation forwarder or dynamic closure call dispatcher, then we must
-        // check non-covariant parameters as well as covariant ones.
-        type_check_mode = kTypeCheckAllParameters;
       }
 
       // Continue reading FunctionNode:
@@ -284,7 +278,7 @@
         }
         scope_->InsertParameterAt(pos++, result_->setter_value);
 
-        if (is_method && !function.CanReceiveDynamicInvocation()) {
+        if (is_method) {
           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/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index 1c7f122..9931e91 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -130,8 +130,6 @@
     //
     // Normally we have to check the parameter type.
     ASSERT(function.NeedsArgumentTypeChecks());
-    // Dynamic call sites will go to dyn:set:* instead.
-    ASSERT(!function.CanReceiveDynamicInvocation());
     // Covariant parameter types have to be checked, which we don't support.
     if (field.is_covariant() || field.is_generic_covariant_impl()) return false;
 
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 156a5c4..e4dae18 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -501,7 +501,7 @@
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
-static constexpr dart::compiler::target::word Script_InstanceSize = 64;
+static constexpr dart::compiler::target::word Script_InstanceSize = 56;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SignatureData_InstanceSize = 12;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
@@ -1022,7 +1022,7 @@
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
-static constexpr dart::compiler::target::word Script_InstanceSize = 104;
+static constexpr dart::compiler::target::word Script_InstanceSize = 96;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SignatureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
@@ -1534,7 +1534,7 @@
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
-static constexpr dart::compiler::target::word Script_InstanceSize = 64;
+static constexpr dart::compiler::target::word Script_InstanceSize = 56;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SignatureData_InstanceSize = 12;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
@@ -2056,7 +2056,7 @@
 static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
 static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
 static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
-static constexpr dart::compiler::target::word Script_InstanceSize = 104;
+static constexpr dart::compiler::target::word Script_InstanceSize = 96;
 static constexpr dart::compiler::target::word SendPort_InstanceSize = 24;
 static constexpr dart::compiler::target::word SignatureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word SingleTargetCache_InstanceSize =
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index d98eaa1..8761060 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -273,12 +273,10 @@
                               arguments_descriptor);
   }
 
-  if (!callable_function.CanReceiveDynamicInvocation()) {
-    const auto& result = Object::Handle(
-        zone, callable_function.DoArgumentTypesMatch(arguments, args_desc));
-    if (result.IsError()) {
-      Exceptions::PropagateError(Error::Cast(result));
-    }
+  const auto& result = Object::Handle(
+      zone, callable_function.DoArgumentTypesMatch(arguments, args_desc));
+  if (result.IsError()) {
+    Exceptions::PropagateError(Error::Cast(result));
   }
 
   return InvokeFunction(callable_function, arguments, arguments_descriptor);
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 07932e6..7c53e72 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -347,36 +347,6 @@
   script.set_debug_positions(array_object);
 }
 
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-ArrayPtr CollectConstConstructorCoverageFrom(const Script& interesting_script) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  interesting_script.LookupSourceAndLineStarts(zone);
-  TranslationHelper helper(thread);
-  helper.InitFromScript(interesting_script);
-
-  ExternalTypedData& data =
-      ExternalTypedData::Handle(zone, interesting_script.constant_coverage());
-
-  KernelReaderHelper kernel_reader(zone, &helper, interesting_script, data, 0);
-
-  // Read "constant coverage constructors".
-  const intptr_t constant_coverage_constructors = kernel_reader.ReadUInt();
-  const Array& constructors =
-      Array::Handle(Array::New(constant_coverage_constructors));
-  for (intptr_t i = 0; i < constant_coverage_constructors; ++i) {
-    NameIndex kernel_name = kernel_reader.ReadCanonicalNameReference();
-    Class& klass = Class::ZoneHandle(
-        zone,
-        helper.LookupClassByKernelClass(helper.EnclosingName(kernel_name)));
-    const Function& target = Function::ZoneHandle(
-        zone, helper.LookupConstructorByKernelConstructor(klass, kernel_name));
-    constructors.SetAt(i, target);
-  }
-  return constructors.raw();
-}
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-
 ObjectPtr EvaluateStaticConstFieldInitializer(const Field& field) {
   ASSERT(field.is_static() && field.is_const());
 
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 4b55de9..9b0d8de 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -195,10 +195,6 @@
 
 void CollectTokenPositionsFor(const Script& script);
 
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-ArrayPtr CollectConstConstructorCoverageFrom(const Script& interesting_script);
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-
 ObjectPtr EvaluateStaticConstFieldInitializer(const Field& field);
 ObjectPtr EvaluateMetadata(const Field& metadata_field,
                            bool is_annotations_offset);
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index a8cafe4..e37f325 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -2099,10 +2099,6 @@
   const String& uri_string = helper_.SourceTableUriFor(index);
   const String& import_uri_string =
       helper_.SourceTableImportUriFor(index, program_->binary_version());
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-  ExternalTypedData& constant_coverage =
-      ExternalTypedData::Handle(Z, helper_.GetConstantCoverageFor(index));
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
   String& sources = String::Handle(Z);
   TypedData& line_starts = TypedData::Handle(Z);
@@ -2148,9 +2144,6 @@
   script.set_kernel_script_index(index);
   script.set_kernel_program_info(kernel_program_info_);
   script.set_line_starts(line_starts);
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-  script.set_constant_coverage(constant_coverage);
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   script.set_debug_positions(Array::null_array());
   return script.raw();
 }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bae9d93f..160aa54 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -4215,12 +4215,10 @@
   }
   // This is a static function, so we pass an empty instantiator tav.
   ASSERT(function.is_static());
-  if (!function.CanReceiveDynamicInvocation()) {
-    ObjectPtr type_error = function.DoArgumentTypesMatch(
-        args, args_descriptor, Object::empty_type_arguments());
-    if (type_error != Error::null()) {
-      return type_error;
-    }
+  ObjectPtr type_error = function.DoArgumentTypesMatch(
+      args, args_descriptor, Object::empty_type_arguments());
+  if (type_error != Error::null()) {
+    return type_error;
   }
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
@@ -9648,8 +9646,7 @@
   }
   // The prologue of those functions need to examine the arg descriptor for
   // various purposes.
-  return IsGeneric() || HasOptionalParameters() ||
-         CanReceiveDynamicInvocation();
+  return IsGeneric() || HasOptionalParameters();
 }
 
 bool Function::MayHaveUncheckedEntryPoint() const {
@@ -11162,16 +11159,6 @@
   StorePointer(&raw_ptr()->line_starts_, value.raw());
 }
 
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-void Script::set_constant_coverage(const ExternalTypedData& value) const {
-  StorePointer(&raw_ptr()->constant_coverage_, value.raw());
-}
-
-ExternalTypedDataPtr Script::constant_coverage() const {
-  return raw_ptr()->constant_coverage_;
-}
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-
 void Script::set_debug_positions(const Array& value) const {
   StorePointer(&raw_ptr()->debug_positions_, value.raw());
 }
@@ -12718,12 +12705,10 @@
     return DartEntry::InvokeNoSuchMethod(thread, receiver, target_name, args,
                                          args_descriptor_array);
   }
-  if (!function.CanReceiveDynamicInvocation()) {
-    ObjectPtr type_error = function.DoArgumentTypesMatch(
-        args, args_descriptor, instantiator_type_args);
-    if (type_error != Error::null()) {
-      return type_error;
-    }
+  ObjectPtr type_error = function.DoArgumentTypesMatch(args, args_descriptor,
+                                                       instantiator_type_args);
+  if (type_error != Error::null()) {
+    return type_error;
   }
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
@@ -12920,12 +12905,10 @@
   }
   // This is a static function, so we pass an empty instantiator tav.
   ASSERT(function.is_static());
-  if (!function.CanReceiveDynamicInvocation()) {
-    ObjectPtr type_error = function.DoArgumentTypesMatch(
-        args, args_descriptor, Object::empty_type_arguments());
-    if (type_error != Error::null()) {
-      return type_error;
-    }
+  ObjectPtr type_error = function.DoArgumentTypesMatch(
+      args, args_descriptor, Object::empty_type_arguments());
+  if (type_error != Error::null()) {
+    return type_error;
   }
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
@@ -14896,6 +14879,24 @@
 }
 #endif
 
+void ICData::SetTargetAtPos(const Array& data,
+                            intptr_t data_pos,
+                            intptr_t num_args_tested,
+                            const Function& target) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  // JIT
+  data.SetAt(data_pos + TargetIndexFor(num_args_tested), target);
+#else
+  // AOT
+  ASSERT(target.HasCode());
+  const Code& code = Code::Handle(target.CurrentCode());
+  const Smi& entry_point =
+      Smi::Handle(Smi::FromAlignedAddress(code.EntryPoint()));
+  data.SetAt(data_pos + CodeIndexFor(num_args_tested), code);
+  data.SetAt(data_pos + EntryPointIndexFor(num_args_tested), entry_point);
+#endif
+}
+
 const char* ICData::ToCString() const {
   Zone* zone = Thread::Current()->zone();
   const String& name = String::Handle(zone, target_name());
@@ -15347,24 +15348,15 @@
     data_pos = 0;
   }
   data.SetAt(data_pos, Smi::Handle(Smi::New(receiver_class_id)));
+  SetTargetAtPos(data, data_pos, kNumArgsTested, target);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  // JIT
-  data.SetAt(data_pos + TargetIndexFor(kNumArgsTested), target);
   data.SetAt(data_pos + CountIndexFor(kNumArgsTested),
              Smi::Handle(Smi::New(count)));
   if (is_tracking_exactness()) {
     data.SetAt(data_pos + ExactnessIndexFor(kNumArgsTested),
                Smi::Handle(Smi::New(exactness.Encode())));
   }
-#else
-  // AOT
-  ASSERT(target.HasCode());
-  const Code& code = Code::Handle(target.CurrentCode());
-  const Smi& entry_point =
-      Smi::Handle(Smi::FromAlignedAddress(code.EntryPoint()));
-  data.SetAt(data_pos + CodeIndexFor(kNumArgsTested), code);
-  data.SetAt(data_pos + EntryPointIndexFor(kNumArgsTested), entry_point);
 #endif
 
   // Multithreaded access to ICData requires setting of array to be the last
@@ -15839,9 +15831,13 @@
     cid = Smi::New((*cids)[i]);
     array.SetAt(i, cid);
   }
+
+  SetTargetAtPos(array, 0, num_args_tested, target);
+#if !defined(DART_PRECOMPILED_RUNTIME)
   array.SetAt(CountIndexFor(num_args_tested), Object::smi_zero());
-  array.SetAt(TargetIndexFor(num_args_tested), target);
+#endif
   WriteSentinel(array, entry_len);
+
   result.set_entries(array);
 
   return result.raw();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 584e180..3c70ead 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2258,6 +2258,11 @@
   void SetNumArgsTested(intptr_t value) const;
   void SetReceiversStaticType(const AbstractType& type) const;
 
+  static void SetTargetAtPos(const Array& data,
+                             intptr_t data_pos,
+                             intptr_t num_args_tested,
+                             const Function& target);
+
   // This bit is set when a call site becomes megamorphic and starts using a
   // MegamorphicCache instead of ICData. It means that the entries in the
   // ICData are incomplete and the MegamorphicCache needs to also be consulted
@@ -2849,10 +2854,6 @@
     return (kind() == FunctionLayout::kConstructor) && is_static();
   }
 
-  // Whether this function can receive an invocation where the number and names
-  // of arguments have not been checked.
-  bool CanReceiveDynamicInvocation() const { return IsFfiTrampoline(); }
-
   bool HasThisParameter() const {
     return IsDynamicFunction(/*allow_abstract=*/true) ||
            IsGenerativeConstructor() || (IsFieldInitializer() && !is_static());
@@ -4501,12 +4502,6 @@
 
   TypedDataPtr line_starts() const;
 
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-  ExternalTypedDataPtr constant_coverage() const;
-
-  void set_constant_coverage(const ExternalTypedData& value) const;
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-
   void set_line_starts(const TypedData& value) const;
 
   void set_debug_positions(const Array& value) const;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index bbfc8f7..6ef0636 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1253,9 +1253,6 @@
   StringPtr resolved_url_;
   ArrayPtr compile_time_constants_;
   TypedDataPtr line_starts_;
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-  ExternalTypedDataPtr constant_coverage_;
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   ArrayPtr debug_positions_;
   KernelProgramInfoPtr kernel_program_info_;
   StringPtr source_;
@@ -1287,17 +1284,8 @@
                kLazyLookupSourceAndLineStartsSize>;
   uint8_t flags_;
 
+  intptr_t kernel_script_index_;
   int64_t load_timestamp_;
-  int32_t kernel_script_index_;
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) &&                 \
-    defined(ARCH_IS_32_BIT)
-  // MSVC aligns sizeof(ScriptLayout) by 8 on 32-bit because rgw structure
-  // contains int64_t member, while clang does not.
-  // This member is thus needed to ensure consistent struct size across all
-  // compilers.
-  int32_t padding_;
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) &&          \
-        // defined(ARCH_IS_32_BIT)
 };
 
 class LibraryLayout : public ObjectLayout {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index f241c0c..8ef9463 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1596,6 +1596,9 @@
   void DoMegamorphicMiss(const MegamorphicCache& data,
                          const Function& target_function);
 
+  ICDataPtr NewICData();
+  ICDataPtr NewICDataWithTarget(intptr_t cid, const Function& target);
+
   Isolate* isolate_;
   Thread* thread_;
   Zone* zone_;
@@ -1613,16 +1616,11 @@
 
 void SwitchableCallHandler::DoUnlinkedCall(const UnlinkedCall& unlinked,
                                            const Function& target_function) {
-  const String& name = String::Handle(zone_, unlinked.target_name());
-  const Array& descriptor =
-      Array::Handle(zone_, unlinked.arguments_descriptor());
-  const ICData& ic_data =
-      ICData::Handle(zone_, ICData::New(caller_function_, name, descriptor,
-                                        DeoptId::kNone, 1, /* args_tested */
-                                        ICData::kInstance));
-  if (!target_function.IsNull()) {
-    ic_data.AddReceiverCheck(receiver_.GetClassId(), target_function);
-  }
+  const auto& ic_data = ICData::Handle(
+      zone_,
+      target_function.IsNull()
+          ? NewICData()
+          : NewICDataWithTarget(receiver_.GetClassId(), target_function));
 
   Object& object = Object::Handle(zone_, ic_data.raw());
   Code& code = Code::Handle(zone_, StubCode::ICCallThroughCode().raw());
@@ -1746,14 +1744,10 @@
       zone_,
       Resolve(thread_, zone_, old_receiver_class, name_, args_descriptor_));
 
-  const ICData& ic_data = ICData::Handle(
-      zone_, ICData::New(caller_function_, name_, args_descriptor_,
-                         DeoptId::kNone, 1, /* args_tested */
-                         ICData::kInstance));
-  // Add the first target.
-  if (!old_target.IsNull()) {
-    ic_data.AddReceiverCheck(old_expected_cid, old_target);
-  }
+  const auto& ic_data = ICData::Handle(
+      zone_, old_target.IsNull()
+                 ? NewICData()
+                 : NewICDataWithTarget(old_expected_cid, old_target));
 
   if (is_monomorphic_hit) {
     // The site just have been updated to monomorphic state with same
@@ -1794,6 +1788,7 @@
   arguments_.SetArgAt(0, stub);
   arguments_.SetReturn(ic_data);
 #else   // JIT
+
   const ICData& ic_data = ICData::Handle(
       zone_,
       FindICDataForInstanceCall(zone_, caller_code_, caller_frame_->pc()));
@@ -1836,13 +1831,11 @@
       Function::Handle(zone_, Function::RawCast(old_target_code.owner()));
 
   // We lost the original ICData when we patched to the monomorphic case.
-  const ICData& ic_data = ICData::Handle(
-      zone_, ICData::New(caller_function_, name_, args_descriptor_,
-                         DeoptId::kNone, 1, /* args_tested */
-                         ICData::kInstance));
-  if (!target_function.IsNull()) {
-    ic_data.AddReceiverCheck(receiver_.GetClassId(), target_function);
-  }
+  const auto& ic_data = ICData::Handle(
+      zone_,
+      target_function.IsNull()
+          ? NewICData()
+          : NewICDataWithTarget(receiver_.GetClassId(), target_function));
 
   intptr_t lower = data.lower_limit();
   intptr_t upper = data.upper_limit();
@@ -1957,6 +1950,20 @@
   arguments_.SetReturn(data);
 }
 
+ICDataPtr SwitchableCallHandler::NewICData() {
+  return ICData::New(caller_function_, name_, args_descriptor_, DeoptId::kNone,
+                     /*num_args_tested=*/1, ICData::kInstance);
+}
+
+ICDataPtr SwitchableCallHandler::NewICDataWithTarget(intptr_t cid,
+                                                     const Function& target) {
+  GrowableArray<intptr_t> cids(1);
+  cids.Add(cid);
+  return ICData::NewWithCheck(caller_function_, name_, args_descriptor_,
+                              DeoptId::kNone, /*num_args_tested=*/1,
+                              ICData::kInstance, &cids, target);
+}
+
 FunctionPtr SwitchableCallHandler::ResolveTargetFunction(const Object& data) {
   switch (data.GetClassId()) {
     case kUnlinkedCallCid: {
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 3f074ff..84f5495 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -565,19 +565,6 @@
 
     // Visit all closures for this isolate.
     VisitClosures(&ranges);
-
-    // Output constant coverage if coverage is requested.
-    if (IsReportRequested(kCoverage)) {
-      // Find all scripts. We need to go though all scripts because a script
-      // (even one we don't want) can add coverage to another library (i.e.
-      // potentially one we want).
-      DirectChainedHashMap<ScriptTableTrait> local_script_table;
-      GrowableArray<ScriptTableEntry*> local_script_table_entries;
-      CollectAllScripts(&local_script_table, &local_script_table_entries);
-      CollectConstConstructorCoverageFromScripts(&local_script_table_entries,
-                                                 &ranges);
-      CleanupCollectedScripts(&local_script_table, &local_script_table_entries);
-    }
   }
 
   // Print the script table.
@@ -585,102 +572,5 @@
   PrintScriptTable(&scripts);
 }
 
-void SourceReport::CollectAllScripts(
-    DirectChainedHashMap<ScriptTableTrait>* local_script_table,
-    GrowableArray<ScriptTableEntry*>* local_script_table_entries) {
-  ScriptTableEntry wrapper;
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-      zone(), thread()->isolate()->object_store()->libraries());
-  Library& lib = Library::Handle(zone());
-  Script& scriptRef = Script::Handle(zone());
-  for (int i = 0; i < libs.Length(); i++) {
-    lib ^= libs.At(i);
-    const Array& scripts = Array::Handle(zone(), lib.LoadedScripts());
-    for (intptr_t j = 0; j < scripts.Length(); j++) {
-      scriptRef ^= scripts.At(j);
-      const String& url = String::Handle(zone(), scriptRef.url());
-      wrapper.key = &url;
-      wrapper.script = &Script::Handle(zone(), scriptRef.raw());
-      ScriptTableEntry* pair = local_script_table->LookupValue(&wrapper);
-      if (pair != NULL) {
-        // Existing one.
-        continue;
-      }
-      // New one. Insert.
-      ScriptTableEntry* tmp = new ScriptTableEntry();
-      tmp->key = &url;
-      tmp->index = next_script_index_++;
-      tmp->script = wrapper.script;
-      local_script_table_entries->Add(tmp);
-      local_script_table->Insert(tmp);
-    }
-  }
-}
-
-void SourceReport::CleanupCollectedScripts(
-    DirectChainedHashMap<ScriptTableTrait>* local_script_table,
-    GrowableArray<ScriptTableEntry*>* local_script_table_entries) {
-  for (intptr_t i = 0; i < local_script_table_entries->length(); i++) {
-    delete local_script_table_entries->operator[](i);
-    local_script_table_entries->operator[](i) = NULL;
-  }
-  local_script_table_entries->Clear();
-  local_script_table->Clear();
-}
-
-void SourceReport::CollectConstConstructorCoverageFromScripts(
-    GrowableArray<ScriptTableEntry*>* local_script_table_entries,
-    JSONArray* ranges) {
-  // Now output the wanted constant coverage.
-  for (intptr_t i = 0; i < local_script_table_entries->length(); i++) {
-    const Script* script = local_script_table_entries->At(i)->script;
-    bool script_ok = true;
-    if (script_ != NULL && !script_->IsNull()) {
-      if (script->raw() != script_->raw()) {
-        // This is the wrong script.
-        script_ok = false;
-      }
-    }
-
-    // Whether we want *this* script or not we need to look at the constant
-    // constructor coverage. Any of those could be in a script we *do* want.
-    {
-      Script& scriptRef = Script::Handle(zone());
-      const Array& constructors =
-          Array::Handle(kernel::CollectConstConstructorCoverageFrom(*script));
-      intptr_t constructors_count = constructors.Length();
-      Function& constructor = Function::Handle(zone());
-      Code& code = Code::Handle(zone());
-      for (intptr_t i = 0; i < constructors_count; i++) {
-        constructor ^= constructors.At(i);
-        // Check if we want coverage for this constructor.
-        if (ShouldSkipFunction(constructor)) {
-          continue;
-        }
-        scriptRef ^= constructor.script();
-        code ^= constructor.unoptimized_code();
-        const TokenPosition begin_pos = constructor.token_pos();
-        const TokenPosition end_pos = constructor.end_token_pos();
-        JSONObject range(ranges);
-        range.AddProperty("scriptIndex", GetScriptIndex(scriptRef));
-        range.AddProperty("compiled",
-                          !code.IsNull());  // Does this make a difference?
-        range.AddProperty("startPos", begin_pos);
-        range.AddProperty("endPos", end_pos);
-
-        JSONObject cov(&range, "coverage");
-        {
-          JSONArray hits(&cov, "hits");
-          hits.AddValue(begin_pos);
-        }
-        {
-          JSONArray misses(&cov, "misses");
-          // No misses
-        }
-      }
-    }
-  }
-}
-
 }  // namespace dart
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h
index 4ec20c9..0a3ddb1 100644
--- a/runtime/vm/source_report.h
+++ b/runtime/vm/source_report.h
@@ -112,18 +112,6 @@
     }
   };
 
-  void CollectAllScripts(
-      DirectChainedHashMap<ScriptTableTrait>* local_script_table,
-      GrowableArray<ScriptTableEntry*>* local_script_table_entries);
-
-  void CleanupCollectedScripts(
-      DirectChainedHashMap<ScriptTableTrait>* local_script_table,
-      GrowableArray<ScriptTableEntry*>* local_script_table_entries);
-
-  void CollectConstConstructorCoverageFromScripts(
-      GrowableArray<ScriptTableEntry*>* local_script_table_entries,
-      JSONArray* ranges);
-
   intptr_t report_set_;
   CompileMode compile_mode_;
   Thread* thread_;
diff --git a/tests/ffi/function_test.dart b/tests/ffi/function_test.dart
index 376711b..bff456e 100644
--- a/tests/ffi/function_test.dart
+++ b/tests/ffi/function_test.dart
@@ -69,13 +69,22 @@
 
 void testNativeFunctionFromLookup() {
   Expect.equals(49, sumPlus42(3, 4));
+  Expect.equals(49, (sumPlus42 as dynamic)(3, 4));
+  Expect.throwsNoSuchMethodError(() => (sumPlus42 as dynamic)());
+  Expect.throwsTypeError(() => (sumPlus42 as dynamic)(3, 4.0));
 
   Expect.equals(625, intComputation(125, 250, 500, 1000));
+  Expect.equals(625, (intComputation as dynamic)(125, 250, 500, 1000));
 
   Expect.equals(
       0x7FFFFFFFFFFFFFFF, intComputation(0, 0, 0, 0x7FFFFFFFFFFFFFFF));
   Expect.equals(
       -0x8000000000000000, intComputation(0, 0, 0, -0x8000000000000000));
+
+  Expect.equals(0x7FFFFFFFFFFFFFFF,
+      (intComputation as dynamic)(0, 0, 0, 0x7FFFFFFFFFFFFFFF));
+  Expect.equals(-0x8000000000000000,
+      (intComputation as dynamic)(0, 0, 0, -0x8000000000000000));
 }
 
 typedef NativeReturnMaxUint8 = Uint8 Function();
diff --git a/tests/ffi_2/function_test.dart b/tests/ffi_2/function_test.dart
index 376711b..bff456e 100644
--- a/tests/ffi_2/function_test.dart
+++ b/tests/ffi_2/function_test.dart
@@ -69,13 +69,22 @@
 
 void testNativeFunctionFromLookup() {
   Expect.equals(49, sumPlus42(3, 4));
+  Expect.equals(49, (sumPlus42 as dynamic)(3, 4));
+  Expect.throwsNoSuchMethodError(() => (sumPlus42 as dynamic)());
+  Expect.throwsTypeError(() => (sumPlus42 as dynamic)(3, 4.0));
 
   Expect.equals(625, intComputation(125, 250, 500, 1000));
+  Expect.equals(625, (intComputation as dynamic)(125, 250, 500, 1000));
 
   Expect.equals(
       0x7FFFFFFFFFFFFFFF, intComputation(0, 0, 0, 0x7FFFFFFFFFFFFFFF));
   Expect.equals(
       -0x8000000000000000, intComputation(0, 0, 0, -0x8000000000000000));
+
+  Expect.equals(0x7FFFFFFFFFFFFFFF,
+      (intComputation as dynamic)(0, 0, 0, 0x7FFFFFFFFFFFFFFF));
+  Expect.equals(-0x8000000000000000,
+      (intComputation as dynamic)(0, 0, 0, -0x8000000000000000));
 }
 
 typedef NativeReturnMaxUint8 = Uint8 Function();
diff --git a/tools/VERSION b/tools/VERSION
index 7c1de33..ff6e07f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 103
+PRERELEASE 104
 PRERELEASE_PATCH 0
\ No newline at end of file
