json 2.4.1 → 2.5.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 +4 -4
- data/CHANGES.md +4 -0
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +12 -6
- data/ext/json/ext/parser/parser.c +40 -25
- data/ext/json/ext/parser/parser.rl +40 -25
- data/json.gemspec +1 -1
- data/lib/json/common.rb +32 -13
- data/lib/json/version.rb +1 -1
- data/tests/json_generator_test.rb +4 -37
- data/tests/lib/core_assertions.rb +763 -0
- data/tests/lib/envutil.rb +365 -0
- data/tests/lib/find_executable.rb +22 -0
- data/tests/lib/helper.rb +4 -0
- data/tests/ractor_test.rb +30 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae21d647db9c8291ae1fd3137d82feff3c0f7d575c244bd23902332179ef660b
|
4
|
+
data.tar.gz: d51e458a1de384797e9a11ca9413f74ff58f067e4478a4d54d220527387914fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7b8eaa3f4cb78f26cdb0a4629529372baa32b9e30f16bcfe8955581e6e886561f3da4b396fd711a1ffdad04dec9657f4f0953bf4283a99d9c5243353272ad11
|
7
|
+
data.tar.gz: fe145361cd4b6bfd2fdb038ae5ab373d9f641893f43dab26460bc085833687ce78e105f2b18cff2c11d4cf974a32da082954d0117fffbeb8f75548272392201b
|
data/CHANGES.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.5.0
|
@@ -15,8 +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
|
19
|
-
i_SAFE_STATE_PROTOTYPE;
|
18
|
+
eNestingError;
|
20
19
|
|
21
20
|
static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
|
22
21
|
i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
|
@@ -620,13 +619,18 @@ static size_t State_memsize(const void *ptr)
|
|
620
619
|
return size;
|
621
620
|
}
|
622
621
|
|
622
|
+
#ifndef HAVE_RB_EXT_RACTOR_SAFE
|
623
|
+
# undef RUBY_TYPED_FROZEN_SHAREABLE
|
624
|
+
# define RUBY_TYPED_FROZEN_SHAREABLE 0
|
625
|
+
#endif
|
626
|
+
|
623
627
|
#ifdef NEW_TYPEDDATA_WRAPPER
|
624
628
|
static const rb_data_type_t JSON_Generator_State_type = {
|
625
629
|
"JSON/Generator/State",
|
626
630
|
{NULL, State_free, State_memsize,},
|
627
631
|
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
628
632
|
0, 0,
|
629
|
-
RUBY_TYPED_FREE_IMMEDIATELY,
|
633
|
+
RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE,
|
630
634
|
#endif
|
631
635
|
};
|
632
636
|
#endif
|
@@ -1166,8 +1170,7 @@ static VALUE cState_from_state_s(VALUE self, VALUE opts)
|
|
1166
1170
|
} else if (rb_obj_is_kind_of(opts, rb_cHash)) {
|
1167
1171
|
return rb_funcall(self, i_new, 1, opts);
|
1168
1172
|
} else {
|
1169
|
-
|
1170
|
-
return rb_funcall(prototype, i_dup, 0);
|
1173
|
+
return rb_class_new_instance(0, NULL, cState);
|
1171
1174
|
}
|
1172
1175
|
}
|
1173
1176
|
|
@@ -1499,6 +1502,10 @@ static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_l
|
|
1499
1502
|
*/
|
1500
1503
|
void Init_generator(void)
|
1501
1504
|
{
|
1505
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
1506
|
+
rb_ext_ractor_safe(true);
|
1507
|
+
#endif
|
1508
|
+
|
1502
1509
|
#undef rb_intern
|
1503
1510
|
rb_require("json/common");
|
1504
1511
|
|
@@ -1608,5 +1615,4 @@ void Init_generator(void)
|
|
1608
1615
|
i_encoding = rb_intern("encoding");
|
1609
1616
|
i_encode = rb_intern("encode");
|
1610
1617
|
#endif
|
1611
|
-
i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE");
|
1612
1618
|
}
|
@@ -91,13 +91,12 @@ static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
|
|
91
91
|
|
92
92
|
static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
|
93
93
|
static VALUE CNaN, CInfinity, CMinusInfinity;
|
94
|
-
static VALUE cBigDecimal = Qundef;
|
95
94
|
|
96
95
|
static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
97
96
|
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
|
98
97
|
i_object_class, i_array_class, i_decimal_class, i_key_p,
|
99
98
|
i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
|
100
|
-
i_leftshift, i_new,
|
99
|
+
i_leftshift, i_new, i_try_convert, i_freeze, i_uminus;
|
101
100
|
|
102
101
|
|
103
102
|
#line 126 "parser.rl"
|
@@ -991,19 +990,6 @@ enum {JSON_float_en_main = 1};
|
|
991
990
|
#line 346 "parser.rl"
|
992
991
|
|
993
992
|
|
994
|
-
static int is_bigdecimal_class(VALUE obj)
|
995
|
-
{
|
996
|
-
if (cBigDecimal == Qundef) {
|
997
|
-
if (rb_const_defined(rb_cObject, i_BigDecimal)) {
|
998
|
-
cBigDecimal = rb_const_get_at(rb_cObject, i_BigDecimal);
|
999
|
-
}
|
1000
|
-
else {
|
1001
|
-
return 0;
|
1002
|
-
}
|
1003
|
-
}
|
1004
|
-
return obj == cBigDecimal;
|
1005
|
-
}
|
1006
|
-
|
1007
993
|
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
1008
994
|
{
|
1009
995
|
int cs = EVIL;
|
@@ -1146,21 +1132,46 @@ case 7:
|
|
1146
1132
|
#line 368 "parser.rl"
|
1147
1133
|
|
1148
1134
|
if (cs >= JSON_float_first_final) {
|
1135
|
+
VALUE mod = Qnil;
|
1136
|
+
ID method_id = 0;
|
1137
|
+
if (rb_respond_to(json->decimal_class, i_try_convert)) {
|
1138
|
+
mod = json->decimal_class;
|
1139
|
+
method_id = i_try_convert;
|
1140
|
+
} else if (rb_respond_to(json->decimal_class, i_new)) {
|
1141
|
+
mod = json->decimal_class;
|
1142
|
+
method_id = i_new;
|
1143
|
+
} else if (RB_TYPE_P(json->decimal_class, T_CLASS)) {
|
1144
|
+
VALUE name = rb_class_name(json->decimal_class);
|
1145
|
+
const char *name_cstr = RSTRING_PTR(name);
|
1146
|
+
const char *last_colon = strrchr(name_cstr, ':');
|
1147
|
+
if (last_colon) {
|
1148
|
+
const char *mod_path_end = last_colon - 1;
|
1149
|
+
VALUE mod_path = rb_str_substr(name, 0, mod_path_end - name_cstr);
|
1150
|
+
mod = rb_path_to_class(mod_path);
|
1151
|
+
|
1152
|
+
const char *method_name_beg = last_colon + 1;
|
1153
|
+
long before_len = method_name_beg - name_cstr;
|
1154
|
+
long len = RSTRING_LEN(name) - before_len;
|
1155
|
+
VALUE method_name = rb_str_substr(name, before_len, len);
|
1156
|
+
method_id = SYM2ID(rb_str_intern(method_name));
|
1157
|
+
} else {
|
1158
|
+
mod = rb_mKernel;
|
1159
|
+
method_id = SYM2ID(rb_str_intern(name));
|
1160
|
+
}
|
1161
|
+
}
|
1162
|
+
|
1149
1163
|
long len = p - json->memo;
|
1150
1164
|
fbuffer_clear(json->fbuffer);
|
1151
1165
|
fbuffer_append(json->fbuffer, json->memo, len);
|
1152
1166
|
fbuffer_append_char(json->fbuffer, '\0');
|
1153
|
-
|
1154
|
-
|
1167
|
+
|
1168
|
+
if (method_id) {
|
1169
|
+
VALUE text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
|
1170
|
+
*result = rb_funcallv(mod, method_id, 1, &text);
|
1155
1171
|
} else {
|
1156
|
-
|
1157
|
-
text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
|
1158
|
-
if (is_bigdecimal_class(json->decimal_class)) {
|
1159
|
-
*result = rb_funcall(Qnil, i_BigDecimal, 1, text);
|
1160
|
-
} else {
|
1161
|
-
*result = rb_funcall(json->decimal_class, i_new, 1, text);
|
1162
|
-
}
|
1172
|
+
*result = DBL2NUM(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
|
1163
1173
|
}
|
1174
|
+
|
1164
1175
|
return p + 1;
|
1165
1176
|
} else {
|
1166
1177
|
return NULL;
|
@@ -2108,6 +2119,10 @@ static VALUE cParser_source(VALUE self)
|
|
2108
2119
|
|
2109
2120
|
void Init_parser(void)
|
2110
2121
|
{
|
2122
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
2123
|
+
rb_ext_ractor_safe(true);
|
2124
|
+
#endif
|
2125
|
+
|
2111
2126
|
#undef rb_intern
|
2112
2127
|
rb_require("json/common");
|
2113
2128
|
mJSON = rb_define_module("JSON");
|
@@ -2150,7 +2165,7 @@ void Init_parser(void)
|
|
2150
2165
|
i_aref = rb_intern("[]");
|
2151
2166
|
i_leftshift = rb_intern("<<");
|
2152
2167
|
i_new = rb_intern("new");
|
2153
|
-
|
2168
|
+
i_try_convert = rb_intern("try_convert");
|
2154
2169
|
i_freeze = rb_intern("freeze");
|
2155
2170
|
i_uminus = rb_intern("-@");
|
2156
2171
|
}
|
@@ -89,13 +89,12 @@ static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
|
|
89
89
|
|
90
90
|
static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
|
91
91
|
static VALUE CNaN, CInfinity, CMinusInfinity;
|
92
|
-
static VALUE cBigDecimal = Qundef;
|
93
92
|
|
94
93
|
static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
95
94
|
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
|
96
95
|
i_object_class, i_array_class, i_decimal_class, i_key_p,
|
97
96
|
i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
|
98
|
-
i_leftshift, i_new,
|
97
|
+
i_leftshift, i_new, i_try_convert, i_freeze, i_uminus;
|
99
98
|
|
100
99
|
%%{
|
101
100
|
machine JSON_common;
|
@@ -345,19 +344,6 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
|
|
345
344
|
) (^[0-9Ee.\-]? @exit );
|
346
345
|
}%%
|
347
346
|
|
348
|
-
static int is_bigdecimal_class(VALUE obj)
|
349
|
-
{
|
350
|
-
if (cBigDecimal == Qundef) {
|
351
|
-
if (rb_const_defined(rb_cObject, i_BigDecimal)) {
|
352
|
-
cBigDecimal = rb_const_get_at(rb_cObject, i_BigDecimal);
|
353
|
-
}
|
354
|
-
else {
|
355
|
-
return 0;
|
356
|
-
}
|
357
|
-
}
|
358
|
-
return obj == cBigDecimal;
|
359
|
-
}
|
360
|
-
|
361
347
|
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
362
348
|
{
|
363
349
|
int cs = EVIL;
|
@@ -367,21 +353,46 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
367
353
|
%% write exec;
|
368
354
|
|
369
355
|
if (cs >= JSON_float_first_final) {
|
356
|
+
VALUE mod = Qnil;
|
357
|
+
ID method_id = 0;
|
358
|
+
if (rb_respond_to(json->decimal_class, i_try_convert)) {
|
359
|
+
mod = json->decimal_class;
|
360
|
+
method_id = i_try_convert;
|
361
|
+
} else if (rb_respond_to(json->decimal_class, i_new)) {
|
362
|
+
mod = json->decimal_class;
|
363
|
+
method_id = i_new;
|
364
|
+
} else if (RB_TYPE_P(json->decimal_class, T_CLASS)) {
|
365
|
+
VALUE name = rb_class_name(json->decimal_class);
|
366
|
+
const char *name_cstr = RSTRING_PTR(name);
|
367
|
+
const char *last_colon = strrchr(name_cstr, ':');
|
368
|
+
if (last_colon) {
|
369
|
+
const char *mod_path_end = last_colon - 1;
|
370
|
+
VALUE mod_path = rb_str_substr(name, 0, mod_path_end - name_cstr);
|
371
|
+
mod = rb_path_to_class(mod_path);
|
372
|
+
|
373
|
+
const char *method_name_beg = last_colon + 1;
|
374
|
+
long before_len = method_name_beg - name_cstr;
|
375
|
+
long len = RSTRING_LEN(name) - before_len;
|
376
|
+
VALUE method_name = rb_str_substr(name, before_len, len);
|
377
|
+
method_id = SYM2ID(rb_str_intern(method_name));
|
378
|
+
} else {
|
379
|
+
mod = rb_mKernel;
|
380
|
+
method_id = SYM2ID(rb_str_intern(name));
|
381
|
+
}
|
382
|
+
}
|
383
|
+
|
370
384
|
long len = p - json->memo;
|
371
385
|
fbuffer_clear(json->fbuffer);
|
372
386
|
fbuffer_append(json->fbuffer, json->memo, len);
|
373
387
|
fbuffer_append_char(json->fbuffer, '\0');
|
374
|
-
|
375
|
-
|
388
|
+
|
389
|
+
if (method_id) {
|
390
|
+
VALUE text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
|
391
|
+
*result = rb_funcallv(mod, method_id, 1, &text);
|
376
392
|
} else {
|
377
|
-
|
378
|
-
text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
|
379
|
-
if (is_bigdecimal_class(json->decimal_class)) {
|
380
|
-
*result = rb_funcall(Qnil, i_BigDecimal, 1, text);
|
381
|
-
} else {
|
382
|
-
*result = rb_funcall(json->decimal_class, i_new, 1, text);
|
383
|
-
}
|
393
|
+
*result = DBL2NUM(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
|
384
394
|
}
|
395
|
+
|
385
396
|
return p + 1;
|
386
397
|
} else {
|
387
398
|
return NULL;
|
@@ -868,6 +879,10 @@ static VALUE cParser_source(VALUE self)
|
|
868
879
|
|
869
880
|
void Init_parser(void)
|
870
881
|
{
|
882
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
883
|
+
rb_ext_ractor_safe(true);
|
884
|
+
#endif
|
885
|
+
|
871
886
|
#undef rb_intern
|
872
887
|
rb_require("json/common");
|
873
888
|
mJSON = rb_define_module("JSON");
|
@@ -910,7 +925,7 @@ void Init_parser(void)
|
|
910
925
|
i_aref = rb_intern("[]");
|
911
926
|
i_leftshift = rb_intern("<<");
|
912
927
|
i_new = rb_intern("new");
|
913
|
-
|
928
|
+
i_try_convert = rb_intern("try_convert");
|
914
929
|
i_freeze = rb_intern("freeze");
|
915
930
|
i_uminus = rb_intern("-@");
|
916
931
|
}
|
data/json.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "json"
|
5
|
-
s.version = File.read('VERSION').chomp
|
5
|
+
s.version = File.read(File.expand_path('../VERSION', __FILE__)).chomp
|
6
6
|
|
7
7
|
s.summary = "JSON Implementation for Ruby"
|
8
8
|
s.description = "This is a JSON implementation as a Ruby extension in C."
|
data/lib/json/common.rb
CHANGED
@@ -71,22 +71,28 @@ module JSON
|
|
71
71
|
end
|
72
72
|
self.state = generator::State
|
73
73
|
const_set :State, self.state
|
74
|
-
const_set :SAFE_STATE_PROTOTYPE, State.new
|
75
|
-
|
74
|
+
const_set :SAFE_STATE_PROTOTYPE, State.new # for JRuby
|
75
|
+
ensure
|
76
|
+
$VERBOSE = old
|
77
|
+
end
|
78
|
+
|
79
|
+
def create_fast_state
|
80
|
+
State.new(
|
76
81
|
:indent => '',
|
77
82
|
:space => '',
|
78
83
|
:object_nl => "",
|
79
84
|
:array_nl => "",
|
80
85
|
:max_nesting => false
|
81
86
|
)
|
82
|
-
|
87
|
+
end
|
88
|
+
|
89
|
+
def create_pretty_state
|
90
|
+
State.new(
|
83
91
|
:indent => ' ',
|
84
92
|
:space => ' ',
|
85
93
|
:object_nl => "\n",
|
86
94
|
:array_nl => "\n"
|
87
95
|
)
|
88
|
-
ensure
|
89
|
-
$VERBOSE = old
|
90
96
|
end
|
91
97
|
|
92
98
|
# Returns the JSON generator module that is used by JSON. This is
|
@@ -98,13 +104,26 @@ module JSON
|
|
98
104
|
# either JSON::Ext::Generator::State or JSON::Pure::Generator::State:
|
99
105
|
# JSON.state # => JSON::Ext::Generator::State
|
100
106
|
attr_accessor :state
|
107
|
+
end
|
108
|
+
|
109
|
+
DEFAULT_CREATE_ID = 'json_class'.freeze
|
110
|
+
private_constant :DEFAULT_CREATE_ID
|
111
|
+
|
112
|
+
CREATE_ID_TLS_KEY = "JSON.create_id".freeze
|
113
|
+
private_constant :CREATE_ID_TLS_KEY
|
114
|
+
|
115
|
+
# Sets create identifier, which is used to decide if the _json_create_
|
116
|
+
# hook of a class should be called; initial value is +json_class+:
|
117
|
+
# JSON.create_id # => 'json_class'
|
118
|
+
def self.create_id=(new_value)
|
119
|
+
Thread.current[CREATE_ID_TLS_KEY] = new_value.dup.freeze
|
120
|
+
end
|
101
121
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
122
|
+
# Returns the current create identifier.
|
123
|
+
# See also JSON.create_id=.
|
124
|
+
def self.create_id
|
125
|
+
Thread.current[CREATE_ID_TLS_KEY] || DEFAULT_CREATE_ID
|
106
126
|
end
|
107
|
-
self.create_id = 'json_class'
|
108
127
|
|
109
128
|
NaN = 0.0/0
|
110
129
|
|
@@ -276,7 +295,7 @@ module JSON
|
|
276
295
|
if State === opts
|
277
296
|
state, opts = opts, nil
|
278
297
|
else
|
279
|
-
state =
|
298
|
+
state = State.new
|
280
299
|
end
|
281
300
|
if opts
|
282
301
|
if opts.respond_to? :to_hash
|
@@ -315,7 +334,7 @@ module JSON
|
|
315
334
|
if State === opts
|
316
335
|
state, opts = opts, nil
|
317
336
|
else
|
318
|
-
state =
|
337
|
+
state = JSON.create_fast_state
|
319
338
|
end
|
320
339
|
if opts
|
321
340
|
if opts.respond_to? :to_hash
|
@@ -370,7 +389,7 @@ module JSON
|
|
370
389
|
if State === opts
|
371
390
|
state, opts = opts, nil
|
372
391
|
else
|
373
|
-
state =
|
392
|
+
state = JSON.create_pretty_state
|
374
393
|
end
|
375
394
|
if opts
|
376
395
|
if opts.respond_to? :to_hash
|
data/lib/json/version.rb
CHANGED
@@ -48,35 +48,6 @@ EOT
|
|
48
48
|
$VERBOSE = v
|
49
49
|
end
|
50
50
|
|
51
|
-
def test_remove_const_segv
|
52
|
-
stress = GC.stress
|
53
|
-
const = JSON::SAFE_STATE_PROTOTYPE.dup
|
54
|
-
|
55
|
-
bignum_too_long_to_embed_as_string = 1234567890123456789012345
|
56
|
-
expect = bignum_too_long_to_embed_as_string.to_s
|
57
|
-
GC.stress = true
|
58
|
-
|
59
|
-
10.times do |i|
|
60
|
-
tmp = bignum_too_long_to_embed_as_string.to_json
|
61
|
-
raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
|
62
|
-
end
|
63
|
-
|
64
|
-
silence do
|
65
|
-
JSON.const_set :SAFE_STATE_PROTOTYPE, nil
|
66
|
-
end
|
67
|
-
|
68
|
-
10.times do |i|
|
69
|
-
assert_raise TypeError do
|
70
|
-
bignum_too_long_to_embed_as_string.to_json
|
71
|
-
end
|
72
|
-
end
|
73
|
-
ensure
|
74
|
-
GC.stress = stress
|
75
|
-
silence do
|
76
|
-
JSON.const_set :SAFE_STATE_PROTOTYPE, const
|
77
|
-
end
|
78
|
-
end if JSON.const_defined?("Ext") && RUBY_ENGINE != 'jruby'
|
79
|
-
|
80
51
|
def test_generate
|
81
52
|
json = generate(@hash)
|
82
53
|
assert_equal(parse(@json2), parse(json))
|
@@ -171,7 +142,7 @@ EOT
|
|
171
142
|
end
|
172
143
|
|
173
144
|
def test_pretty_state
|
174
|
-
state =
|
145
|
+
state = JSON.create_pretty_state
|
175
146
|
assert_equal({
|
176
147
|
:allow_nan => false,
|
177
148
|
:array_nl => "\n",
|
@@ -188,7 +159,7 @@ EOT
|
|
188
159
|
end
|
189
160
|
|
190
161
|
def test_safe_state
|
191
|
-
state =
|
162
|
+
state = JSON::State.new
|
192
163
|
assert_equal({
|
193
164
|
:allow_nan => false,
|
194
165
|
:array_nl => "",
|
@@ -205,7 +176,7 @@ EOT
|
|
205
176
|
end
|
206
177
|
|
207
178
|
def test_fast_state
|
208
|
-
state =
|
179
|
+
state = JSON.create_fast_state
|
209
180
|
assert_equal({
|
210
181
|
:allow_nan => false,
|
211
182
|
:array_nl => "",
|
@@ -241,12 +212,8 @@ EOT
|
|
241
212
|
|
242
213
|
def test_depth
|
243
214
|
ary = []; ary << ary
|
244
|
-
assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
|
245
215
|
assert_raise(JSON::NestingError) { generate(ary) }
|
246
|
-
assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
|
247
|
-
assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
|
248
216
|
assert_raise(JSON::NestingError) { JSON.pretty_generate(ary) }
|
249
|
-
assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
|
250
217
|
s = JSON.state.new
|
251
218
|
assert_equal 0, s.depth
|
252
219
|
assert_raise(JSON::NestingError) { ary.to_json(s) }
|
@@ -265,7 +232,7 @@ EOT
|
|
265
232
|
end
|
266
233
|
|
267
234
|
def test_gc
|
268
|
-
if respond_to?(:assert_in_out_err)
|
235
|
+
if respond_to?(:assert_in_out_err) && !(RUBY_PLATFORM =~ /java/)
|
269
236
|
assert_in_out_err(%w[-rjson --disable-gems], <<-EOS, [], [])
|
270
237
|
bignum_too_long_to_embed_as_string = 1234567890123456789012345
|
271
238
|
expect = bignum_too_long_to_embed_as_string.to_s
|