oj 3.14.2 → 3.15.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/CHANGELOG.md +9 -1
- data/README.md +0 -1
- data/ext/oj/buf.h +2 -2
- data/ext/oj/cache.c +16 -16
- data/ext/oj/cache8.c +7 -7
- data/ext/oj/circarray.c +2 -1
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +2 -2
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +6 -14
- data/ext/oj/custom.c +6 -16
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +43 -18
- data/ext/oj/dump_compat.c +551 -576
- data/ext/oj/dump_leaf.c +3 -5
- data/ext/oj/dump_object.c +35 -36
- data/ext/oj/dump_strict.c +2 -4
- data/ext/oj/encoder.c +1 -1
- data/ext/oj/err.c +2 -13
- data/ext/oj/err.h +9 -12
- data/ext/oj/extconf.rb +1 -1
- data/ext/oj/fast.c +24 -38
- data/ext/oj/intern.c +38 -42
- data/ext/oj/intern.h +3 -7
- data/ext/oj/mem.c +211 -217
- data/ext/oj/mem.h +10 -10
- data/ext/oj/mimic_json.c +39 -24
- data/ext/oj/object.c +12 -26
- data/ext/oj/odd.c +2 -1
- data/ext/oj/odd.h +4 -4
- data/ext/oj/oj.c +80 -81
- data/ext/oj/oj.h +56 -54
- data/ext/oj/parse.c +55 -118
- data/ext/oj/parse.h +5 -10
- data/ext/oj/parser.c +7 -8
- data/ext/oj/parser.h +7 -8
- data/ext/oj/rails.c +28 -59
- data/ext/oj/reader.c +5 -9
- data/ext/oj/reader.h +1 -1
- data/ext/oj/resolve.c +3 -4
- data/ext/oj/rxclass.c +1 -1
- data/ext/oj/rxclass.h +1 -1
- data/ext/oj/saj.c +4 -4
- data/ext/oj/saj2.c +32 -49
- data/ext/oj/saj2.h +1 -1
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +18 -67
- data/ext/oj/stream_writer.c +5 -18
- data/ext/oj/strict.c +16 -40
- data/ext/oj/string_writer.c +6 -14
- data/ext/oj/trace.h +27 -16
- data/ext/oj/usual.c +62 -61
- data/ext/oj/usual.h +6 -6
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.h +4 -4
- data/ext/oj/wab.c +16 -36
- data/lib/oj/active_support_helper.rb +0 -1
- data/lib/oj/bag.rb +7 -1
- data/lib/oj/easy_hash.rb +4 -5
- data/lib/oj/error.rb +0 -1
- data/lib/oj/json.rb +4 -2
- data/lib/oj/mimic.rb +4 -2
- data/lib/oj/state.rb +8 -5
- data/lib/oj/version.rb +1 -2
- data/lib/oj.rb +2 -0
- data/pages/Options.md +4 -0
- data/test/_test_active.rb +8 -9
- data/test/_test_active_mimic.rb +7 -8
- data/test/_test_mimic_rails.rb +17 -20
- data/test/activerecord/result_test.rb +5 -6
- data/test/files.rb +15 -15
- data/test/foo.rb +9 -52
- data/test/helper.rb +5 -8
- data/test/isolated/shared.rb +3 -2
- data/test/json_gem/json_addition_test.rb +2 -2
- data/test/json_gem/json_common_interface_test.rb +4 -4
- data/test/json_gem/json_encoding_test.rb +0 -0
- data/test/json_gem/json_ext_parser_test.rb +1 -0
- data/test/json_gem/json_fixtures_test.rb +3 -2
- data/test/json_gem/json_generator_test.rb +43 -32
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +46 -46
- data/test/json_gem/json_string_matching_test.rb +9 -9
- data/test/mem.rb +13 -12
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +31 -33
- data/test/perf_dump.rb +25 -25
- data/test/perf_fast.rb +80 -82
- data/test/perf_file.rb +27 -29
- data/test/perf_object.rb +65 -69
- data/test/perf_once.rb +12 -11
- data/test/perf_parser.rb +41 -48
- data/test/perf_saj.rb +46 -54
- data/test/perf_scp.rb +57 -69
- data/test/perf_simple.rb +41 -39
- data/test/perf_strict.rb +68 -70
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +3 -3
- data/test/sample/change.rb +0 -1
- data/test/sample/dir.rb +0 -1
- data/test/sample/doc.rb +0 -1
- data/test/sample/file.rb +0 -1
- data/test/sample/group.rb +0 -1
- data/test/sample/hasprops.rb +0 -1
- data/test/sample/layer.rb +0 -1
- data/test/sample/rect.rb +0 -1
- data/test/sample/shape.rb +0 -1
- data/test/sample/text.rb +0 -1
- data/test/sample.rb +16 -16
- data/test/sample_json.rb +8 -8
- data/test/test_compat.rb +52 -52
- data/test/test_custom.rb +61 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +86 -90
- data/test/test_file.rb +24 -29
- data/test/test_gc.rb +5 -5
- data/test/test_generate.rb +5 -5
- data/test/test_hash.rb +4 -4
- data/test/test_integer_range.rb +9 -9
- data/test/test_null.rb +20 -20
- data/test/test_object.rb +78 -87
- data/test/test_parser.rb +4 -4
- data/test/test_parser_debug.rb +4 -4
- data/test/test_parser_saj.rb +27 -25
- data/test/test_parser_usual.rb +6 -6
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +10 -8
- data/test/test_scp.rb +35 -35
- data/test/test_strict.rb +28 -32
- data/test/test_various.rb +140 -97
- data/test/test_wab.rb +46 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +7 -7
- data/test/tests_mimic.rb +6 -6
- data/test/tests_mimic_addition.rb +6 -6
- metadata +18 -30
- data/test/activesupport4/decoding_test.rb +0 -108
- data/test/activesupport4/encoding_test.rb +0 -531
- data/test/activesupport4/test_helper.rb +0 -41
- data/test/activesupport5/abstract_unit.rb +0 -45
- data/test/activesupport5/decoding_test.rb +0 -133
- data/test/activesupport5/encoding_test.rb +0 -500
- data/test/activesupport5/encoding_test_cases.rb +0 -98
- data/test/activesupport5/test_helper.rb +0 -72
- data/test/activesupport5/time_zone_test_helpers.rb +0 -39
- data/test/bar.rb +0 -11
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/ext/oj/scp.c
CHANGED
@@ -33,8 +33,7 @@ static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
|
|
33
33
|
return Qundef;
|
34
34
|
}
|
35
35
|
|
36
|
-
static void
|
37
|
-
noop_hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *orig) {
|
36
|
+
static void noop_hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *orig) {
|
38
37
|
}
|
39
38
|
|
40
39
|
static void noop_hash_set_num(ParseInfo pi, Val kval, NumInfo ni) {
|
@@ -91,12 +90,7 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
|
|
91
90
|
volatile VALUE rstr = rb_str_new(str, len);
|
92
91
|
|
93
92
|
rstr = oj_encode(rstr);
|
94
|
-
rb_funcall(pi->handler,
|
95
|
-
oj_hash_set_id,
|
96
|
-
3,
|
97
|
-
stack_peek(&pi->stack)->val,
|
98
|
-
oj_calc_hash_key(pi, kval),
|
99
|
-
rstr);
|
93
|
+
rb_funcall(pi->handler, oj_hash_set_id, 3, stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, kval), rstr);
|
100
94
|
}
|
101
95
|
|
102
96
|
static void hash_set_num(ParseInfo pi, Val kval, NumInfo ni) {
|
@@ -109,12 +103,7 @@ static void hash_set_num(ParseInfo pi, Val kval, NumInfo ni) {
|
|
109
103
|
}
|
110
104
|
|
111
105
|
static void hash_set_value(ParseInfo pi, Val kval, VALUE value) {
|
112
|
-
rb_funcall(pi->handler,
|
113
|
-
oj_hash_set_id,
|
114
|
-
3,
|
115
|
-
stack_peek(&pi->stack)->val,
|
116
|
-
oj_calc_hash_key(pi, kval),
|
117
|
-
value);
|
106
|
+
rb_funcall(pi->handler, oj_hash_set_id, 3, stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, kval), value);
|
118
107
|
}
|
119
108
|
|
120
109
|
static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
data/ext/oj/sparse.c
CHANGED
@@ -7,10 +7,10 @@
|
|
7
7
|
#include <string.h>
|
8
8
|
#include <unistd.h>
|
9
9
|
|
10
|
-
#include "mem.h"
|
11
10
|
#include "buf.h"
|
12
11
|
#include "encode.h"
|
13
12
|
#include "intern.h" // for oj_strndup()
|
13
|
+
#include "mem.h"
|
14
14
|
#include "oj.h"
|
15
15
|
#include "parse.h"
|
16
16
|
#include "val_stack.h"
|
@@ -213,11 +213,7 @@ static void read_escaped_str(ParseInfo pi) {
|
|
213
213
|
}
|
214
214
|
while ('\"' != (c = reader_get(&pi->rd))) {
|
215
215
|
if ('\0' == c) {
|
216
|
-
oj_set_error_at(pi,
|
217
|
-
oj_parse_error_class,
|
218
|
-
__FILE__,
|
219
|
-
__LINE__,
|
220
|
-
"quoted string not terminated");
|
216
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "quoted string not terminated");
|
221
217
|
buf_cleanup(&buf);
|
222
218
|
return;
|
223
219
|
} else if ('\\' == c) {
|
@@ -250,11 +246,7 @@ static void read_escaped_str(ParseInfo pi) {
|
|
250
246
|
reader_backup(&pi->rd);
|
251
247
|
break;
|
252
248
|
}
|
253
|
-
oj_set_error_at(pi,
|
254
|
-
oj_parse_error_class,
|
255
|
-
__FILE__,
|
256
|
-
__LINE__,
|
257
|
-
"invalid escaped character");
|
249
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid escaped character");
|
258
250
|
buf_cleanup(&buf);
|
259
251
|
return;
|
260
252
|
}
|
@@ -278,11 +270,7 @@ static void read_escaped_str(ParseInfo pi) {
|
|
278
270
|
buf_append(&buf, c);
|
279
271
|
break;
|
280
272
|
}
|
281
|
-
oj_set_error_at(pi,
|
282
|
-
oj_parse_error_class,
|
283
|
-
__FILE__,
|
284
|
-
__LINE__,
|
285
|
-
"invalid escaped character");
|
273
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid escaped character");
|
286
274
|
buf_cleanup(&buf);
|
287
275
|
return;
|
288
276
|
}
|
@@ -346,11 +334,7 @@ static void read_str(ParseInfo pi) {
|
|
346
334
|
reader_protect(&pi->rd);
|
347
335
|
while ('\"' != (c = reader_get(&pi->rd))) {
|
348
336
|
if ('\0' == c) {
|
349
|
-
oj_set_error_at(pi,
|
350
|
-
oj_parse_error_class,
|
351
|
-
__FILE__,
|
352
|
-
__LINE__,
|
353
|
-
"quoted string not terminated");
|
337
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "quoted string not terminated");
|
354
338
|
return;
|
355
339
|
} else if ('\\' == c) {
|
356
340
|
reader_backup(&pi->rd);
|
@@ -430,7 +414,7 @@ static void read_num(ParseInfo pi) {
|
|
430
414
|
ni.no_big = !pi->options.compat_bigdec;
|
431
415
|
ni.bigdec_load = pi->options.compat_bigdec;
|
432
416
|
} else {
|
433
|
-
ni.no_big
|
417
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load ||
|
434
418
|
RubyDec == pi->options.bigdec_load);
|
435
419
|
ni.bigdec_load = pi->options.bigdec_load;
|
436
420
|
}
|
@@ -444,18 +428,10 @@ static void read_num(ParseInfo pi) {
|
|
444
428
|
}
|
445
429
|
if ('I' == c) {
|
446
430
|
if (No == pi->options.allow_nan) {
|
447
|
-
oj_set_error_at(pi,
|
448
|
-
oj_parse_error_class,
|
449
|
-
__FILE__,
|
450
|
-
__LINE__,
|
451
|
-
"not a number or other value");
|
431
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
|
452
432
|
return;
|
453
433
|
} else if (0 != reader_expect(&pi->rd, "nfinity")) {
|
454
|
-
oj_set_error_at(pi,
|
455
|
-
oj_parse_error_class,
|
456
|
-
__FILE__,
|
457
|
-
__LINE__,
|
458
|
-
"not a number or other value");
|
434
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
|
459
435
|
return;
|
460
436
|
}
|
461
437
|
ni.infinity = 1;
|
@@ -477,11 +453,7 @@ static void read_num(ParseInfo pi) {
|
|
477
453
|
|
478
454
|
if (0 < d) {
|
479
455
|
if (zero1 && CompatMode == pi->options.mode) {
|
480
|
-
oj_set_error_at(pi,
|
481
|
-
oj_parse_error_class,
|
482
|
-
__FILE__,
|
483
|
-
__LINE__,
|
484
|
-
"not a number");
|
456
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number");
|
485
457
|
return;
|
486
458
|
}
|
487
459
|
zero1 = false;
|
@@ -592,7 +564,7 @@ static void read_nan(ParseInfo pi) {
|
|
592
564
|
ni.no_big = !pi->options.compat_bigdec;
|
593
565
|
ni.bigdec_load = pi->options.compat_bigdec;
|
594
566
|
} else {
|
595
|
-
ni.no_big
|
567
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load ||
|
596
568
|
RubyDec == pi->options.bigdec_load);
|
597
569
|
ni.bigdec_load = pi->options.bigdec_load;
|
598
570
|
}
|
@@ -717,11 +689,7 @@ void oj_sparse2(ParseInfo pi) {
|
|
717
689
|
case '"': read_str(pi); break;
|
718
690
|
case '+':
|
719
691
|
if (CompatMode == pi->options.mode) {
|
720
|
-
oj_set_error_at(pi,
|
721
|
-
oj_parse_error_class,
|
722
|
-
__FILE__,
|
723
|
-
__LINE__,
|
724
|
-
"unexpected character");
|
692
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "unexpected character");
|
725
693
|
return;
|
726
694
|
}
|
727
695
|
pi->cur--;
|
@@ -746,11 +714,7 @@ void oj_sparse2(ParseInfo pi) {
|
|
746
714
|
reader_backup(&pi->rd);
|
747
715
|
read_num(pi);
|
748
716
|
} else {
|
749
|
-
oj_set_error_at(pi,
|
750
|
-
oj_parse_error_class,
|
751
|
-
__FILE__,
|
752
|
-
__LINE__,
|
753
|
-
"unexpected character");
|
717
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "unexpected character");
|
754
718
|
return;
|
755
719
|
}
|
756
720
|
break;
|
@@ -758,11 +722,7 @@ void oj_sparse2(ParseInfo pi) {
|
|
758
722
|
if (Yes == pi->options.allow_nan) {
|
759
723
|
read_nan(pi);
|
760
724
|
} else {
|
761
|
-
oj_set_error_at(pi,
|
762
|
-
oj_parse_error_class,
|
763
|
-
__FILE__,
|
764
|
-
__LINE__,
|
765
|
-
"unexpected character");
|
725
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "unexpected character");
|
766
726
|
return;
|
767
727
|
}
|
768
728
|
break;
|
@@ -800,8 +760,7 @@ void oj_sparse2(ParseInfo pi) {
|
|
800
760
|
ni.no_big = !pi->options.compat_bigdec;
|
801
761
|
ni.bigdec_load = pi->options.compat_bigdec;
|
802
762
|
} else {
|
803
|
-
ni.no_big = (FloatDec == pi->options.bigdec_load ||
|
804
|
-
FastDec == pi->options.bigdec_load ||
|
763
|
+
ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load ||
|
805
764
|
RubyDec == pi->options.bigdec_load);
|
806
765
|
ni.bigdec_load = pi->options.bigdec_load;
|
807
766
|
}
|
@@ -814,13 +773,7 @@ void oj_sparse2(ParseInfo pi) {
|
|
814
773
|
case '/': skip_comment(pi); break;
|
815
774
|
case '\0': return;
|
816
775
|
default:
|
817
|
-
oj_set_error_at(pi,
|
818
|
-
oj_parse_error_class,
|
819
|
-
__FILE__,
|
820
|
-
__LINE__,
|
821
|
-
"unexpected character '%c' [0x%02x]",
|
822
|
-
c,
|
823
|
-
c);
|
776
|
+
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "unexpected character '%c' [0x%02x]", c, c);
|
824
777
|
return;
|
825
778
|
}
|
826
779
|
if (err_has(&pi->err)) {
|
@@ -879,8 +832,8 @@ oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd) {
|
|
879
832
|
} else {
|
880
833
|
rb_raise(rb_eTypeError, "Nil is not a valid JSON source.");
|
881
834
|
}
|
882
|
-
} else if (CompatMode == pi->options.mode && T_STRING == rb_type(input) &&
|
883
|
-
|
835
|
+
} else if (CompatMode == pi->options.mode && T_STRING == rb_type(input) && No == pi->options.nilnil &&
|
836
|
+
0 == RSTRING_LEN(input)) {
|
884
837
|
rb_raise(oj_json_parser_error_class, "An empty string is not a valid JSON string.");
|
885
838
|
}
|
886
839
|
if (rb_block_given_p()) {
|
@@ -933,9 +886,7 @@ oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd) {
|
|
933
886
|
switch (v->next) {
|
934
887
|
case NEXT_ARRAY_NEW:
|
935
888
|
case NEXT_ARRAY_ELEMENT:
|
936
|
-
case NEXT_ARRAY_COMMA:
|
937
|
-
oj_set_error_at(pi, err_class, __FILE__, __LINE__, "Array not terminated");
|
938
|
-
break;
|
889
|
+
case NEXT_ARRAY_COMMA: oj_set_error_at(pi, err_class, __FILE__, __LINE__, "Array not terminated"); break;
|
939
890
|
case NEXT_HASH_NEW:
|
940
891
|
case NEXT_HASH_KEY:
|
941
892
|
case NEXT_HASH_COLON:
|
data/ext/oj/stream_writer.c
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
#include <errno.h>
|
5
5
|
#include <ruby.h>
|
6
6
|
|
7
|
-
#include "mem.h"
|
8
7
|
#include "encode.h"
|
8
|
+
#include "mem.h"
|
9
9
|
|
10
10
|
extern VALUE Oj;
|
11
11
|
|
@@ -83,8 +83,8 @@ static VALUE stream_writer_new(int argc, VALUE *argv, VALUE self) {
|
|
83
83
|
if (oj_stringio_class == clas) {
|
84
84
|
type = STRING_IO;
|
85
85
|
#if !IS_WINDOWS
|
86
|
-
} else if (rb_respond_to(stream, oj_fileno_id) &&
|
87
|
-
|
86
|
+
} else if (rb_respond_to(stream, oj_fileno_id) && Qnil != (s = rb_funcall(stream, oj_fileno_id, 0)) &&
|
87
|
+
0 != (fd = FIX2INT(s))) {
|
88
88
|
type = FILE_IO;
|
89
89
|
#endif
|
90
90
|
} else if (rb_respond_to(stream, oj_write_id)) {
|
@@ -102,15 +102,10 @@ static VALUE stream_writer_new(int argc, VALUE *argv, VALUE self) {
|
|
102
102
|
rb_gc_register_address(&buffer_size_sym);
|
103
103
|
}
|
104
104
|
if (Qnil != (v = rb_hash_lookup(argv[1], buffer_size_sym))) {
|
105
|
-
#ifdef RUBY_INTEGER_UNIFICATION
|
106
105
|
if (rb_cInteger != rb_obj_class(v)) {
|
106
|
+
OJ_R_FREE(sw);
|
107
107
|
rb_raise(rb_eArgError, ":buffer size must be a Integer.");
|
108
108
|
}
|
109
|
-
#else
|
110
|
-
if (T_FIXNUM != rb_type(v)) {
|
111
|
-
rb_raise(rb_eArgError, ":buffer size must be a Integer.");
|
112
|
-
}
|
113
|
-
#endif
|
114
109
|
buf_size = FIX2INT(v);
|
115
110
|
}
|
116
111
|
oj_str_writer_init(&sw->sw, buf_size);
|
@@ -140,7 +135,6 @@ static VALUE stream_writer_new(int argc, VALUE *argv, VALUE self) {
|
|
140
135
|
static VALUE stream_writer_push_key(VALUE self, VALUE key) {
|
141
136
|
StreamWriter sw = (StreamWriter)DATA_PTR(self);
|
142
137
|
|
143
|
-
rb_check_type(key, T_STRING);
|
144
138
|
oj_str_writer_push_key(&sw->sw, StringValuePtr(key));
|
145
139
|
if (sw->flush_limit < sw->sw.out.cur - sw->sw.out.buf) {
|
146
140
|
stream_writer_write(sw);
|
@@ -165,7 +159,6 @@ static VALUE stream_writer_push_object(int argc, VALUE *argv, VALUE self) {
|
|
165
159
|
if (Qnil == argv[0]) {
|
166
160
|
oj_str_writer_push_object(&sw->sw, 0);
|
167
161
|
} else {
|
168
|
-
rb_check_type(argv[0], T_STRING);
|
169
162
|
oj_str_writer_push_object(&sw->sw, StringValuePtr(argv[0]));
|
170
163
|
}
|
171
164
|
break;
|
@@ -194,7 +187,6 @@ static VALUE stream_writer_push_array(int argc, VALUE *argv, VALUE self) {
|
|
194
187
|
if (Qnil == argv[0]) {
|
195
188
|
oj_str_writer_push_array(&sw->sw, 0);
|
196
189
|
} else {
|
197
|
-
rb_check_type(argv[0], T_STRING);
|
198
190
|
oj_str_writer_push_array(&sw->sw, StringValuePtr(argv[0]));
|
199
191
|
}
|
200
192
|
break;
|
@@ -222,7 +214,6 @@ static VALUE stream_writer_push_value(int argc, VALUE *argv, VALUE self) {
|
|
222
214
|
if (Qnil == argv[1]) {
|
223
215
|
oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
|
224
216
|
} else {
|
225
|
-
rb_check_type(argv[1], T_STRING);
|
226
217
|
oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, StringValuePtr(argv[1]));
|
227
218
|
}
|
228
219
|
break;
|
@@ -246,17 +237,13 @@ static VALUE stream_writer_push_value(int argc, VALUE *argv, VALUE self) {
|
|
246
237
|
static VALUE stream_writer_push_json(int argc, VALUE *argv, VALUE self) {
|
247
238
|
StreamWriter sw = (StreamWriter)DATA_PTR(self);
|
248
239
|
|
249
|
-
rb_check_type(argv[0], T_STRING);
|
250
240
|
switch (argc) {
|
251
241
|
case 1: oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0); break;
|
252
242
|
case 2:
|
253
243
|
if (Qnil == argv[1]) {
|
254
244
|
oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
|
255
245
|
} else {
|
256
|
-
|
257
|
-
oj_str_writer_push_json((StrWriter)DATA_PTR(self),
|
258
|
-
StringValuePtr(*argv),
|
259
|
-
StringValuePtr(argv[1]));
|
246
|
+
oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), StringValuePtr(argv[1]));
|
260
247
|
}
|
261
248
|
break;
|
262
249
|
default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_json'."); break;
|
data/ext/oj/strict.c
CHANGED
@@ -17,7 +17,7 @@ VALUE oj_cstr_to_value(const char *str, size_t len, size_t cache_str) {
|
|
17
17
|
volatile VALUE rstr = Qnil;
|
18
18
|
|
19
19
|
if (len < cache_str) {
|
20
|
-
|
20
|
+
rstr = oj_str_intern(str, len);
|
21
21
|
} else {
|
22
22
|
rstr = rb_str_new(str, len);
|
23
23
|
rstr = oj_encode(rstr);
|
@@ -37,14 +37,14 @@ VALUE oj_calc_hash_key(ParseInfo pi, Val parent) {
|
|
37
37
|
} else {
|
38
38
|
rkey = rb_str_new(parent->key, parent->klen);
|
39
39
|
rkey = oj_encode(rkey);
|
40
|
-
|
40
|
+
OBJ_FREEZE(rkey); // frozen when used as a Hash key anyway
|
41
41
|
}
|
42
42
|
return rkey;
|
43
43
|
}
|
44
44
|
if (Yes == pi->options.sym_key) {
|
45
|
-
|
45
|
+
rkey = oj_sym_intern(parent->key, parent->klen);
|
46
46
|
} else {
|
47
|
-
|
47
|
+
rkey = oj_str_intern(parent->key, parent->klen);
|
48
48
|
}
|
49
49
|
return rkey;
|
50
50
|
}
|
@@ -62,9 +62,7 @@ static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
|
|
62
62
|
}
|
63
63
|
|
64
64
|
static void add_value(ParseInfo pi, VALUE val) {
|
65
|
-
|
66
|
-
oj_trace_parse_call("add_value", pi, __FILE__, __LINE__, val);
|
67
|
-
}
|
65
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_value", pi, val);
|
68
66
|
pi->stack.head->val = val;
|
69
67
|
}
|
70
68
|
|
@@ -72,9 +70,7 @@ static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig
|
|
72
70
|
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
73
71
|
|
74
72
|
pi->stack.head->val = rstr;
|
75
|
-
|
76
|
-
oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, rstr);
|
77
|
-
}
|
73
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_string", pi, rstr);
|
78
74
|
}
|
79
75
|
|
80
76
|
static void add_num(ParseInfo pi, NumInfo ni) {
|
@@ -82,9 +78,7 @@ static void add_num(ParseInfo pi, NumInfo ni) {
|
|
82
78
|
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
|
83
79
|
}
|
84
80
|
pi->stack.head->val = oj_num_as_value(ni);
|
85
|
-
|
86
|
-
oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, pi->stack.head->val);
|
87
|
-
}
|
81
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_number", pi, pi->stack.head->val);
|
88
82
|
}
|
89
83
|
|
90
84
|
static VALUE start_hash(ParseInfo pi) {
|
@@ -98,12 +92,8 @@ static VALUE start_hash(ParseInfo pi) {
|
|
98
92
|
static void hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char *orig) {
|
99
93
|
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
100
94
|
|
101
|
-
rb_hash_aset(stack_peek(&pi->stack)->val,
|
102
|
-
|
103
|
-
rstr);
|
104
|
-
if (RB_UNLIKELY(Yes == pi->options.trace)) {
|
105
|
-
oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
|
106
|
-
}
|
95
|
+
rb_hash_aset(stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, parent), rstr);
|
96
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_string", pi, rstr);
|
107
97
|
}
|
108
98
|
|
109
99
|
static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
|
@@ -113,21 +103,13 @@ static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
|
|
113
103
|
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
|
114
104
|
}
|
115
105
|
v = oj_num_as_value(ni);
|
116
|
-
rb_hash_aset(stack_peek(&pi->stack)->val,
|
117
|
-
|
118
|
-
v);
|
119
|
-
if (RB_UNLIKELY(Yes == pi->options.trace)) {
|
120
|
-
oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, v);
|
121
|
-
}
|
106
|
+
rb_hash_aset(stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, parent), v);
|
107
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_number", pi, v);
|
122
108
|
}
|
123
109
|
|
124
110
|
static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
|
125
|
-
rb_hash_aset(stack_peek(&pi->stack)->val,
|
126
|
-
|
127
|
-
value);
|
128
|
-
if (RB_UNLIKELY(Yes == pi->options.trace)) {
|
129
|
-
oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
|
130
|
-
}
|
111
|
+
rb_hash_aset(stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, parent), value);
|
112
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_value", pi, value);
|
131
113
|
}
|
132
114
|
|
133
115
|
static VALUE start_array(ParseInfo pi) {
|
@@ -139,9 +121,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
|
|
139
121
|
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
140
122
|
|
141
123
|
rb_ary_push(stack_peek(&pi->stack)->val, rstr);
|
142
|
-
|
143
|
-
oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
|
144
|
-
}
|
124
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_string", pi, rstr);
|
145
125
|
}
|
146
126
|
|
147
127
|
static void array_append_num(ParseInfo pi, NumInfo ni) {
|
@@ -152,16 +132,12 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
|
|
152
132
|
}
|
153
133
|
v = oj_num_as_value(ni);
|
154
134
|
rb_ary_push(stack_peek(&pi->stack)->val, v);
|
155
|
-
|
156
|
-
oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, v);
|
157
|
-
}
|
135
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_number", pi, v);
|
158
136
|
}
|
159
137
|
|
160
138
|
static void array_append_value(ParseInfo pi, VALUE value) {
|
161
139
|
rb_ary_push(stack_peek(&pi->stack)->val, value);
|
162
|
-
|
163
|
-
oj_trace_parse_call("append_value", pi, __FILE__, __LINE__, value);
|
164
|
-
}
|
140
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_value", pi, value);
|
165
141
|
}
|
166
142
|
|
167
143
|
void oj_set_strict_callbacks(ParseInfo pi) {
|
data/ext/oj/string_writer.c
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
// Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
|
2
2
|
// Licensed under the MIT License. See LICENSE file in the project root for license details.
|
3
3
|
|
4
|
-
#include "mem.h"
|
5
4
|
#include "dump.h"
|
6
5
|
#include "encode.h"
|
6
|
+
#include "mem.h"
|
7
7
|
|
8
8
|
extern VALUE Oj;
|
9
9
|
|
@@ -56,10 +56,10 @@ void oj_str_writer_init(StrWriter sw, int buf_size) {
|
|
56
56
|
}
|
57
57
|
// Must be allocated. Using the out.stack_buffer results in double frees
|
58
58
|
// and I haven't figured out why yet.
|
59
|
-
sw->out.buf
|
60
|
-
sw->out.cur
|
61
|
-
sw->out.end
|
62
|
-
sw->out.allocated
|
59
|
+
sw->out.buf = OJ_R_ALLOC_N(char, buf_size);
|
60
|
+
sw->out.cur = sw->out.buf;
|
61
|
+
sw->out.end = sw->out.buf + buf_size - BUFFER_EXTRA;
|
62
|
+
sw->out.allocated = true;
|
63
63
|
|
64
64
|
*sw->out.cur = '\0';
|
65
65
|
sw->out.circ_cache = NULL;
|
@@ -281,7 +281,6 @@ static VALUE str_writer_new(int argc, VALUE *argv, VALUE self) {
|
|
281
281
|
static VALUE str_writer_push_key(VALUE self, VALUE key) {
|
282
282
|
StrWriter sw = (StrWriter)DATA_PTR(self);
|
283
283
|
|
284
|
-
rb_check_type(key, T_STRING);
|
285
284
|
oj_str_writer_push_key(sw, StringValuePtr(key));
|
286
285
|
|
287
286
|
return Qnil;
|
@@ -303,7 +302,6 @@ static VALUE str_writer_push_object(int argc, VALUE *argv, VALUE self) {
|
|
303
302
|
if (Qnil == argv[0]) {
|
304
303
|
oj_str_writer_push_object(sw, 0);
|
305
304
|
} else {
|
306
|
-
rb_check_type(argv[0], T_STRING);
|
307
305
|
oj_str_writer_push_object(sw, StringValuePtr(argv[0]));
|
308
306
|
}
|
309
307
|
break;
|
@@ -332,7 +330,6 @@ static VALUE str_writer_push_array(int argc, VALUE *argv, VALUE self) {
|
|
332
330
|
if (Qnil == argv[0]) {
|
333
331
|
oj_str_writer_push_array(sw, 0);
|
334
332
|
} else {
|
335
|
-
rb_check_type(argv[0], T_STRING);
|
336
333
|
oj_str_writer_push_array(sw, StringValuePtr(argv[0]));
|
337
334
|
}
|
338
335
|
break;
|
@@ -359,7 +356,6 @@ static VALUE str_writer_push_value(int argc, VALUE *argv, VALUE self) {
|
|
359
356
|
if (Qnil == argv[1]) {
|
360
357
|
oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
|
361
358
|
} else {
|
362
|
-
rb_check_type(argv[1], T_STRING);
|
363
359
|
oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, StringValuePtr(argv[1]));
|
364
360
|
}
|
365
361
|
break;
|
@@ -378,17 +374,13 @@ static VALUE str_writer_push_value(int argc, VALUE *argv, VALUE self) {
|
|
378
374
|
* - *key* [_String_] the key if adding to an object in the JSON document
|
379
375
|
*/
|
380
376
|
static VALUE str_writer_push_json(int argc, VALUE *argv, VALUE self) {
|
381
|
-
rb_check_type(argv[0], T_STRING);
|
382
377
|
switch (argc) {
|
383
378
|
case 1: oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0); break;
|
384
379
|
case 2:
|
385
380
|
if (Qnil == argv[1]) {
|
386
381
|
oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
|
387
382
|
} else {
|
388
|
-
|
389
|
-
oj_str_writer_push_json((StrWriter)DATA_PTR(self),
|
390
|
-
StringValuePtr(*argv),
|
391
|
-
StringValuePtr(argv[1]));
|
383
|
+
oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), StringValuePtr(argv[1]));
|
392
384
|
}
|
393
385
|
break;
|
394
386
|
default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_json'."); break;
|
data/ext/oj/trace.h
CHANGED
@@ -17,28 +17,39 @@ typedef enum {
|
|
17
17
|
|
18
18
|
struct _parseInfo;
|
19
19
|
|
20
|
-
extern void
|
21
|
-
oj_trace(const char *func, VALUE obj, const char *file, int line, int depth, TraceWhere where);
|
20
|
+
extern void oj_trace(const char *func, VALUE obj, const char *file, int line, int depth, TraceWhere where);
|
22
21
|
extern void oj_trace_parse_in(const char *func, struct _parseInfo *pi, const char *file, int line);
|
23
|
-
extern void
|
24
|
-
oj_trace_parse_call(const char *func, struct _parseInfo *pi, const char *file, int line, VALUE obj);
|
22
|
+
extern void oj_trace_parse_call(const char *func, struct _parseInfo *pi, const char *file, int line, VALUE obj);
|
25
23
|
extern void oj_trace_parse_hash_end(struct _parseInfo *pi, const char *file, int line);
|
26
24
|
extern void oj_trace_parse_array_end(struct _parseInfo *pi, const char *file, int line);
|
27
25
|
|
28
|
-
|
29
26
|
#ifdef OJ_ENABLE_TRACE_LOG
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
#define TRACE(option, func, obj, depth, where) \
|
28
|
+
if (RB_UNLIKELY(Yes == option)) { \
|
29
|
+
oj_trace(func, obj, __FILE__, __LINE__, depth, where); \
|
30
|
+
}
|
31
|
+
#define TRACE_PARSE_IN(option, func, pi) \
|
32
|
+
if (RB_UNLIKELY(Yes == option)) { \
|
33
|
+
oj_trace_parse_in(func, pi, __FILE__, __LINE__); \
|
34
|
+
}
|
35
|
+
#define TRACE_PARSE_CALL(option, func, pi, obj) \
|
36
|
+
if (RB_UNLIKELY(Yes == option)) { \
|
37
|
+
oj_trace_parse_call(func, pi, __FILE__, __LINE__, obj); \
|
38
|
+
}
|
39
|
+
#define TRACE_PARSE_HASH_END(option, pi) \
|
40
|
+
if (RB_UNLIKELY(Yes == option)) { \
|
41
|
+
oj_trace_parse_hash_end(pi, __FILE__, __LINE__); \
|
42
|
+
}
|
43
|
+
#define TRACE_PARSE_ARRAY_END(option, pi) \
|
44
|
+
if (RB_UNLIKELY(Yes == option)) { \
|
45
|
+
oj_trace_parse_array_end(pi, __FILE__, __LINE__); \
|
46
|
+
}
|
35
47
|
#else
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
48
|
+
#define TRACE(option, func, obj, depth, where)
|
49
|
+
#define TRACE_PARSE_IN(option, func, pi)
|
50
|
+
#define TRACE_PARSE_CALL(option, func, pi, obj)
|
51
|
+
#define TRACE_PARSE_HASH_END(option, pi)
|
52
|
+
#define TRACE_PARSE_ARRAY_END(option, pi)
|
41
53
|
#endif
|
42
54
|
|
43
|
-
|
44
55
|
#endif /* OJ_TRACE_H */
|