Chromium Code Reviews| Index: sdk/lib/async/future_impl.dart |
| diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart |
| index 178445838e37bb7e1445cb5435e6eed2f228a763..9540da4f81a2818b467c9d6e6a0721fe51ca43db 100644 |
| --- a/sdk/lib/async/future_impl.dart |
| +++ b/sdk/lib/async/future_impl.dart |
| @@ -14,7 +14,7 @@ typedef _FutureAction(); |
| abstract class _Completer<T> implements Completer<T> { |
| final _Future<T> future = new _Future<T>(); |
| - void complete([T value]); |
| + void complete([value]); |
| void completeError(Object error, [StackTrace stackTrace]); |
| @@ -25,12 +25,17 @@ abstract class _Completer<T> implements Completer<T> { |
| class _AsyncCompleter<T> extends _Completer<T> { |
| - void complete([T value]) { |
| + void complete([value]) { |
| if (!future._mayComplete) throw new StateError("Future already completed"); |
| future._asyncComplete(value); |
| } |
| void completeError(Object error, [StackTrace stackTrace]) { |
| + if (error is Future) { |
|
floitsch
2013/10/29 18:13:35
ditto. I don't think this restriction is necessary
Lasse Reichstein Nielsen
2013/10/30 09:22:17
Removing.
|
| + throw new ArgumentError("Cannot use completeError with a future - " |
| + "use complete instead"); |
| + } |
| + if (error == null) throw new ArgumentError("Error must not be null"); |
| if (!future._mayComplete) throw new StateError("Future already completed"); |
| future._asyncCompleteError(error, stackTrace); |
| } |
| @@ -38,12 +43,16 @@ class _AsyncCompleter<T> extends _Completer<T> { |
| class _SyncCompleter<T> extends _Completer<T> { |
| - void complete([T value]) { |
| + void complete([value]) { |
| if (!future._mayComplete) throw new StateError("Future already completed"); |
| future._complete(value); |
| } |
| void completeError(Object error, [StackTrace stackTrace]) { |
| + if (error is Future) { |
|
floitsch
2013/10/29 18:13:35
ditto
Lasse Reichstein Nielsen
2013/10/30 09:22:17
ditto too.
|
| + throw new ArgumentError("Cannot use completeError with a future. " |
| + "Use complete instead."); |
| + } |
| if (!future._mayComplete) throw new StateError("Future already completed"); |
| future._completeError(error, stackTrace); |
| } |
| @@ -231,6 +240,7 @@ class _Future<T> implements Future<T> { |
| void _addListener(_Future listener) { |
| assert(listener._nextListener == null); |
| + _Future target = this; |
|
floitsch
2013/10/29 18:13:35
spurious change?
Lasse Reichstein Nielsen
2013/10/30 09:22:17
ack, yes. Left over from debugging.
Removed.
|
| if (_isComplete) { |
| // Handle late listeners asynchronously. |
| _zone.scheduleMicrotask(() { |
| @@ -314,7 +324,7 @@ class _Future<T> implements Future<T> { |
| _attachStackTrace(error, stackTrace); |
| } |
| - _Future listeners = _isChained ? null : _removeListeners(); |
| + _Future listeners = _removeListeners(); |
| _setError(error, stackTrace); |
| _propagateToListeners(this, listeners); |
| } |