json 2.8.2 → 2.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +13 -0
- data/ext/json/ext/fbuffer/fbuffer.h +46 -16
- data/ext/json/ext/generator/generator.c +68 -40
- data/ext/json/ext/parser/extconf.rb +1 -1
- data/ext/json/ext/parser/parser.c +132 -132
- data/ext/json/ext/parser/parser.rl +16 -16
- data/lib/json/common.rb +38 -18
- data/lib/json/ext/generator/state.rb +11 -0
- data/lib/json/truffle_ruby/generator.rb +25 -17
- data/lib/json/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8404bbc1f96ebfb471ebafc0fadef1f11125cd62c6cf1157091793183a8bdc32
|
4
|
+
data.tar.gz: 4c93c85a2575eda3308cf404f116d8e638605d884fb14cd3ab3ee511b649c211
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2043b99c8ca617249d1b3c81d899ebaf86dc2436196f08b0f9a32ee3ba7fa174c20124ca0f75157828049dc71f46fcd8937978cf463f952b2f2e6af113dfab42
|
7
|
+
data.tar.gz: bccae4170d82569a9018ef7497bfb5b228a9371e7c79d84cb4fcc7659be144e3a3ba455db40ecf509a31b576f311d1ad4f85989aea549f59c003210adf87fc77
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
### 2024-12-18 (2.9.1)
|
4
|
+
|
5
|
+
* Fix support for Solaris 10.
|
6
|
+
|
7
|
+
### 2024-12-03 (2.9.0)
|
8
|
+
|
9
|
+
* Fix C implementation of `script_safe` escaping to not confuse some other 3 wide characters with `\u2028` and `\u2029`.
|
10
|
+
e.g. `JSON.generate(["倩", "瀨"], script_safe: true)` would generate the wrong JSON.
|
11
|
+
* `JSON.dump(object, some_io)` now write into the IO in chunks while previously it would buffer the entire JSON before writing.
|
12
|
+
* `JSON::GeneratorError` now has a `#invalid_object` attribute, making it easier to understand why an object tree cannot be serialized.
|
13
|
+
* Numerous improvements to the JRuby extension.
|
14
|
+
|
3
15
|
### 2024-11-14 (2.8.2)
|
4
16
|
|
5
17
|
* `JSON.load_file` explictly read the file as UTF-8.
|
@@ -18,6 +30,7 @@
|
|
18
30
|
pre-existing support for comments, make it suitable to parse `jsonc` documents.
|
19
31
|
* Many performance improvements to `JSON.parse` and `JSON.load`, up to `1.7x` faster on real world documents.
|
20
32
|
* Some minor performance improvements to `JSON.dump` and `JSON.generate`.
|
33
|
+
* `JSON.pretty_generate` no longer include newline inside empty object and arrays.
|
21
34
|
|
22
35
|
### 2024-11-04 (2.7.6)
|
23
36
|
|
@@ -46,9 +46,11 @@ typedef struct FBufferStruct {
|
|
46
46
|
unsigned long len;
|
47
47
|
unsigned long capa;
|
48
48
|
char *ptr;
|
49
|
+
VALUE io;
|
49
50
|
} FBuffer;
|
50
51
|
|
51
52
|
#define FBUFFER_STACK_SIZE 512
|
53
|
+
#define FBUFFER_IO_BUFFER_SIZE (16384 - 1)
|
52
54
|
#define FBUFFER_INITIAL_LENGTH_DEFAULT 1024
|
53
55
|
|
54
56
|
#define FBUFFER_PTR(fb) ((fb)->ptr)
|
@@ -66,7 +68,7 @@ static void fbuffer_append_long(FBuffer *fb, long number);
|
|
66
68
|
#endif
|
67
69
|
static inline void fbuffer_append_char(FBuffer *fb, char newchr);
|
68
70
|
#ifdef JSON_GENERATOR
|
69
|
-
static VALUE
|
71
|
+
static VALUE fbuffer_finalize(FBuffer *fb);
|
70
72
|
#endif
|
71
73
|
|
72
74
|
static void fbuffer_stack_init(FBuffer *fb, unsigned long initial_length, char *stack_buffer, long stack_buffer_size)
|
@@ -86,24 +88,19 @@ static void fbuffer_free(FBuffer *fb)
|
|
86
88
|
}
|
87
89
|
}
|
88
90
|
|
89
|
-
#ifndef JSON_GENERATOR
|
90
91
|
static void fbuffer_clear(FBuffer *fb)
|
91
92
|
{
|
92
93
|
fb->len = 0;
|
93
94
|
}
|
94
|
-
#endif
|
95
95
|
|
96
|
-
static void
|
96
|
+
static void fbuffer_flush(FBuffer *fb)
|
97
97
|
{
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
fb->ptr = ALLOC_N(char, fb->initial_length);
|
102
|
-
fb->capa = fb->initial_length;
|
103
|
-
}
|
104
|
-
|
105
|
-
for (required = fb->capa; requested > required - fb->len; required <<= 1);
|
98
|
+
rb_io_write(fb->io, rb_utf8_str_new(fb->ptr, fb->len));
|
99
|
+
fbuffer_clear(fb);
|
100
|
+
}
|
106
101
|
|
102
|
+
static void fbuffer_realloc(FBuffer *fb, unsigned long required)
|
103
|
+
{
|
107
104
|
if (required > fb->capa) {
|
108
105
|
if (fb->type == FBUFFER_STACK_ALLOCATED) {
|
109
106
|
const char *old_buffer = fb->ptr;
|
@@ -117,6 +114,32 @@ static void fbuffer_do_inc_capa(FBuffer *fb, unsigned long requested)
|
|
117
114
|
}
|
118
115
|
}
|
119
116
|
|
117
|
+
static void fbuffer_do_inc_capa(FBuffer *fb, unsigned long requested)
|
118
|
+
{
|
119
|
+
if (RB_UNLIKELY(fb->io)) {
|
120
|
+
if (fb->capa < FBUFFER_IO_BUFFER_SIZE) {
|
121
|
+
fbuffer_realloc(fb, FBUFFER_IO_BUFFER_SIZE);
|
122
|
+
} else {
|
123
|
+
fbuffer_flush(fb);
|
124
|
+
}
|
125
|
+
|
126
|
+
if (RB_LIKELY(requested < fb->capa)) {
|
127
|
+
return;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
unsigned long required;
|
132
|
+
|
133
|
+
if (RB_UNLIKELY(!fb->ptr)) {
|
134
|
+
fb->ptr = ALLOC_N(char, fb->initial_length);
|
135
|
+
fb->capa = fb->initial_length;
|
136
|
+
}
|
137
|
+
|
138
|
+
for (required = fb->capa; requested > required - fb->len; required <<= 1);
|
139
|
+
|
140
|
+
fbuffer_realloc(fb, required);
|
141
|
+
}
|
142
|
+
|
120
143
|
static inline void fbuffer_inc_capa(FBuffer *fb, unsigned long requested)
|
121
144
|
{
|
122
145
|
if (RB_UNLIKELY(requested > fb->capa - fb->len)) {
|
@@ -174,11 +197,18 @@ static void fbuffer_append_long(FBuffer *fb, long number)
|
|
174
197
|
fbuffer_append(fb, buffer_end - len, len);
|
175
198
|
}
|
176
199
|
|
177
|
-
static VALUE
|
200
|
+
static VALUE fbuffer_finalize(FBuffer *fb)
|
178
201
|
{
|
179
|
-
|
180
|
-
|
181
|
-
|
202
|
+
if (fb->io) {
|
203
|
+
fbuffer_flush(fb);
|
204
|
+
fbuffer_free(fb);
|
205
|
+
rb_io_flush(fb->io);
|
206
|
+
return fb->io;
|
207
|
+
} else {
|
208
|
+
VALUE result = rb_utf8_str_new(FBUFFER_PTR(fb), FBUFFER_LEN(fb));
|
209
|
+
fbuffer_free(fb);
|
210
|
+
return result;
|
211
|
+
}
|
182
212
|
}
|
183
213
|
#endif
|
184
214
|
#endif
|
@@ -54,7 +54,7 @@ struct generate_json_data {
|
|
54
54
|
};
|
55
55
|
|
56
56
|
static VALUE cState_from_state_s(VALUE self, VALUE opts);
|
57
|
-
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func);
|
57
|
+
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func, VALUE io);
|
58
58
|
static void generate_json(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj);
|
59
59
|
static void generate_json_object(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj);
|
60
60
|
static void generate_json_array(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj);
|
@@ -71,6 +71,31 @@ static void generate_json_float(FBuffer *buffer, struct generate_json_data *data
|
|
71
71
|
|
72
72
|
static int usascii_encindex, utf8_encindex, binary_encindex;
|
73
73
|
|
74
|
+
#ifdef RBIMPL_ATTR_NORETURN
|
75
|
+
RBIMPL_ATTR_NORETURN()
|
76
|
+
#endif
|
77
|
+
static void raise_generator_error_str(VALUE invalid_object, VALUE str)
|
78
|
+
{
|
79
|
+
VALUE exc = rb_exc_new_str(eGeneratorError, str);
|
80
|
+
rb_ivar_set(exc, rb_intern("@invalid_object"), invalid_object);
|
81
|
+
rb_exc_raise(exc);
|
82
|
+
}
|
83
|
+
|
84
|
+
#ifdef RBIMPL_ATTR_NORETURN
|
85
|
+
RBIMPL_ATTR_NORETURN()
|
86
|
+
#endif
|
87
|
+
#ifdef RBIMPL_ATTR_FORMAT
|
88
|
+
RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3)
|
89
|
+
#endif
|
90
|
+
static void raise_generator_error(VALUE invalid_object, const char *fmt, ...)
|
91
|
+
{
|
92
|
+
va_list args;
|
93
|
+
va_start(args, fmt);
|
94
|
+
VALUE str = rb_vsprintf(fmt, args);
|
95
|
+
va_end(args);
|
96
|
+
raise_generator_error_str(invalid_object, str);
|
97
|
+
}
|
98
|
+
|
74
99
|
/* Converts in_string to a JSON string (without the wrapping '"'
|
75
100
|
* characters) in FBuffer out_buffer.
|
76
101
|
*
|
@@ -130,7 +155,7 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE str, const char esca
|
|
130
155
|
}
|
131
156
|
case 3: {
|
132
157
|
unsigned char b2 = ptr[pos + 1];
|
133
|
-
if (RB_UNLIKELY(out_script_safe && b2 == 0x80)) {
|
158
|
+
if (RB_UNLIKELY(out_script_safe && ch == 0xE2 && b2 == 0x80)) {
|
134
159
|
unsigned char b3 = ptr[pos + 2];
|
135
160
|
if (b3 == 0xA8) {
|
136
161
|
FLUSH_POS(3);
|
@@ -453,7 +478,7 @@ static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self)
|
|
453
478
|
{
|
454
479
|
rb_check_arity(argc, 0, 1);
|
455
480
|
VALUE Vstate = cState_from_state_s(cState, argc == 1 ? argv[0] : Qnil);
|
456
|
-
return cState_partial_generate(Vstate, self, generate_json_object);
|
481
|
+
return cState_partial_generate(Vstate, self, generate_json_object, Qfalse);
|
457
482
|
}
|
458
483
|
|
459
484
|
/*
|
@@ -467,7 +492,7 @@ static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self)
|
|
467
492
|
static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self) {
|
468
493
|
rb_check_arity(argc, 0, 1);
|
469
494
|
VALUE Vstate = cState_from_state_s(cState, argc == 1 ? argv[0] : Qnil);
|
470
|
-
return cState_partial_generate(Vstate, self, generate_json_array);
|
495
|
+
return cState_partial_generate(Vstate, self, generate_json_array, Qfalse);
|
471
496
|
}
|
472
497
|
|
473
498
|
#ifdef RUBY_INTEGER_UNIFICATION
|
@@ -480,7 +505,7 @@ static VALUE mInteger_to_json(int argc, VALUE *argv, VALUE self)
|
|
480
505
|
{
|
481
506
|
rb_check_arity(argc, 0, 1);
|
482
507
|
VALUE Vstate = cState_from_state_s(cState, argc == 1 ? argv[0] : Qnil);
|
483
|
-
return cState_partial_generate(Vstate, self, generate_json_integer);
|
508
|
+
return cState_partial_generate(Vstate, self, generate_json_integer, Qfalse);
|
484
509
|
}
|
485
510
|
|
486
511
|
#else
|
@@ -493,7 +518,7 @@ static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self)
|
|
493
518
|
{
|
494
519
|
rb_check_arity(argc, 0, 1);
|
495
520
|
VALUE Vstate = cState_from_state_s(cState, argc == 1 ? argv[0] : Qnil);
|
496
|
-
return cState_partial_generate(Vstate, self, generate_json_fixnum);
|
521
|
+
return cState_partial_generate(Vstate, self, generate_json_fixnum, Qfalse);
|
497
522
|
}
|
498
523
|
|
499
524
|
/*
|
@@ -505,7 +530,7 @@ static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self)
|
|
505
530
|
{
|
506
531
|
rb_check_arity(argc, 0, 1);
|
507
532
|
VALUE Vstate = cState_from_state_s(cState, argc == 1 ? argv[0] : Qnil);
|
508
|
-
return cState_partial_generate(Vstate, self, generate_json_bignum);
|
533
|
+
return cState_partial_generate(Vstate, self, generate_json_bignum, Qfalse);
|
509
534
|
}
|
510
535
|
#endif
|
511
536
|
|
@@ -518,7 +543,7 @@ static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self)
|
|
518
543
|
{
|
519
544
|
rb_check_arity(argc, 0, 1);
|
520
545
|
VALUE Vstate = cState_from_state_s(cState, argc == 1 ? argv[0] : Qnil);
|
521
|
-
return cState_partial_generate(Vstate, self, generate_json_float);
|
546
|
+
return cState_partial_generate(Vstate, self, generate_json_float, Qfalse);
|
522
547
|
}
|
523
548
|
|
524
549
|
/*
|
@@ -543,7 +568,7 @@ static VALUE mString_to_json(int argc, VALUE *argv, VALUE self)
|
|
543
568
|
{
|
544
569
|
rb_check_arity(argc, 0, 1);
|
545
570
|
VALUE Vstate = cState_from_state_s(cState, argc == 1 ? argv[0] : Qnil);
|
546
|
-
return cState_partial_generate(Vstate, self, generate_json_string);
|
571
|
+
return cState_partial_generate(Vstate, self, generate_json_string, Qfalse);
|
547
572
|
}
|
548
573
|
|
549
574
|
/*
|
@@ -638,7 +663,7 @@ static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self)
|
|
638
663
|
rb_scan_args(argc, argv, "01", &state);
|
639
664
|
Check_Type(string, T_STRING);
|
640
665
|
state = cState_from_state_s(cState, state);
|
641
|
-
return cState_partial_generate(state, string, generate_json_string);
|
666
|
+
return cState_partial_generate(state, string, generate_json_string, Qfalse);
|
642
667
|
}
|
643
668
|
|
644
669
|
static void State_mark(void *ptr)
|
@@ -867,6 +892,17 @@ static inline int enc_utf8_compatible_p(int enc_idx)
|
|
867
892
|
return 0;
|
868
893
|
}
|
869
894
|
|
895
|
+
static VALUE encode_json_string_try(VALUE str)
|
896
|
+
{
|
897
|
+
return rb_funcall(str, i_encode, 1, Encoding_UTF_8);
|
898
|
+
}
|
899
|
+
|
900
|
+
static VALUE encode_json_string_rescue(VALUE str, VALUE exception)
|
901
|
+
{
|
902
|
+
raise_generator_error_str(str, rb_funcall(exception, rb_intern("message"), 0));
|
903
|
+
return Qundef;
|
904
|
+
}
|
905
|
+
|
870
906
|
static inline VALUE ensure_valid_encoding(VALUE str)
|
871
907
|
{
|
872
908
|
int encindex = RB_ENCODING_GET(str);
|
@@ -886,7 +922,7 @@ static inline VALUE ensure_valid_encoding(VALUE str)
|
|
886
922
|
}
|
887
923
|
}
|
888
924
|
|
889
|
-
str =
|
925
|
+
str = rb_rescue(encode_json_string_try, str, encode_json_string_rescue, str);
|
890
926
|
}
|
891
927
|
return str;
|
892
928
|
}
|
@@ -909,7 +945,7 @@ static void generate_json_string(FBuffer *buffer, struct generate_json_data *dat
|
|
909
945
|
}
|
910
946
|
break;
|
911
947
|
default:
|
912
|
-
|
948
|
+
raise_generator_error(obj, "source sequence is illegal/malformed utf-8");
|
913
949
|
break;
|
914
950
|
}
|
915
951
|
fbuffer_append_char(buffer, '"');
|
@@ -957,10 +993,8 @@ static void generate_json_float(FBuffer *buffer, struct generate_json_data *data
|
|
957
993
|
char allow_nan = state->allow_nan;
|
958
994
|
VALUE tmp = rb_funcall(obj, i_to_s, 0);
|
959
995
|
if (!allow_nan) {
|
960
|
-
if (isinf(value)) {
|
961
|
-
|
962
|
-
} else if (isnan(value)) {
|
963
|
-
rb_raise(eGeneratorError, "%"PRIsVALUE" not allowed in JSON", tmp);
|
996
|
+
if (isinf(value) || isnan(value)) {
|
997
|
+
raise_generator_error(obj, "%"PRIsVALUE" not allowed in JSON", tmp);
|
964
998
|
}
|
965
999
|
}
|
966
1000
|
fbuffer_append_str(buffer, tmp);
|
@@ -1008,7 +1042,7 @@ static void generate_json(FBuffer *buffer, struct generate_json_data *data, JSON
|
|
1008
1042
|
default:
|
1009
1043
|
general:
|
1010
1044
|
if (state->strict) {
|
1011
|
-
|
1045
|
+
raise_generator_error(obj, "%"PRIsVALUE" not allowed in JSON", CLASS_OF(obj));
|
1012
1046
|
} else if (rb_respond_to(obj, i_to_json)) {
|
1013
1047
|
tmp = rb_funcall(obj, i_to_json, 1, vstate_get(data));
|
1014
1048
|
Check_Type(tmp, T_STRING);
|
@@ -1036,21 +1070,19 @@ static VALUE generate_json_rescue(VALUE d, VALUE exc)
|
|
1036
1070
|
struct generate_json_data *data = (struct generate_json_data *)d;
|
1037
1071
|
fbuffer_free(data->buffer);
|
1038
1072
|
|
1039
|
-
if (RBASIC_CLASS(exc) == rb_path2class("Encoding::UndefinedConversionError")) {
|
1040
|
-
exc = rb_exc_new_str(eGeneratorError, rb_funcall(exc, rb_intern("message"), 0));
|
1041
|
-
}
|
1042
|
-
|
1043
1073
|
rb_exc_raise(exc);
|
1044
1074
|
|
1045
1075
|
return Qundef;
|
1046
1076
|
}
|
1047
1077
|
|
1048
|
-
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func)
|
1078
|
+
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func, VALUE io)
|
1049
1079
|
{
|
1050
1080
|
GET_STATE(self);
|
1051
1081
|
|
1052
1082
|
char stack_buffer[FBUFFER_STACK_SIZE];
|
1053
|
-
FBuffer buffer = {
|
1083
|
+
FBuffer buffer = {
|
1084
|
+
.io = RTEST(io) ? io : Qfalse,
|
1085
|
+
};
|
1054
1086
|
fbuffer_stack_init(&buffer, state->buffer_initial_length, stack_buffer, FBUFFER_STACK_SIZE);
|
1055
1087
|
|
1056
1088
|
struct generate_json_data data = {
|
@@ -1062,19 +1094,12 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func)
|
|
1062
1094
|
};
|
1063
1095
|
rb_rescue(generate_json_try, (VALUE)&data, generate_json_rescue, (VALUE)&data);
|
1064
1096
|
|
1065
|
-
return
|
1097
|
+
return fbuffer_finalize(&buffer);
|
1066
1098
|
}
|
1067
1099
|
|
1068
|
-
|
1069
|
-
* call-seq: generate(obj)
|
1070
|
-
*
|
1071
|
-
* Generates a valid JSON document from object +obj+ and returns the
|
1072
|
-
* result. If no valid JSON document can be created this method raises a
|
1073
|
-
* GeneratorError exception.
|
1074
|
-
*/
|
1075
|
-
static VALUE cState_generate(VALUE self, VALUE obj)
|
1100
|
+
static VALUE cState_generate(VALUE self, VALUE obj, VALUE io)
|
1076
1101
|
{
|
1077
|
-
VALUE result = cState_partial_generate(self, obj, generate_json);
|
1102
|
+
VALUE result = cState_partial_generate(self, obj, generate_json, io);
|
1078
1103
|
GET_STATE(self);
|
1079
1104
|
(void)state;
|
1080
1105
|
return result;
|
@@ -1502,14 +1527,16 @@ static VALUE cState_configure(VALUE self, VALUE opts)
|
|
1502
1527
|
return self;
|
1503
1528
|
}
|
1504
1529
|
|
1505
|
-
static VALUE cState_m_generate(VALUE klass, VALUE obj, VALUE opts)
|
1530
|
+
static VALUE cState_m_generate(VALUE klass, VALUE obj, VALUE opts, VALUE io)
|
1506
1531
|
{
|
1507
1532
|
JSON_Generator_State state = {0};
|
1508
1533
|
state_init(&state);
|
1509
1534
|
configure_state(&state, opts);
|
1510
1535
|
|
1511
1536
|
char stack_buffer[FBUFFER_STACK_SIZE];
|
1512
|
-
FBuffer buffer = {
|
1537
|
+
FBuffer buffer = {
|
1538
|
+
.io = RTEST(io) ? io : Qfalse,
|
1539
|
+
};
|
1513
1540
|
fbuffer_stack_init(&buffer, state.buffer_initial_length, stack_buffer, FBUFFER_STACK_SIZE);
|
1514
1541
|
|
1515
1542
|
struct generate_json_data data = {
|
@@ -1521,7 +1548,7 @@ static VALUE cState_m_generate(VALUE klass, VALUE obj, VALUE opts)
|
|
1521
1548
|
};
|
1522
1549
|
rb_rescue(generate_json_try, (VALUE)&data, generate_json_rescue, (VALUE)&data);
|
1523
1550
|
|
1524
|
-
return
|
1551
|
+
return fbuffer_finalize(&buffer);
|
1525
1552
|
}
|
1526
1553
|
|
1527
1554
|
/*
|
@@ -1540,10 +1567,11 @@ void Init_generator(void)
|
|
1540
1567
|
VALUE mExt = rb_define_module_under(mJSON, "Ext");
|
1541
1568
|
VALUE mGenerator = rb_define_module_under(mExt, "Generator");
|
1542
1569
|
|
1570
|
+
rb_global_variable(&eGeneratorError);
|
1543
1571
|
eGeneratorError = rb_path2class("JSON::GeneratorError");
|
1572
|
+
|
1573
|
+
rb_global_variable(&eNestingError);
|
1544
1574
|
eNestingError = rb_path2class("JSON::NestingError");
|
1545
|
-
rb_gc_register_mark_object(eGeneratorError);
|
1546
|
-
rb_gc_register_mark_object(eNestingError);
|
1547
1575
|
|
1548
1576
|
cState = rb_define_class_under(mGenerator, "State", rb_cObject);
|
1549
1577
|
rb_define_alloc_func(cState, cState_s_allocate);
|
@@ -1583,9 +1611,9 @@ void Init_generator(void)
|
|
1583
1611
|
rb_define_method(cState, "depth=", cState_depth_set, 1);
|
1584
1612
|
rb_define_method(cState, "buffer_initial_length", cState_buffer_initial_length, 0);
|
1585
1613
|
rb_define_method(cState, "buffer_initial_length=", cState_buffer_initial_length_set, 1);
|
1586
|
-
|
1614
|
+
rb_define_private_method(cState, "_generate", cState_generate, 2);
|
1587
1615
|
|
1588
|
-
rb_define_singleton_method(cState, "generate", cState_m_generate,
|
1616
|
+
rb_define_singleton_method(cState, "generate", cState_m_generate, 3);
|
1589
1617
|
|
1590
1618
|
VALUE mGeneratorMethods = rb_define_module_under(mGenerator, "GeneratorMethods");
|
1591
1619
|
|
@@ -3,9 +3,9 @@ require 'mkmf'
|
|
3
3
|
|
4
4
|
have_func("rb_enc_interned_str", "ruby.h") # RUBY_VERSION >= 3.0
|
5
5
|
have_func("rb_hash_new_capa", "ruby.h") # RUBY_VERSION >= 3.2
|
6
|
-
have_func("rb_gc_mark_locations", "ruby.h") # Missing on TruffleRuby
|
7
6
|
have_func("rb_hash_bulk_insert", "ruby.h") # Missing on TruffleRuby
|
8
7
|
have_func("rb_category_warn", "ruby.h") # Missing on TruffleRuby
|
8
|
+
have_func("strnlen", "string.h") # Missing on Solaris 10
|
9
9
|
|
10
10
|
append_cflags("-std=c99")
|
11
11
|
|