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);