Hello community,

here is the log from the commit of package rubygem-json_pure for 
openSUSE:Factory checked in at 2020-05-11 13:41:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-json_pure (Old)
 and      /work/SRC/openSUSE:Factory/.rubygem-json_pure.new.2738 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rubygem-json_pure"

Mon May 11 13:41:17 2020 rev:26 rq:802340 version:2.3.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-json_pure/rubygem-json_pure.changes      
2019-06-19 21:00:16.466081753 +0200
+++ 
/work/SRC/openSUSE:Factory/.rubygem-json_pure.new.2738/rubygem-json_pure.changes
    2020-05-11 13:41:22.681122563 +0200
@@ -1,0 +2,6 @@
+Thu May  7 20:59:04 UTC 2020 - Stephan Kulow <co...@suse.com>
+
+- updated to version 2.3.0
+ see installed CHANGES.md
+
+-------------------------------------------------------------------

Old:
----
  json_pure-2.2.0.gem

New:
----
  json_pure-2.3.0.gem

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rubygem-json_pure.spec ++++++
--- /var/tmp/diff_new_pack.wGc41H/_old  2020-05-11 13:41:23.689124702 +0200
+++ /var/tmp/diff_new_pack.wGc41H/_new  2020-05-11 13:41:23.689124702 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package rubygem-json_pure
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -24,7 +24,7 @@
 #
 
 Name:           rubygem-json_pure
-Version:        2.2.0
+Version:        2.3.0
 Release:        0
 %define mod_name json_pure
 %define mod_full_name %{mod_name}-%{version}
@@ -33,7 +33,7 @@
 BuildRequires:  %{rubygem gem2rpm}
 BuildRequires:  %{rubygem rdoc > 3.10}
 BuildRequires:  ruby-macros >= 5
-Url:            http://flori.github.com/json
+URL:            http://flori.github.com/json
 Source:         https://rubygems.org/gems/%{mod_full_name}.gem
 Source1:        gem2rpm.yml
 Summary:        JSON Implementation for Ruby
@@ -49,7 +49,7 @@
 
 %install
 %gem_install \
-  --doc-files="CHANGES.md README.md" \
+  --doc-files="CHANGES.md LICENSE README.md" \
   -f
 
 %gem_packages

++++++ json_pure-2.2.0.gem -> json_pure-2.3.0.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      2019-02-21 23:15:38.000000000 +0100
+++ new/.gitignore      2020-03-25 02:58:01.000000000 +0100
@@ -15,3 +15,4 @@
 */**/Makefile
 */**/*.o
 .byebug_history
+*.log
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.travis.yml new/.travis.yml
--- old/.travis.yml     2019-02-21 23:15:38.000000000 +0100
+++ new/.travis.yml     2020-03-25 02:58:01.000000000 +0100
@@ -4,7 +4,6 @@
 
 # Specify which ruby versions you wish to run your tests on, each version will 
be used
 rvm:
-  - 1.9.3
   - 2.0.0
   - 2.1
   - 2.2
@@ -12,12 +11,14 @@
   - 2.4
   - 2.5
   - 2.6
+  - 2.7.0-preview3
   - ruby-head
   - jruby
+  - jruby-9.2.7.0
 matrix:
   allow_failures:
-    - rvm: 1.9.3
     - rvm: ruby-head
     - rvm: jruby
+    - rvm: jruby-9.2.7.0
 script: "bundle exec rake"
 sudo: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/LICENSE new/LICENSE
--- old/LICENSE 1970-01-01 01:00:00.000000000 +0100
+++ new/LICENSE 2020-03-25 02:58:01.000000000 +0100
@@ -0,0 +1,56 @@
+Ruby is copyrighted free software by Yukihiro Matsumoto <m...@netlab.jp>.
+You can redistribute it and/or modify it under either the terms of the
+2-clause BSDL (see the file BSDL), or the conditions below:
+
+  1. You may make and give away verbatim copies of the source form of the
+     software without restriction, provided that you duplicate all of the
+     original copyright notices and associated disclaimers.
+
+  2. You may modify your copy of the software in any way, provided that
+     you do at least ONE of the following:
+
+       a) place your modifications in the Public Domain or otherwise
+          make them Freely Available, such as by posting said
+         modifications to Usenet or an equivalent medium, or by allowing
+         the author to include your modifications in the software.
+
+       b) use the modified software only within your corporation or
+          organization.
+
+       c) give non-standard binaries non-standard names, with
+          instructions on where to get the original software distribution.
+
+       d) make other distribution arrangements with the author.
+
+  3. You may distribute the software in object code or binary form,
+     provided that you do at least ONE of the following:
+
+       a) distribute the binaries and library files of the software,
+         together with instructions (in the manual page or equivalent)
+         on where to get the original distribution.
+
+       b) accompany the distribution with the machine-readable source of
+         the software.
+
+       c) give non-standard binaries non-standard names, with
+          instructions on where to get the original software distribution.
+
+       d) make other distribution arrangements with the author.
+
+  4. You may modify and include the part of the software into any other
+     software (possibly commercial).  But some files in the distribution
+     are not written by the author, so that they are not under these terms.
+
+     For the list of those files and their copying conditions, see the
+     file LEGAL.
+
+  5. The scripts and library files supplied as input to or produced as
+     output from the software do not automatically fall under the
+     copyright of the software, but belong to whomever generated them,
+     and may be sold commercially, and may be aggregated with this
+     software.
+
+  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+     PURPOSE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README.md new/README.md
--- old/README.md       2019-02-21 23:15:38.000000000 +0100
+++ new/README.md       2020-03-25 02:58:01.000000000 +0100
@@ -406,4 +406,4 @@
 
 Online Documentation should be located at
 
-* http://json.rubyforge.org
+* https://www.rubydoc.info/gems/json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Rakefile new/Rakefile
--- old/Rakefile        2019-02-21 23:15:38.000000000 +0100
+++ new/Rakefile        2020-03-25 02:58:01.000000000 +0100
@@ -23,8 +23,13 @@
   def desc(*) end
 end
 
-MAKE   = ENV['MAKE']   || %w[gmake make].find { |c| system(c, '-v') }
-BUNDLE = ENV['BUNDLE'] || %w[bundle].find { |c| system(c, '-v') }
+which = lambda { |c|
+  w = `which #{c}`
+  break w.chomp unless w.empty?
+}
+
+MAKE   = ENV['MAKE']   || %w[gmake make].find(&which)
+BUNDLE = ENV['BUNDLE'] || %w[bundle].find(&which)
 PKG_NAME          = 'json'
 PKG_TITLE         = 'JSON Implementation for Ruby'
 PKG_VERSION       = File.read('VERSION').chomp
@@ -47,8 +52,8 @@
 JRUBY_PARSER_JAR    = File.expand_path("lib/json/ext/parser.jar")
 JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar")
 
-RAGEL_CODEGEN     = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') }
-RAGEL_DOTGEN      = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') }
+RAGEL_CODEGEN     = %w[rlcodegen rlgen-cd ragel].find(&which)
+RAGEL_DOTGEN      = %w[rlgen-dot rlgen-cd ragel].find(&which)
 
 desc "Installing library (pure)"
 task :install_pure => :version do
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/VERSION new/VERSION
--- old/VERSION 2019-02-21 23:15:38.000000000 +0100
+++ new/VERSION 2020-03-25 02:58:01.000000000 +0100
@@ -1 +1 @@
-2.2.0
+2.3.0
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ext/json/ext/generator/generator.c 
new/ext/json/ext/generator/generator.c
--- old/ext/json/ext/generator/generator.c      2019-02-21 23:15:38.000000000 
+0100
+++ new/ext/json/ext/generator/generator.c      2020-03-25 02:58:01.000000000 
+0100
@@ -15,7 +15,7 @@
 #endif
              mFloat, mString, mString_Extend,
              mTrueClass, mFalseClass, mNilClass, eGeneratorError,
-             eNestingError, CRegexp_MULTILINE, CJSON_SAFE_STATE_PROTOTYPE,
+             eNestingError,
              i_SAFE_STATE_PROTOTYPE;
 
 static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
@@ -237,6 +237,7 @@
     int escape_len;
     unsigned char c;
     char buf[6] = { '\\', 'u' };
+    int ascii_only = rb_enc_str_asciionly_p(string);
 
     for (start = 0, end = 0; end < len;) {
         p = ptr + end;
@@ -281,14 +282,17 @@
                     break;
                 default:
                     {
-                        unsigned short clen = trailingBytesForUTF8[c] + 1;
-                        if (end + clen > len) {
-                            rb_raise(rb_path2class("JSON::GeneratorError"),
-                                    "partial character in source, but hit 
end");
-                        }
-                        if (!isLegalUTF8((UTF8 *) p, clen)) {
-                            rb_raise(rb_path2class("JSON::GeneratorError"),
-                                    "source sequence is illegal/malformed 
utf-8");
+                        unsigned short clen = 1;
+                        if (!ascii_only) {
+                            clen += trailingBytesForUTF8[c];
+                            if (end + clen > len) {
+                                rb_raise(rb_path2class("JSON::GeneratorError"),
+                                        "partial character in source, but hit 
end");
+                            }
+                            if (!isLegalUTF8((UTF8 *) p, clen)) {
+                                rb_raise(rb_path2class("JSON::GeneratorError"),
+                                        "source sequence is illegal/malformed 
utf-8");
+                            }
                         }
                         end += clen;
                     }
@@ -692,7 +696,7 @@
     if (RTEST(rb_funcall(self, i_respond_to_p, 1, name))) {
         return rb_funcall(self, i_send, 1, name);
     } else {
-        return rb_ivar_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), 
name)));
+        return rb_attr_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), 
name)));
     }
 }
 
@@ -715,43 +719,83 @@
     return Qnil;
 }
 
-static void generate_json_object(FBuffer *buffer, VALUE Vstate, 
JSON_Generator_State *state, VALUE obj)
+struct hash_foreach_arg {
+    FBuffer *buffer;
+    JSON_Generator_State *state;
+    VALUE Vstate;
+    int iter;
+};
+
+static int
+json_object_i(VALUE key, VALUE val, VALUE _arg)
 {
+    struct hash_foreach_arg *arg = (struct hash_foreach_arg *)_arg;
+    FBuffer *buffer = arg->buffer;
+    JSON_Generator_State *state = arg->state;
+    VALUE Vstate = arg->Vstate;
+
     char *object_nl = state->object_nl;
     long object_nl_len = state->object_nl_len;
     char *indent = state->indent;
     long indent_len = state->indent_len;
-    long max_nesting = state->max_nesting;
     char *delim = FBUFFER_PTR(state->object_delim);
     long delim_len = FBUFFER_LEN(state->object_delim);
     char *delim2 = FBUFFER_PTR(state->object_delim2);
     long delim2_len = FBUFFER_LEN(state->object_delim2);
+    long depth = state->depth;
+    int j;
+    VALUE klass, key_to_s;
+
+    if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len);
+    if (object_nl) {
+        fbuffer_append(buffer, object_nl, object_nl_len);
+    }
+    if (indent) {
+        for (j = 0; j < depth; j++) {
+            fbuffer_append(buffer, indent, indent_len);
+        }
+    }
+
+    klass = CLASS_OF(key);
+    if (klass == rb_cString) {
+        key_to_s = key;
+    } else if (klass == rb_cSymbol) {
+        key_to_s = rb_id2str(SYM2ID(key));
+    } else {
+        key_to_s = rb_funcall(key, i_to_s, 0);
+    }
+    Check_Type(key_to_s, T_STRING);
+    generate_json(buffer, Vstate, state, key_to_s);
+    fbuffer_append(buffer, delim2, delim2_len);
+    generate_json(buffer, Vstate, state, val);
+
+    arg->iter++;
+    return ST_CONTINUE;
+}
+
+static void generate_json_object(FBuffer *buffer, VALUE Vstate, 
JSON_Generator_State *state, VALUE obj)
+{
+    char *object_nl = state->object_nl;
+    long object_nl_len = state->object_nl_len;
+    char *indent = state->indent;
+    long indent_len = state->indent_len;
+    long max_nesting = state->max_nesting;
     long depth = ++state->depth;
-    int i, j;
-    VALUE key, key_to_s, keys;
+    int j;
+    struct hash_foreach_arg arg;
+
     if (max_nesting != 0 && depth > max_nesting) {
         fbuffer_free(buffer);
         rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
     }
     fbuffer_append_char(buffer, '{');
-    keys = rb_funcall(obj, i_keys, 0);
-    for(i = 0; i < RARRAY_LEN(keys); i++) {
-        if (i > 0) fbuffer_append(buffer, delim, delim_len);
-        if (object_nl) {
-            fbuffer_append(buffer, object_nl, object_nl_len);
-        }
-        if (indent) {
-            for (j = 0; j < depth; j++) {
-                fbuffer_append(buffer, indent, indent_len);
-            }
-        }
-        key = rb_ary_entry(keys, i);
-        key_to_s = rb_funcall(key, i_to_s, 0);
-        Check_Type(key_to_s, T_STRING);
-        generate_json(buffer, Vstate, state, key_to_s);
-        fbuffer_append(buffer, delim2, delim2_len);
-        generate_json(buffer, Vstate, state, rb_hash_aref(obj, key));
-    }
+
+    arg.buffer = buffer;
+    arg.state = state;
+    arg.Vstate = Vstate;
+    arg.iter = 0;
+    rb_hash_foreach(obj, json_object_i, (VALUE)&arg);
+
     depth = --state->depth;
     if (object_nl) {
         fbuffer_append(buffer, object_nl, object_nl_len);
@@ -802,11 +846,22 @@
     fbuffer_append_char(buffer, ']');
 }
 
+#ifdef HAVE_RUBY_ENCODING_H
+static int enc_utf8_compatible_p(rb_encoding *enc)
+{
+    if (enc == rb_usascii_encoding()) return 1;
+    if (enc == rb_utf8_encoding()) return 1;
+    return 0;
+}
+#endif
+
 static void generate_json_string(FBuffer *buffer, VALUE Vstate, 
JSON_Generator_State *state, VALUE obj)
 {
     fbuffer_append_char(buffer, '"');
 #ifdef HAVE_RUBY_ENCODING_H
-    obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8);
+    if (!enc_utf8_compatible_p(rb_enc_get(obj))) {
+        obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil);
+    }
 #endif
     if (state->ascii_only) {
         convert_UTF8_to_JSON_ASCII(buffer, obj);
@@ -970,6 +1025,8 @@
  * * *allow_nan*: true if NaN, Infinity, and -Infinity should be
  *   generated, otherwise an exception is thrown, if these values are
  *   encountered. This options defaults to false.
+ * * *ascii_only*: true if only ASCII characters should be generated. This
+ *   ontions defaults to false.
  * * *buffer_initial_length*: sets the initial length of the generator's
  *   internal buffer.
  */
@@ -1025,10 +1082,8 @@
     } else if (rb_obj_is_kind_of(opts, rb_cHash)) {
         return rb_funcall(self, i_new, 1, opts);
     } else {
-        if (NIL_P(CJSON_SAFE_STATE_PROTOTYPE)) {
-            CJSON_SAFE_STATE_PROTOTYPE = rb_const_get(mJSON, 
i_SAFE_STATE_PROTOTYPE);
-        }
-        return rb_funcall(CJSON_SAFE_STATE_PROTOTYPE, i_dup, 0);
+        VALUE prototype = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
+        return rb_funcall(prototype, i_dup, 0);
     }
 }
 
@@ -1267,7 +1322,7 @@
 /*
  * call-seq: ascii_only?
  *
- * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise
+ * Returns true, if only ASCII characters should be generated. Otherwise
  * returns false.
  */
 static VALUE cState_ascii_only_p(VALUE self)
@@ -1344,6 +1399,8 @@
 
     eGeneratorError = rb_path2class("JSON::GeneratorError");
     eNestingError = rb_path2class("JSON::NestingError");
+    rb_gc_register_mark_object(eGeneratorError);
+    rb_gc_register_mark_object(eNestingError);
 
     cState = rb_define_class_under(mGenerator, "State", rb_cObject);
     rb_define_alloc_func(cState, cState_s_allocate);
@@ -1409,7 +1466,6 @@
     mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass");
     rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1);
 
-    CRegexp_MULTILINE = rb_const_get(rb_cRegexp, rb_intern("MULTILINE"));
     i_to_s = rb_intern("to_s");
     i_to_json = rb_intern("to_json");
     i_new = rb_intern("new");
@@ -1440,5 +1496,4 @@
     i_encode = rb_intern("encode");
 #endif
     i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE");
-    CJSON_SAFE_STATE_PROTOTYPE = Qnil;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ext/json/ext/parser/parser.c 
new/ext/json/ext/parser/parser.c
--- old/ext/json/ext/parser/parser.c    2019-02-21 23:15:38.000000000 +0100
+++ new/ext/json/ext/parser/parser.c    2020-03-25 02:58:01.000000000 +0100
@@ -27,7 +27,7 @@
 
 /* unicode */
 
-static const char digit_values[256] = {
+static const signed char digit_values[256] = {
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
@@ -46,7 +46,7 @@
 
 static UTF32 unescape_unicode(const unsigned char *p)
 {
-    char b;
+    signed char b;
     UTF32 result = 0;
     b = digit_values[p[0]];
     if (b < 0) return UNI_REPLACEMENT_CHAR;
@@ -1676,10 +1676,8 @@
 
     if (json->symbolize_names && json->parsing_name) {
       *result = rb_str_intern(*result);
-    } else {
-          if (RB_TYPE_P(*result, T_STRING)) {
-              rb_str_resize(*result, RSTRING_LEN(*result));
-          }
+    } else if (RB_TYPE_P(*result, T_STRING)) {
+      rb_str_resize(*result, RSTRING_LEN(*result));
     }
     if (cs >= JSON_string_first_final) {
         return p + 1;
@@ -1835,7 +1833,7 @@
     } else {
         json->max_nesting = 100;
         json->allow_nan = 0;
-        json->create_additions = 1;
+        json->create_additions = 0;
         json->create_id = rb_funcall(mJSON, i_create_id, 0);
         json->object_class = Qnil;
         json->array_class = Qnil;
@@ -1850,7 +1848,7 @@
 }
 
 
-#line 1854 "parser.c"
+#line 1852 "parser.c"
 enum {JSON_start = 1};
 enum {JSON_first_final = 10};
 enum {JSON_error = 0};
@@ -1858,7 +1856,7 @@
 enum {JSON_en_main = 1};
 
 
-#line 762 "parser.rl"
+#line 760 "parser.rl"
 
 
 /*
@@ -1875,16 +1873,16 @@
   GET_PARSER;
 
 
-#line 1879 "parser.c"
+#line 1877 "parser.c"
        {
        cs = JSON_start;
        }
 
-#line 778 "parser.rl"
+#line 776 "parser.rl"
   p = json->source;
   pe = p + json->len;
 
-#line 1888 "parser.c"
+#line 1886 "parser.c"
        {
        if ( p == pe )
                goto _test_eof;
@@ -1918,7 +1916,7 @@
 cs = 0;
        goto _out;
 tr2:
-#line 754 "parser.rl"
+#line 752 "parser.rl"
        {
         char *np = JSON_parse_value(json, p, pe, &result, 0);
         if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( 
np))-1;}
@@ -1928,7 +1926,7 @@
        if ( ++p == pe )
                goto _test_eof10;
 case 10:
-#line 1932 "parser.c"
+#line 1930 "parser.c"
        switch( (*p) ) {
                case 13: goto st10;
                case 32: goto st10;
@@ -2017,7 +2015,7 @@
        _out: {}
        }
 
-#line 781 "parser.rl"
+#line 779 "parser.rl"
 
   if (cs >= JSON_first_final && p == pe) {
     return result;
@@ -2091,14 +2089,21 @@
     cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
     eParserError = rb_path2class("JSON::ParserError");
     eNestingError = rb_path2class("JSON::NestingError");
+    rb_gc_register_mark_object(eParserError);
+    rb_gc_register_mark_object(eNestingError);
     rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
     rb_define_method(cParser, "initialize", cParser_initialize, -1);
     rb_define_method(cParser, "parse", cParser_parse, 0);
     rb_define_method(cParser, "source", cParser_source, 0);
 
     CNaN = rb_const_get(mJSON, rb_intern("NaN"));
+    rb_gc_register_mark_object(CNaN);
+
     CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
+    rb_gc_register_mark_object(CInfinity);
+
     CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
+    rb_gc_register_mark_object(CMinusInfinity);
 
     i_json_creatable_p = rb_intern("json_creatable?");
     i_json_create = rb_intern("json_create");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ext/json/ext/parser/parser.rl 
new/ext/json/ext/parser/parser.rl
--- old/ext/json/ext/parser/parser.rl   2019-02-21 23:15:38.000000000 +0100
+++ new/ext/json/ext/parser/parser.rl   2020-03-25 02:58:01.000000000 +0100
@@ -25,7 +25,7 @@
 
 /* unicode */
 
-static const char digit_values[256] = {
+static const signed char digit_values[256] = {
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
@@ -44,7 +44,7 @@
 
 static UTF32 unescape_unicode(const unsigned char *p)
 {
-    char b;
+    signed char b;
     UTF32 result = 0;
     b = digit_values[p[0]];
     if (b < 0) return UNI_REPLACEMENT_CHAR;
@@ -571,10 +571,8 @@
 
     if (json->symbolize_names && json->parsing_name) {
       *result = rb_str_intern(*result);
-    } else {
-          if (RB_TYPE_P(*result, T_STRING)) {
-              rb_str_resize(*result, RSTRING_LEN(*result));
-          }
+    } else if (RB_TYPE_P(*result, T_STRING)) {
+      rb_str_resize(*result, RSTRING_LEN(*result));
     }
     if (cs >= JSON_string_first_final) {
         return p + 1;
@@ -730,7 +728,7 @@
     } else {
         json->max_nesting = 100;
         json->allow_nan = 0;
-        json->create_additions = 1;
+        json->create_additions = 0;
         json->create_id = rb_funcall(mJSON, i_create_id, 0);
         json->object_class = Qnil;
         json->array_class = Qnil;
@@ -851,14 +849,21 @@
     cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
     eParserError = rb_path2class("JSON::ParserError");
     eNestingError = rb_path2class("JSON::NestingError");
+    rb_gc_register_mark_object(eParserError);
+    rb_gc_register_mark_object(eNestingError);
     rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
     rb_define_method(cParser, "initialize", cParser_initialize, -1);
     rb_define_method(cParser, "parse", cParser_parse, 0);
     rb_define_method(cParser, "source", cParser_source, 0);
 
     CNaN = rb_const_get(mJSON, rb_intern("NaN"));
+    rb_gc_register_mark_object(CNaN);
+
     CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
+    rb_gc_register_mark_object(CInfinity);
+
     CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
+    rb_gc_register_mark_object(CMinusInfinity);
 
     i_json_creatable_p = rb_intern("json_creatable?");
     i_json_create = rb_intern("json_create");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/java/src/json/ext/Generator.java 
new/java/src/json/ext/Generator.java
--- old/java/src/json/ext/Generator.java        2019-02-21 23:15:38.000000000 
+0100
+++ new/java/src/json/ext/Generator.java        2020-03-25 02:58:01.000000000 
+0100
@@ -7,6 +7,7 @@
 
 import org.jruby.Ruby;
 import org.jruby.RubyArray;
+import org.jruby.RubyBasicObject;
 import org.jruby.RubyBignum;
 import org.jruby.RubyBoolean;
 import org.jruby.RubyClass;
@@ -15,6 +16,7 @@
 import org.jruby.RubyHash;
 import org.jruby.RubyNumeric;
 import org.jruby.RubyString;
+import org.jruby.runtime.ClassIndex;
 import org.jruby.runtime.ThreadContext;
 import org.jruby.runtime.builtin.IRubyObject;
 import org.jruby.util.ByteList;
@@ -57,6 +59,19 @@
         return handler.generateNew(session, object);
     }
 
+    // NOTE: drop this once Ruby 1.9.3 support is gone!
+    private static final int FIXNUM = 1;
+    private static final int BIGNUM = 2;
+    private static final int ARRAY = 3;
+    private static final int STRING = 4;
+    private static final int NIL = 5;
+    private static final int TRUE = 6;
+    private static final int FALSE = 7;
+    private static final int HASH = 10;
+    private static final int FLOAT = 11;
+    // hard-coded due JRuby 1.7 compatibility
+    // 
https://github.com/jruby/jruby/blob/1.7.27/core/src/main/java/org/jruby/runtime/ClassIndex.java
+
     /**
      * Returns the best serialization handler for the given object.
      */
@@ -65,16 +80,24 @@
     @SuppressWarnings("unchecked")
     private static <T extends IRubyObject>
             Handler<? super T> getHandlerFor(Ruby runtime, T object) {
-        RubyClass metaClass = object.getMetaClass();
-        if (metaClass == runtime.getString()) return (Handler)STRING_HANDLER;
-        if (metaClass == runtime.getFixnum()) return (Handler)FIXNUM_HANDLER;
-        if (metaClass == runtime.getHash())   return (Handler)HASH_HANDLER;
-        if (metaClass == runtime.getArray())  return (Handler)ARRAY_HANDLER;
-        if (object.isNil())                   return (Handler)NIL_HANDLER;
-        if (object == runtime.getTrue())      return (Handler)TRUE_HANDLER;
-        if (object == runtime.getFalse())     return (Handler)FALSE_HANDLER;
-        if (metaClass == runtime.getFloat())  return (Handler)FLOAT_HANDLER;
-        if (metaClass == runtime.getBignum()) return (Handler)BIGNUM_HANDLER;
+        switch (((RubyBasicObject) object).getNativeTypeIndex()) {
+            // can not use getNativeClassIndex due 1.7 compatibility
+            case NIL    : return (Handler) NIL_HANDLER;
+            case TRUE   : return (Handler) TRUE_HANDLER;
+            case FALSE  : return (Handler) FALSE_HANDLER;
+            case FLOAT  : return (Handler) FLOAT_HANDLER;
+            case FIXNUM : return (Handler) FIXNUM_HANDLER;
+            case BIGNUM : return (Handler) BIGNUM_HANDLER;
+            case STRING :
+                if (((RubyBasicObject) object).getMetaClass() != 
runtime.getString()) break;
+                return (Handler) STRING_HANDLER;
+            case ARRAY  :
+                if (((RubyBasicObject) object).getMetaClass() != 
runtime.getArray()) break;
+                return (Handler) ARRAY_HANDLER;
+            case HASH   :
+                if (((RubyBasicObject) object).getMetaClass() != 
runtime.getHash()) break;
+                return (Handler) HASH_HANDLER;
+        }
         return GENERIC_HANDLER;
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/json-java.gemspec new/json-java.gemspec
--- old/json-java.gemspec       2019-02-21 23:15:38.000000000 +0100
+++ new/json-java.gemspec       2020-03-25 02:58:01.000000000 +0100
@@ -8,9 +8,8 @@
   s.description = "A JSON implementation as a JRuby extension."
   s.author = "Daniel Luz"
   s.email = "dev+r...@mernen.com"
-  s.homepage = "http://json-jruby.rubyforge.org/";
+  s.homepage = "http://flori.github.com/json";
   s.platform = 'java'
-  s.rubyforge_project = "json-jruby"
   s.licenses = ["Ruby"]
 
   s.files = Dir["{docs,lib,tests}/**/*"]
Binary files old/json.gemspec and new/json.gemspec differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/json_pure.gemspec new/json_pure.gemspec
--- old/json_pure.gemspec       2019-02-21 23:15:38.000000000 +0100
+++ new/json_pure.gemspec       2020-03-25 02:58:01.000000000 +0100
@@ -1,23 +1,23 @@
 # -*- encoding: utf-8 -*-
-# stub: json_pure 2.2.0 ruby lib
+# stub: json_pure 2.3.0 ruby lib
 
 Gem::Specification.new do |s|
   s.name = "json_pure".freeze
-  s.version = "2.2.0"
+  s.version = "2.3.0"
 
   s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if 
s.respond_to? :required_rubygems_version=
   s.require_paths = ["lib".freeze]
   s.authors = ["Florian Frank".freeze]
-  s.date = "2019-02-21"
+  s.date = "2019-12-11"
   s.description = "This is a JSON implementation in pure Ruby.".freeze
   s.email = "fl...@ping.de".freeze
   s.extra_rdoc_files = ["README.md".freeze]
-  s.files = ["./tests/test_helper.rb".freeze, ".gitignore".freeze, 
".travis.yml".freeze, "CHANGES.md".freeze, "Gemfile".freeze, 
"README-json-jruby.md".freeze, "README.md".freeze, "Rakefile".freeze, 
"VERSION".freeze, "data/example.json".freeze, "data/index.html".freeze, 
"data/prototype.js".freeze, "diagrams/.keep".freeze, 
"ext/json/ext/fbuffer/fbuffer.h".freeze, 
"ext/json/ext/generator/depend".freeze, 
"ext/json/ext/generator/extconf.rb".freeze, 
"ext/json/ext/generator/generator.c".freeze, 
"ext/json/ext/generator/generator.h".freeze, 
"ext/json/ext/parser/depend".freeze, "ext/json/ext/parser/extconf.rb".freeze, 
"ext/json/ext/parser/parser.c".freeze, "ext/json/ext/parser/parser.h".freeze, 
"ext/json/ext/parser/parser.rl".freeze, "ext/json/extconf.rb".freeze, 
"install.rb".freeze, "java/src/json/ext/ByteListTranscoder.java".freeze, 
"java/src/json/ext/Generator.java".freeze, 
"java/src/json/ext/GeneratorMethods.java".freeze, 
"java/src/json/ext/GeneratorService.java".freeze, 
"java/src/json/ext/GeneratorState.java".freeze, 
"java/src/json/ext/OptionsReader.java".freeze, 
"java/src/json/ext/Parser.java".freeze, "java/src/json/ext/Parser.rl".freeze, 
"java/src/json/ext/ParserService.java".freeze, 
"java/src/json/ext/RuntimeInfo.java".freeze, 
"java/src/json/ext/StringDecoder.java".freeze, 
"java/src/json/ext/StringEncoder.java".freeze, 
"java/src/json/ext/Utils.java".freeze, "json-java.gemspec".freeze, 
"json.gemspec".freeze, "json_pure.gemspec".freeze, "lib/json.rb".freeze, 
"lib/json/add/bigdecimal.rb".freeze, "lib/json/add/complex.rb".freeze, 
"lib/json/add/core.rb".freeze, "lib/json/add/date.rb".freeze, 
"lib/json/add/date_time.rb".freeze, "lib/json/add/exception.rb".freeze, 
"lib/json/add/ostruct.rb".freeze, "lib/json/add/range.rb".freeze, 
"lib/json/add/rational.rb".freeze, "lib/json/add/regexp.rb".freeze, 
"lib/json/add/set.rb".freeze, "lib/json/add/struct.rb".freeze, 
"lib/json/add/symbol.rb".freeze, "lib/json/add/time.rb".freeze, 
"lib/json/common.rb".freeze, "lib/json/ext.rb".freeze, 
"lib/json/ext/.keep".freeze, "lib/json/generic_object.rb".freeze, 
"lib/json/pure.rb".freeze, "lib/json/pure/generator.rb".freeze, 
"lib/json/pure/parser.rb".freeze, "lib/json/version.rb".freeze, 
"references/rfc7159.txt".freeze, "tests/fixtures/fail10.json".freeze, 
"tests/fixtures/fail11.json".freeze, "tests/fixtures/fail12.json".freeze, 
"tests/fixtures/fail13.json".freeze, "tests/fixtures/fail14.json".freeze, 
"tests/fixtures/fail18.json".freeze, "tests/fixtures/fail19.json".freeze, 
"tests/fixtures/fail2.json".freeze, "tests/fixtures/fail20.json".freeze, 
"tests/fixtures/fail21.json".freeze, "tests/fixtures/fail22.json".freeze, 
"tests/fixtures/fail23.json".freeze, "tests/fixtures/fail24.json".freeze, 
"tests/fixtures/fail25.json".freeze, "tests/fixtures/fail27.json".freeze, 
"tests/fixtures/fail28.json".freeze, "tests/fixtures/fail3.json".freeze, 
"tests/fixtures/fail4.json".freeze, "tests/fixtures/fail5.json".freeze, 
"tests/fixtures/fail6.json".freeze, "tests/fixtures/fail7.json".freeze, 
"tests/fixtures/fail8.json".freeze, "tests/fixtures/fail9.json".freeze, 
"tests/fixtures/obsolete_fail1.json".freeze, 
"tests/fixtures/pass1.json".freeze, "tests/fixtures/pass15.json".freeze, 
"tests/fixtures/pass16.json".freeze, "tests/fixtures/pass17.json".freeze, 
"tests/fixtures/pass2.json".freeze, "tests/fixtures/pass26.json".freeze, 
"tests/fixtures/pass3.json".freeze, "tests/json_addition_test.rb".freeze, 
"tests/json_common_interface_test.rb".freeze, 
"tests/json_encoding_test.rb".freeze, "tests/json_ext_parser_test.rb".freeze, 
"tests/json_fixtures_test.rb".freeze, "tests/json_generator_test.rb".freeze, 
"tests/json_generic_object_test.rb".freeze, "tests/json_parser_test.rb".freeze, 
"tests/json_string_matching_test.rb".freeze, "tests/test_helper.rb".freeze, 
"tools/diff.sh".freeze, "tools/fuzz.rb".freeze, "tools/server.rb".freeze]
+  s.files = ["./tests/test_helper.rb".freeze, ".gitignore".freeze, 
".travis.yml".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, 
"README-json-jruby.md".freeze, "README.md".freeze, "Rakefile".freeze, 
"VERSION".freeze, "diagrams/.keep".freeze, 
"ext/json/ext/fbuffer/fbuffer.h".freeze, 
"ext/json/ext/generator/depend".freeze, 
"ext/json/ext/generator/extconf.rb".freeze, 
"ext/json/ext/generator/generator.c".freeze, 
"ext/json/ext/generator/generator.h".freeze, 
"ext/json/ext/parser/depend".freeze, "ext/json/ext/parser/extconf.rb".freeze, 
"ext/json/ext/parser/parser.c".freeze, "ext/json/ext/parser/parser.h".freeze, 
"ext/json/ext/parser/parser.rl".freeze, "ext/json/extconf.rb".freeze, 
"install.rb".freeze, "java/src/json/ext/ByteListTranscoder.java".freeze, 
"java/src/json/ext/Generator.java".freeze, 
"java/src/json/ext/GeneratorMethods.java".freeze, 
"java/src/json/ext/GeneratorService.java".freeze, 
"java/src/json/ext/GeneratorState.java".freeze, 
"java/src/json/ext/OptionsReader.java".freeze, 
"java/src/json/ext/Parser.java".freeze, "java/src/json/ext/Parser.rl".freeze, 
"java/src/json/ext/ParserService.java".freeze, 
"java/src/json/ext/RuntimeInfo.java".freeze, 
"java/src/json/ext/StringDecoder.java".freeze, 
"java/src/json/ext/StringEncoder.java".freeze, 
"java/src/json/ext/Utils.java".freeze, "json-java.gemspec".freeze, 
"json.gemspec".freeze, "json_pure.gemspec".freeze, "lib/json.rb".freeze, 
"lib/json/add/bigdecimal.rb".freeze, "lib/json/add/complex.rb".freeze, 
"lib/json/add/core.rb".freeze, "lib/json/add/date.rb".freeze, 
"lib/json/add/date_time.rb".freeze, "lib/json/add/exception.rb".freeze, 
"lib/json/add/ostruct.rb".freeze, "lib/json/add/range.rb".freeze, 
"lib/json/add/rational.rb".freeze, "lib/json/add/regexp.rb".freeze, 
"lib/json/add/set.rb".freeze, "lib/json/add/struct.rb".freeze, 
"lib/json/add/symbol.rb".freeze, "lib/json/add/time.rb".freeze, 
"lib/json/common.rb".freeze, "lib/json/ext.rb".freeze, 
"lib/json/ext/.keep".freeze, "lib/json/generic_object.rb".freeze, 
"lib/json/pure.rb".freeze, "lib/json/pure/generator.rb".freeze, 
"lib/json/pure/parser.rb".freeze, "lib/json/version.rb".freeze, 
"references/rfc7159.txt".freeze, "tests/fixtures/fail10.json".freeze, 
"tests/fixtures/fail11.json".freeze, "tests/fixtures/fail12.json".freeze, 
"tests/fixtures/fail13.json".freeze, "tests/fixtures/fail14.json".freeze, 
"tests/fixtures/fail18.json".freeze, "tests/fixtures/fail19.json".freeze, 
"tests/fixtures/fail2.json".freeze, "tests/fixtures/fail20.json".freeze, 
"tests/fixtures/fail21.json".freeze, "tests/fixtures/fail22.json".freeze, 
"tests/fixtures/fail23.json".freeze, "tests/fixtures/fail24.json".freeze, 
"tests/fixtures/fail25.json".freeze, "tests/fixtures/fail27.json".freeze, 
"tests/fixtures/fail28.json".freeze, "tests/fixtures/fail3.json".freeze, 
"tests/fixtures/fail4.json".freeze, "tests/fixtures/fail5.json".freeze, 
"tests/fixtures/fail6.json".freeze, "tests/fixtures/fail7.json".freeze, 
"tests/fixtures/fail8.json".freeze, "tests/fixtures/fail9.json".freeze, 
"tests/fixtures/obsolete_fail1.json".freeze, 
"tests/fixtures/pass1.json".freeze, "tests/fixtures/pass15.json".freeze, 
"tests/fixtures/pass16.json".freeze, "tests/fixtures/pass17.json".freeze, 
"tests/fixtures/pass2.json".freeze, "tests/fixtures/pass26.json".freeze, 
"tests/fixtures/pass3.json".freeze, "tests/json_addition_test.rb".freeze, 
"tests/json_common_interface_test.rb".freeze, 
"tests/json_encoding_test.rb".freeze, "tests/json_ext_parser_test.rb".freeze, 
"tests/json_fixtures_test.rb".freeze, "tests/json_generator_test.rb".freeze, 
"tests/json_generic_object_test.rb".freeze, "tests/json_parser_test.rb".freeze, 
"tests/json_string_matching_test.rb".freeze, "tests/test_helper.rb".freeze, 
"tools/diff.sh".freeze, "tools/fuzz.rb".freeze, "tools/server.rb".freeze]
   s.homepage = "http://flori.github.com/json".freeze
   s.licenses = ["Ruby".freeze]
   s.rdoc_options = ["--title".freeze, "JSON implemention for ruby".freeze, 
"--main".freeze, "README.md".freeze]
   s.required_ruby_version = Gem::Requirement.new(">= 1.9".freeze)
-  s.rubygems_version = "2.7.6".freeze
+  s.rubygems_version = "3.0.3".freeze
   s.summary = "JSON Implementation for Ruby".freeze
   s.test_files = ["./tests/test_helper.rb".freeze]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/add/bigdecimal.rb 
new/lib/json/add/bigdecimal.rb
--- old/lib/json/add/bigdecimal.rb      2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/add/bigdecimal.rb      2020-03-25 02:58:01.000000000 +0100
@@ -23,7 +23,7 @@
   end
 
   # return the JSON value
-  def to_json(*)
-    as_json.to_json
+  def to_json(*args)
+    as_json.to_json(*args)
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/add/complex.rb new/lib/json/add/complex.rb
--- old/lib/json/add/complex.rb 2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/add/complex.rb 2020-03-25 02:58:01.000000000 +0100
@@ -23,7 +23,7 @@
   end
 
   # Stores class name (Complex) along with real value <tt>r</tt> and imaginary 
value <tt>i</tt> as JSON string
-  def to_json(*)
-    as_json.to_json
+  def to_json(*args)
+    as_json.to_json(*args)
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/add/rational.rb new/lib/json/add/rational.rb
--- old/lib/json/add/rational.rb        2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/add/rational.rb        2020-03-25 02:58:01.000000000 +0100
@@ -22,7 +22,7 @@
   end
 
   # Stores class name (Rational) along with numerator value <tt>n</tt> and 
denominator value <tt>d</tt> as JSON string
-  def to_json(*)
-    as_json.to_json
+  def to_json(*args)
+    as_json.to_json(*args)
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/add/regexp.rb new/lib/json/add/regexp.rb
--- old/lib/json/add/regexp.rb  2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/add/regexp.rb  2020-03-25 02:58:01.000000000 +0100
@@ -24,7 +24,7 @@
 
   # Stores class name (Regexp) with options <tt>o</tt> and source <tt>s</tt>
   # (Regexp or String) as JSON string
-  def to_json(*)
-    as_json.to_json
+  def to_json(*args)
+    as_json.to_json(*args)
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/common.rb new/lib/json/common.rb
--- old/lib/json/common.rb      2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/common.rb      2020-03-25 02:58:01.000000000 +0100
@@ -153,7 +153,7 @@
   # * *object_class*: Defaults to Hash
   # * *array_class*: Defaults to Array
   def parse(source, opts = {})
-    Parser.new(source, opts).parse
+    Parser.new(source, **(opts||{})).parse
   end
 
   # Parse the JSON document _source_ into a Ruby data structure and return it.
@@ -176,7 +176,7 @@
       :max_nesting  => false,
       :allow_nan    => true
     }.merge(opts)
-    Parser.new(source, opts).parse
+    Parser.new(source, **(opts||{})).parse
   end
 
   # Generate a JSON document from the Ruby data structure _obj_ and return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/pure/generator.rb 
new/lib/json/pure/generator.rb
--- old/lib/json/pure/generator.rb      2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/pure/generator.rb      2020-03-25 02:58:01.000000000 +0100
@@ -250,7 +250,8 @@
           if respond_to?(name)
             __send__(name)
           else
-            instance_variable_get("@#{name}")
+            instance_variable_get("@#{name}") if
+              instance_variables.include?("@#{name}".to_sym) # avoid warning
           end
         end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/pure/parser.rb new/lib/json/pure/parser.rb
--- old/lib/json/pure/parser.rb 2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/pure/parser.rb 2020-03-25 02:58:01.000000000 +0100
@@ -197,7 +197,15 @@
       def parse_value
         case
         when scan(FLOAT)
-          @decimal_class && @decimal_class.new(self[1]) || Float(self[1])
+          if @decimal_class then
+            if @decimal_class == BigDecimal then
+              BigDecimal(self[1])
+            else
+              @decimal_class.new(self[1]) || Float(self[1])
+            end
+          else
+            Float(self[1])
+          end
         when scan(INTEGER)
           Integer(self[1])
         when scan(TRUE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/json/version.rb new/lib/json/version.rb
--- old/lib/json/version.rb     2019-02-21 23:15:38.000000000 +0100
+++ new/lib/json/version.rb     2020-03-25 02:58:01.000000000 +0100
@@ -1,7 +1,7 @@
 # frozen_string_literal: false
 module JSON
   # JSON version
-  VERSION         = '2.2.0'
+  VERSION         = '2.3.0'
   VERSION_ARRAY   = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
   VERSION_MAJOR   = VERSION_ARRAY[0] # :nodoc:
   VERSION_MINOR   = VERSION_ARRAY[1] # :nodoc:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata        2019-02-21 23:15:38.000000000 +0100
+++ new/metadata        2020-03-25 02:58:01.000000000 +0100
@@ -1,14 +1,14 @@
 --- !ruby/object:Gem::Specification
 name: json_pure
 version: !ruby/object:Gem::Version
-  version: 2.2.0
+  version: 2.3.0
 platform: ruby
 authors:
 - Florian Frank
 autorequire: 
 bindir: bin
 cert_chain: []
-date: 2019-02-21 00:00:00.000000000 Z
+date: 2019-12-11 00:00:00.000000000 Z
 dependencies:
 - !ruby/object:Gem::Dependency
   name: rake
@@ -50,6 +50,7 @@
 - ".travis.yml"
 - CHANGES.md
 - Gemfile
+- LICENSE
 - README-json-jruby.md
 - README.md
 - Rakefile
@@ -174,7 +175,7 @@
     - !ruby/object:Gem::Version
       version: '0'
 requirements: []
-rubygems_version: 3.0.2
+rubygems_version: 3.1.2
 signing_key: 
 specification_version: 4
 summary: JSON Implementation for Ruby
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tests/json_common_interface_test.rb 
new/tests/json_common_interface_test.rb
--- old/tests/json_common_interface_test.rb     2019-02-21 23:15:38.000000000 
+0100
+++ new/tests/json_common_interface_test.rb     2020-03-25 02:58:01.000000000 
+0100
@@ -27,15 +27,15 @@
   end
 
   def test_parser
-    assert_match /::Parser\z/, JSON.parser.name
+    assert_match(/::Parser\z/, JSON.parser.name)
   end
 
   def test_generator
-    assert_match /::Generator\z/, JSON.generator.name
+    assert_match(/::Generator\z/, JSON.generator.name)
   end
 
   def test_state
-    assert_match /::Generator::State\z/, JSON.state.name
+    assert_match(/::Generator::State\z/, JSON.state.name)
   end
 
   def test_create_id
@@ -56,7 +56,7 @@
   end
 
   def test_parse_bang
-    assert_equal [ 1, NaN, 3, ], JSON.parse!('[ 1, NaN, 3 ]')
+    assert_equal [ 1, Infinity, 3, ], JSON.parse!('[ 1, Infinity, 3 ]')
   end
 
   def test_generate
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tests/json_generator_test.rb 
new/tests/json_generator_test.rb
--- old/tests/json_generator_test.rb    2019-02-21 23:15:38.000000000 +0100
+++ new/tests/json_generator_test.rb    2020-03-25 02:58:01.000000000 +0100
@@ -40,6 +40,44 @@
 EOT
   end
 
+  def silence
+    v = $VERBOSE
+    $VERBOSE = nil
+    yield
+  ensure
+    $VERBOSE = v
+  end
+
+  def test_remove_const_segv
+    return if RUBY_ENGINE == 'jruby'
+    stress = GC.stress
+    const = JSON::SAFE_STATE_PROTOTYPE.dup
+
+    bignum_too_long_to_embed_as_string = 1234567890123456789012345
+    expect = bignum_too_long_to_embed_as_string.to_s
+    GC.stress = true
+
+    10.times do |i|
+      tmp = bignum_too_long_to_embed_as_string.to_json
+      raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
+    end
+
+    silence do
+      JSON.const_set :SAFE_STATE_PROTOTYPE, nil
+    end
+
+    10.times do |i|
+      assert_raise TypeError do
+        bignum_too_long_to_embed_as_string.to_json
+      end
+    end
+  ensure
+    GC.stress = stress
+    silence do
+      JSON.const_set :SAFE_STATE_PROTOTYPE, const
+    end
+  end if JSON.const_defined?("Ext")
+
   def test_generate
     json = generate(@hash)
     assert_equal(parse(@json2), parse(json))
@@ -374,4 +412,10 @@
       assert_equal '["foo"]', JSON.generate([s.new('foo')])
     end
   end
+
+  if defined?(Encoding)
+    def test_nonutf8_encoding
+      assert_equal("\"5\u{b0}\"", "5\xb0".force_encoding("iso-8859-1").to_json)
+    end
+  end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tests/json_parser_test.rb 
new/tests/json_parser_test.rb
--- old/tests/json_parser_test.rb       2019-02-21 23:15:38.000000000 +0100
+++ new/tests/json_parser_test.rb       2020-03-25 02:58:01.000000000 +0100
@@ -91,27 +91,27 @@
     assert_raise(JSON::ParserError) { parse('+23') }
     assert_raise(JSON::ParserError) { parse('.23') }
     assert_raise(JSON::ParserError) { parse('023') }
-    assert_equal 23, parse('23')
-    assert_equal -23, parse('-23')
-    assert_equal_float 3.141, parse('3.141')
-    assert_equal_float -3.141, parse('-3.141')
-    assert_equal_float 3.141, parse('3141e-3')
-    assert_equal_float 3.141, parse('3141.1e-3')
-    assert_equal_float 3.141, parse('3141E-3')
-    assert_equal_float 3.141, parse('3141.0E-3')
-    assert_equal_float -3.141, parse('-3141.0e-3')
-    assert_equal_float -3.141, parse('-3141e-3')
+    assert_equal(23, parse('23'))
+    assert_equal(-23, parse('-23'))
+    assert_equal_float(3.141, parse('3.141'))
+    assert_equal_float(-3.141, parse('-3.141'))
+    assert_equal_float(3.141, parse('3141e-3'))
+    assert_equal_float(3.141, parse('3141.1e-3'))
+    assert_equal_float(3.141, parse('3141E-3'))
+    assert_equal_float(3.141, parse('3141.0E-3'))
+    assert_equal_float(-3.141, parse('-3141.0e-3'))
+    assert_equal_float(-3.141, parse('-3141e-3'))
     assert_raise(ParserError) { parse('NaN') }
     assert parse('NaN', :allow_nan => true).nan?
     assert_raise(ParserError) { parse('Infinity') }
-    assert_equal 1.0/0, parse('Infinity', :allow_nan => true)
+    assert_equal(1.0/0, parse('Infinity', :allow_nan => true))
     assert_raise(ParserError) { parse('-Infinity') }
-    assert_equal -1.0/0, parse('-Infinity', :allow_nan => true)
+    assert_equal(-1.0/0, parse('-Infinity', :allow_nan => true))
   end
 
   def test_parse_bigdecimals
-    assert_equal(BigDecimal,                                 
JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: 
BigDecimal)["foo"].class)
-    
assert_equal(BigDecimal.new("0.901234567890123456789E1"),JSON.parse('{"foo": 
9.01234567890123456789}', decimal_class: BigDecimal)["foo"]      )
+    assert_equal(BigDecimal,                             JSON.parse('{"foo": 
9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
+    assert_equal(BigDecimal("0.901234567890123456789E1"),JSON.parse('{"foo": 
9.01234567890123456789}', decimal_class: BigDecimal)["foo"]      )
   end
 
   if Array.method_defined?(:permutation)


Reply via email to