json_pure 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08028c4e7729dcf45631d4654799aa31280e1fb172ae74ff05a5c5fa85cbefc8'
4
- data.tar.gz: 5845322c2daa41d815c4b845c6561d2addf86b459a5c093590317210d6d85901
3
+ metadata.gz: fab9422e98859d78988b32e0b4bd32de3f12265967d142a623853a90a7640b29
4
+ data.tar.gz: b8d15790e812a4e3a22bab7c935c9a3e70a4ad303e61e949a229773f51c357b2
5
5
  SHA512:
6
- metadata.gz: 5ff74c77b754fd54e11516c7986f975c262c385d6dc4b00a6db23b942c241a3bb546c77cb20abf23ab2ee4ab8aca53a74584ebfe279a3972ada969c0388e3ab0
7
- data.tar.gz: e74601af87a7ec32952fd596b4981b0d26c4f96ddb88979a26b2fb06604dff204d38ba7c120cd0389756edb83cbd81b6fc569d16f5f7740b8b2915d63cdc8f22
6
+ metadata.gz: 90bc0dd8e8ed6a061f201483568751ca2b4e6ab020d1cfe398c9f28fafc973d8715f3f798c36d064e3cadb7da14216855ea7e6c57b9d635cb8c4ac6006e2b817
7
+ data.tar.gz: 8a20ce759eaafdb7f933c1d4265144785fc212e27dc50ab0bb25b5d0337c11807e1c3f2107e2ccfa4a4b117714f3737c199904ce28ca993ff4284d8ebb38ad0d
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ Gemfile.lock
15
15
  */**/Makefile
16
16
  */**/*.o
17
17
  .byebug_history
18
+ *.log
@@ -4,7 +4,6 @@ language: ruby
4
4
 
5
5
  # Specify which ruby versions you wish to run your tests on, each version will be used
6
6
  rvm:
7
- - 1.9.3
8
7
  - 2.0.0
9
8
  - 2.1
10
9
  - 2.2
@@ -12,12 +11,14 @@ rvm:
12
11
  - 2.4
13
12
  - 2.5
14
13
  - 2.6
14
+ - 2.7.0-preview3
15
15
  - ruby-head
16
16
  - jruby
17
+ - jruby-9.2.7.0
17
18
  matrix:
18
19
  allow_failures:
19
- - rvm: 1.9.3
20
20
  - rvm: ruby-head
21
21
  - rvm: jruby
22
+ - rvm: jruby-9.2.7.0
22
23
  script: "bundle exec rake"
23
24
  sudo: false
data/LICENSE ADDED
@@ -0,0 +1,56 @@
1
+ Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
2
+ You can redistribute it and/or modify it under either the terms of the
3
+ 2-clause BSDL (see the file BSDL), or the conditions below:
4
+
5
+ 1. You may make and give away verbatim copies of the source form of the
6
+ software without restriction, provided that you duplicate all of the
7
+ original copyright notices and associated disclaimers.
8
+
9
+ 2. You may modify your copy of the software in any way, provided that
10
+ you do at least ONE of the following:
11
+
12
+ a) place your modifications in the Public Domain or otherwise
13
+ make them Freely Available, such as by posting said
14
+ modifications to Usenet or an equivalent medium, or by allowing
15
+ the author to include your modifications in the software.
16
+
17
+ b) use the modified software only within your corporation or
18
+ organization.
19
+
20
+ c) give non-standard binaries non-standard names, with
21
+ instructions on where to get the original software distribution.
22
+
23
+ d) make other distribution arrangements with the author.
24
+
25
+ 3. You may distribute the software in object code or binary form,
26
+ provided that you do at least ONE of the following:
27
+
28
+ a) distribute the binaries and library files of the software,
29
+ together with instructions (in the manual page or equivalent)
30
+ on where to get the original distribution.
31
+
32
+ b) accompany the distribution with the machine-readable source of
33
+ the software.
34
+
35
+ c) give non-standard binaries non-standard names, with
36
+ instructions on where to get the original software distribution.
37
+
38
+ d) make other distribution arrangements with the author.
39
+
40
+ 4. You may modify and include the part of the software into any other
41
+ software (possibly commercial). But some files in the distribution
42
+ are not written by the author, so that they are not under these terms.
43
+
44
+ For the list of those files and their copying conditions, see the
45
+ file LEGAL.
46
+
47
+ 5. The scripts and library files supplied as input to or produced as
48
+ output from the software do not automatically fall under the
49
+ copyright of the software, but belong to whomever generated them,
50
+ and may be sold commercially, and may be aggregated with this
51
+ software.
52
+
53
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
54
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
55
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56
+ PURPOSE.
data/README.md CHANGED
@@ -406,4 +406,4 @@ The latest version of this library can be downloaded at
406
406
 
407
407
  Online Documentation should be located at
408
408
 
409
- * http://json.rubyforge.org
409
+ * https://www.rubydoc.info/gems/json
data/Rakefile CHANGED
@@ -23,8 +23,13 @@ class UndocumentedTestTask < Rake::TestTask
23
23
  def desc(*) end
24
24
  end
25
25
 
26
- MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') }
27
- BUNDLE = ENV['BUNDLE'] || %w[bundle].find { |c| system(c, '-v') }
26
+ which = lambda { |c|
27
+ w = `which #{c}`
28
+ break w.chomp unless w.empty?
29
+ }
30
+
31
+ MAKE = ENV['MAKE'] || %w[gmake make].find(&which)
32
+ BUNDLE = ENV['BUNDLE'] || %w[bundle].find(&which)
28
33
  PKG_NAME = 'json'
29
34
  PKG_TITLE = 'JSON Implementation for Ruby'
30
35
  PKG_VERSION = File.read('VERSION').chomp
@@ -47,8 +52,8 @@ JAVA_CLASSES = []
47
52
  JRUBY_PARSER_JAR = File.expand_path("lib/json/ext/parser.jar")
48
53
  JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar")
49
54
 
50
- RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') }
51
- RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') }
55
+ RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find(&which)
56
+ RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find(&which)
52
57
 
53
58
  desc "Installing library (pure)"
54
59
  task :install_pure => :version do
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.3.0
@@ -15,7 +15,7 @@ static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
15
15
  #endif
16
16
  mFloat, mString, mString_Extend,
17
17
  mTrueClass, mFalseClass, mNilClass, eGeneratorError,
18
- eNestingError, CRegexp_MULTILINE, CJSON_SAFE_STATE_PROTOTYPE,
18
+ eNestingError,
19
19
  i_SAFE_STATE_PROTOTYPE;
20
20
 
21
21
  static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
@@ -237,6 +237,7 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string)
237
237
  int escape_len;
238
238
  unsigned char c;
239
239
  char buf[6] = { '\\', 'u' };
240
+ int ascii_only = rb_enc_str_asciionly_p(string);
240
241
 
241
242
  for (start = 0, end = 0; end < len;) {
242
243
  p = ptr + end;
@@ -281,14 +282,17 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string)
281
282
  break;
282
283
  default:
283
284
  {
284
- unsigned short clen = trailingBytesForUTF8[c] + 1;
285
- if (end + clen > len) {
286
- rb_raise(rb_path2class("JSON::GeneratorError"),
287
- "partial character in source, but hit end");
288
- }
289
- if (!isLegalUTF8((UTF8 *) p, clen)) {
290
- rb_raise(rb_path2class("JSON::GeneratorError"),
291
- "source sequence is illegal/malformed utf-8");
285
+ unsigned short clen = 1;
286
+ if (!ascii_only) {
287
+ clen += trailingBytesForUTF8[c];
288
+ if (end + clen > len) {
289
+ rb_raise(rb_path2class("JSON::GeneratorError"),
290
+ "partial character in source, but hit end");
291
+ }
292
+ if (!isLegalUTF8((UTF8 *) p, clen)) {
293
+ rb_raise(rb_path2class("JSON::GeneratorError"),
294
+ "source sequence is illegal/malformed utf-8");
295
+ }
292
296
  }
293
297
  end += clen;
294
298
  }
@@ -692,7 +696,7 @@ static VALUE cState_aref(VALUE self, VALUE name)
692
696
  if (RTEST(rb_funcall(self, i_respond_to_p, 1, name))) {
693
697
  return rb_funcall(self, i_send, 1, name);
694
698
  } else {
695
- return rb_ivar_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name)));
699
+ return rb_attr_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name)));
696
700
  }
697
701
  }
698
702
 
@@ -715,43 +719,83 @@ static VALUE cState_aset(VALUE self, VALUE name, VALUE value)
715
719
  return Qnil;
716
720
  }
717
721
 
718
- static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
722
+ struct hash_foreach_arg {
723
+ FBuffer *buffer;
724
+ JSON_Generator_State *state;
725
+ VALUE Vstate;
726
+ int iter;
727
+ };
728
+
729
+ static int
730
+ json_object_i(VALUE key, VALUE val, VALUE _arg)
719
731
  {
732
+ struct hash_foreach_arg *arg = (struct hash_foreach_arg *)_arg;
733
+ FBuffer *buffer = arg->buffer;
734
+ JSON_Generator_State *state = arg->state;
735
+ VALUE Vstate = arg->Vstate;
736
+
720
737
  char *object_nl = state->object_nl;
721
738
  long object_nl_len = state->object_nl_len;
722
739
  char *indent = state->indent;
723
740
  long indent_len = state->indent_len;
724
- long max_nesting = state->max_nesting;
725
741
  char *delim = FBUFFER_PTR(state->object_delim);
726
742
  long delim_len = FBUFFER_LEN(state->object_delim);
727
743
  char *delim2 = FBUFFER_PTR(state->object_delim2);
728
744
  long delim2_len = FBUFFER_LEN(state->object_delim2);
745
+ long depth = state->depth;
746
+ int j;
747
+ VALUE klass, key_to_s;
748
+
749
+ if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len);
750
+ if (object_nl) {
751
+ fbuffer_append(buffer, object_nl, object_nl_len);
752
+ }
753
+ if (indent) {
754
+ for (j = 0; j < depth; j++) {
755
+ fbuffer_append(buffer, indent, indent_len);
756
+ }
757
+ }
758
+
759
+ klass = CLASS_OF(key);
760
+ if (klass == rb_cString) {
761
+ key_to_s = key;
762
+ } else if (klass == rb_cSymbol) {
763
+ key_to_s = rb_id2str(SYM2ID(key));
764
+ } else {
765
+ key_to_s = rb_funcall(key, i_to_s, 0);
766
+ }
767
+ Check_Type(key_to_s, T_STRING);
768
+ generate_json(buffer, Vstate, state, key_to_s);
769
+ fbuffer_append(buffer, delim2, delim2_len);
770
+ generate_json(buffer, Vstate, state, val);
771
+
772
+ arg->iter++;
773
+ return ST_CONTINUE;
774
+ }
775
+
776
+ static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
777
+ {
778
+ char *object_nl = state->object_nl;
779
+ long object_nl_len = state->object_nl_len;
780
+ char *indent = state->indent;
781
+ long indent_len = state->indent_len;
782
+ long max_nesting = state->max_nesting;
729
783
  long depth = ++state->depth;
730
- int i, j;
731
- VALUE key, key_to_s, keys;
784
+ int j;
785
+ struct hash_foreach_arg arg;
786
+
732
787
  if (max_nesting != 0 && depth > max_nesting) {
733
788
  fbuffer_free(buffer);
734
789
  rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
735
790
  }
736
791
  fbuffer_append_char(buffer, '{');
737
- keys = rb_funcall(obj, i_keys, 0);
738
- for(i = 0; i < RARRAY_LEN(keys); i++) {
739
- if (i > 0) fbuffer_append(buffer, delim, delim_len);
740
- if (object_nl) {
741
- fbuffer_append(buffer, object_nl, object_nl_len);
742
- }
743
- if (indent) {
744
- for (j = 0; j < depth; j++) {
745
- fbuffer_append(buffer, indent, indent_len);
746
- }
747
- }
748
- key = rb_ary_entry(keys, i);
749
- key_to_s = rb_funcall(key, i_to_s, 0);
750
- Check_Type(key_to_s, T_STRING);
751
- generate_json(buffer, Vstate, state, key_to_s);
752
- fbuffer_append(buffer, delim2, delim2_len);
753
- generate_json(buffer, Vstate, state, rb_hash_aref(obj, key));
754
- }
792
+
793
+ arg.buffer = buffer;
794
+ arg.state = state;
795
+ arg.Vstate = Vstate;
796
+ arg.iter = 0;
797
+ rb_hash_foreach(obj, json_object_i, (VALUE)&arg);
798
+
755
799
  depth = --state->depth;
756
800
  if (object_nl) {
757
801
  fbuffer_append(buffer, object_nl, object_nl_len);
@@ -802,11 +846,22 @@ static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
802
846
  fbuffer_append_char(buffer, ']');
803
847
  }
804
848
 
849
+ #ifdef HAVE_RUBY_ENCODING_H
850
+ static int enc_utf8_compatible_p(rb_encoding *enc)
851
+ {
852
+ if (enc == rb_usascii_encoding()) return 1;
853
+ if (enc == rb_utf8_encoding()) return 1;
854
+ return 0;
855
+ }
856
+ #endif
857
+
805
858
  static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
806
859
  {
807
860
  fbuffer_append_char(buffer, '"');
808
861
  #ifdef HAVE_RUBY_ENCODING_H
809
- obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8);
862
+ if (!enc_utf8_compatible_p(rb_enc_get(obj))) {
863
+ obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil);
864
+ }
810
865
  #endif
811
866
  if (state->ascii_only) {
812
867
  convert_UTF8_to_JSON_ASCII(buffer, obj);
@@ -970,6 +1025,8 @@ static VALUE cState_generate(VALUE self, VALUE obj)
970
1025
  * * *allow_nan*: true if NaN, Infinity, and -Infinity should be
971
1026
  * generated, otherwise an exception is thrown, if these values are
972
1027
  * encountered. This options defaults to false.
1028
+ * * *ascii_only*: true if only ASCII characters should be generated. This
1029
+ * ontions defaults to false.
973
1030
  * * *buffer_initial_length*: sets the initial length of the generator's
974
1031
  * internal buffer.
975
1032
  */
@@ -1025,10 +1082,8 @@ static VALUE cState_from_state_s(VALUE self, VALUE opts)
1025
1082
  } else if (rb_obj_is_kind_of(opts, rb_cHash)) {
1026
1083
  return rb_funcall(self, i_new, 1, opts);
1027
1084
  } else {
1028
- if (NIL_P(CJSON_SAFE_STATE_PROTOTYPE)) {
1029
- CJSON_SAFE_STATE_PROTOTYPE = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
1030
- }
1031
- return rb_funcall(CJSON_SAFE_STATE_PROTOTYPE, i_dup, 0);
1085
+ VALUE prototype = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
1086
+ return rb_funcall(prototype, i_dup, 0);
1032
1087
  }
1033
1088
  }
1034
1089
 
@@ -1267,7 +1322,7 @@ static VALUE cState_allow_nan_p(VALUE self)
1267
1322
  /*
1268
1323
  * call-seq: ascii_only?
1269
1324
  *
1270
- * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise
1325
+ * Returns true, if only ASCII characters should be generated. Otherwise
1271
1326
  * returns false.
1272
1327
  */
1273
1328
  static VALUE cState_ascii_only_p(VALUE self)
@@ -1344,6 +1399,8 @@ void Init_generator(void)
1344
1399
 
1345
1400
  eGeneratorError = rb_path2class("JSON::GeneratorError");
1346
1401
  eNestingError = rb_path2class("JSON::NestingError");
1402
+ rb_gc_register_mark_object(eGeneratorError);
1403
+ rb_gc_register_mark_object(eNestingError);
1347
1404
 
1348
1405
  cState = rb_define_class_under(mGenerator, "State", rb_cObject);
1349
1406
  rb_define_alloc_func(cState, cState_s_allocate);
@@ -1409,7 +1466,6 @@ void Init_generator(void)
1409
1466
  mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass");
1410
1467
  rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1);
1411
1468
 
1412
- CRegexp_MULTILINE = rb_const_get(rb_cRegexp, rb_intern("MULTILINE"));
1413
1469
  i_to_s = rb_intern("to_s");
1414
1470
  i_to_json = rb_intern("to_json");
1415
1471
  i_new = rb_intern("new");
@@ -1440,5 +1496,4 @@ void Init_generator(void)
1440
1496
  i_encode = rb_intern("encode");
1441
1497
  #endif
1442
1498
  i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE");
1443
- CJSON_SAFE_STATE_PROTOTYPE = Qnil;
1444
1499
  }
@@ -27,7 +27,7 @@ enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...)
27
27
 
28
28
  /* unicode */
29
29
 
30
- static const char digit_values[256] = {
30
+ static const signed char digit_values[256] = {
31
31
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
32
32
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
33
33
  -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 const char digit_values[256] = {
46
46
 
47
47
  static UTF32 unescape_unicode(const unsigned char *p)
48
48
  {
49
- char b;
49
+ signed char b;
50
50
  UTF32 result = 0;
51
51
  b = digit_values[p[0]];
52
52
  if (b < 0) return UNI_REPLACEMENT_CHAR;
@@ -1676,10 +1676,8 @@ case 7:
1676
1676
 
1677
1677
  if (json->symbolize_names && json->parsing_name) {
1678
1678
  *result = rb_str_intern(*result);
1679
- } else {
1680
- if (RB_TYPE_P(*result, T_STRING)) {
1681
- rb_str_resize(*result, RSTRING_LEN(*result));
1682
- }
1679
+ } else if (RB_TYPE_P(*result, T_STRING)) {
1680
+ rb_str_resize(*result, RSTRING_LEN(*result));
1683
1681
  }
1684
1682
  if (cs >= JSON_string_first_final) {
1685
1683
  return p + 1;
@@ -1835,7 +1833,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1835
1833
  } else {
1836
1834
  json->max_nesting = 100;
1837
1835
  json->allow_nan = 0;
1838
- json->create_additions = 1;
1836
+ json->create_additions = 0;
1839
1837
  json->create_id = rb_funcall(mJSON, i_create_id, 0);
1840
1838
  json->object_class = Qnil;
1841
1839
  json->array_class = Qnil;
@@ -1850,7 +1848,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1850
1848
  }
1851
1849
 
1852
1850
 
1853
- #line 1854 "parser.c"
1851
+ #line 1852 "parser.c"
1854
1852
  enum {JSON_start = 1};
1855
1853
  enum {JSON_first_final = 10};
1856
1854
  enum {JSON_error = 0};
@@ -1858,7 +1856,7 @@ enum {JSON_error = 0};
1858
1856
  enum {JSON_en_main = 1};
1859
1857
 
1860
1858
 
1861
- #line 762 "parser.rl"
1859
+ #line 760 "parser.rl"
1862
1860
 
1863
1861
 
1864
1862
  /*
@@ -1875,16 +1873,16 @@ static VALUE cParser_parse(VALUE self)
1875
1873
  GET_PARSER;
1876
1874
 
1877
1875
 
1878
- #line 1879 "parser.c"
1876
+ #line 1877 "parser.c"
1879
1877
  {
1880
1878
  cs = JSON_start;
1881
1879
  }
1882
1880
 
1883
- #line 778 "parser.rl"
1881
+ #line 776 "parser.rl"
1884
1882
  p = json->source;
1885
1883
  pe = p + json->len;
1886
1884
 
1887
- #line 1888 "parser.c"
1885
+ #line 1886 "parser.c"
1888
1886
  {
1889
1887
  if ( p == pe )
1890
1888
  goto _test_eof;
@@ -1918,7 +1916,7 @@ st0:
1918
1916
  cs = 0;
1919
1917
  goto _out;
1920
1918
  tr2:
1921
- #line 754 "parser.rl"
1919
+ #line 752 "parser.rl"
1922
1920
  {
1923
1921
  char *np = JSON_parse_value(json, p, pe, &result, 0);
1924
1922
  if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -1928,7 +1926,7 @@ st10:
1928
1926
  if ( ++p == pe )
1929
1927
  goto _test_eof10;
1930
1928
  case 10:
1931
- #line 1932 "parser.c"
1929
+ #line 1930 "parser.c"
1932
1930
  switch( (*p) ) {
1933
1931
  case 13: goto st10;
1934
1932
  case 32: goto st10;
@@ -2017,7 +2015,7 @@ case 9:
2017
2015
  _out: {}
2018
2016
  }
2019
2017
 
2020
- #line 781 "parser.rl"
2018
+ #line 779 "parser.rl"
2021
2019
 
2022
2020
  if (cs >= JSON_first_final && p == pe) {
2023
2021
  return result;
@@ -2091,14 +2089,21 @@ void Init_parser(void)
2091
2089
  cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
2092
2090
  eParserError = rb_path2class("JSON::ParserError");
2093
2091
  eNestingError = rb_path2class("JSON::NestingError");
2092
+ rb_gc_register_mark_object(eParserError);
2093
+ rb_gc_register_mark_object(eNestingError);
2094
2094
  rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
2095
2095
  rb_define_method(cParser, "initialize", cParser_initialize, -1);
2096
2096
  rb_define_method(cParser, "parse", cParser_parse, 0);
2097
2097
  rb_define_method(cParser, "source", cParser_source, 0);
2098
2098
 
2099
2099
  CNaN = rb_const_get(mJSON, rb_intern("NaN"));
2100
+ rb_gc_register_mark_object(CNaN);
2101
+
2100
2102
  CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
2103
+ rb_gc_register_mark_object(CInfinity);
2104
+
2101
2105
  CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
2106
+ rb_gc_register_mark_object(CMinusInfinity);
2102
2107
 
2103
2108
  i_json_creatable_p = rb_intern("json_creatable?");
2104
2109
  i_json_create = rb_intern("json_create");
@@ -25,7 +25,7 @@ enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...)
25
25
 
26
26
  /* unicode */
27
27
 
28
- static const char digit_values[256] = {
28
+ static const signed char digit_values[256] = {
29
29
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
30
30
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
31
31
  -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 const char digit_values[256] = {
44
44
 
45
45
  static UTF32 unescape_unicode(const unsigned char *p)
46
46
  {
47
- char b;
47
+ signed char b;
48
48
  UTF32 result = 0;
49
49
  b = digit_values[p[0]];
50
50
  if (b < 0) return UNI_REPLACEMENT_CHAR;
@@ -571,10 +571,8 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
571
571
 
572
572
  if (json->symbolize_names && json->parsing_name) {
573
573
  *result = rb_str_intern(*result);
574
- } else {
575
- if (RB_TYPE_P(*result, T_STRING)) {
576
- rb_str_resize(*result, RSTRING_LEN(*result));
577
- }
574
+ } else if (RB_TYPE_P(*result, T_STRING)) {
575
+ rb_str_resize(*result, RSTRING_LEN(*result));
578
576
  }
579
577
  if (cs >= JSON_string_first_final) {
580
578
  return p + 1;
@@ -730,7 +728,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
730
728
  } else {
731
729
  json->max_nesting = 100;
732
730
  json->allow_nan = 0;
733
- json->create_additions = 1;
731
+ json->create_additions = 0;
734
732
  json->create_id = rb_funcall(mJSON, i_create_id, 0);
735
733
  json->object_class = Qnil;
736
734
  json->array_class = Qnil;
@@ -851,14 +849,21 @@ void Init_parser(void)
851
849
  cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
852
850
  eParserError = rb_path2class("JSON::ParserError");
853
851
  eNestingError = rb_path2class("JSON::NestingError");
852
+ rb_gc_register_mark_object(eParserError);
853
+ rb_gc_register_mark_object(eNestingError);
854
854
  rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
855
855
  rb_define_method(cParser, "initialize", cParser_initialize, -1);
856
856
  rb_define_method(cParser, "parse", cParser_parse, 0);
857
857
  rb_define_method(cParser, "source", cParser_source, 0);
858
858
 
859
859
  CNaN = rb_const_get(mJSON, rb_intern("NaN"));
860
+ rb_gc_register_mark_object(CNaN);
861
+
860
862
  CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
863
+ rb_gc_register_mark_object(CInfinity);
864
+
861
865
  CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
866
+ rb_gc_register_mark_object(CMinusInfinity);
862
867
 
863
868
  i_json_creatable_p = rb_intern("json_creatable?");
864
869
  i_json_create = rb_intern("json_create");
@@ -7,6 +7,7 @@ package json.ext;
7
7
 
8
8
  import org.jruby.Ruby;
9
9
  import org.jruby.RubyArray;
10
+ import org.jruby.RubyBasicObject;
10
11
  import org.jruby.RubyBignum;
11
12
  import org.jruby.RubyBoolean;
12
13
  import org.jruby.RubyClass;
@@ -15,6 +16,7 @@ import org.jruby.RubyFloat;
15
16
  import org.jruby.RubyHash;
16
17
  import org.jruby.RubyNumeric;
17
18
  import org.jruby.RubyString;
19
+ import org.jruby.runtime.ClassIndex;
18
20
  import org.jruby.runtime.ThreadContext;
19
21
  import org.jruby.runtime.builtin.IRubyObject;
20
22
  import org.jruby.util.ByteList;
@@ -57,6 +59,19 @@ public final class Generator {
57
59
  return handler.generateNew(session, object);
58
60
  }
59
61
 
62
+ // NOTE: drop this once Ruby 1.9.3 support is gone!
63
+ private static final int FIXNUM = 1;
64
+ private static final int BIGNUM = 2;
65
+ private static final int ARRAY = 3;
66
+ private static final int STRING = 4;
67
+ private static final int NIL = 5;
68
+ private static final int TRUE = 6;
69
+ private static final int FALSE = 7;
70
+ private static final int HASH = 10;
71
+ private static final int FLOAT = 11;
72
+ // hard-coded due JRuby 1.7 compatibility
73
+ // https://github.com/jruby/jruby/blob/1.7.27/core/src/main/java/org/jruby/runtime/ClassIndex.java
74
+
60
75
  /**
61
76
  * Returns the best serialization handler for the given object.
62
77
  */
@@ -65,16 +80,24 @@ public final class Generator {
65
80
  @SuppressWarnings("unchecked")
66
81
  private static <T extends IRubyObject>
67
82
  Handler<? super T> getHandlerFor(Ruby runtime, T object) {
68
- RubyClass metaClass = object.getMetaClass();
69
- if (metaClass == runtime.getString()) return (Handler)STRING_HANDLER;
70
- if (metaClass == runtime.getFixnum()) return (Handler)FIXNUM_HANDLER;
71
- if (metaClass == runtime.getHash()) return (Handler)HASH_HANDLER;
72
- if (metaClass == runtime.getArray()) return (Handler)ARRAY_HANDLER;
73
- if (object.isNil()) return (Handler)NIL_HANDLER;
74
- if (object == runtime.getTrue()) return (Handler)TRUE_HANDLER;
75
- if (object == runtime.getFalse()) return (Handler)FALSE_HANDLER;
76
- if (metaClass == runtime.getFloat()) return (Handler)FLOAT_HANDLER;
77
- if (metaClass == runtime.getBignum()) return (Handler)BIGNUM_HANDLER;
83
+ switch (((RubyBasicObject) object).getNativeTypeIndex()) {
84
+ // can not use getNativeClassIndex due 1.7 compatibility
85
+ case NIL : return (Handler) NIL_HANDLER;
86
+ case TRUE : return (Handler) TRUE_HANDLER;
87
+ case FALSE : return (Handler) FALSE_HANDLER;
88
+ case FLOAT : return (Handler) FLOAT_HANDLER;
89
+ case FIXNUM : return (Handler) FIXNUM_HANDLER;
90
+ case BIGNUM : return (Handler) BIGNUM_HANDLER;
91
+ case STRING :
92
+ if (((RubyBasicObject) object).getMetaClass() != runtime.getString()) break;
93
+ return (Handler) STRING_HANDLER;
94
+ case ARRAY :
95
+ if (((RubyBasicObject) object).getMetaClass() != runtime.getArray()) break;
96
+ return (Handler) ARRAY_HANDLER;
97
+ case HASH :
98
+ if (((RubyBasicObject) object).getMetaClass() != runtime.getHash()) break;
99
+ return (Handler) HASH_HANDLER;
100
+ }
78
101
  return GENERIC_HANDLER;
79
102
  }
80
103
 
@@ -8,9 +8,8 @@ spec = Gem::Specification.new do |s|
8
8
  s.description = "A JSON implementation as a JRuby extension."
9
9
  s.author = "Daniel Luz"
10
10
  s.email = "dev+ruby@mernen.com"
11
- s.homepage = "http://json-jruby.rubyforge.org/"
11
+ s.homepage = "http://flori.github.com/json"
12
12
  s.platform = 'java'
13
- s.rubyforge_project = "json-jruby"
14
13
  s.licenses = ["Ruby"]
15
14
 
16
15
  s.files = Dir["{docs,lib,tests}/**/*"]
Binary file
@@ -1,23 +1,23 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: json_pure 2.2.0 ruby lib
2
+ # stub: json_pure 2.3.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "json_pure".freeze
6
- s.version = "2.2.0"
6
+ s.version = "2.3.0"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2019-02-21"
11
+ s.date = "2019-12-11"
12
12
  s.description = "This is a JSON implementation in pure Ruby.".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.extra_rdoc_files = ["README.md".freeze]
15
- 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]
15
+ 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]
16
16
  s.homepage = "http://flori.github.com/json".freeze
17
17
  s.licenses = ["Ruby".freeze]
18
18
  s.rdoc_options = ["--title".freeze, "JSON implemention for ruby".freeze, "--main".freeze, "README.md".freeze]
19
19
  s.required_ruby_version = Gem::Requirement.new(">= 1.9".freeze)
20
- s.rubygems_version = "2.7.6".freeze
20
+ s.rubygems_version = "3.0.3".freeze
21
21
  s.summary = "JSON Implementation for Ruby".freeze
22
22
  s.test_files = ["./tests/test_helper.rb".freeze]
23
23
 
@@ -23,7 +23,7 @@ class BigDecimal
23
23
  end
24
24
 
25
25
  # return the JSON value
26
- def to_json(*)
27
- as_json.to_json
26
+ def to_json(*args)
27
+ as_json.to_json(*args)
28
28
  end
29
29
  end
@@ -23,7 +23,7 @@ class Complex
23
23
  end
24
24
 
25
25
  # Stores class name (Complex) along with real value <tt>r</tt> and imaginary value <tt>i</tt> as JSON string
26
- def to_json(*)
27
- as_json.to_json
26
+ def to_json(*args)
27
+ as_json.to_json(*args)
28
28
  end
29
29
  end
@@ -22,7 +22,7 @@ class Rational
22
22
  end
23
23
 
24
24
  # Stores class name (Rational) along with numerator value <tt>n</tt> and denominator value <tt>d</tt> as JSON string
25
- def to_json(*)
26
- as_json.to_json
25
+ def to_json(*args)
26
+ as_json.to_json(*args)
27
27
  end
28
28
  end
@@ -24,7 +24,7 @@ class Regexp
24
24
 
25
25
  # Stores class name (Regexp) with options <tt>o</tt> and source <tt>s</tt>
26
26
  # (Regexp or String) as JSON string
27
- def to_json(*)
28
- as_json.to_json
27
+ def to_json(*args)
28
+ as_json.to_json(*args)
29
29
  end
30
30
  end
@@ -153,7 +153,7 @@ module JSON
153
153
  # * *object_class*: Defaults to Hash
154
154
  # * *array_class*: Defaults to Array
155
155
  def parse(source, opts = {})
156
- Parser.new(source, opts).parse
156
+ Parser.new(source, **(opts||{})).parse
157
157
  end
158
158
 
159
159
  # Parse the JSON document _source_ into a Ruby data structure and return it.
@@ -176,7 +176,7 @@ module JSON
176
176
  :max_nesting => false,
177
177
  :allow_nan => true
178
178
  }.merge(opts)
179
- Parser.new(source, opts).parse
179
+ Parser.new(source, **(opts||{})).parse
180
180
  end
181
181
 
182
182
  # Generate a JSON document from the Ruby data structure _obj_ and return
@@ -250,7 +250,8 @@ module JSON
250
250
  if respond_to?(name)
251
251
  __send__(name)
252
252
  else
253
- instance_variable_get("@#{name}")
253
+ instance_variable_get("@#{name}") if
254
+ instance_variables.include?("@#{name}".to_sym) # avoid warning
254
255
  end
255
256
  end
256
257
 
@@ -197,7 +197,15 @@ module JSON
197
197
  def parse_value
198
198
  case
199
199
  when scan(FLOAT)
200
- @decimal_class && @decimal_class.new(self[1]) || Float(self[1])
200
+ if @decimal_class then
201
+ if @decimal_class == BigDecimal then
202
+ BigDecimal(self[1])
203
+ else
204
+ @decimal_class.new(self[1]) || Float(self[1])
205
+ end
206
+ else
207
+ Float(self[1])
208
+ end
201
209
  when scan(INTEGER)
202
210
  Integer(self[1])
203
211
  when scan(TRUE)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
  module JSON
3
3
  # JSON version
4
- VERSION = '2.2.0'
4
+ VERSION = '2.3.0'
5
5
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
6
6
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
7
7
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -27,15 +27,15 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
27
27
  end
28
28
 
29
29
  def test_parser
30
- assert_match /::Parser\z/, JSON.parser.name
30
+ assert_match(/::Parser\z/, JSON.parser.name)
31
31
  end
32
32
 
33
33
  def test_generator
34
- assert_match /::Generator\z/, JSON.generator.name
34
+ assert_match(/::Generator\z/, JSON.generator.name)
35
35
  end
36
36
 
37
37
  def test_state
38
- assert_match /::Generator::State\z/, JSON.state.name
38
+ assert_match(/::Generator::State\z/, JSON.state.name)
39
39
  end
40
40
 
41
41
  def test_create_id
@@ -56,7 +56,7 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
56
56
  end
57
57
 
58
58
  def test_parse_bang
59
- assert_equal [ 1, NaN, 3, ], JSON.parse!('[ 1, NaN, 3 ]')
59
+ assert_equal [ 1, Infinity, 3, ], JSON.parse!('[ 1, Infinity, 3 ]')
60
60
  end
61
61
 
62
62
  def test_generate
@@ -40,6 +40,44 @@ class JSONGeneratorTest < Test::Unit::TestCase
40
40
  EOT
41
41
  end
42
42
 
43
+ def silence
44
+ v = $VERBOSE
45
+ $VERBOSE = nil
46
+ yield
47
+ ensure
48
+ $VERBOSE = v
49
+ end
50
+
51
+ def test_remove_const_segv
52
+ return if RUBY_ENGINE == 'jruby'
53
+ stress = GC.stress
54
+ const = JSON::SAFE_STATE_PROTOTYPE.dup
55
+
56
+ bignum_too_long_to_embed_as_string = 1234567890123456789012345
57
+ expect = bignum_too_long_to_embed_as_string.to_s
58
+ GC.stress = true
59
+
60
+ 10.times do |i|
61
+ tmp = bignum_too_long_to_embed_as_string.to_json
62
+ raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
63
+ end
64
+
65
+ silence do
66
+ JSON.const_set :SAFE_STATE_PROTOTYPE, nil
67
+ end
68
+
69
+ 10.times do |i|
70
+ assert_raise TypeError do
71
+ bignum_too_long_to_embed_as_string.to_json
72
+ end
73
+ end
74
+ ensure
75
+ GC.stress = stress
76
+ silence do
77
+ JSON.const_set :SAFE_STATE_PROTOTYPE, const
78
+ end
79
+ end if JSON.const_defined?("Ext")
80
+
43
81
  def test_generate
44
82
  json = generate(@hash)
45
83
  assert_equal(parse(@json2), parse(json))
@@ -374,4 +412,10 @@ EOT
374
412
  assert_equal '["foo"]', JSON.generate([s.new('foo')])
375
413
  end
376
414
  end
415
+
416
+ if defined?(Encoding)
417
+ def test_nonutf8_encoding
418
+ assert_equal("\"5\u{b0}\"", "5\xb0".force_encoding("iso-8859-1").to_json)
419
+ end
420
+ end
377
421
  end
@@ -91,27 +91,27 @@ class JSONParserTest < Test::Unit::TestCase
91
91
  assert_raise(JSON::ParserError) { parse('+23') }
92
92
  assert_raise(JSON::ParserError) { parse('.23') }
93
93
  assert_raise(JSON::ParserError) { parse('023') }
94
- assert_equal 23, parse('23')
95
- assert_equal -23, parse('-23')
96
- assert_equal_float 3.141, parse('3.141')
97
- assert_equal_float -3.141, parse('-3.141')
98
- assert_equal_float 3.141, parse('3141e-3')
99
- assert_equal_float 3.141, parse('3141.1e-3')
100
- assert_equal_float 3.141, parse('3141E-3')
101
- assert_equal_float 3.141, parse('3141.0E-3')
102
- assert_equal_float -3.141, parse('-3141.0e-3')
103
- assert_equal_float -3.141, parse('-3141e-3')
94
+ assert_equal(23, parse('23'))
95
+ assert_equal(-23, parse('-23'))
96
+ assert_equal_float(3.141, parse('3.141'))
97
+ assert_equal_float(-3.141, parse('-3.141'))
98
+ assert_equal_float(3.141, parse('3141e-3'))
99
+ assert_equal_float(3.141, parse('3141.1e-3'))
100
+ assert_equal_float(3.141, parse('3141E-3'))
101
+ assert_equal_float(3.141, parse('3141.0E-3'))
102
+ assert_equal_float(-3.141, parse('-3141.0e-3'))
103
+ assert_equal_float(-3.141, parse('-3141e-3'))
104
104
  assert_raise(ParserError) { parse('NaN') }
105
105
  assert parse('NaN', :allow_nan => true).nan?
106
106
  assert_raise(ParserError) { parse('Infinity') }
107
- assert_equal 1.0/0, parse('Infinity', :allow_nan => true)
107
+ assert_equal(1.0/0, parse('Infinity', :allow_nan => true))
108
108
  assert_raise(ParserError) { parse('-Infinity') }
109
- assert_equal -1.0/0, parse('-Infinity', :allow_nan => true)
109
+ assert_equal(-1.0/0, parse('-Infinity', :allow_nan => true))
110
110
  end
111
111
 
112
112
  def test_parse_bigdecimals
113
- assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
114
- assert_equal(BigDecimal.new("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] )
113
+ assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
114
+ assert_equal(BigDecimal("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] )
115
115
  end
116
116
 
117
117
  if Array.method_defined?(:permutation)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_pure
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-21 00:00:00.000000000 Z
11
+ date: 2019-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -50,6 +50,7 @@ files:
50
50
  - ".travis.yml"
51
51
  - CHANGES.md
52
52
  - Gemfile
53
+ - LICENSE
53
54
  - README-json-jruby.md
54
55
  - README.md
55
56
  - Rakefile
@@ -174,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
175
  - !ruby/object:Gem::Version
175
176
  version: '0'
176
177
  requirements: []
177
- rubygems_version: 3.0.2
178
+ rubygems_version: 3.1.2
178
179
  signing_key:
179
180
  specification_version: 4
180
181
  summary: JSON Implementation for Ruby