oj 3.13.18 → 3.13.21
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/CHANGELOG.md +12 -0
- data/ext/oj/extconf.rb +2 -14
- data/ext/oj/parse.c +18 -50
- data/ext/oj/parse.h +1 -1
- data/ext/oj/saj2.c +4 -4
- data/lib/oj/version.rb +1 -1
- data/pages/Compatibility.md +1 -1
- data/test/helper.rb +8 -2
- data/test/json_gem/json_parser_test.rb +2 -0
- data/test/json_gem/test_helper.rb +7 -3
- data/test/test_custom.rb +12 -0
- data/test/test_file.rb +7 -2
- data/test/test_gc.rb +13 -0
- data/test/test_integer_range.rb +6 -0
- data/test/test_object.rb +39 -1
- data/test/test_parser_saj.rb +37 -0
- data/test/test_scp.rb +4 -4
- data/test/test_strict.rb +2 -0
- data/test/test_wab.rb +2 -0
- 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: ca812104ece12895a17969eea5c870837070875b8c59917220adea228f24cab2
|
4
|
+
data.tar.gz: c46bd5d0d161b9e8e0337daf5af42f9fcc37ec41401a2d9fb3c5416e2ce2fccc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 860134683a2d535fc9dfd17eb6ad369855ede35c0474dd386d9a8a3fb80e1a5d9cf2133d04c6ebea84d65ad127b62a2e83adf4f5166db8cbdf0dadf50f9d3984
|
7
|
+
data.tar.gz: cac281da136cf4a336245105eb847ec369e36b09ec8f48e80e3e48bacd0aacc6052d88b1cdca3a912f82f329444fa6c74e02e3ee5f9c56b6002afafbd65611ca
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 3.13.21 - 2022-08-19
|
4
|
+
|
5
|
+
- Bug parsing big numbers fixed in the SAJ parser.
|
6
|
+
|
7
|
+
## 3.13.20 - 2022-08-07
|
8
|
+
|
9
|
+
- SSE4 made optional with a `--with-sse42` flag to the compile.
|
10
|
+
|
11
|
+
## 3.13.19 - 2022-07-29
|
12
|
+
|
13
|
+
- TruffleRuby issues resolved.
|
14
|
+
|
3
15
|
## 3.13.18 - 2022-07-25
|
4
16
|
|
5
17
|
- Fixed SSE detection at run time.
|
data/ext/oj/extconf.rb
CHANGED
@@ -34,21 +34,9 @@ have_func('rb_hash_bulk_insert', 'ruby.h') unless '2' == version[0] && '6' == ve
|
|
34
34
|
|
35
35
|
dflags['OJ_DEBUG'] = true unless ENV['OJ_DEBUG'].nil?
|
36
36
|
|
37
|
-
|
38
|
-
#include <string.h>
|
39
|
-
#include <nmmintrin.h>
|
40
|
-
int main(int argc, char **argv) {
|
41
|
-
const char *str = "hello ";
|
42
|
-
const char chars[16] = "\x00\\\"";
|
43
|
-
const __m128i terminate = _mm_loadu_si128((const __m128i *)&chars[0]);
|
44
|
-
const __m128i string = _mm_loadu_si128((const __m128i *)str);
|
45
|
-
int r = _mm_cmpestri(terminate, 3, string, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT);
|
46
|
-
return r == 16 ? 0 : 1;
|
47
|
-
}
|
48
|
-
SRC
|
49
|
-
|
50
|
-
if try_run(src, '-msse4.2')
|
37
|
+
if with_config('--with-sse42')
|
51
38
|
$CPPFLAGS += ' -msse4.2'
|
39
|
+
dflags['OJ_USE_SSE4_2'] = 1
|
52
40
|
end
|
53
41
|
|
54
42
|
dflags.each do |k,v|
|
data/ext/oj/parse.c
CHANGED
@@ -192,28 +192,7 @@ static inline const char *scan_string_noSIMD(const char *str, const char *end) {
|
|
192
192
|
return str;
|
193
193
|
}
|
194
194
|
|
195
|
-
|
196
|
-
// https://github.com/tensorflow/tensorflow/blob/5dcfc51118817f27fad5246812d83e5dccdc5f72/tensorflow/core/lib/hash/crc32c_accelerate.cc#L21-L38
|
197
|
-
#ifdef __SSE4_2__
|
198
|
-
#if defined(__x86_64__) && defined(__GNUC__) && \
|
199
|
-
(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
|
200
|
-
#define USE_SSE_DETECT 1
|
201
|
-
#elif defined(__x86_64__) && defined(__clang__)
|
202
|
-
#if __has_builtin(__builtin_cpu_supports)
|
203
|
-
#define USE_SSE_DETECT 1
|
204
|
-
#endif
|
205
|
-
#endif
|
206
|
-
#endif /* __SSE4_2__ */
|
207
|
-
|
208
|
-
// This version of Apple clang has a bug:
|
209
|
-
// https://llvm.org/bugs/show_bug.cgi?id=25510
|
210
|
-
#if defined(__APPLE__) && (__clang_major__ <= 8)
|
211
|
-
#undef USE_SSE_DETECT
|
212
|
-
#endif
|
213
|
-
|
214
|
-
#ifdef USE_SSE_DETECT
|
215
|
-
#include <nmmintrin.h>
|
216
|
-
|
195
|
+
#ifdef OJ_USE_SSE4_2
|
217
196
|
static inline const char *scan_string_SIMD(const char *str, const char *end) {
|
218
197
|
static const char chars[16] = "\x00\\\"";
|
219
198
|
const __m128i terminate = _mm_loadu_si128((const __m128i *)&chars[0]);
|
@@ -232,23 +211,12 @@ static inline const char *scan_string_SIMD(const char *str, const char *end) {
|
|
232
211
|
}
|
233
212
|
#endif
|
234
213
|
|
235
|
-
static bool cpu_supports_sse42(void) {
|
236
|
-
#if USE_SSE_DETECT
|
237
|
-
__builtin_cpu_init();
|
238
|
-
return (__builtin_cpu_supports("sse4.2"));
|
239
|
-
#else
|
240
|
-
return false;
|
241
|
-
#endif
|
242
|
-
}
|
243
|
-
|
244
214
|
static const char *(*scan_func) (const char *str, const char *end) = scan_string_noSIMD;
|
245
215
|
|
246
216
|
void oj_scanner_init(void) {
|
247
|
-
|
248
|
-
|
249
|
-
scan_func = scan_string_SIMD;
|
217
|
+
#ifdef OJ_USE_SSE4_2
|
218
|
+
scan_func = scan_string_SIMD;
|
250
219
|
#endif
|
251
|
-
}
|
252
220
|
}
|
253
221
|
|
254
222
|
// entered at /
|
@@ -663,7 +631,7 @@ static void read_num(ParseInfo pi) {
|
|
663
631
|
}
|
664
632
|
|
665
633
|
static void array_start(ParseInfo pi) {
|
666
|
-
|
634
|
+
VALUE v = pi->start_array(pi);
|
667
635
|
|
668
636
|
stack_push(&pi->stack, v, NEXT_ARRAY_NEW);
|
669
637
|
}
|
@@ -687,13 +655,13 @@ static void array_end(ParseInfo pi) {
|
|
687
655
|
}
|
688
656
|
|
689
657
|
static void hash_start(ParseInfo pi) {
|
690
|
-
|
658
|
+
VALUE v = pi->start_hash(pi);
|
691
659
|
|
692
660
|
stack_push(&pi->stack, v, NEXT_HASH_NEW);
|
693
661
|
}
|
694
662
|
|
695
663
|
static void hash_end(ParseInfo pi) {
|
696
|
-
|
664
|
+
Val hash = stack_peek(&pi->stack);
|
697
665
|
|
698
666
|
// leave hash on stack until just before
|
699
667
|
if (0 == hash) {
|
@@ -880,7 +848,7 @@ static long double exp_plus[] = {
|
|
880
848
|
|
881
849
|
VALUE
|
882
850
|
oj_num_as_value(NumInfo ni) {
|
883
|
-
|
851
|
+
VALUE rnum = Qnil;
|
884
852
|
|
885
853
|
if (ni->infinity) {
|
886
854
|
if (ni->neg) {
|
@@ -915,7 +883,7 @@ oj_num_as_value(NumInfo ni) {
|
|
915
883
|
}
|
916
884
|
} else { // decimal
|
917
885
|
if (ni->big) {
|
918
|
-
|
886
|
+
VALUE bd = rb_str_new(ni->str, ni->len);
|
919
887
|
|
920
888
|
rnum = rb_rescue2(parse_big_decimal, bd, rescue_big_decimal, bd, rb_eException, 0);
|
921
889
|
if (ni->no_big) {
|
@@ -943,7 +911,7 @@ oj_num_as_value(NumInfo ni) {
|
|
943
911
|
}
|
944
912
|
rnum = rb_float_new((double)ld);
|
945
913
|
} else if (RubyDec == ni->bigdec_load) {
|
946
|
-
|
914
|
+
VALUE sv = rb_str_new(ni->str, ni->len);
|
947
915
|
|
948
916
|
rnum = rb_funcall(sv, rb_intern("to_f"), 0);
|
949
917
|
} else {
|
@@ -1038,7 +1006,7 @@ static VALUE protect_parse(VALUE pip) {
|
|
1038
1006
|
|
1039
1007
|
extern int oj_utf8_index;
|
1040
1008
|
|
1041
|
-
static void oj_pi_set_input_str(ParseInfo pi,
|
1009
|
+
static void oj_pi_set_input_str(ParseInfo pi, VALUE *inputp) {
|
1042
1010
|
int idx = RB_ENCODING_GET(*inputp);
|
1043
1011
|
|
1044
1012
|
if (oj_utf8_encoding_index != idx) {
|
@@ -1051,12 +1019,12 @@ static void oj_pi_set_input_str(ParseInfo pi, volatile VALUE *inputp) {
|
|
1051
1019
|
|
1052
1020
|
VALUE
|
1053
1021
|
oj_pi_parse(int argc, VALUE *argv, ParseInfo pi, char *json, size_t len, int yieldOk) {
|
1054
|
-
char *
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
int
|
1059
|
-
int
|
1022
|
+
char * buf = 0;
|
1023
|
+
VALUE input;
|
1024
|
+
VALUE wrapped_stack;
|
1025
|
+
VALUE result = Qnil;
|
1026
|
+
int line = 0;
|
1027
|
+
int free_json = 0;
|
1060
1028
|
|
1061
1029
|
if (argc < 1) {
|
1062
1030
|
rb_raise(rb_eArgError, "Wrong number of arguments to parse.");
|
@@ -1092,8 +1060,8 @@ oj_pi_parse(int argc, VALUE *argv, ParseInfo pi, char *json, size_t len, int yie
|
|
1092
1060
|
rb_raise(rb_eTypeError, "Nil is not a valid JSON source.");
|
1093
1061
|
}
|
1094
1062
|
} else {
|
1095
|
-
VALUE
|
1096
|
-
|
1063
|
+
VALUE clas = rb_obj_class(input);
|
1064
|
+
VALUE s;
|
1097
1065
|
|
1098
1066
|
if (oj_stringio_class == clas) {
|
1099
1067
|
s = rb_funcall2(input, oj_string_id, 0, 0);
|
data/ext/oj/parse.h
CHANGED
@@ -97,7 +97,7 @@ static inline void parse_info_init(ParseInfo pi) {
|
|
97
97
|
memset(pi, 0, sizeof(struct _parseInfo));
|
98
98
|
}
|
99
99
|
|
100
|
-
extern void oj_scanner_init();
|
100
|
+
extern void oj_scanner_init(void);
|
101
101
|
|
102
102
|
static inline bool empty_ok(Options options) {
|
103
103
|
switch (options->mode) {
|
data/ext/oj/saj2.c
CHANGED
@@ -289,7 +289,7 @@ static void add_float_key_loc(ojParser p) {
|
|
289
289
|
}
|
290
290
|
|
291
291
|
static void add_big(ojParser p) {
|
292
|
-
rb_funcall((
|
292
|
+
rb_funcall(((Delegate)p->ctx)->handler,
|
293
293
|
oj_add_value_id,
|
294
294
|
2,
|
295
295
|
rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
|
@@ -297,7 +297,7 @@ static void add_big(ojParser p) {
|
|
297
297
|
}
|
298
298
|
|
299
299
|
static void add_big_loc(ojParser p) {
|
300
|
-
rb_funcall((
|
300
|
+
rb_funcall(((Delegate)p->ctx)->handler,
|
301
301
|
oj_add_value_id,
|
302
302
|
4,
|
303
303
|
rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
|
@@ -307,7 +307,7 @@ static void add_big_loc(ojParser p) {
|
|
307
307
|
}
|
308
308
|
|
309
309
|
static void add_big_key(ojParser p) {
|
310
|
-
rb_funcall((
|
310
|
+
rb_funcall(((Delegate)p->ctx)->handler,
|
311
311
|
oj_add_value_id,
|
312
312
|
2,
|
313
313
|
rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
|
@@ -315,7 +315,7 @@ static void add_big_key(ojParser p) {
|
|
315
315
|
}
|
316
316
|
|
317
317
|
static void add_big_key_loc(ojParser p) {
|
318
|
-
rb_funcall((
|
318
|
+
rb_funcall(((Delegate)p->ctx)->handler,
|
319
319
|
oj_add_value_id,
|
320
320
|
4,
|
321
321
|
rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
|
data/lib/oj/version.rb
CHANGED
data/pages/Compatibility.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
**Ruby**
|
4
4
|
|
5
|
-
Oj is compatible with Ruby 2.
|
5
|
+
Oj is compatible with Ruby 2.4+ and RBX.
|
6
6
|
Support for JRuby has been removed as JRuby no longer supports C extensions and
|
7
7
|
there are bugs in the older versions that are not being fixed.
|
8
8
|
|
data/test/helper.rb
CHANGED
@@ -19,10 +19,16 @@ require 'pp'
|
|
19
19
|
require 'oj'
|
20
20
|
|
21
21
|
|
22
|
-
|
22
|
+
def verify_gc_compaction
|
23
23
|
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
24
24
|
# move objects around, helping to find object movement bugs.
|
25
|
-
GC.verify_compaction_references(
|
25
|
+
if defined?(GC.verify_compaction_references) == 'method' && !(RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/)
|
26
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.2.0")
|
27
|
+
GC.verify_compaction_references(expand_heap: true, toward: :empty)
|
28
|
+
else
|
29
|
+
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
30
|
+
end
|
31
|
+
end
|
26
32
|
end
|
27
33
|
|
28
34
|
|
@@ -24,6 +24,8 @@ class JSONParserTest < Test::Unit::TestCase
|
|
24
24
|
end if defined?(Encoding::UTF_16)
|
25
25
|
|
26
26
|
def test_error_message_encoding
|
27
|
+
omit 'TruffleRuby causes NameError(<uninitialized constant JSON::Ext>)' if RUBY_ENGINE == 'truffleruby'
|
28
|
+
|
27
29
|
bug10705 = '[ruby-core:67386] [Bug #10705]'
|
28
30
|
json = ".\"\xE2\x88\x9A\"".force_encoding(Encoding::UTF_8)
|
29
31
|
e = assert_raise(JSON::ParserError) {
|
@@ -15,10 +15,14 @@ else
|
|
15
15
|
require 'oj'
|
16
16
|
Oj.mimic_JSON
|
17
17
|
|
18
|
+
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
19
|
+
# move objects around, helping to find object movement bugs.
|
18
20
|
if defined?(GC.verify_compaction_references) == 'method'
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.2.0")
|
22
|
+
GC.verify_compaction_references(expand_heap: true, toward: :empty)
|
23
|
+
else
|
24
|
+
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
25
|
+
end
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
data/test/test_custom.rb
CHANGED
@@ -200,6 +200,8 @@ class CustomJuice < Minitest::Test
|
|
200
200
|
end
|
201
201
|
|
202
202
|
def test_deep_nest
|
203
|
+
skip 'TruffleRuby causes SEGV' if RUBY_ENGINE == 'truffleruby'
|
204
|
+
|
203
205
|
begin
|
204
206
|
n = 10000
|
205
207
|
Oj.strict_load('[' * n + ']' * n)
|
@@ -258,6 +260,8 @@ class CustomJuice < Minitest::Test
|
|
258
260
|
end
|
259
261
|
|
260
262
|
def test_object
|
263
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
264
|
+
|
261
265
|
obj = Jeez.new(true, 58)
|
262
266
|
json = Oj.dump(obj, create_id: "^o", use_to_json: false, use_as_json: false, use_to_hash: false)
|
263
267
|
assert_equal(%|{"x":true,"y":58,"_z":"true"}|, json)
|
@@ -403,11 +407,15 @@ class CustomJuice < Minitest::Test
|
|
403
407
|
end
|
404
408
|
|
405
409
|
def test_range
|
410
|
+
skip 'TruffleRuby fails this spec' if RUBY_ENGINE == 'truffleruby'
|
411
|
+
|
406
412
|
obj = 3..8
|
407
413
|
dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
|
408
414
|
end
|
409
415
|
|
410
416
|
def test_date
|
417
|
+
skip 'TruffleRuby causes SEGV' if RUBY_ENGINE == 'truffleruby'
|
418
|
+
|
411
419
|
obj = Date.new(2017, 1, 5)
|
412
420
|
dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
|
413
421
|
end
|
@@ -437,6 +445,8 @@ class CustomJuice < Minitest::Test
|
|
437
445
|
end
|
438
446
|
|
439
447
|
def test_datetime
|
448
|
+
skip 'TruffleRuby causes SEGV' if RUBY_ENGINE == 'truffleruby'
|
449
|
+
|
440
450
|
obj = DateTime.new(2017, 1, 5, 10, 20, 30)
|
441
451
|
dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
|
442
452
|
end
|
@@ -480,6 +490,8 @@ class CustomJuice < Minitest::Test
|
|
480
490
|
end
|
481
491
|
|
482
492
|
def test_time
|
493
|
+
skip 'TruffleRuby fails this spec' if RUBY_ENGINE == 'truffleruby'
|
494
|
+
|
483
495
|
obj = Time.now()
|
484
496
|
dump_load_dump(obj, false, :time_format => :unix, :create_id => "^o", :create_additions => true)
|
485
497
|
dump_load_dump(obj, false, :time_format => :unix_zone, :create_id => "^o", :create_additions => true)
|
data/test/test_file.rb
CHANGED
@@ -125,13 +125,16 @@ class FileJuice < Minitest::Test
|
|
125
125
|
|
126
126
|
# Time
|
127
127
|
def test_time_object
|
128
|
+
skip 'TruffleRuby fails this spec' if RUBY_ENGINE == 'truffleruby'
|
129
|
+
|
128
130
|
t = Time.now()
|
129
131
|
Oj.default_options = { :mode => :object, :time_format => :unix_zone }
|
130
132
|
dump_and_load(t, false)
|
131
133
|
end
|
132
134
|
def test_time_object_early
|
133
|
-
|
134
|
-
|
135
|
+
skip 'Windows does not support dates before 1970.' if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
136
|
+
skip 'TruffleRuby fails this spec' if RUBY_ENGINE == 'truffleruby'
|
137
|
+
|
135
138
|
t = Time.xmlschema("1954-01-05T00:00:00.123456")
|
136
139
|
Oj.default_options = { :mode => :object, :time_format => :unix_zone }
|
137
140
|
dump_and_load(t, false)
|
@@ -166,6 +169,8 @@ class FileJuice < Minitest::Test
|
|
166
169
|
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
167
170
|
elsif 'jruby' == $ruby
|
168
171
|
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
172
|
+
elsif 'truffleruby' == $ruby
|
173
|
+
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
169
174
|
else
|
170
175
|
assert_equal(%{{"^u":["Range",1,7,false]}}, json)
|
171
176
|
end
|
data/test/test_gc.rb
CHANGED
@@ -26,10 +26,12 @@ class GCTest < Minitest::Test
|
|
26
26
|
|
27
27
|
def setup
|
28
28
|
@default_options = Oj.default_options
|
29
|
+
GC.stress = true
|
29
30
|
end
|
30
31
|
|
31
32
|
def teardown
|
32
33
|
Oj.default_options = @default_options
|
34
|
+
GC.stress = false
|
33
35
|
end
|
34
36
|
|
35
37
|
# if no crash then the GC marking is working
|
@@ -41,9 +43,20 @@ class GCTest < Minitest::Test
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def test_parse_object_gc
|
46
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
47
|
+
|
44
48
|
g = Goo.new(0, nil)
|
45
49
|
100.times { |i| g = Goo.new(i, g) }
|
46
50
|
json = Oj.dump(g, :mode => :object)
|
47
51
|
Oj.object_load(json)
|
48
52
|
end
|
53
|
+
|
54
|
+
def test_parse_gc
|
55
|
+
json = '{"a":"Alpha","b":true,"c":12345,"d":[true,[false,[-123456789,null],3.9676,["Something else.",false],null]],"e":{"zero":null,"one":1,"two":2,"three":[3],"four":[0,1,2,3,4]},"f":null,"h":{"a":{"b":{"c":{"d":{"e":{"f":{"g":null}}}}}}},"i":[[[[[[[null]]]]]]]}'
|
56
|
+
|
57
|
+
50.times do
|
58
|
+
data = Oj.load(json)
|
59
|
+
assert_equal(json, Oj.dump(data))
|
60
|
+
end
|
61
|
+
end
|
49
62
|
end
|
data/test/test_integer_range.rb
CHANGED
@@ -23,18 +23,24 @@ class IntegerRangeTest < Minitest::Test
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_range
|
26
|
+
skip 'TruffleRuby fails this spec with `ArgumentError: :integer_range must be a range of Fixnum.`' if RUBY_ENGINE == 'truffleruby'
|
27
|
+
|
26
28
|
test = {s: 0, s2: -1, s3: 1, u: -2, u2: 2, u3: 9007199254740993}
|
27
29
|
exp = '{"s":0,"s2":-1,"s3":1,"u":"-2","u2":"2","u3":"9007199254740993"}'
|
28
30
|
assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
|
29
31
|
end
|
30
32
|
|
31
33
|
def test_bignum
|
34
|
+
skip 'TruffleRuby fails this spec with `ArgumentError: :integer_range must be a range of Fixnum.`' if RUBY_ENGINE == 'truffleruby'
|
35
|
+
|
32
36
|
test = {u: -10000000000000000000, u2: 10000000000000000000}
|
33
37
|
exp = '{"u":"-10000000000000000000","u2":"10000000000000000000"}'
|
34
38
|
assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
|
35
39
|
end
|
36
40
|
|
37
41
|
def test_valid_modes
|
42
|
+
skip 'TruffleRuby fails this spec with `ArgumentError: :integer_range must be a range of Fixnum.`' if RUBY_ENGINE == 'truffleruby'
|
43
|
+
|
38
44
|
test = {safe: 0, unsafe: 9007199254740993}
|
39
45
|
exp = '{"safe":0,"unsafe":"9007199254740993"}'
|
40
46
|
|
data/test/test_object.rb
CHANGED
@@ -224,7 +224,7 @@ class ObjectJuice < Minitest::Test
|
|
224
224
|
#=begin
|
225
225
|
if '3.1.0' <= RUBY_VERSION && !(RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/)
|
226
226
|
#Oj::debug_odd("teardown before GC.verify_compaction_references")
|
227
|
-
|
227
|
+
verify_gc_compaction
|
228
228
|
#Oj::debug_odd("teardown after GC.verify_compaction_references")
|
229
229
|
end
|
230
230
|
#=end
|
@@ -461,6 +461,8 @@ class ObjectJuice < Minitest::Test
|
|
461
461
|
end
|
462
462
|
|
463
463
|
def test_json_module_object
|
464
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
465
|
+
|
464
466
|
obj = One::Two::Three::Deep.new()
|
465
467
|
dump_and_load(obj, false)
|
466
468
|
end
|
@@ -631,11 +633,15 @@ class ObjectJuice < Minitest::Test
|
|
631
633
|
end
|
632
634
|
|
633
635
|
def test_json_object
|
636
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
637
|
+
|
634
638
|
obj = Jeez.new(true, 58)
|
635
639
|
dump_and_load(obj, false)
|
636
640
|
end
|
637
641
|
|
638
642
|
def test_json_object_create_deep
|
643
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
644
|
+
|
639
645
|
obj = One::Two::Three::Deep.new()
|
640
646
|
dump_and_load(obj, false)
|
641
647
|
end
|
@@ -672,6 +678,8 @@ class ObjectJuice < Minitest::Test
|
|
672
678
|
end
|
673
679
|
|
674
680
|
def test_json_anonymous_struct
|
681
|
+
skip 'TruffleRuby fails this spec with `TypeError: allocator undefined for Class`' if RUBY_ENGINE == 'truffleruby'
|
682
|
+
|
675
683
|
s = Struct.new(:x, :y)
|
676
684
|
obj = s.new(1, 2)
|
677
685
|
json = Oj.dump(obj, :indent => 2, :mode => :object)
|
@@ -694,6 +702,8 @@ class ObjectJuice < Minitest::Test
|
|
694
702
|
end
|
695
703
|
|
696
704
|
def test_json_object_object
|
705
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
706
|
+
|
697
707
|
obj = Jeez.new(true, 58)
|
698
708
|
json = Oj.dump(obj, mode: :object, indent: 2, ignore_under: true)
|
699
709
|
assert(%{{
|
@@ -713,6 +723,8 @@ class ObjectJuice < Minitest::Test
|
|
713
723
|
end
|
714
724
|
|
715
725
|
def test_to_hash_object_object
|
726
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
727
|
+
|
716
728
|
obj = Jazz.new(true, 58)
|
717
729
|
json = Oj.dump(obj, :mode => :object, :indent => 2)
|
718
730
|
assert(%{{
|
@@ -732,6 +744,8 @@ class ObjectJuice < Minitest::Test
|
|
732
744
|
end
|
733
745
|
|
734
746
|
def test_as_json_object_object
|
747
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
748
|
+
|
735
749
|
obj = Orange.new(true, 58)
|
736
750
|
json = Oj.dump(obj, :mode => :object, :indent => 2)
|
737
751
|
assert(%{{
|
@@ -751,6 +765,8 @@ class ObjectJuice < Minitest::Test
|
|
751
765
|
end
|
752
766
|
|
753
767
|
def test_object_object_no_cache
|
768
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
769
|
+
|
754
770
|
obj = Jam.new(true, 58)
|
755
771
|
json = Oj.dump(obj, :mode => :object, :indent => 2)
|
756
772
|
assert(%{{
|
@@ -779,6 +795,8 @@ class ObjectJuice < Minitest::Test
|
|
779
795
|
end
|
780
796
|
|
781
797
|
def test_exception
|
798
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
799
|
+
|
782
800
|
err = nil
|
783
801
|
begin
|
784
802
|
raise StandardError.new('A Message')
|
@@ -809,6 +827,8 @@ class ObjectJuice < Minitest::Test
|
|
809
827
|
end
|
810
828
|
|
811
829
|
def test_exception_subclass
|
830
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
831
|
+
|
812
832
|
err = nil
|
813
833
|
begin
|
814
834
|
raise SubX.new
|
@@ -830,6 +850,8 @@ class ObjectJuice < Minitest::Test
|
|
830
850
|
json = Oj.dump(1..7, :mode => :object, :indent => 0)
|
831
851
|
if 'rubinius' == $ruby
|
832
852
|
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
853
|
+
elsif 'truffleruby' == $ruby
|
854
|
+
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
833
855
|
else
|
834
856
|
assert_equal(%{{"^u":["Range",1,7,false]}}, json)
|
835
857
|
end
|
@@ -895,6 +917,8 @@ class ObjectJuice < Minitest::Test
|
|
895
917
|
end
|
896
918
|
|
897
919
|
def test_circular_object
|
920
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
921
|
+
|
898
922
|
obj = Jeez.new(nil, 58)
|
899
923
|
obj.x = obj
|
900
924
|
json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
|
@@ -903,6 +927,8 @@ class ObjectJuice < Minitest::Test
|
|
903
927
|
end
|
904
928
|
|
905
929
|
def test_circular_object2
|
930
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
931
|
+
|
906
932
|
obj = Jam.new(nil, 58)
|
907
933
|
obj.x = obj
|
908
934
|
json = Oj.dump(obj, :mode => :object, :indent => 2, :circular => true)
|
@@ -925,6 +951,8 @@ class ObjectJuice < Minitest::Test
|
|
925
951
|
end
|
926
952
|
|
927
953
|
def test_circular
|
954
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
955
|
+
|
928
956
|
h = { 'a' => 7 }
|
929
957
|
obj = Jeez.new(h, 58)
|
930
958
|
obj.x['b'] = obj
|
@@ -935,6 +963,8 @@ class ObjectJuice < Minitest::Test
|
|
935
963
|
end
|
936
964
|
|
937
965
|
def test_circular2
|
966
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
967
|
+
|
938
968
|
h = { 'a' => 7 }
|
939
969
|
obj = Jam.new(h, 58)
|
940
970
|
obj.x['b'] = obj
|
@@ -947,6 +977,8 @@ class ObjectJuice < Minitest::Test
|
|
947
977
|
end
|
948
978
|
|
949
979
|
def test_omit_nil
|
980
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
981
|
+
|
950
982
|
jam = Jam.new({'a' => 1, 'b' => nil }, nil)
|
951
983
|
|
952
984
|
json = Oj.dump(jam, :omit_nil => true, :mode => :object)
|
@@ -1001,16 +1033,22 @@ class ObjectJuice < Minitest::Test
|
|
1001
1033
|
end
|
1002
1034
|
|
1003
1035
|
def test_auto_string
|
1036
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
1037
|
+
|
1004
1038
|
s = AutoStrung.new("Pete", true)
|
1005
1039
|
dump_and_load(s, false)
|
1006
1040
|
end
|
1007
1041
|
|
1008
1042
|
def test_auto_array
|
1043
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
1044
|
+
|
1009
1045
|
a = AutoArray.new([1, 'abc', nil], true)
|
1010
1046
|
dump_and_load(a, false)
|
1011
1047
|
end
|
1012
1048
|
|
1013
1049
|
def test_auto_hash
|
1050
|
+
skip 'TruffleRuby fails this spec with `RuntimeError: rb_ivar_foreach not implemented`' if RUBY_ENGINE == 'truffleruby'
|
1051
|
+
|
1014
1052
|
h = AutoHash.new(nil, true)
|
1015
1053
|
h['a'] = 1
|
1016
1054
|
h['b'] = 2
|
data/test/test_parser_saj.rb
CHANGED
@@ -149,6 +149,43 @@ class SajTest < Minitest::Test
|
|
149
149
|
assert_equal((12345.6789e7 * 10000).to_i, (handler.calls[0][1] * 10000).to_i)
|
150
150
|
end
|
151
151
|
|
152
|
+
def test_bignum
|
153
|
+
handler = AllSaj.new()
|
154
|
+
json = %{-11.899999999999999}
|
155
|
+
p = Oj::Parser.new(:saj)
|
156
|
+
p.handler = handler
|
157
|
+
p.parse(json)
|
158
|
+
assert_equal(1, handler.calls.size)
|
159
|
+
assert_equal(:add_value, handler.calls[0][0])
|
160
|
+
assert_equal(-118999, (handler.calls[0][1] * 10000).to_i)
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_bignum_loc
|
164
|
+
handler = LocSaj.new()
|
165
|
+
json = <<~JSON
|
166
|
+
{
|
167
|
+
"width": 192.33800000000002,
|
168
|
+
"xaxis": {
|
169
|
+
"anchor": "y"
|
170
|
+
}
|
171
|
+
}
|
172
|
+
JSON
|
173
|
+
|
174
|
+
p = Oj::Parser.new(:saj)
|
175
|
+
p.handler = handler
|
176
|
+
p.parse(json)
|
177
|
+
assert_equal(6, handler.calls.size)
|
178
|
+
assert_equal(1_923_380, (handler.calls[1][1] * 10000).to_i)
|
179
|
+
handler.calls[1][1] = 1_923_380
|
180
|
+
assert_equal([[:hash_start, nil, 1, 1],
|
181
|
+
[:add_value, 1923380, 'width', 2, 30],
|
182
|
+
[:hash_start, 'xaxis', 3, 12],
|
183
|
+
[:add_value, 'y', 'anchor', 4, 17],
|
184
|
+
[:hash_end, 'xaxis', 5, 3],
|
185
|
+
[:hash_end, nil, 6, 1]],
|
186
|
+
handler.calls)
|
187
|
+
end
|
188
|
+
|
152
189
|
def test_array_empty
|
153
190
|
handler = AllSaj.new()
|
154
191
|
json = %{[]}
|
data/test/test_scp.rb
CHANGED
@@ -320,8 +320,8 @@ class ScpTest < Minitest::Test
|
|
320
320
|
end
|
321
321
|
|
322
322
|
def test_pipe
|
323
|
-
|
324
|
-
|
323
|
+
skip ' Windows does not support fork' if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
324
|
+
skip 'TruffleRuby fails this spec with `NotImplementedError: fork is not available`' if RUBY_ENGINE == 'truffleruby'
|
325
325
|
|
326
326
|
handler = AllHandler.new()
|
327
327
|
json = %{{"one":true,"two":false}}
|
@@ -357,8 +357,8 @@ class ScpTest < Minitest::Test
|
|
357
357
|
end
|
358
358
|
|
359
359
|
def test_pipe_close
|
360
|
-
|
361
|
-
|
360
|
+
skip 'Windows does not support fork' if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
361
|
+
skip 'TruffleRuby fails this spec with `NotImplementedError: fork is not available`' if RUBY_ENGINE == 'truffleruby'
|
362
362
|
|
363
363
|
json = %{{"one":true,"two":false}}
|
364
364
|
IO.pipe do |read_io, write_io|
|
data/test/test_strict.rb
CHANGED
data/test/test_wab.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.13.
|
4
|
+
version: 3.13.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|