Index: sdk/lib/async/stream_transformers.dart |
diff --git a/sdk/lib/async/stream_transformers.dart b/sdk/lib/async/stream_transformers.dart |
index 3f4857707ee4786f55a7fda679ab4f71696fe36e..27f1547fc4e30ec2da46806f0b3f41ff8f8fac0e 100644 |
--- a/sdk/lib/async/stream_transformers.dart |
+++ b/sdk/lib/async/stream_transformers.dart |
@@ -209,12 +209,29 @@ class _HandlerEventSink<S, T> implements EventSink<S> { |
final _TransformDoneHandler<T> _handleDone; |
/// The output sink where the handlers should send their data into. |
- final EventSink<T> _sink; |
+ EventSink<T> _sink; |
_HandlerEventSink( |
- this._handleData, this._handleError, this._handleDone, this._sink); |
+ this._handleData, this._handleError, this._handleDone, this._sink) { |
+ if (_sink == null) { |
+ throw new ArgumentError("The provided sink must not be null."); |
+ } |
+ } |
+ |
+ bool get _isClosed => _sink == null; |
+ |
+ _reportClosedSink() { |
+ // TODO(29554): throw a StateError, and don't just report the problem. |
+ Zone.ROOT |
+ ..print("Sink is closed and adding to it is an error.") |
+ ..print(" See http://dartbug.com/29554.") |
+ ..print(StackTrace.current.toString()); |
+ } |
void add(S data) { |
+ if (_isClosed) { |
+ _reportClosedSink(); |
+ } |
if (_handleData != null) { |
_handleData(data, _sink); |
} else { |
@@ -223,6 +240,9 @@ class _HandlerEventSink<S, T> implements EventSink<S> { |
} |
void addError(Object error, [StackTrace stackTrace]) { |
+ if (_isClosed) { |
+ _reportClosedSink(); |
+ } |
if (_handleError != null) { |
_handleError(error, stackTrace, _sink); |
} else { |
@@ -231,10 +251,13 @@ class _HandlerEventSink<S, T> implements EventSink<S> { |
} |
void close() { |
+ if (_isClosed) return; |
+ var sink = _sink; |
+ _sink = null; |
if (_handleDone != null) { |
- _handleDone(_sink); |
+ _handleDone(sink); |
} else { |
- _sink.close(); |
+ sink.close(); |
} |
} |
} |