Tighten types on error stream handler to avoid dynamic calls.

Make a private field typed to avoid an unnecessary dynamic call in the error handler for a stream.  Also remove an unused private member found in passing.

Change-Id: I29ebba5a3818a4c24df436e504d159731fd6531e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/241243
Reviewed-by: Lasse Nielsen <lrn@google.com>
Reviewed-by: Nate Bosch <nbosch@google.com>
Commit-Queue: Leaf Petersen <leafp@google.com>
diff --git a/sdk/lib/async/async_error.dart b/sdk/lib/async/async_error.dart
index 2340a41..cc8ac20 100644
--- a/sdk/lib/async/async_error.dart
+++ b/sdk/lib/async/async_error.dart
@@ -31,17 +31,3 @@
 
   String toString() => '$error';
 }
-
-// Helper function used by stream method implementations.
-_invokeErrorHandler(
-    Function errorHandler, Object error, StackTrace stackTrace) {
-  var handler = errorHandler; // Rename to avoid promotion.
-  if (handler is ZoneBinaryCallback<dynamic, Never, Never>) {
-    // Dynamic invocation because we don't know the actual type of the
-    // first argument or the error object, but we should successfully call
-    // the handler if they match up.
-    return errorHandler(error, stackTrace);
-  } else {
-    return errorHandler(error);
-  }
-}
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 509faf2..7d1e4b1 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -870,15 +870,21 @@
   /// // 4
   /// ```
   Stream<T> handleError(Function onError, {bool test(error)?}) {
-    if (onError is! void Function(Object, StackTrace) &&
-        onError is! void Function(Object)) {
+    final void Function(Object, StackTrace) callback;
+    if (onError is void Function(Object, StackTrace)) {
+      callback = onError;
+    } else if (onError is void Function(Object)) {
+      callback = (Object error, StackTrace _) {
+        onError(error);
+      };
+    } else {
       throw ArgumentError.value(
           onError,
           "onError",
           "Error handler must accept one Object or one Object and a StackTrace"
               " as arguments.");
     }
-    return new _HandleErrorStream<T>(this, onError, test);
+    return new _HandleErrorStream<T>(this, callback, test);
   }
 
   /// Transforms each element of this stream into a sequence of elements.
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index 4533043..cd707be 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -243,7 +243,7 @@
 /// A stream pipe that converts or disposes error events
 /// before passing them on.
 class _HandleErrorStream<T> extends _ForwardingStream<T, T> {
-  final Function _onError;
+  final void Function(Object, StackTrace) _onError;
   final bool Function(Object)? _test;
 
   _HandleErrorStream(Stream<T> source, this._onError, this._test)
@@ -266,7 +266,7 @@
     }
     if (matches) {
       try {
-        _invokeErrorHandler(_onError, error, stackTrace);
+        _onError(error, stackTrace);
       } catch (e, s) {
         if (identical(e, error)) {
           sink._addError(error, stackTrace);
diff --git a/sdk/lib/internal/cast.dart b/sdk/lib/internal/cast.dart
index e3e0dae..5bd1f44 100644
--- a/sdk/lib/internal/cast.dart
+++ b/sdk/lib/internal/cast.dart
@@ -186,8 +186,6 @@
 
   CastSet(this._source, this._emptySet);
 
-  static Set<R> _defaultEmptySet<R>() => new Set<R>();
-
   Set<R> cast<R>() => new CastSet<S, R>(_source, _emptySet);
   bool add(T value) => _source.add(value as S);