Version 2.12.0-79.0.dev

Merge commit '85174e4d8cfdb75b80c95d10476ebbd2eeba2857' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index f616daa..8315206 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -258,12 +258,6 @@
       "languageVersion": "2.12"
     },
     {
-      "name": "file",
-      "rootUri": "../third_party/pkg/file/packages/file",
-      "packageUri": "lib/",
-      "languageVersion": "2.12"
-    },
-    {
       "name": "fixnum",
       "rootUri": "../third_party/pkg/fixnum",
       "packageUri": "lib/",
@@ -290,7 +284,7 @@
       "name": "glob",
       "rootUri": "../third_party/pkg/glob",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.2"
     },
     {
       "name": "html",
diff --git a/DEPS b/DEPS
index cee5f0a..70e73aa 100644
--- a/DEPS
+++ b/DEPS
@@ -104,8 +104,7 @@
   "dartdoc_rev" : "d79877d0764ce23ffea7055049f8da5dffce0308",
   "ffi_rev": "a5d4232cd38562c75a3ed847baa340e399538028",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
-  "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
-  "glob_rev": "7c0ef8d4fa086f6b185c4dd724b700e7d7ad8f79",
+  "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
   "html_rev": "22f17e97fedeacaa1e945cf84d8016284eed33a6",
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_rev" : "f1d1c9c024a293ab0a0e16f8b7632e87c708b448",
@@ -336,9 +335,6 @@
       Var("dart_git") + "ffi.git" + "@" + Var("ffi_rev"),
   Var("dart_root") + "/third_party/pkg/fixnum":
       Var("dart_git") + "fixnum.git" + "@" + Var("fixnum_rev"),
-  Var("dart_root") + "/third_party/pkg/file":
-      Var("dart_git") + "external/github.com/google/file.dart/"
-      + "@" + Var("file_rev"),
   Var("dart_root") + "/third_party/pkg/glob":
       Var("dart_git") + "glob.git" + "@" + Var("glob_rev"),
   Var("dart_root") + "/third_party/pkg/html":
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index e168137..0c7657a 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -3357,6 +3357,25 @@
     assertNotSuggested('Object');
   }
 
+  @failingTest
+  Future<void> test_functionExpression_expressionBody() async {
+    // This test fails because the OpType at the completion location doesn't
+    // allow for functions that return `void`. But because the expected return
+    // type is `dynamic` we probably want to allow it.
+    addTestSource('''
+void f() {
+  g(() => ^);
+}
+void g(dynamic Function() h) {}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestFunction('f', 'void');
+    assertSuggestFunction('g', 'void');
+  }
+
   Future<void> test_functionExpression_parameterList() async {
     addTestSource('''
 var c = <T>(^) {};
@@ -5187,6 +5206,20 @@
     assertSuggestMethod('m', 'B', null);
   }
 
+  @failingTest
+  Future<void> test_parameterList_genericFunctionType() async {
+    // This test fails because we don't suggest `void` as the type of a
+    // parameter, but we should for the case of `void Function()`.
+    addTestSource('''
+void f(^) {}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggest('void');
+  }
+
   Future<void> test_parameterName_excludeTypes() async {
     addTestSource('m(int ^) {}');
     await computeSuggestions();
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b8bfd7d..755e7d6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -48,9 +48,9 @@
   final ExecutableElement element;
   final bool isAsynchronous;
   final bool isConstConstructor;
-  final bool isFactoryConstructor;
   final bool isGenerativeConstructor;
   final bool isGenerator;
+  final bool inFactoryConstructor;
   final bool inStaticMethod;
 
   /// The return statements that have a value.
@@ -66,11 +66,10 @@
   EnclosingExecutableContext(this.element)
       : isAsynchronous = element != null && element.isAsynchronous,
         isConstConstructor = element is ConstructorElement && element.isConst,
-        isFactoryConstructor =
-            element is ConstructorElement && element.isFactory,
         isGenerativeConstructor =
             element is ConstructorElement && !element.isFactory,
         isGenerator = element != null && element.isGenerator,
+        inFactoryConstructor = _inFactoryConstructor(element),
         inStaticMethod = _inStaticMethod(element);
 
   EnclosingExecutableContext.empty() : this(null);
@@ -84,7 +83,7 @@
           ? className
           : '$className.$constructorName';
     } else {
-      return element.displayName;
+      return element?.displayName;
     }
   }
 
@@ -107,6 +106,17 @@
 
   DartType get returnType => element.returnType;
 
+  static bool _inFactoryConstructor(ExecutableElement element) {
+    if (element is ConstructorElement) {
+      return element.isFactory;
+    }
+    var enclosing = element?.enclosingElement;
+    if (enclosing is ExecutableElement) {
+      return _inFactoryConstructor(enclosing);
+    }
+    return false;
+  }
+
   static bool _inStaticMethod(ExecutableElement element) {
     var enclosing = element?.enclosingElement;
     if (enclosing is ClassElement || enclosing is ExtensionElement) {
@@ -1129,7 +1139,7 @@
   void visitSimpleIdentifier(SimpleIdentifier node) {
     _checkForAmbiguousImport(node);
     _checkForReferenceBeforeDeclaration(node);
-    _checkForImplicitThisReferenceInInitializer(node);
+    _checkForInvalidInstanceMemberAccess(node);
     _checkForTypeParameterReferencedByStatic(node);
     if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
       _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
@@ -2773,76 +2783,6 @@
     }
   }
 
-  /// Verify that if the given [identifier] is part of a constructor
-  /// initializer, then it does not implicitly reference 'this' expression.
-  ///
-  /// See [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER], and
-  /// [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC].
-  /// TODO(scheglov) rename thid method
-  void _checkForImplicitThisReferenceInInitializer(
-      SimpleIdentifier identifier) {
-    if (_isInComment) {
-      return;
-    }
-    if (!_isInConstructorInitializer &&
-        !_enclosingExecutable.inStaticMethod &&
-        !_enclosingExecutable.isFactoryConstructor &&
-        !_isInInstanceNotLateVariableDeclaration &&
-        !_isInStaticVariableDeclaration) {
-      return;
-    }
-    // prepare element
-    Element element = identifier.writeOrReadElement;
-    if (!(element is MethodElement || element is PropertyAccessorElement)) {
-      return;
-    }
-    // static element
-    ExecutableElement executableElement = element as ExecutableElement;
-    if (executableElement.isStatic) {
-      return;
-    }
-    // not a class member
-    Element enclosingElement = element.enclosingElement;
-    if (enclosingElement is! ClassElement &&
-        enclosingElement is! ExtensionElement) {
-      return;
-    }
-    // qualified method invocation
-    AstNode parent = identifier.parent;
-    if (parent is MethodInvocation) {
-      if (identical(parent.methodName, identifier) &&
-          parent.realTarget != null) {
-        return;
-      }
-    }
-    // qualified property access
-    if (parent is PropertyAccess) {
-      if (identical(parent.propertyName, identifier) &&
-          parent.realTarget != null) {
-        return;
-      }
-    }
-    if (parent is PrefixedIdentifier) {
-      if (identical(parent.identifier, identifier)) {
-        return;
-      }
-    }
-
-    if (_enclosingExecutable.inStaticMethod) {
-      // TODO
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, identifier);
-    } else if (_enclosingExecutable.isFactoryConstructor) {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, identifier);
-    } else {
-      _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
-          identifier,
-          [identifier.name]);
-    }
-  }
-
   /// Check that if the visiting library is not system, then any given library
   /// should not be SDK internal library. The [importElement] is the
   /// [ImportElement] retrieved from the node, if the element in the node was
@@ -3011,6 +2951,74 @@
     }
   }
 
+  /// Verify that if the given [identifier] is part of a constructor
+  /// initializer, then it does not implicitly reference 'this' expression.
+  ///
+  /// See [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER],
+  /// [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY], and
+  /// [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC].
+  void _checkForInvalidInstanceMemberAccess(SimpleIdentifier identifier) {
+    if (_isInComment) {
+      return;
+    }
+    if (!_isInConstructorInitializer &&
+        !_enclosingExecutable.inStaticMethod &&
+        !_enclosingExecutable.inFactoryConstructor &&
+        !_isInInstanceNotLateVariableDeclaration &&
+        !_isInStaticVariableDeclaration) {
+      return;
+    }
+    // prepare element
+    Element element = identifier.writeOrReadElement;
+    if (!(element is MethodElement || element is PropertyAccessorElement)) {
+      return;
+    }
+    // static element
+    ExecutableElement executableElement = element as ExecutableElement;
+    if (executableElement.isStatic) {
+      return;
+    }
+    // not a class member
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement &&
+        enclosingElement is! ExtensionElement) {
+      return;
+    }
+    // qualified method invocation
+    AstNode parent = identifier.parent;
+    if (parent is MethodInvocation) {
+      if (identical(parent.methodName, identifier) &&
+          parent.realTarget != null) {
+        return;
+      }
+    }
+    // qualified property access
+    if (parent is PropertyAccess) {
+      if (identical(parent.propertyName, identifier) &&
+          parent.realTarget != null) {
+        return;
+      }
+    }
+    if (parent is PrefixedIdentifier) {
+      if (identical(parent.identifier, identifier)) {
+        return;
+      }
+    }
+
+    if (_enclosingExecutable.inStaticMethod) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, identifier);
+    } else if (_enclosingExecutable.inFactoryConstructor) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, identifier);
+    } else {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
+          identifier,
+          [identifier.name]);
+    }
+  }
+
   /// Check to see whether the given function [body] has a modifier associated
   /// with it, and report it as an error if it does.
   void _checkForInvalidModifierOnBody(
diff --git a/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart b/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart
index 5bde8d7..8791394 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_member_access_from_factory_test.dart
@@ -30,6 +30,39 @@
     ]);
   }
 
+  test_property() async {
+    await assertErrorsInCode(r'''
+class A {
+  int m;
+  A();
+  factory A.make() {
+    m;
+    return new A();
+  }
+}
+''', [
+      error(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, 51, 1),
+    ]);
+  }
+
+  test_property_fromClosure() async {
+    await assertErrorsInCode(r'''
+class A {
+  int m;
+  A();
+  factory A.make() {
+    void f() {
+      m;
+    }
+    f();
+    return new A();
+  }
+}
+''', [
+      error(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, 68, 1),
+    ]);
+  }
+
   test_unnamed() async {
     await assertErrorsInCode(r'''
 class A {
diff --git a/pkg/test_runner/lib/src/browser_controller.dart b/pkg/test_runner/lib/src/browser_controller.dart
index fce0fca..708d185 100644
--- a/pkg/test_runner/lib/src/browser_controller.dart
+++ b/pkg/test_runner/lib/src/browser_controller.dart
@@ -298,8 +298,8 @@
     // We run killAndResetSafari in a Zone as opposed to running an external
     // process. The Zone allows us to collect its output, and protect the rest
     // of the test infrastructure against errors in it.
-    runZonedGuarded(zoneWrapper, handleUncaughtError,
-        zoneSpecification: specification);
+    runZoned(zoneWrapper,
+        zoneSpecification: specification, onError: handleUncaughtError);
 
     try {
       await completer.future;
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 6f5d5f2..91e0731 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -862,6 +862,7 @@
 
     print("Cannot create URL for path $file. Not in build or dart directory.");
     exit(1);
+    throw "unreachable";
   }
 
   String _uriForBrowserTest(String pathComponent) {
diff --git a/pkg/test_runner/pubspec.yaml b/pkg/test_runner/pubspec.yaml
index 9fad3c1..be9765a 100644
--- a/pkg/test_runner/pubspec.yaml
+++ b/pkg/test_runner/pubspec.yaml
@@ -22,14 +22,10 @@
 dev_dependencies:
   expect:
     path: ../expect
-  file: any
-  glob: any
+  glob:
+    path: ../../third_party/pkg/glob    
 dependency_overrides:
   # Other packages in the dependency graph have normal hosted dependencies on
   # this, so just override it to force the local one.
   args:
     path: ../../third_party/pkg/args
-  file:
-    path: ../../third_party/pkg/file/packages/file
-  glob:
-    path: ../../third_party/pkg/glob
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index add8fe5..7432ff2 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -7,9 +7,7 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:file/file.dart' as pkg_file;
 import 'package:glob/glob.dart';
-import 'package:glob/list_local_fs.dart';
 import 'package:path/path.dart' as p;
 
 import 'package:test_runner/src/command_output.dart';
@@ -132,7 +130,7 @@
   for (var entry in glob.listSync(root: root)) {
     if (!entry.path.endsWith(".dart")) continue;
 
-    if (entry is pkg_file.File) {
+    if (entry is File) {
       await _processFile(entry,
           dryRun: dryRun,
           remove: removeSources,
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 4a56206..8407f4f 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -563,10 +563,16 @@
   }
 
   void DeleteReloadContext();
-
-  bool IsReloading() const { return group_reload_context_ != nullptr; }
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
+  bool IsReloading() const {
+#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
+    return group_reload_context_ != nullptr;
+#else
+    return false;
+#endif
+  }
+
   uint64_t id() { return id_; }
 
   static void Init();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 801ca53..e1e4f70 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -14962,27 +14962,27 @@
                   NumArgsTestedBits::update(value, raw_ptr()->state_bits_));
 }
 
-intptr_t ICData::TypeArgsLen() const {
+intptr_t CallSiteData::TypeArgsLen() const {
   ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
   return args_desc.TypeArgsLen();
 }
 
-intptr_t ICData::CountWithTypeArgs() const {
+intptr_t CallSiteData::CountWithTypeArgs() const {
   ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
   return args_desc.CountWithTypeArgs();
 }
 
-intptr_t ICData::CountWithoutTypeArgs() const {
+intptr_t CallSiteData::CountWithoutTypeArgs() const {
   ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
   return args_desc.Count();
 }
 
-intptr_t ICData::SizeWithoutTypeArgs() const {
+intptr_t CallSiteData::SizeWithoutTypeArgs() const {
   ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
   return args_desc.Size();
 }
 
-intptr_t ICData::SizeWithTypeArgs() const {
+intptr_t CallSiteData::SizeWithTypeArgs() const {
   ArgumentsDescriptor args_desc(Array::Handle(arguments_descriptor()));
   return args_desc.SizeWithTypeArgs();
 }
@@ -15134,11 +15134,14 @@
   return -1;
 }
 
-void ICData::WriteSentinelAt(intptr_t index) const {
+void ICData::WriteSentinelAt(intptr_t index,
+                             const CallSiteResetter& proof_of_reload) const {
+  USE(proof_of_reload);  // This method can only be called during reload.
+
+  Thread* thread = Thread::Current();
   const intptr_t len = Length();
   ASSERT(index >= 0);
   ASSERT(index < len);
-  Thread* thread = Thread::Current();
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   Array& data = thread->ArrayHandle();
   data = entries();
@@ -15149,13 +15152,20 @@
   }
 }
 
-void ICData::ClearCountAt(intptr_t index) const {
+void ICData::ClearCountAt(intptr_t index,
+                          const CallSiteResetter& proof_of_reload) const {
+  USE(proof_of_reload);  // This method can only be called during reload.
+
   ASSERT(index >= 0);
   ASSERT(index < NumberOfChecks());
   SetCountAt(index, 0);
 }
 
-void ICData::ClearAndSetStaticTarget(const Function& func) const {
+void ICData::ClearAndSetStaticTarget(
+    const Function& func,
+    const CallSiteResetter& proof_of_reload) const {
+  USE(proof_of_reload);  // This method can only be called during reload.
+
   if (IsImmutable()) {
     return;
   }
@@ -15163,12 +15173,13 @@
   if (len == 0) {
     return;
   }
+  Thread* thread = Thread::Current();
+
   // The final entry is always the sentinel.
   ASSERT(IsSentinelAt(len - 1));
   const intptr_t num_args_tested = NumArgsTested();
   if (num_args_tested == 0) {
     // No type feedback is being collected.
-    Thread* thread = Thread::Current();
     REUSABLE_ARRAY_HANDLESCOPE(thread);
     Array& data = thread->ArrayHandle();
     data = entries();
@@ -15186,9 +15197,8 @@
     // Type feedback on arguments is being collected.
     // Fill all but the first entry with the sentinel.
     for (intptr_t i = len - 1; i > 0; i--) {
-      WriteSentinelAt(i);
+      WriteSentinelAt(i, proof_of_reload);
     }
-    Thread* thread = Thread::Current();
     REUSABLE_ARRAY_HANDLESCOPE(thread);
     Array& data = thread->ArrayHandle();
     data = entries();
@@ -15557,15 +15567,6 @@
 #endif
 }
 
-ObjectPtr ICData::GetTargetOrCodeAt(intptr_t index) const {
-  const intptr_t data_pos =
-      index * TestEntryLength() + TargetIndexFor(NumArgsTested());
-
-  NoSafepointScope no_safepoint;
-  ArrayPtr raw_data = entries();
-  return raw_data->ptr()->data()[data_pos];
-}
-
 void ICData::IncrementCountAt(intptr_t index, intptr_t value) const {
   ASSERT(0 <= value);
   ASSERT(value <= Smi::kMaxValue);
@@ -15616,46 +15617,7 @@
   return count;
 }
 
-void ICData::SetCodeAt(intptr_t index, const Code& value) const {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  Thread* thread = Thread::Current();
-  REUSABLE_ARRAY_HANDLESCOPE(thread);
-  Array& data = thread->ArrayHandle();
-  data = entries();
-  const intptr_t data_pos =
-      index * TestEntryLength() + CodeIndexFor(NumArgsTested());
-  data.SetAt(data_pos, value);
-#endif
-}
-
-void ICData::SetEntryPointAt(intptr_t index, const Smi& value) const {
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  UNREACHABLE();
-#else
-  Thread* thread = Thread::Current();
-  REUSABLE_ARRAY_HANDLESCOPE(thread);
-  Array& data = thread->ArrayHandle();
-  data = entries();
-  const intptr_t data_pos =
-      index * TestEntryLength() + EntryPointIndexFor(NumArgsTested());
-  data.SetAt(data_pos, value);
-#endif
-}
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
-ICDataPtr ICData::AsUnaryClassChecksForCid(intptr_t cid,
-                                           const Function& target) const {
-  ASSERT(!IsNull());
-  const intptr_t kNumArgsTested = 1;
-  ICData& result = ICData::Handle(ICData::NewFrom(*this, kNumArgsTested));
-
-  // Copy count so that we copy the state "count == 0" vs "count > 0".
-  result.AddReceiverCheck(cid, target, GetCountAt(0));
-  return result.raw();
-}
-
 ICDataPtr ICData::AsUnaryClassChecksForArgNr(intptr_t arg_nr) const {
   ASSERT(!IsNull());
   ASSERT(NumArgsTested() > arg_nr);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 28ab1c2..0ec0812 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -63,6 +63,7 @@
 class FlowGraphCompiler;
 class HierarchyInfo;
 class LocalScope;
+class CallSiteResetter;
 class CodeStatistics;
 class IsolateGroupReloadContext;
 
@@ -1862,6 +1863,16 @@
   StringPtr target_name() const { return raw_ptr()->target_name_; }
   ArrayPtr arguments_descriptor() const { return raw_ptr()->args_descriptor_; }
 
+  intptr_t TypeArgsLen() const;
+
+  intptr_t CountWithTypeArgs() const;
+
+  intptr_t CountWithoutTypeArgs() const;
+
+  intptr_t SizeWithoutTypeArgs() const;
+
+  intptr_t SizeWithTypeArgs() const;
+
   static intptr_t target_name_offset() {
     return OFFSET_OF(CallSiteDataLayout, target_name_);
   }
@@ -1921,16 +1932,6 @@
 
   intptr_t NumArgsTested() const;
 
-  intptr_t TypeArgsLen() const;
-
-  intptr_t CountWithTypeArgs() const;
-
-  intptr_t CountWithoutTypeArgs() const;
-
-  intptr_t SizeWithoutTypeArgs() const;
-
-  intptr_t SizeWithTypeArgs() const;
-
   intptr_t deopt_id() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
@@ -1946,21 +1947,13 @@
   AbstractTypePtr receivers_static_type() const {
     return raw_ptr()->receivers_static_type_;
   }
-  void SetReceiversStaticType(const AbstractType& type) const;
   bool is_tracking_exactness() const {
     return TrackingExactnessBit::decode(raw_ptr()->state_bits_);
   }
-  void set_tracking_exactness(bool value) const {
-    StoreNonPointer(
-        &raw_ptr()->state_bits_,
-        TrackingExactnessBit::update(value, raw_ptr()->state_bits_));
-  }
 #else
   bool is_tracking_exactness() const { return false; }
 #endif
 
-  void Reset(Zone* zone) const;
-
 // Note: only deopts with reasons before Unknown in this list are recorded in
 // the ICData. All other reasons are used purely for informational messages
 // printed during deoptimization itself.
@@ -2025,7 +2018,6 @@
   static const char* RebindRuleToCString(RebindRule r);
   static bool ParseRebindRule(const char* str, RebindRule* out);
   RebindRule rebind_rule() const;
-  void set_rebind_rule(uint32_t rebind_rule) const;
 
   void set_is_megamorphic(bool value) const {
     // We don't have concurrent RW access to [state_bits_].
@@ -2077,14 +2069,20 @@
 #endif
 
   // Replaces entry |index| with the sentinel.
-  void WriteSentinelAt(intptr_t index) const;
+  // NOTE: Can only be called during reload.
+  void WriteSentinelAt(intptr_t index,
+                       const CallSiteResetter& proof_of_reload) const;
 
   // Clears the count for entry |index|.
-  void ClearCountAt(intptr_t index) const;
+  // NOTE: Can only be called during reload.
+  void ClearCountAt(intptr_t index,
+                    const CallSiteResetter& proof_of_reload) const;
 
   // Clear all entries with the sentinel value and reset the first entry
   // with the dummy target entry.
-  void ClearAndSetStaticTarget(const Function& func) const;
+  // NOTE: Can only be called during reload.
+  void ClearAndSetStaticTarget(const Function& func,
+                               const CallSiteResetter& proof_of_reload) const;
 
   void DebugDump() const;
 
@@ -2112,9 +2110,6 @@
                         StaticTypeExactnessState exactness =
                             StaticTypeExactnessState::NotTracking()) const;
 
-  // Does entry |index| contain the sentinel value?
-  bool IsSentinelAt(intptr_t index) const;
-
   // Retrieving checks.
 
   void GetCheckAt(intptr_t index,
@@ -2134,10 +2129,6 @@
 
   FunctionPtr GetTargetAt(intptr_t index) const;
 
-  ObjectPtr GetTargetOrCodeAt(intptr_t index) const;
-  void SetCodeAt(intptr_t index, const Code& value) const;
-  void SetEntryPointAt(intptr_t index, const Smi& value) const;
-
   void IncrementCountAt(intptr_t index, intptr_t value) const;
   void SetCountAt(intptr_t index, intptr_t value) const;
   intptr_t GetCountAt(intptr_t index) const;
@@ -2148,8 +2139,6 @@
   // Returns only used entries.
   ICDataPtr AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
   ICDataPtr AsUnaryClassChecks() const { return AsUnaryClassChecksForArgNr(0); }
-  ICDataPtr AsUnaryClassChecksForCid(intptr_t cid,
-                                     const Function& target) const;
 
   // Returns ICData with aggregated receiver count, sorted by highest count.
   // Smi not first!! (the convention for ICData used in code generation is that
@@ -2239,11 +2228,21 @@
   // for the new entry.
   ArrayPtr Grow(intptr_t* index) const;
 
-  void set_owner(const Function& value) const;
   void set_deopt_id(intptr_t value) const;
-  void SetNumArgsTested(intptr_t value) const;
   void set_entries(const Array& value) const;
+  void set_owner(const Function& value) const;
+  void set_rebind_rule(uint32_t rebind_rule) const;
   void set_state_bits(uint32_t bits) const;
+  void set_tracking_exactness(bool value) const {
+    StoreNonPointer(
+        &raw_ptr()->state_bits_,
+        TrackingExactnessBit::update(value, raw_ptr()->state_bits_));
+  }
+
+  // Does entry |index| contain the sentinel value?
+  bool IsSentinelAt(intptr_t index) const;
+  void SetNumArgsTested(intptr_t value) const;
+  void SetReceiversStaticType(const AbstractType& type) const;
 
   // 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
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 447dbc2..907dda1 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -904,8 +904,8 @@
           (class_ids[1] == kSmiCid)) {
         // The smi fast path case, preserve the initial entry but reset the
         // count.
-        ic.ClearCountAt(0);
-        ic.WriteSentinelAt(1);
+        ic.ClearCountAt(0, *this);
+        ic.WriteSentinelAt(1, *this);
         entries_ = ic.entries();
         entries_.Truncate(2 * ic.TestEntryLength());
         return;
@@ -955,7 +955,7 @@
                  Object::Handle(zone_, ic.Owner()).ToCString());
       return;
     }
-    ic.ClearAndSetStaticTarget(new_target_);
+    ic.ClearAndSetStaticTarget(new_target_, *this);
   } else {
     FATAL("Unexpected rebind rule.");
   }
diff --git a/tools/VERSION b/tools/VERSION
index c5859ca..832de43 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 78
+PRERELEASE 79
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch b/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch
deleted file mode 100644
index da7f66b..0000000
--- a/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/DEPS b/DEPS
-index 17f3f9f68..39b78c735 100644
---- a/DEPS
-+++ b/DEPS
-@@ -198,6 +198,9 @@ deps = {
-   'src/third_party/dart/third_party/pkg/ffi':
-    Var('dart_git') + '/ffi.git@a5d4232cd38562c75a3ed847baa340e399538028',
- 
-+  'src/third_party/dart/third_party/pkg/file':
-+   Var('dart_git') + '/external/github.com/google/file.dart@0e09370f581ab6388d46fda4cdab66638c0171a1',
-+
-   'src/third_party/dart/third_party/pkg/fixnum':
-    Var('dart_git') + '/fixnum.git@16d3890c6dc82ca629659da1934e412292508bba',
-