anchor.diff:  
       _byteOffset = index.binaryOffsetForSourceTable;
       Map<Uri, Source> uriToSource = readUriToSource();
  -    component.uriToSource.addAll(uriToSource);
  +    _mergeUriToSource(component.uriToSource, uriToSource);
   
       _byteOffset = index.binaryOffsetForConstantTable;
       readConstantTable();
  
positive.code: 
      _byteOffset = index.binaryOffsetForSourceTable;
      Map<Uri, Source> uriToSource = readUriToSource();
      component.uriToSource.addAll(uriToSource);
  
      _byteOffset = _componentStartOffset + componentFileSize;
    }
  
negative.code:       readUint32();
      }
      return uriToSource;
    }
  
    // Add everything from [src] into [dst], but don't overwrite a non-empty
    // source with an empty source. Empty sources may be introduced by
    // synthetic, copy-down implementations such as mixin applications or
    // noSuchMethod forwarders.
    void _mergeUriToSource(Map<Uri, Source> dst, Map<Uri, Source> src) {
      if (dst.isEmpty) {
        // Fast path for the common case of one component per binary.
        dst.addAll(src);
      } else {
        src.forEach((Uri key, Source value) {
          if (value.source.isNotEmpty || !dst.containsKey(key)) {
            dst[key] = value;
          }
        });
      }
    }
  
    CanonicalName readCanonicalNameReference() {
  