anchor.diff:    }
   
     // Take the value (when completed) of source and complete target with that
  -  // value (or error). This function can chain all Futures, but is slower
  -  // for _Future than _chainCoreFuture - Use _chainCoreFuture in that case.
  +  // value (or error). This function could chain all Futures, but is slower
  +  // for _Future than _chainCoreFuture, so you must use _chainCoreFuture
  +  // in that case.
     static void _chainForeignFuture(Future source, _Future target) {
       assert(!target._isComplete);
       assert(source is! _Future);
   
       // Mark the target as chained (and as such half-completed).
  -    target._isChained = true;
  +    target._setChained();
       try {
         source.then((value) {
             assert(target._isChained);
  
positive.code:       }
        _Future result = listener.result;
        listeners = result._removeListeners();
        if (listenerHasValue) {
          result._setValue(listenerValueOrError);
        } else {
          AsyncError asyncError = listenerValueOrError;
  
negative.code:       Future<T> typedFuture = value;
        if (typedFuture is _Future) {
          _Future<T> coreFuture = typedFuture;
          if (coreFuture._hasError) {
            // Case 1 from above. Delay completion to enable the user to register
            // callbacks.
            _markPendingCompletion();
  