anchor.diff:    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)) {
  +  final Function _toEncodable;
  +  final StringSink _sink;
  +  final Set<Object> _seen;
  +
  +  _JsonStringifier(this._sink, this._toEncodable)
  +      : this._seen = new HashSet.identity();
  +
  +  static String stringify(object, toEncodable(object)) {
       if (toEncodable == null) toEncodable = _defaultToEncodable;
       StringBuffer output = new StringBuffer();
  +    printOn(object, output, toEncodable);
  +    return output.toString();
  +  }
  +
  +  static void printOn(object, StringSink output, toEncodable(object)) {
       _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) {
  
positive.code:   // ('0' + x) or ('a' + x - 10)
    static int hexDigit(int x) => x < 10 ? 48 + x : 87 + x;
  
    static void escape(StringSink sb, String s) {
      final int length = s.length;
      bool needsEscape = false;
      final charCodes = new List<int>();
  
negative.code:    * Returns true if the value is one of these types, and false if not.
     * If a value is both a [List] and a [Map], it's serialized as a [List].
     */
    bool stringifyJsonValue(object) {
      if (object is num) {
        if (!object.isFinite) return false;
        _sink.write(numberToString(object));
        return true;
      } else if (identical(object, true)) {
        _sink.write('true');
        return true;
      } else if (identical(object, false)) {
        _sink.write('false');
         return true;
      } else if (object == null) {
        _sink.write('null');
        return true;
      } else if (object is String) {
        _sink.write('"');
        escape(object);
        _sink.write('"');
        return true;
      } else if (object is List) {
        checkCycle(object);
        List a = object;
        _sink.write('[');
        if (a.length > 0) {
          stringifyValue(a[0]);
          for (int i = 1; i < a.length; i++) {
            _sink.write(',');
            stringifyValue(a[i]);
          }
        }
        _sink.write(']');
        _seen.remove(object);
        return true;
      } else if (object is Map) {
        checkCycle(object);
        Map<String, Object> m = object;
        _sink.write('{');
        bool first = true;
        m.forEach((String key, Object value) {
          if (!first) {
            _sink.write(',"');
          } else {
            _sink.write('"');
          }
          escape(key);
          _sink.write('":');
          stringifyValue(value);
          first = false;
        });
        _sink.write('}');
        _seen.remove(object);
        return true;
      } else {
        return false;
  