anchor.diff:          charCodes.add(charCode);
         }
       }
  -    sb.write(needsEscape ? new String.fromCharCodes(charCodes) : s);
  -  }
  -
  -  void checkCycle(final object) {
  -    if (seen.contains(object)) {
  +    _sink.write(needsEscape ? new String.fromCharCodes(charCodes) : s);
  +  }
  +
  +  void checkCycle(object) {
  +    if (_seen.contains(object)) {
         throw new JsonCyclicError(object);
       }
  -    seen.add(object);
  -  }
  -
  -  void stringifyValue(final object) {
  +    _seen.add(object);
  +  }
  +
  +  void stringifyValue(object) {
       // Tries stringifying object directly. If it's not a simple value, List or
       // Map, call toJson() to get a custom representation and try serializing
       // that.
       if (!stringifyJsonValue(object)) {
         checkCycle(object);
         try {
  -        var customJson = toEncodable(object);
  +        var customJson = _toEncodable(object);
           if (!stringifyJsonValue(customJson)) {
             throw new JsonUnsupportedObjectError(object);
           }
  -        seen.remove(object);
  +        _seen.remove(object);
         } catch (e) {
           throw new JsonUnsupportedObjectError(object, cause: e);
         }
  
positive.code:   static const int CHAR_t          = 0x74;
    static const int CHAR_u          = 0x75;
  
    final Function toEncodable;
    final StringSink sink;
    final Set<Object> seen;
  
    _JsonStringifier(this.sink, this.toEncodable)
        : this.seen = new HashSet.identity();
  
    static String stringify(final object, toEncodable(object)) {
      if (toEncodable == null) toEncodable = _defaultToEncodable;
      StringBuffer output = new StringBuffer();
      _JsonStringifier stringifier = new _JsonStringifier(output, toEncodable);
      stringifier.stringifyValue(object);
      return output.toString();
    }
  
    static void printOn(final object, StringSink output, toEncodable(object)) {
      _JsonStringifier stringifier = new _JsonStringifier(output, toEncodable);
      stringifier.stringifyValue(object);
    }
  
    static String numberToString(num x) {
  
negative.code:   // ('0' + x) or ('a' + x - 10)
    static int hexDigit(int x) => x < 10 ? 48 + x : 87 + x;
  
    void escape(String s) {
      final int length = s.length;
      bool needsEscape = false;
      final charCodes = new List<int>();
  