void _prependListeners(_FutureListener listeners) { if (listeners == null) { return; } if (_mayAddListener) { _FutureListener existingListeners = (_FutureListener)_resultOrListeners; _resultOrListeners = listeners; if (existingListeners != null) { _FutureListener cursor = listeners; while (cursor._nextListener != null) { cursor = cursor._nextListener; } cursor._nextListener = existingListeners; } } else { if (_isChained) { // Delegate listeners to chained source future. // If the source is complete, instead copy its values and // drop the chaining. _Future source = _chainSource; if (!source._isComplete) { source._prependListeners(listeners); return; } _cloneResult(source); } D.assert(_isComplete); listeners = _reverseListeners(listeners); _zone.scheduleMicrotask(() => { _propagateToListeners(this, listeners); return(null); }); } }
static void _chainCoreFuture(_Future source, _Future target) { D.assert(target._mayAddListener); // Not completed, not already chained. while (source._isChained) { source = source._chainSource; } if (source._isComplete) { _FutureListener listeners = target._removeListeners(); target._cloneResult(source); _propagateToListeners(target, listeners); } else { _FutureListener listeners = (_FutureListener)target._resultOrListeners; target._setChained(source); source._prependListeners(listeners); } }