json 2.6.2 → 2.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21e09bba5bfe89e923363872b46bfb0ee800ff01e039e36b662008c85983983f
4
- data.tar.gz: 2f319b945dd9f7510ce8dac412ab6d69f289942278cd298728af1cecb3b329c0
3
+ metadata.gz: 1ae811d90e98bbf8438c5abff24a9eabd5ef9c929115c14d3616a0c23f3a3fa2
4
+ data.tar.gz: eaa6afeb5ed814f5272bf54172b98ab217b26f850cb91d6fb081a9551237030c
5
5
  SHA512:
6
- metadata.gz: f7edf79e46c4a5e1b353f1463cad92af3198c8983247e9bb04751dd98ee714040455ebff17f03fe2b1a7928992885914d192e8b509673a26b47c8966822cb450
7
- data.tar.gz: 5b086c18aac3d99ac1ef2ec5bdf66af841ba5dd6bc3a85e1e8e65ccb086458902b4a49fdb08a8acce978a46c13b82c23dc724450869f02898d6374d79750aca6
6
+ metadata.gz: c4119c5fdb66b553ee50cab0185cdec0ff7b09f102cfec8faa28efe2a6042d1e5cb46ada853afdc47b76707b5b180e0f68fb039e08e329935434716e2419b8e1
7
+ data.tar.gz: f7d69e1e729e4b37687358bd6ebf81e8909fe4418bfff5c8a2d676b070d6af979146d0b18c01820d5bd4a7f567a62cbb90d0e164e96d05c0e99d9968657467c0
data/CHANGES.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changes
2
2
 
3
+ ### 2023-12-05 (2.7.1)
4
+
5
+ * JSON.dump: handle unenclosed hashes regression #554
6
+ * Overload kwargs in JSON.dump #556
7
+ * [DOC] RDoc for additions #557
8
+ * Fix JSON.dump overload combination #558
9
+
10
+ ### 2023-12-01 (2.7.0)
11
+
12
+ * Add a strict option to Generator #519
13
+ * `escape_slash` option was renamed as `script_safe` and now also escape U+2028 and U+2029. `escape_slash` is now an alias of `script_safe` #525
14
+ * Remove unnecessary initialization of create_id in JSON.parse() #454
15
+ * Improvements to Hash#to_json in pure implementation generator #203
16
+ * Use ruby_xfree to free buffers #518
17
+ * Fix "unexpected token" offset for Infinity #507
18
+ * Avoid using deprecated BigDecimal.new on JRuby #546
19
+ * Removed code for Ruby 1.8 #540
20
+ * Rename JSON::ParseError to JSON:ParserError #530
21
+ * Call super in included hook #486
22
+ * JRuby requires a minimum of Java 8 #516
23
+ * Always indent even if empty #517
24
+
25
+ ### 2022-11-30 (2.6.3)
26
+
27
+ * bugfix json/pure mixing escaped with literal unicode raises Encoding::CompatibilityError #483
28
+ * Stop including the parser source __LINE__ in exceptions #470
29
+
30
+ ### 2022-11-17 (2.6.2)
31
+
32
+ * Remove unknown keyword arg from DateTime.parse #488
33
+ * Ignore java artifacts by @hsbt #489
34
+ * Fix parser bug for empty string allocation #496
35
+
3
36
  ### 2021-10-24 (2.6.1)
4
37
 
5
38
  * Restore version.rb with 2.6.1
@@ -105,6 +138,19 @@
105
138
  I changed these mentions to be consistent with the Ruby license setting in
106
139
  the gemspec files which were already correct now.
107
140
 
141
+ ## 2017-01-13 (1.8.6)
142
+ * Be compatible with ancient ruby 1.8 (maybe?)
143
+
144
+ ## 2015-09-11 (1.8.5)
145
+ * Be compatible with ruby 2.4.0
146
+ * There were still some mentions of dual GPL licensing in the source, but JSON
147
+ has just the Ruby license that itself includes an explicit dual-licensing
148
+ clause that allows covered software to be distributed under the terms of
149
+ the Simplified BSD License instead for all ruby versions >= 1.9.3. This is
150
+ however a GPL compatible license according to the Free Software Foundation.
151
+ I changed these mentions to be consistent with the Ruby license setting in
152
+ the gemspec files which were already correct now.
153
+
108
154
  ## 2015-06-01 (1.8.3)
109
155
  * Fix potential memory leak, thx to nobu.
110
156
 
data/README.md CHANGED
@@ -12,8 +12,7 @@ will be two variants available:
12
12
  extensions, which are both part of the ruby standard library.
13
13
  * The quite a bit faster native extension variant, which is in parts
14
14
  implemented in C or Java and comes with its own unicode conversion
15
- functions and a parser generated by the ragel state machine compiler
16
- http://www.complang.org/ragel/ .
15
+ functions and a parser generated by the [Ragel] state machine compiler.
17
16
 
18
17
  Both variants of the JSON generator generate UTF-8 character sequences by
19
18
  default. If an :ascii\_only option with a true value is given, they escape all
@@ -71,8 +70,7 @@ with:
71
70
  ## Compiling the extensions yourself
72
71
 
73
72
  If you want to create the `parser.c` file from its `parser.rl` file or draw nice
74
- graphviz images of the state machines, you need ragel from:
75
- http://www.complang.org/ragel/
73
+ graphviz images of the state machines, you need [Ragel].
76
74
 
77
75
  ## Usage
78
76
 
@@ -142,15 +140,6 @@ JSON JSON(1..10) # => 1..10
142
140
  To find out how to add JSON support to other or your own classes, read the
143
141
  section "More Examples" below.
144
142
 
145
- To get the best compatibility to rails' JSON implementation, you can
146
-
147
- ```ruby
148
- require 'json/add/rails'
149
- ```
150
-
151
- Both of the additions attempt to require `'json'` (like above) first, if it has
152
- not been required yet.
153
-
154
143
  ## Serializing exceptions
155
144
 
156
145
  The JSON module doesn't extend `Exception` by default. If you convert an `Exception`
@@ -423,3 +412,5 @@ The latest version of this library can be downloaded at
423
412
  Online Documentation should be located at
424
413
 
425
414
  * https://www.rubydoc.info/gems/json
415
+
416
+ [Ragel]: http://www.colm.net/open-source/ragel/
@@ -16,7 +16,7 @@ static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
16
16
  i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
17
17
  i_pack, i_unpack, i_create_id, i_extend, i_key_p,
18
18
  i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth,
19
- i_buffer_initial_length, i_dup, i_escape_slash;
19
+ i_buffer_initial_length, i_dup, i_script_safe, i_escape_slash, i_strict;
20
20
 
21
21
  /*
22
22
  * Copyright 2001-2004 Unicode, Inc.
@@ -124,7 +124,7 @@ static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16
124
124
 
125
125
  /* Converts string to a JSON string in FBuffer buffer, where all but the ASCII
126
126
  * and control characters are JSON escaped. */
127
- static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char escape_slash)
127
+ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char script_safe)
128
128
  {
129
129
  const UTF8 *source = (UTF8 *) RSTRING_PTR(string);
130
130
  const UTF8 *sourceEnd = source + RSTRING_LEN(string);
@@ -175,7 +175,7 @@ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char escap
175
175
  fbuffer_append(buffer, "\\\"", 2);
176
176
  break;
177
177
  case '/':
178
- if(escape_slash) {
178
+ if(script_safe) {
179
179
  fbuffer_append(buffer, "\\/", 2);
180
180
  break;
181
181
  }
@@ -228,7 +228,7 @@ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char escap
228
228
  * characters required by the JSON standard are JSON escaped. The remaining
229
229
  * characters (should be UTF8) are just passed through and appended to the
230
230
  * result. */
231
- static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slash)
231
+ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char script_safe)
232
232
  {
233
233
  const char *ptr = RSTRING_PTR(string), *p;
234
234
  unsigned long len = RSTRING_LEN(string), start = 0, end = 0;
@@ -280,7 +280,7 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slas
280
280
  escape_len = 2;
281
281
  break;
282
282
  case '/':
283
- if(escape_slash) {
283
+ if(script_safe) {
284
284
  escape = "\\/";
285
285
  escape_len = 2;
286
286
  break;
@@ -294,6 +294,22 @@ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slas
294
294
  rb_raise(rb_path2class("JSON::GeneratorError"),
295
295
  "partial character in source, but hit end");
296
296
  }
297
+
298
+ if (script_safe && c == 0xE2) {
299
+ unsigned char c2 = (unsigned char) *(p+1);
300
+ unsigned char c3 = (unsigned char) *(p+2);
301
+ if (c2 == 0x80 && (c3 == 0xA8 || c3 == 0xA9)) {
302
+ fbuffer_append(buffer, ptr + start, end - start);
303
+ start = end = (end + clen);
304
+ if (c3 == 0xA8) {
305
+ fbuffer_append(buffer, "\\u2028", 6);
306
+ } else {
307
+ fbuffer_append(buffer, "\\u2029", 6);
308
+ }
309
+ continue;
310
+ }
311
+ }
312
+
297
313
  if (!isLegalUTF8((UTF8 *) p, clen)) {
298
314
  rb_raise(rb_path2class("JSON::GeneratorError"),
299
315
  "source sequence is illegal/malformed utf-8");
@@ -478,6 +494,7 @@ static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self)
478
494
  */
479
495
  static VALUE mString_included_s(VALUE self, VALUE modul) {
480
496
  VALUE result = rb_funcall(modul, i_extend, 1, mString_Extend);
497
+ rb_call_super(1, &modul);
481
498
  return result;
482
499
  }
483
500
 
@@ -726,8 +743,14 @@ static VALUE cState_configure(VALUE self, VALUE opts)
726
743
  state->allow_nan = RTEST(tmp);
727
744
  tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only));
728
745
  state->ascii_only = RTEST(tmp);
729
- tmp = rb_hash_aref(opts, ID2SYM(i_escape_slash));
730
- state->escape_slash = RTEST(tmp);
746
+ tmp = rb_hash_aref(opts, ID2SYM(i_script_safe));
747
+ state->script_safe = RTEST(tmp);
748
+ if (!state->script_safe) {
749
+ tmp = rb_hash_aref(opts, ID2SYM(i_escape_slash));
750
+ state->script_safe = RTEST(tmp);
751
+ }
752
+ tmp = rb_hash_aref(opts, ID2SYM(i_strict));
753
+ state->strict = RTEST(tmp);
731
754
  return self;
732
755
  }
733
756
 
@@ -762,7 +785,8 @@ static VALUE cState_to_h(VALUE self)
762
785
  rb_hash_aset(result, ID2SYM(i_allow_nan), state->allow_nan ? Qtrue : Qfalse);
763
786
  rb_hash_aset(result, ID2SYM(i_ascii_only), state->ascii_only ? Qtrue : Qfalse);
764
787
  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);
788
+ rb_hash_aset(result, ID2SYM(i_script_safe), state->script_safe ? Qtrue : Qfalse);
789
+ rb_hash_aset(result, ID2SYM(i_strict), state->strict ? Qtrue : Qfalse);
766
790
  rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth));
767
791
  rb_hash_aset(result, ID2SYM(i_buffer_initial_length), LONG2FIX(state->buffer_initial_length));
768
792
  return result;
@@ -843,7 +867,7 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
843
867
  if (klass == rb_cString) {
844
868
  key_to_s = key;
845
869
  } else if (klass == rb_cSymbol) {
846
- key_to_s = rb_id2str(SYM2ID(key));
870
+ key_to_s = rb_sym2str(key);
847
871
  } else {
848
872
  key_to_s = rb_funcall(key, i_to_s, 0);
849
873
  }
@@ -868,7 +892,6 @@ static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
868
892
  struct hash_foreach_arg arg;
869
893
 
870
894
  if (max_nesting != 0 && depth > max_nesting) {
871
- fbuffer_free(buffer);
872
895
  rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
873
896
  }
874
897
  fbuffer_append_char(buffer, '{');
@@ -903,7 +926,6 @@ static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
903
926
  long depth = ++state->depth;
904
927
  int i, j;
905
928
  if (max_nesting != 0 && depth > max_nesting) {
906
- fbuffer_free(buffer);
907
929
  rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
908
930
  }
909
931
  fbuffer_append_char(buffer, '[');
@@ -947,9 +969,9 @@ static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
947
969
  }
948
970
  #endif
949
971
  if (state->ascii_only) {
950
- convert_UTF8_to_JSON_ASCII(buffer, obj, state->escape_slash);
972
+ convert_UTF8_to_JSON_ASCII(buffer, obj, state->script_safe);
951
973
  } else {
952
- convert_UTF8_to_JSON(buffer, obj, state->escape_slash);
974
+ convert_UTF8_to_JSON(buffer, obj, state->script_safe);
953
975
  }
954
976
  fbuffer_append_char(buffer, '"');
955
977
  }
@@ -996,11 +1018,9 @@ static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
996
1018
  VALUE tmp = rb_funcall(obj, i_to_s, 0);
997
1019
  if (!allow_nan) {
998
1020
  if (isinf(value)) {
999
- fbuffer_free(buffer);
1000
- rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp));
1021
+ rb_raise(eGeneratorError, "%"PRIsVALUE" not allowed in JSON", RB_OBJ_STRING(tmp));
1001
1022
  } else if (isnan(value)) {
1002
- fbuffer_free(buffer);
1003
- rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp));
1023
+ rb_raise(eGeneratorError, "%"PRIsVALUE" not allowed in JSON", RB_OBJ_STRING(tmp));
1004
1024
  }
1005
1025
  }
1006
1026
  fbuffer_append_str(buffer, tmp);
@@ -1028,6 +1048,8 @@ static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *s
1028
1048
  generate_json_bignum(buffer, Vstate, state, obj);
1029
1049
  } else if (klass == rb_cFloat) {
1030
1050
  generate_json_float(buffer, Vstate, state, obj);
1051
+ } else if (state->strict) {
1052
+ rb_raise(eGeneratorError, "%"PRIsVALUE" not allowed in JSON", RB_OBJ_STRING(CLASS_OF(obj)));
1031
1053
  } else if (rb_respond_to(obj, i_to_json)) {
1032
1054
  tmp = rb_funcall(obj, i_to_json, 1, Vstate);
1033
1055
  Check_Type(tmp, T_STRING);
@@ -1070,11 +1092,45 @@ static FBuffer *cState_prepare_buffer(VALUE self)
1070
1092
  return buffer;
1071
1093
  }
1072
1094
 
1095
+ struct generate_json_data {
1096
+ FBuffer *buffer;
1097
+ VALUE vstate;
1098
+ JSON_Generator_State *state;
1099
+ VALUE obj;
1100
+ };
1101
+
1102
+ static VALUE generate_json_try(VALUE d)
1103
+ {
1104
+ struct generate_json_data *data = (struct generate_json_data *)d;
1105
+
1106
+ generate_json(data->buffer, data->vstate, data->state, data->obj);
1107
+
1108
+ return Qnil;
1109
+ }
1110
+
1111
+ static VALUE generate_json_rescue(VALUE d, VALUE exc)
1112
+ {
1113
+ struct generate_json_data *data = (struct generate_json_data *)d;
1114
+ fbuffer_free(data->buffer);
1115
+
1116
+ rb_exc_raise(exc);
1117
+
1118
+ return Qundef;
1119
+ }
1120
+
1073
1121
  static VALUE cState_partial_generate(VALUE self, VALUE obj)
1074
1122
  {
1075
1123
  FBuffer *buffer = cState_prepare_buffer(self);
1076
1124
  GET_STATE(self);
1077
- generate_json(buffer, self, state, obj);
1125
+
1126
+ struct generate_json_data data = {
1127
+ .buffer = buffer,
1128
+ .vstate = self,
1129
+ .state = state,
1130
+ .obj = obj
1131
+ };
1132
+ rb_rescue(generate_json_try, (VALUE)&data, generate_json_rescue, (VALUE)&data);
1133
+
1078
1134
  return fbuffer_to_s(buffer);
1079
1135
  }
1080
1136
 
@@ -1390,27 +1446,58 @@ static VALUE cState_max_nesting_set(VALUE self, VALUE depth)
1390
1446
  }
1391
1447
 
1392
1448
  /*
1393
- * call-seq: escape_slash
1449
+ * call-seq: script_safe
1394
1450
  *
1395
1451
  * If this boolean is true, the forward slashes will be escaped in
1396
1452
  * the json output.
1397
1453
  */
1398
- static VALUE cState_escape_slash(VALUE self)
1454
+ static VALUE cState_script_safe(VALUE self)
1399
1455
  {
1400
1456
  GET_STATE(self);
1401
- return state->escape_slash ? Qtrue : Qfalse;
1457
+ return state->script_safe ? Qtrue : Qfalse;
1402
1458
  }
1403
1459
 
1404
1460
  /*
1405
- * call-seq: escape_slash=(depth)
1461
+ * call-seq: script_safe=(enable)
1406
1462
  *
1407
1463
  * This sets whether or not the forward slashes will be escaped in
1408
1464
  * the json output.
1409
1465
  */
1410
- static VALUE cState_escape_slash_set(VALUE self, VALUE enable)
1466
+ static VALUE cState_script_safe_set(VALUE self, VALUE enable)
1467
+ {
1468
+ GET_STATE(self);
1469
+ state->script_safe = RTEST(enable);
1470
+ return Qnil;
1471
+ }
1472
+
1473
+ /*
1474
+ * call-seq: strict
1475
+ *
1476
+ * If this boolean is false, types unsupported by the JSON format will
1477
+ * be serialized as strings.
1478
+ * If this boolean is true, types unsupported by the JSON format will
1479
+ * raise a JSON::GeneratorError.
1480
+ */
1481
+ static VALUE cState_strict(VALUE self)
1482
+ {
1483
+ GET_STATE(self);
1484
+ return state->strict ? Qtrue : Qfalse;
1485
+ }
1486
+
1487
+ /*
1488
+ * call-seq: strict=(enable)
1489
+ *
1490
+ * This sets whether or not to serialize types unsupported by the
1491
+ * JSON format as strings.
1492
+ * If this boolean is false, types unsupported by the JSON format will
1493
+ * be serialized as strings.
1494
+ * If this boolean is true, types unsupported by the JSON format will
1495
+ * raise a JSON::GeneratorError.
1496
+ */
1497
+ static VALUE cState_strict_set(VALUE self, VALUE enable)
1411
1498
  {
1412
1499
  GET_STATE(self);
1413
- state->escape_slash = RTEST(enable);
1500
+ state->strict = RTEST(enable);
1414
1501
  return Qnil;
1415
1502
  }
1416
1503
 
@@ -1530,9 +1617,15 @@ void Init_generator(void)
1530
1617
  rb_define_method(cState, "array_nl=", cState_array_nl_set, 1);
1531
1618
  rb_define_method(cState, "max_nesting", cState_max_nesting, 0);
1532
1619
  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);
1620
+ rb_define_method(cState, "script_safe", cState_script_safe, 0);
1621
+ rb_define_method(cState, "script_safe?", cState_script_safe, 0);
1622
+ rb_define_method(cState, "script_safe=", cState_script_safe_set, 1);
1623
+ rb_define_alias(cState, "escape_slash", "script_safe");
1624
+ rb_define_alias(cState, "escape_slash?", "script_safe?");
1625
+ rb_define_alias(cState, "escape_slash=", "script_safe=");
1626
+ rb_define_method(cState, "strict", cState_strict, 0);
1627
+ rb_define_method(cState, "strict?", cState_strict, 0);
1628
+ rb_define_method(cState, "strict=", cState_strict_set, 1);
1536
1629
  rb_define_method(cState, "check_circular?", cState_check_circular_p, 0);
1537
1630
  rb_define_method(cState, "allow_nan?", cState_allow_nan_p, 0);
1538
1631
  rb_define_method(cState, "ascii_only?", cState_ascii_only_p, 0);
@@ -1589,7 +1682,9 @@ void Init_generator(void)
1589
1682
  i_object_nl = rb_intern("object_nl");
1590
1683
  i_array_nl = rb_intern("array_nl");
1591
1684
  i_max_nesting = rb_intern("max_nesting");
1685
+ i_script_safe = rb_intern("script_safe");
1592
1686
  i_escape_slash = rb_intern("escape_slash");
1687
+ i_strict = rb_intern("strict");
1593
1688
  i_allow_nan = rb_intern("allow_nan");
1594
1689
  i_ascii_only = rb_intern("ascii_only");
1595
1690
  i_depth = rb_intern("depth");
@@ -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, char escape_slash);
53
- static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char escape_slash);
52
+ static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string, char script_safe);
53
+ static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char script_safe);
54
54
  static char *fstrndup(const char *ptr, unsigned long len);
55
55
 
56
56
  /* ruby api and some helpers */
@@ -72,7 +72,8 @@ 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
+ char script_safe;
76
+ char strict;
76
77
  long depth;
77
78
  long buffer_initial_length;
78
79
  } JSON_Generator_State;
@@ -151,8 +152,10 @@ static VALUE cState_allow_nan_p(VALUE self);
151
152
  static VALUE cState_ascii_only_p(VALUE self);
152
153
  static VALUE cState_depth(VALUE self);
153
154
  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);
155
+ static VALUE cState_script_safe(VALUE self);
156
+ static VALUE cState_script_safe_set(VALUE self, VALUE depth);
157
+ static VALUE cState_strict(VALUE self);
158
+ static VALUE cState_strict_set(VALUE self, VALUE strict);
156
159
  static FBuffer *cState_prepare_buffer(VALUE self);
157
160
  #ifndef ZALLOC
158
161
  #define ZALLOC(type) ((type *)ruby_zalloc(sizeof(type)))