oj 3.13.9 → 3.16.1
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 +101 -0
- data/README.md +13 -2
- data/ext/oj/buf.h +11 -6
- data/ext/oj/cache.c +25 -24
- data/ext/oj/cache8.c +10 -9
- data/ext/oj/circarray.c +8 -6
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +19 -33
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +20 -60
- data/ext/oj/custom.c +76 -155
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +203 -213
- data/ext/oj/dump.h +26 -12
- data/ext/oj/dump_compat.c +565 -642
- data/ext/oj/dump_leaf.c +17 -63
- data/ext/oj/dump_object.c +59 -181
- data/ext/oj/dump_strict.c +24 -48
- data/ext/oj/encoder.c +43 -0
- data/ext/oj/err.c +2 -13
- data/ext/oj/err.h +9 -12
- data/ext/oj/extconf.rb +18 -7
- data/ext/oj/fast.c +83 -108
- data/ext/oj/intern.c +52 -50
- data/ext/oj/intern.h +4 -8
- data/ext/oj/mem.c +318 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +104 -81
- data/ext/oj/object.c +50 -67
- data/ext/oj/odd.c +89 -67
- data/ext/oj/odd.h +15 -15
- data/ext/oj/oj.c +171 -106
- data/ext/oj/oj.h +96 -74
- data/ext/oj/parse.c +169 -189
- data/ext/oj/parse.h +23 -24
- data/ext/oj/parser.c +89 -34
- data/ext/oj/parser.h +20 -9
- data/ext/oj/rails.c +86 -151
- data/ext/oj/rails.h +1 -1
- data/ext/oj/reader.c +12 -15
- data/ext/oj/reader.h +4 -2
- data/ext/oj/resolve.c +3 -4
- data/ext/oj/rxclass.c +6 -5
- data/ext/oj/rxclass.h +1 -1
- data/ext/oj/saj.c +21 -32
- data/ext/oj/saj2.c +329 -93
- data/ext/oj/saj2.h +23 -0
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +26 -70
- data/ext/oj/stream_writer.c +12 -22
- data/ext/oj/strict.c +20 -52
- data/ext/oj/string_writer.c +21 -22
- data/ext/oj/trace.h +31 -4
- data/ext/oj/usual.c +105 -150
- data/ext/oj/usual.h +68 -0
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.c +1 -1
- data/ext/oj/val_stack.h +8 -7
- data/ext/oj/validate.c +21 -26
- data/ext/oj/wab.c +32 -69
- data/lib/oj/active_support_helper.rb +1 -3
- 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 +162 -150
- data/lib/oj/mimic.rb +6 -2
- data/lib/oj/saj.rb +20 -6
- data/lib/oj/state.rb +9 -6
- data/lib/oj/version.rb +1 -2
- data/lib/oj.rb +2 -0
- data/pages/Compatibility.md +1 -1
- data/pages/InstallOptions.md +20 -0
- data/pages/JsonGem.md +15 -0
- data/pages/Modes.md +6 -3
- data/pages/Options.md +10 -0
- data/pages/Rails.md +12 -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/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
- data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
- data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
- data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
- data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
- data/test/files.rb +15 -15
- data/test/foo.rb +15 -15
- data/test/helper.rb +11 -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 +8 -6
- 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 +49 -37
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +54 -47
- data/test/json_gem/json_string_matching_test.rb +9 -9
- data/test/json_gem/test_helper.rb +7 -3
- data/test/mem.rb +13 -12
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +31 -33
- data/test/perf_dump.rb +50 -0
- 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 +42 -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 +95 -43
- data/test/test_custom.rb +72 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +102 -87
- data/test/test_file.rb +41 -30
- data/test/test_gc.rb +16 -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 +85 -96
- data/test/test_parser.rb +6 -22
- data/test/test_parser_debug.rb +27 -0
- data/test/test_parser_saj.rb +115 -23
- 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 +37 -39
- data/test/test_strict.rb +40 -32
- data/test/test_various.rb +163 -84
- data/test/test_wab.rb +48 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +13 -5
- data/test/tests_mimic.rb +12 -3
- data/test/tests_mimic_addition.rb +12 -3
- metadata +34 -144
- 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/test_helper.rb +0 -72
- data/test/bar.rb +0 -16
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/ext/oj/compat.c
CHANGED
@@ -6,38 +6,26 @@
|
|
6
6
|
#include "encode.h"
|
7
7
|
#include "err.h"
|
8
8
|
#include "intern.h"
|
9
|
+
#include "mem.h"
|
9
10
|
#include "oj.h"
|
10
11
|
#include "parse.h"
|
11
12
|
#include "resolve.h"
|
12
13
|
#include "trace.h"
|
13
14
|
|
14
15
|
static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *orig) {
|
15
|
-
const char *
|
16
|
-
int
|
17
|
-
Val
|
18
|
-
volatile VALUE rkey = kval->key_val;
|
16
|
+
const char *key = kval->key;
|
17
|
+
int klen = kval->klen;
|
18
|
+
Val parent = stack_peek(&pi->stack);
|
19
19
|
|
20
|
-
if (Qundef ==
|
20
|
+
if (Qundef == kval->key_val && Yes == pi->options.create_ok && NULL != pi->options.create_id &&
|
21
21
|
*pi->options.create_id == *key && (int)pi->options.create_id_len == klen &&
|
22
22
|
0 == strncmp(pi->options.create_id, key, klen)) {
|
23
23
|
parent->classname = oj_strndup(str, len);
|
24
24
|
parent->clen = len;
|
25
25
|
} else {
|
26
26
|
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
27
|
+
volatile VALUE rkey = oj_calc_hash_key(pi, kval);
|
27
28
|
|
28
|
-
if (Qundef == rkey) {
|
29
|
-
if (Yes != pi->options.cache_keys) {
|
30
|
-
if (Yes == pi->options.sym_key) {
|
31
|
-
rkey = ID2SYM(rb_intern3(key, klen, oj_utf8_encoding));
|
32
|
-
} else {
|
33
|
-
rkey = rb_utf8_str_new(key, klen);
|
34
|
-
}
|
35
|
-
} else if (Yes == pi->options.sym_key) {
|
36
|
-
rkey = oj_sym_intern(key, klen);
|
37
|
-
} else {
|
38
|
-
rkey = oj_str_intern(key, klen);
|
39
|
-
}
|
40
|
-
}
|
41
29
|
if (Yes == pi->options.create_ok && NULL != pi->options.str_rx.head) {
|
42
30
|
VALUE clas = oj_rxclass_match(&pi->options.str_rx, str, (int)len);
|
43
31
|
|
@@ -54,9 +42,7 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
|
|
54
42
|
} else {
|
55
43
|
rb_hash_aset(parent->val, rkey, rstr);
|
56
44
|
}
|
57
|
-
|
58
|
-
oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
|
59
|
-
}
|
45
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_string", pi, rstr);
|
60
46
|
}
|
61
47
|
}
|
62
48
|
|
@@ -68,9 +54,7 @@ static VALUE start_hash(ParseInfo pi) {
|
|
68
54
|
} else {
|
69
55
|
h = rb_hash_new();
|
70
56
|
}
|
71
|
-
|
72
|
-
oj_trace_parse_in("start_hash", pi, __FILE__, __LINE__);
|
73
|
-
}
|
57
|
+
TRACE_PARSE_IN(pi->options.trace, "start_hash", pi);
|
74
58
|
return h;
|
75
59
|
}
|
76
60
|
|
@@ -89,13 +73,11 @@ static void end_hash(struct _parseInfo *pi) {
|
|
89
73
|
}
|
90
74
|
}
|
91
75
|
if (0 != parent->classname) {
|
92
|
-
|
76
|
+
OJ_R_FREE((char *)parent->classname);
|
93
77
|
parent->classname = 0;
|
94
78
|
}
|
95
79
|
}
|
96
|
-
|
97
|
-
oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
|
98
|
-
}
|
80
|
+
TRACE_PARSE_HASH_END(pi->options.trace, pi);
|
99
81
|
}
|
100
82
|
|
101
83
|
static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
@@ -110,37 +92,27 @@ static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig
|
|
110
92
|
}
|
111
93
|
}
|
112
94
|
pi->stack.head->val = rstr;
|
113
|
-
|
114
|
-
oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, rstr);
|
115
|
-
}
|
95
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_string", pi, rstr);
|
116
96
|
}
|
117
97
|
|
118
98
|
static void add_num(ParseInfo pi, NumInfo ni) {
|
119
99
|
pi->stack.head->val = oj_num_as_value(ni);
|
120
|
-
|
121
|
-
oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, pi->stack.head->val);
|
122
|
-
}
|
100
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_number", pi, pi->stack.head->val);
|
123
101
|
}
|
124
102
|
|
125
103
|
static void hash_set_num(struct _parseInfo *pi, Val parent, NumInfo ni) {
|
126
104
|
volatile VALUE rval = oj_num_as_value(ni);
|
127
105
|
|
128
|
-
if (
|
106
|
+
if (rb_cHash != rb_obj_class(parent->val)) {
|
129
107
|
// The rb_hash_set would still work but the unit tests for the
|
130
108
|
// json gem require the less efficient []= method be called to set
|
131
109
|
// values. Even using the store method to set the values will fail
|
132
110
|
// the unit tests.
|
133
|
-
rb_funcall(stack_peek(&pi->stack)->val,
|
134
|
-
rb_intern("[]="),
|
135
|
-
2,
|
136
|
-
oj_calc_hash_key(pi, parent),
|
137
|
-
rval);
|
111
|
+
rb_funcall(stack_peek(&pi->stack)->val, rb_intern("[]="), 2, oj_calc_hash_key(pi, parent), rval);
|
138
112
|
} else {
|
139
113
|
rb_hash_aset(stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, parent), rval);
|
140
114
|
}
|
141
|
-
|
142
|
-
oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, rval);
|
143
|
-
}
|
115
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_number", pi, rval);
|
144
116
|
}
|
145
117
|
|
146
118
|
static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
|
@@ -149,26 +121,18 @@ static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
|
|
149
121
|
// json gem require the less efficient []= method be called to set
|
150
122
|
// values. Even using the store method to set the values will fail
|
151
123
|
// the unit tests.
|
152
|
-
rb_funcall(stack_peek(&pi->stack)->val,
|
153
|
-
rb_intern("[]="),
|
154
|
-
2,
|
155
|
-
oj_calc_hash_key(pi, parent),
|
156
|
-
value);
|
124
|
+
rb_funcall(stack_peek(&pi->stack)->val, rb_intern("[]="), 2, oj_calc_hash_key(pi, parent), value);
|
157
125
|
} else {
|
158
126
|
rb_hash_aset(stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, parent), value);
|
159
127
|
}
|
160
|
-
|
161
|
-
oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
|
162
|
-
}
|
128
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_value", pi, value);
|
163
129
|
}
|
164
130
|
|
165
131
|
static VALUE start_array(ParseInfo pi) {
|
166
132
|
if (Qnil != pi->options.array_class) {
|
167
133
|
return rb_class_new_instance(0, NULL, pi->options.array_class);
|
168
134
|
}
|
169
|
-
|
170
|
-
oj_trace_parse_in("start_array", pi, __FILE__, __LINE__);
|
171
|
-
}
|
135
|
+
TRACE_PARSE_IN(pi->options.trace, "start_array", pi);
|
172
136
|
return rb_ary_new();
|
173
137
|
}
|
174
138
|
|
@@ -184,9 +148,7 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
|
|
184
148
|
} else {
|
185
149
|
rb_ary_push(parent->val, rval);
|
186
150
|
}
|
187
|
-
|
188
|
-
oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
|
189
|
-
}
|
151
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_number", pi, rval);
|
190
152
|
}
|
191
153
|
|
192
154
|
static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
@@ -201,9 +163,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
|
|
201
163
|
}
|
202
164
|
}
|
203
165
|
rb_ary_push(stack_peek(&pi->stack)->val, rstr);
|
204
|
-
|
205
|
-
oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
|
206
|
-
}
|
166
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_string", pi, rstr);
|
207
167
|
}
|
208
168
|
|
209
169
|
void oj_set_compat_callbacks(ParseInfo pi) {
|