json 2.3.1 → 2.6.2

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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +38 -5
  3. data/LICENSE +56 -0
  4. data/README.md +3 -3
  5. data/VERSION +1 -1
  6. data/ext/json/ext/generator/generator.c +61 -22
  7. data/ext/json/ext/generator/generator.h +5 -2
  8. data/ext/json/ext/parser/extconf.rb +26 -0
  9. data/ext/json/ext/parser/parser.c +2980 -1770
  10. data/ext/json/ext/parser/parser.h +6 -1
  11. data/ext/json/ext/parser/parser.rl +127 -38
  12. data/ext/json/extconf.rb +1 -0
  13. data/json.gemspec +8 -80
  14. data/lib/json/add/complex.rb +0 -1
  15. data/lib/json/add/rational.rb +0 -1
  16. data/lib/json/common.rb +240 -228
  17. data/lib/json/pure/generator.rb +28 -8
  18. data/lib/json/pure/parser.rb +21 -3
  19. data/lib/json/version.rb +1 -1
  20. data/lib/json.rb +172 -1
  21. metadata +8 -110
  22. data/.gitignore +0 -18
  23. data/.travis.yml +0 -26
  24. data/Gemfile +0 -14
  25. data/README-json-jruby.md +0 -33
  26. data/Rakefile +0 -334
  27. data/diagrams/.keep +0 -0
  28. data/install.rb +0 -23
  29. data/java/src/json/ext/ByteListTranscoder.java +0 -166
  30. data/java/src/json/ext/Generator.java +0 -466
  31. data/java/src/json/ext/GeneratorMethods.java +0 -231
  32. data/java/src/json/ext/GeneratorService.java +0 -42
  33. data/java/src/json/ext/GeneratorState.java +0 -490
  34. data/java/src/json/ext/OptionsReader.java +0 -113
  35. data/java/src/json/ext/Parser.java +0 -2362
  36. data/java/src/json/ext/Parser.rl +0 -893
  37. data/java/src/json/ext/ParserService.java +0 -34
  38. data/java/src/json/ext/RuntimeInfo.java +0 -116
  39. data/java/src/json/ext/StringDecoder.java +0 -166
  40. data/java/src/json/ext/StringEncoder.java +0 -111
  41. data/java/src/json/ext/Utils.java +0 -88
  42. data/json-java.gemspec +0 -37
  43. data/json_pure.gemspec +0 -33
  44. data/lib/json/ext/.keep +0 -0
  45. data/references/rfc7159.txt +0 -899
  46. data/tests/fixtures/fail10.json +0 -1
  47. data/tests/fixtures/fail11.json +0 -1
  48. data/tests/fixtures/fail12.json +0 -1
  49. data/tests/fixtures/fail13.json +0 -1
  50. data/tests/fixtures/fail14.json +0 -1
  51. data/tests/fixtures/fail18.json +0 -1
  52. data/tests/fixtures/fail19.json +0 -1
  53. data/tests/fixtures/fail2.json +0 -1
  54. data/tests/fixtures/fail20.json +0 -1
  55. data/tests/fixtures/fail21.json +0 -1
  56. data/tests/fixtures/fail22.json +0 -1
  57. data/tests/fixtures/fail23.json +0 -1
  58. data/tests/fixtures/fail24.json +0 -1
  59. data/tests/fixtures/fail25.json +0 -1
  60. data/tests/fixtures/fail27.json +0 -2
  61. data/tests/fixtures/fail28.json +0 -2
  62. data/tests/fixtures/fail3.json +0 -1
  63. data/tests/fixtures/fail4.json +0 -1
  64. data/tests/fixtures/fail5.json +0 -1
  65. data/tests/fixtures/fail6.json +0 -1
  66. data/tests/fixtures/fail7.json +0 -1
  67. data/tests/fixtures/fail8.json +0 -1
  68. data/tests/fixtures/fail9.json +0 -1
  69. data/tests/fixtures/obsolete_fail1.json +0 -1
  70. data/tests/fixtures/pass1.json +0 -56
  71. data/tests/fixtures/pass15.json +0 -1
  72. data/tests/fixtures/pass16.json +0 -1
  73. data/tests/fixtures/pass17.json +0 -1
  74. data/tests/fixtures/pass2.json +0 -1
  75. data/tests/fixtures/pass26.json +0 -1
  76. data/tests/fixtures/pass3.json +0 -6
  77. data/tests/json_addition_test.rb +0 -203
  78. data/tests/json_common_interface_test.rb +0 -126
  79. data/tests/json_encoding_test.rb +0 -107
  80. data/tests/json_ext_parser_test.rb +0 -15
  81. data/tests/json_fixtures_test.rb +0 -37
  82. data/tests/json_generator_test.rb +0 -421
  83. data/tests/json_generic_object_test.rb +0 -82
  84. data/tests/json_parser_test.rb +0 -472
  85. data/tests/json_string_matching_test.rb +0 -38
  86. data/tests/test_helper.rb +0 -17
  87. data/tools/diff.sh +0 -18
  88. data/tools/fuzz.rb +0 -131
  89. data/tools/server.rb +0 -62
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80444509bc162d6df8e9cc3e7af2fc28507c06aef49cbfc1dd9e5990af42b14f
4
- data.tar.gz: 8541be9708b44604eeeecac22f89c47933d32c90606f23c1d37e70c8b2d3e9db
3
+ metadata.gz: 21e09bba5bfe89e923363872b46bfb0ee800ff01e039e36b662008c85983983f
4
+ data.tar.gz: 2f319b945dd9f7510ce8dac412ab6d69f289942278cd298728af1cecb3b329c0
5
5
  SHA512:
6
- metadata.gz: 1df7b5ee2bf58103f0b5776c4a581aa3b013ad4b3a85a442d37bb72dc62aaf04dc42ed1080fb307fec1d1e9128c9f21e43827c7f15494cb0f9f310f7189bdc5e
7
- data.tar.gz: 15ba56ce5d0e04c5326feb9e9faf2627628a715fa4bbeaec5c4aadeab5f27a65135f4f24f142b361f62ca37bbf36380f671d7ae35d46991737e4fc62423a6f9b
6
+ metadata.gz: f7edf79e46c4a5e1b353f1463cad92af3198c8983247e9bb04751dd98ee714040455ebff17f03fe2b1a7928992885914d192e8b509673a26b47c8966822cb450
7
+ data.tar.gz: 5b086c18aac3d99ac1ef2ec5bdf66af841ba5dd6bc3a85e1e8e65ccb086458902b4a49fdb08a8acce978a46c13b82c23dc724450869f02898d6374d79750aca6
data/CHANGES.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changes
2
2
 
3
+ ### 2021-10-24 (2.6.1)
4
+
5
+ * Restore version.rb with 2.6.1
6
+
7
+ ### 2021-10-14 (2.6.0)
8
+
9
+ * Use `rb_enc_interned_str` if available to reduce allocations in `freeze: true` mode. #451.
10
+ * Bump required_ruby_version to 2.3.
11
+ * Fix compatibility with `GC.compact`.
12
+ * Fix some compilation warnings. #469
13
+
14
+ ## 2020-12-22 (2.5.1)
15
+
16
+ * Restore the compatibility for constants of JSON class.
17
+
18
+ ## 2020-12-22 (2.5.0)
19
+
20
+ * Ready to Ractor-safe at Ruby 3.0.
21
+
22
+ ## 2020-12-17 (2.4.1)
23
+
24
+ * Restore version.rb with 2.4.1
25
+
26
+ ## 2020-12-15 (2.4.0)
27
+
28
+ * Implement a freeze: parser option #447
29
+ * Fix an issue with generate_pretty and empty objects in the Ruby and Java implementations #449
30
+ * Fix JSON.load_file doc #448
31
+ * Fix pure parser with unclosed arrays / objects #425
32
+ * bundle the LICENSE file in the gem #444
33
+ * Add an option to escape forward slash character #405
34
+ * RDoc for JSON #439 #446 #442 #434 #433 #430
35
+
3
36
  ## 2020-06-30 (2.3.1)
4
37
 
5
38
  * Spelling and grammar fixes for comments. Pull request #191 by Josh
@@ -61,7 +94,7 @@
61
94
 
62
95
  ## 2015-09-11 (2.0.0)
63
96
  * Now complies to newest JSON RFC 7159.
64
- * Implements compatibiliy to ruby 2.4 integer unification.
97
+ * Implements compatibility to ruby 2.4 integer unification.
65
98
  * Drops support for old rubies whose life has ended, that is rubies < 2.0.
66
99
  Also see https://www.ruby-lang.org/en/news/2014/07/01/eol-for-1-8-7-and-1-9-2/
67
100
  * There were still some mentions of dual GPL licensing in the source, but JSON
@@ -102,9 +135,9 @@
102
135
  ## 2013-02-04 (1.7.7)
103
136
  * Security fix for JSON create_additions default value and
104
137
  `JSON::GenericObject`. It should not be possible to create additions unless
105
- explicitely requested by setting the create_additions argument to true or
138
+ explicitly requested by setting the create_additions argument to true or
106
139
  using the JSON.load/dump interface. If `JSON::GenericObject` is supposed to
107
- be automatically deserialised, this has to be explicitely enabled by
140
+ be automatically deserialised, this has to be explicitly enabled by
108
141
  setting
109
142
  JSON::GenericObject.json_creatable = true
110
143
  as well.
@@ -250,7 +283,7 @@
250
283
  ## 2010-04-23 (1.4.0)
251
284
  * Major speed improvements and building with simplified
252
285
  directory/file-structure.
253
- * Extension should at least be comapatible with MRI, YARV and Rubinius.
286
+ * Extension should at least be compatible with MRI, YARV and Rubinius.
254
287
 
255
288
  ## 2010-04-07 (1.2.4)
256
289
  * Triger const_missing callback to make Rails' dynamic class loading work.
@@ -268,7 +301,7 @@
268
301
  strings in object names/keys.
269
302
 
270
303
  ## 2009-10-01 (1.2.0)
271
- * `fast_generate` now raises an exeception for nan and infinite floats.
304
+ * `fast_generate` now raises an exception for nan and infinite floats.
272
305
  * On Ruby 1.8 json supports parsing of UTF-8, UTF-16BE, UTF-16LE, UTF-32BE,
273
306
  and UTF-32LE JSON documents now. Under Ruby 1.9 the M17n conversion
274
307
  functions are used to convert from all supported encodings. ASCII-8BIT
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
@@ -1,6 +1,6 @@
1
1
  # JSON implementation for Ruby
2
2
 
3
- [![Travis Widget](http://travis-ci.org/flori/json.svg?branch=master)](https://travis-ci.org/flori/json)
3
+ [![CI](https://github.com/flori/json/actions/workflows/ci.yml/badge.svg)](https://github.com/flori/json/actions/workflows/ci.yml)
4
4
 
5
5
  ## Description
6
6
 
@@ -267,7 +267,7 @@ the `pp` library's `pp` methods.
267
267
 
268
268
  The script `tools/server.rb` contains a small example if you want to test, how
269
269
  receiving a JSON object from a webrick server in your browser with the
270
- javasript prototype library http://www.prototypejs.org works.
270
+ JavaScript prototype library http://www.prototypejs.org works.
271
271
 
272
272
  ## Speed Comparisons
273
273
 
@@ -294,7 +294,7 @@ extension:
294
294
  ```
295
295
 
296
296
  In the table above 1 is `JSON::Ext::Parser`, 2 is `YAML.load` with YAML
297
- compatbile JSON document, 3 is is `JSON::Pure::Parser`, and 4 is
297
+ compatible JSON document, 3 is is `JSON::Pure::Parser`, and 4 is
298
298
  `ActiveSupport::JSON.decode`. The ActiveSupport JSON-decoder converts the
299
299
  input first to YAML and then uses the YAML-parser, the conversion seems to
300
300
  slow it down so much that it is only as fast as the `JSON::Pure::Parser`!
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.6.2
@@ -1,11 +1,6 @@
1
1
  #include "../fbuffer/fbuffer.h"
2
2
  #include "generator.h"
3
3
 
4
- #ifdef HAVE_RUBY_ENCODING_H
5
- static VALUE CEncoding_UTF_8;
6
- static ID i_encoding, i_encode;
7
- #endif
8
-
9
4
  static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
10
5
  mHash, mArray,
11
6
  #ifdef RUBY_INTEGER_UNIFICATION
@@ -15,14 +10,13 @@ static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
15
10
  #endif
16
11
  mFloat, mString, mString_Extend,
17
12
  mTrueClass, mFalseClass, mNilClass, eGeneratorError,
18
- eNestingError,
19
- i_SAFE_STATE_PROTOTYPE;
13
+ eNestingError;
20
14
 
21
15
  static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
22
16
  i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
23
17
  i_pack, i_unpack, i_create_id, i_extend, i_key_p,
24
18
  i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth,
25
- i_buffer_initial_length, i_dup;
19
+ i_buffer_initial_length, i_dup, i_escape_slash;
26
20
 
27
21
  /*
28
22
  * Copyright 2001-2004 Unicode, Inc.
@@ -130,7 +124,7 @@ static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16
130
124
 
131
125
  /* Converts string to a JSON string in FBuffer buffer, where all but the ASCII
132
126
  * and control characters are JSON escaped. */
133
- static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string)
127
+ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char escape_slash)
134
128
  {
135
129
  const UTF8 *source = (UTF8 *) RSTRING_PTR(string);
136
130
  const UTF8 *sourceEnd = source + RSTRING_LEN(string);
@@ -180,6 +174,11 @@ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string)
180
174
  case '"':
181
175
  fbuffer_append(buffer, "\\\"", 2);
182
176
  break;
177
+ case '/':
178
+ if(escape_slash) {
179
+ fbuffer_append(buffer, "\\/", 2);
180
+ break;
181
+ }
183
182
  default:
184
183
  fbuffer_append_char(buffer, (char)ch);
185
184
  break;
@@ -229,7 +228,7 @@ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string)
229
228
  * characters required by the JSON standard are JSON escaped. The remaining
230
229
  * characters (should be UTF8) are just passed through and appended to the
231
230
  * result. */
232
- static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string)
231
+ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slash)
233
232
  {
234
233
  const char *ptr = RSTRING_PTR(string), *p;
235
234
  unsigned long len = RSTRING_LEN(string), start = 0, end = 0;
@@ -280,6 +279,12 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string)
280
279
  escape = "\\\"";
281
280
  escape_len = 2;
282
281
  break;
282
+ case '/':
283
+ if(escape_slash) {
284
+ escape = "\\/";
285
+ escape_len = 2;
286
+ break;
287
+ }
283
288
  default:
284
289
  {
285
290
  unsigned short clen = 1;
@@ -609,13 +614,18 @@ static size_t State_memsize(const void *ptr)
609
614
  return size;
610
615
  }
611
616
 
617
+ #ifndef HAVE_RB_EXT_RACTOR_SAFE
618
+ # undef RUBY_TYPED_FROZEN_SHAREABLE
619
+ # define RUBY_TYPED_FROZEN_SHAREABLE 0
620
+ #endif
621
+
612
622
  #ifdef NEW_TYPEDDATA_WRAPPER
613
623
  static const rb_data_type_t JSON_Generator_State_type = {
614
624
  "JSON/Generator/State",
615
625
  {NULL, State_free, State_memsize,},
616
626
  #ifdef RUBY_TYPED_FREE_IMMEDIATELY
617
627
  0, 0,
618
- RUBY_TYPED_FREE_IMMEDIATELY,
628
+ RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE,
619
629
  #endif
620
630
  };
621
631
  #endif
@@ -716,6 +726,8 @@ static VALUE cState_configure(VALUE self, VALUE opts)
716
726
  state->allow_nan = RTEST(tmp);
717
727
  tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only));
718
728
  state->ascii_only = RTEST(tmp);
729
+ tmp = rb_hash_aref(opts, ID2SYM(i_escape_slash));
730
+ state->escape_slash = RTEST(tmp);
719
731
  return self;
720
732
  }
721
733
 
@@ -750,6 +762,7 @@ static VALUE cState_to_h(VALUE self)
750
762
  rb_hash_aset(result, ID2SYM(i_allow_nan), state->allow_nan ? Qtrue : Qfalse);
751
763
  rb_hash_aset(result, ID2SYM(i_ascii_only), state->ascii_only ? Qtrue : Qfalse);
752
764
  rb_hash_aset(result, ID2SYM(i_max_nesting), LONG2FIX(state->max_nesting));
765
+ rb_hash_aset(result, ID2SYM(i_escape_slash), state->escape_slash ? Qtrue : Qfalse);
753
766
  rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth));
754
767
  rb_hash_aset(result, ID2SYM(i_buffer_initial_length), LONG2FIX(state->buffer_initial_length));
755
768
  return result;
@@ -930,13 +943,13 @@ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
930
943
  fbuffer_append_char(buffer, '"');
931
944
  #ifdef HAVE_RUBY_ENCODING_H
932
945
  if (!enc_utf8_compatible_p(rb_enc_get(obj))) {
933
- obj = rb_str_encode(obj, CEncoding_UTF_8, 0, Qnil);
946
+ obj = rb_str_export_to_enc(obj, rb_utf8_encoding());
934
947
  }
935
948
  #endif
936
949
  if (state->ascii_only) {
937
- convert_UTF8_to_JSON_ASCII(buffer, obj);
950
+ convert_UTF8_to_JSON_ASCII(buffer, obj, state->escape_slash);
938
951
  } else {
939
- convert_UTF8_to_JSON(buffer, obj);
952
+ convert_UTF8_to_JSON(buffer, obj, state->escape_slash);
940
953
  }
941
954
  fbuffer_append_char(buffer, '"');
942
955
  }
@@ -1152,8 +1165,7 @@ static VALUE cState_from_state_s(VALUE self, VALUE opts)
1152
1165
  } else if (rb_obj_is_kind_of(opts, rb_cHash)) {
1153
1166
  return rb_funcall(self, i_new, 1, opts);
1154
1167
  } else {
1155
- VALUE prototype = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
1156
- return rb_funcall(prototype, i_dup, 0);
1168
+ return rb_class_new_instance(0, NULL, cState);
1157
1169
  }
1158
1170
  }
1159
1171
 
@@ -1377,6 +1389,31 @@ static VALUE cState_max_nesting_set(VALUE self, VALUE depth)
1377
1389
  return state->max_nesting = FIX2LONG(depth);
1378
1390
  }
1379
1391
 
1392
+ /*
1393
+ * call-seq: escape_slash
1394
+ *
1395
+ * If this boolean is true, the forward slashes will be escaped in
1396
+ * the json output.
1397
+ */
1398
+ static VALUE cState_escape_slash(VALUE self)
1399
+ {
1400
+ GET_STATE(self);
1401
+ return state->escape_slash ? Qtrue : Qfalse;
1402
+ }
1403
+
1404
+ /*
1405
+ * call-seq: escape_slash=(depth)
1406
+ *
1407
+ * This sets whether or not the forward slashes will be escaped in
1408
+ * the json output.
1409
+ */
1410
+ static VALUE cState_escape_slash_set(VALUE self, VALUE enable)
1411
+ {
1412
+ GET_STATE(self);
1413
+ state->escape_slash = RTEST(enable);
1414
+ return Qnil;
1415
+ }
1416
+
1380
1417
  /*
1381
1418
  * call-seq: allow_nan?
1382
1419
  *
@@ -1460,6 +1497,10 @@ static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_l
1460
1497
  */
1461
1498
  void Init_generator(void)
1462
1499
  {
1500
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
1501
+ rb_ext_ractor_safe(true);
1502
+ #endif
1503
+
1463
1504
  #undef rb_intern
1464
1505
  rb_require("json/common");
1465
1506
 
@@ -1489,6 +1530,9 @@ void Init_generator(void)
1489
1530
  rb_define_method(cState, "array_nl=", cState_array_nl_set, 1);
1490
1531
  rb_define_method(cState, "max_nesting", cState_max_nesting, 0);
1491
1532
  rb_define_method(cState, "max_nesting=", cState_max_nesting_set, 1);
1533
+ rb_define_method(cState, "escape_slash", cState_escape_slash, 0);
1534
+ rb_define_method(cState, "escape_slash?", cState_escape_slash, 0);
1535
+ rb_define_method(cState, "escape_slash=", cState_escape_slash_set, 1);
1492
1536
  rb_define_method(cState, "check_circular?", cState_check_circular_p, 0);
1493
1537
  rb_define_method(cState, "allow_nan?", cState_allow_nan_p, 0);
1494
1538
  rb_define_method(cState, "ascii_only?", cState_ascii_only_p, 0);
@@ -1545,6 +1589,7 @@ void Init_generator(void)
1545
1589
  i_object_nl = rb_intern("object_nl");
1546
1590
  i_array_nl = rb_intern("array_nl");
1547
1591
  i_max_nesting = rb_intern("max_nesting");
1592
+ i_escape_slash = rb_intern("escape_slash");
1548
1593
  i_allow_nan = rb_intern("allow_nan");
1549
1594
  i_ascii_only = rb_intern("ascii_only");
1550
1595
  i_depth = rb_intern("depth");
@@ -1560,10 +1605,4 @@ void Init_generator(void)
1560
1605
  i_match = rb_intern("match");
1561
1606
  i_keys = rb_intern("keys");
1562
1607
  i_dup = rb_intern("dup");
1563
- #ifdef HAVE_RUBY_ENCODING_H
1564
- CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
1565
- i_encoding = rb_intern("encoding");
1566
- i_encode = rb_intern("encode");
1567
- #endif
1568
- i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE");
1569
1608
  }
@@ -49,8 +49,8 @@ static const UTF32 halfMask = 0x3FFUL;
49
49
  static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length);
50
50
  static void unicode_escape(char *buf, UTF16 character);
51
51
  static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character);
52
- static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string);
53
- static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string);
52
+ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char escape_slash);
53
+ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slash);
54
54
  static char *fstrndup(const char *ptr, unsigned long len);
55
55
 
56
56
  /* ruby api and some helpers */
@@ -72,6 +72,7 @@ typedef struct JSON_Generator_StateStruct {
72
72
  long max_nesting;
73
73
  char allow_nan;
74
74
  char ascii_only;
75
+ char escape_slash;
75
76
  long depth;
76
77
  long buffer_initial_length;
77
78
  } JSON_Generator_State;
@@ -150,6 +151,8 @@ static VALUE cState_allow_nan_p(VALUE self);
150
151
  static VALUE cState_ascii_only_p(VALUE self);
151
152
  static VALUE cState_depth(VALUE self);
152
153
  static VALUE cState_depth_set(VALUE self, VALUE depth);
154
+ static VALUE cState_escape_slash(VALUE self);
155
+ static VALUE cState_escape_slash_set(VALUE self, VALUE depth);
153
156
  static FBuffer *cState_prepare_buffer(VALUE self);
154
157
  #ifndef ZALLOC
155
158
  #define ZALLOC(type) ((type *)ruby_zalloc(sizeof(type)))
@@ -2,5 +2,31 @@
2
2
  require 'mkmf'
3
3
 
4
4
  have_func("rb_enc_raise", "ruby.h")
5
+ have_func("rb_enc_interned_str", "ruby.h")
6
+
7
+ # checking if String#-@ (str_uminus) dedupes... '
8
+ begin
9
+ a = -(%w(t e s t).join)
10
+ b = -(%w(t e s t).join)
11
+ if a.equal?(b)
12
+ $CFLAGS << ' -DSTR_UMINUS_DEDUPE=1 '
13
+ else
14
+ $CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 '
15
+ end
16
+ rescue NoMethodError
17
+ $CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 '
18
+ end
19
+
20
+ # checking if String#-@ (str_uminus) directly interns frozen strings... '
21
+ begin
22
+ s = rand.to_s.freeze
23
+ if (-s).equal?(s) && (-s.dup).equal?(s)
24
+ $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=1 '
25
+ else
26
+ $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 '
27
+ end
28
+ rescue NoMethodError
29
+ $CFLAGS << ' -DSTR_UMINUS_DEDUPE_FROZEN=0 '
30
+ end
5
31
 
6
32
  create_makefile 'json/ext/parser'