json 2.6.2 → 2.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +46 -0
- data/README.md +4 -13
- data/ext/json/ext/generator/generator.c +122 -27
- data/ext/json/ext/generator/generator.h +8 -5
- data/ext/json/ext/parser/parser.c +1828 -2964
- data/ext/json/ext/parser/parser.rl +85 -100
- data/json.gemspec +7 -6
- data/lib/json/add/bigdecimal.rb +37 -8
- data/lib/json/add/complex.rb +28 -5
- data/lib/json/add/date.rb +26 -6
- data/lib/json/add/date_time.rb +25 -8
- data/lib/json/add/exception.rb +24 -6
- data/lib/json/add/ostruct.rb +31 -8
- data/lib/json/add/range.rb +32 -7
- data/lib/json/add/rational.rb +27 -5
- data/lib/json/add/regexp.rb +25 -7
- data/lib/json/add/set.rb +25 -6
- data/lib/json/add/struct.rb +28 -6
- data/lib/json/add/symbol.rb +27 -4
- data/lib/json/add/time.rb +26 -5
- data/lib/json/common.rb +29 -34
- data/lib/json/generic_object.rb +6 -2
- data/lib/json/pure/generator.rb +62 -28
- data/lib/json/pure/parser.rb +1 -1
- data/lib/json/version.rb +1 -1
- data/lib/json.rb +9 -0
- metadata +6 -10
- data/VERSION +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ae811d90e98bbf8438c5abff24a9eabd5ef9c929115c14d3616a0c23f3a3fa2
|
4
|
+
data.tar.gz: eaa6afeb5ed814f5272bf54172b98ab217b26f850cb91d6fb081a9551237030c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
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
|
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(
|
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
|
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(
|
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(
|
730
|
-
state->
|
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(
|
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 =
|
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->
|
972
|
+
convert_UTF8_to_JSON_ASCII(buffer, obj, state->script_safe);
|
951
973
|
} else {
|
952
|
-
convert_UTF8_to_JSON(buffer, obj, state->
|
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
|
-
|
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
|
-
|
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
|
-
|
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:
|
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
|
1454
|
+
static VALUE cState_script_safe(VALUE self)
|
1399
1455
|
{
|
1400
1456
|
GET_STATE(self);
|
1401
|
-
return state->
|
1457
|
+
return state->script_safe ? Qtrue : Qfalse;
|
1402
1458
|
}
|
1403
1459
|
|
1404
1460
|
/*
|
1405
|
-
* call-seq:
|
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
|
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->
|
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, "
|
1534
|
-
rb_define_method(cState, "
|
1535
|
-
rb_define_method(cState, "
|
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
|
53
|
-
static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string, char
|
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
|
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
|
155
|
-
static VALUE
|
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)))
|