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