oj 3.13.17 → 3.16.3
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 +77 -0
- data/README.md +4 -2
- data/ext/oj/buf.h +7 -6
- data/ext/oj/cache.c +29 -26
- data/ext/oj/cache.h +3 -2
- data/ext/oj/cache8.c +10 -9
- data/ext/oj/circarray.c +7 -5
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +5 -12
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +20 -60
- data/ext/oj/custom.c +44 -96
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +69 -39
- data/ext/oj/dump.h +1 -4
- data/ext/oj/dump_compat.c +557 -592
- data/ext/oj/dump_leaf.c +3 -5
- data/ext/oj/dump_object.c +42 -48
- data/ext/oj/dump_strict.c +10 -22
- 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 +16 -6
- data/ext/oj/fast.c +76 -106
- data/ext/oj/intern.c +63 -51
- data/ext/oj/intern.h +3 -7
- data/ext/oj/mem.c +318 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +43 -30
- data/ext/oj/object.c +61 -70
- data/ext/oj/odd.c +8 -6
- data/ext/oj/odd.h +4 -4
- data/ext/oj/oj.c +243 -205
- data/ext/oj/oj.h +82 -78
- data/ext/oj/parse.c +123 -188
- data/ext/oj/parse.h +23 -24
- data/ext/oj/parser.c +103 -63
- data/ext/oj/parser.h +19 -9
- data/ext/oj/rails.c +68 -92
- data/ext/oj/reader.c +10 -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 +10 -9
- data/ext/oj/saj2.c +74 -92
- data/ext/oj/saj2.h +23 -0
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +22 -70
- data/ext/oj/stream_writer.c +43 -35
- data/ext/oj/strict.c +20 -52
- data/ext/oj/string_writer.c +60 -34
- data/ext/oj/trace.h +31 -4
- data/ext/oj/usual.c +125 -150
- data/ext/oj/usual.h +69 -0
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.c +14 -3
- data/ext/oj/val_stack.h +8 -7
- data/ext/oj/wab.c +25 -57
- 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/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/Options.md +10 -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 -72
- 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 +53 -37
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +47 -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 +28 -28
- 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 +5 -5
- 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 +80 -53
- data/test/test_custom.rb +73 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +86 -90
- data/test/test_file.rb +28 -35
- 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 +94 -96
- data/test/test_parser.rb +6 -22
- data/test/test_parser_debug.rb +27 -0
- data/test/test_parser_saj.rb +61 -22
- data/test/test_parser_usual.rb +16 -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 +148 -100
- data/test/test_wab.rb +48 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +13 -4
- data/test/tests_mimic.rb +12 -3
- data/test/tests_mimic_addition.rb +12 -3
- metadata +36 -27
- 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/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) {
|
data/ext/oj/custom.c
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
#include "encode.h"
|
10
10
|
#include "err.h"
|
11
11
|
#include "intern.h"
|
12
|
+
#include "mem.h"
|
12
13
|
#include "odd.h"
|
13
14
|
#include "oj.h"
|
14
15
|
#include "parse.h"
|
@@ -24,21 +25,21 @@ static void dump_obj_str(VALUE obj, int depth, Out out) {
|
|
24
25
|
{"s", 1, Qnil},
|
25
26
|
{NULL, 0, Qnil},
|
26
27
|
};
|
27
|
-
attrs->value =
|
28
|
+
attrs->value = oj_safe_string_convert(obj);
|
28
29
|
|
29
30
|
oj_code_attrs(obj, attrs, depth, out, Yes == out->opts->create_ok);
|
30
31
|
}
|
31
32
|
|
32
33
|
static void dump_obj_as_str(VALUE obj, int depth, Out out) {
|
33
|
-
volatile VALUE rstr =
|
34
|
-
const char
|
34
|
+
volatile VALUE rstr = oj_safe_string_convert(obj);
|
35
|
+
const char *str = RSTRING_PTR(rstr);
|
35
36
|
|
36
37
|
oj_dump_cstr(str, RSTRING_LEN(rstr), 0, 0, out);
|
37
38
|
}
|
38
39
|
|
39
40
|
static void bigdecimal_dump(VALUE obj, int depth, Out out) {
|
40
|
-
volatile VALUE rstr =
|
41
|
-
const char
|
41
|
+
volatile VALUE rstr = oj_safe_string_convert(obj);
|
42
|
+
const char *str = RSTRING_PTR(rstr);
|
42
43
|
int len = (int)RSTRING_LEN(rstr);
|
43
44
|
|
44
45
|
if (0 == strcasecmp("Infinity", str)) {
|
@@ -82,8 +83,7 @@ static VALUE complex_load(VALUE clas, VALUE args) {
|
|
82
83
|
real_id = rb_intern("real");
|
83
84
|
imag_id = rb_intern("imag");
|
84
85
|
}
|
85
|
-
return rb_complex_new(rb_hash_aref(args, rb_id2str(real_id)),
|
86
|
-
rb_hash_aref(args, rb_id2str(imag_id)));
|
86
|
+
return rb_complex_new(rb_hash_aref(args, rb_id2str(real_id)), rb_hash_aref(args, rb_id2str(imag_id)));
|
87
87
|
}
|
88
88
|
|
89
89
|
static void time_dump(VALUE obj, int depth, Out out) {
|
@@ -246,8 +246,7 @@ static VALUE rational_load(VALUE clas, VALUE args) {
|
|
246
246
|
numerator_id = rb_intern("numerator");
|
247
247
|
denominator_id = rb_intern("denominator");
|
248
248
|
}
|
249
|
-
return rb_rational_new(rb_hash_aref(args, rb_id2str(numerator_id)),
|
250
|
-
rb_hash_aref(args, rb_id2str(denominator_id)));
|
249
|
+
return rb_rational_new(rb_hash_aref(args, rb_id2str(numerator_id)), rb_hash_aref(args, rb_id2str(denominator_id)));
|
251
250
|
}
|
252
251
|
|
253
252
|
static VALUE regexp_load(VALUE clas, VALUE args) {
|
@@ -292,8 +291,7 @@ static int hash_cb(VALUE key, VALUE value, VALUE ov) {
|
|
292
291
|
assure_size(out, depth * out->indent + 1);
|
293
292
|
fill_indent(out, depth);
|
294
293
|
} else {
|
295
|
-
assure_size(out,
|
296
|
-
depth * out->opts->dump_opts.indent_size + out->opts->dump_opts.hash_size + 1);
|
294
|
+
assure_size(out, depth * out->opts->dump_opts.indent_size + out->opts->dump_opts.hash_size + 1);
|
297
295
|
if (0 < out->opts->dump_opts.hash_size) {
|
298
296
|
APPEND_CHARS(out->cur, out->opts->dump_opts.hash_nl, out->opts->dump_opts.hash_size);
|
299
297
|
}
|
@@ -308,7 +306,7 @@ static int hash_cb(VALUE key, VALUE value, VALUE ov) {
|
|
308
306
|
switch (rb_type(key)) {
|
309
307
|
case T_STRING: oj_dump_str(key, 0, out, false); break;
|
310
308
|
case T_SYMBOL: oj_dump_sym(key, 0, out, false); break;
|
311
|
-
default: oj_dump_str(
|
309
|
+
default: oj_dump_str(oj_safe_string_convert(key), 0, out, false); break;
|
312
310
|
}
|
313
311
|
if (!out->opts->dump_opts.use) {
|
314
312
|
*out->cur++ = ':';
|
@@ -352,9 +350,7 @@ static void dump_hash(VALUE obj, int depth, Out out, bool as_ok) {
|
|
352
350
|
assure_size(out, depth * out->indent + 2);
|
353
351
|
fill_indent(out, depth);
|
354
352
|
} else {
|
355
|
-
assure_size(
|
356
|
-
out,
|
357
|
-
depth * out->opts->dump_opts.indent_size + out->opts->dump_opts.hash_size + 1);
|
353
|
+
assure_size(out, depth * out->opts->dump_opts.indent_size + out->opts->dump_opts.hash_size + 1);
|
358
354
|
if (0 < out->opts->dump_opts.hash_size) {
|
359
355
|
APPEND_CHARS(out->cur, out->opts->dump_opts.hash_nl, out->opts->dump_opts.hash_size);
|
360
356
|
}
|
@@ -372,10 +368,10 @@ static void dump_hash(VALUE obj, int depth, Out out, bool as_ok) {
|
|
372
368
|
}
|
373
369
|
|
374
370
|
static void dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
|
375
|
-
ID
|
376
|
-
AttrGetFunc
|
371
|
+
ID *idp;
|
372
|
+
AttrGetFunc *fp;
|
377
373
|
volatile VALUE v;
|
378
|
-
const char
|
374
|
+
const char *name;
|
379
375
|
size_t size;
|
380
376
|
int d2 = depth + 1;
|
381
377
|
|
@@ -384,7 +380,7 @@ static void dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
|
|
384
380
|
if (NULL != out->opts->create_id && Yes == out->opts->create_ok) {
|
385
381
|
const char *classname = rb_class2name(clas);
|
386
382
|
int clen = (int)strlen(classname);
|
387
|
-
size_t
|
383
|
+
size_t sep_len = out->opts->dump_opts.before_size + out->opts->dump_opts.after_size + 2;
|
388
384
|
|
389
385
|
size = d2 * out->indent + 10 + clen + out->opts->create_id_len + sep_len;
|
390
386
|
assure_size(out, size);
|
@@ -442,7 +438,7 @@ static void dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
|
|
442
438
|
ID i;
|
443
439
|
|
444
440
|
if (sizeof(nbuf) <= nlen) {
|
445
|
-
if (NULL == (n2 =
|
441
|
+
if (NULL == (n2 = OJ_STRDUP(name))) {
|
446
442
|
rb_raise(rb_eNoMemError, "for attribute name.");
|
447
443
|
}
|
448
444
|
} else {
|
@@ -459,7 +455,7 @@ static void dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
|
|
459
455
|
i = rb_intern(n);
|
460
456
|
v = rb_funcall(v, i, 0);
|
461
457
|
if (nbuf != n2) {
|
462
|
-
|
458
|
+
OJ_FREE(n2);
|
463
459
|
}
|
464
460
|
}
|
465
461
|
fill_indent(out, d2);
|
@@ -481,20 +477,16 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
|
|
481
477
|
oj_dump_raw_json(obj, depth, out);
|
482
478
|
} else if (Yes == out->opts->to_json && rb_respond_to(obj, oj_to_json_id)) {
|
483
479
|
volatile VALUE rs;
|
484
|
-
const char
|
480
|
+
const char *s;
|
485
481
|
int len;
|
486
482
|
|
487
|
-
|
488
|
-
oj_trace("to_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyIn);
|
489
|
-
}
|
483
|
+
TRACE(out->opts->trace, "to_json", obj, depth + 1, TraceRubyIn);
|
490
484
|
if (0 == rb_obj_method_arity(obj, oj_to_json_id)) {
|
491
485
|
rs = rb_funcall(obj, oj_to_json_id, 0);
|
492
486
|
} else {
|
493
487
|
rs = rb_funcall2(obj, oj_to_json_id, out->argc, out->argv);
|
494
488
|
}
|
495
|
-
|
496
|
-
oj_trace("to_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
|
497
|
-
}
|
489
|
+
TRACE(out->opts->trace, "to_json", obj, depth + 1, TraceRubyOut);
|
498
490
|
s = RSTRING_PTR(rs);
|
499
491
|
len = (int)RSTRING_LEN(rs);
|
500
492
|
|
@@ -504,9 +496,7 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
|
|
504
496
|
} else if (Yes == out->opts->as_json && rb_respond_to(obj, oj_as_json_id)) {
|
505
497
|
volatile VALUE aj;
|
506
498
|
|
507
|
-
|
508
|
-
oj_trace("as_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyIn);
|
509
|
-
}
|
499
|
+
TRACE(out->opts->trace, "as_json", obj, depth + 1, TraceRubyIn);
|
510
500
|
// Some classes elect to not take an options argument so check the arity
|
511
501
|
// of as_json.
|
512
502
|
if (0 == rb_obj_method_arity(obj, oj_as_json_id)) {
|
@@ -514,18 +504,12 @@ static VALUE dump_common(VALUE obj, int depth, Out out) {
|
|
514
504
|
} else {
|
515
505
|
aj = rb_funcall2(obj, oj_as_json_id, out->argc, out->argv);
|
516
506
|
}
|
517
|
-
|
518
|
-
oj_trace("as_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
|
519
|
-
}
|
507
|
+
TRACE(out->opts->trace, "as_json", obj, depth + 1, TraceRubyOut);
|
520
508
|
// Catch the obvious brain damaged recursive dumping.
|
521
509
|
if (aj == obj) {
|
522
|
-
volatile VALUE rstr =
|
510
|
+
volatile VALUE rstr = oj_safe_string_convert(obj);
|
523
511
|
|
524
|
-
oj_dump_cstr(RSTRING_PTR(rstr),
|
525
|
-
(int)RSTRING_LEN(rstr),
|
526
|
-
false,
|
527
|
-
false,
|
528
|
-
out);
|
512
|
+
oj_dump_cstr(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), false, false, out);
|
529
513
|
} else {
|
530
514
|
oj_dump_custom_val(aj, depth, out, true);
|
531
515
|
}
|
@@ -609,7 +593,7 @@ static void dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out)
|
|
609
593
|
assure_size(out, 2);
|
610
594
|
*out->cur++ = '{';
|
611
595
|
if (Qundef != clas && NULL != out->opts->create_id && Yes == out->opts->create_ok) {
|
612
|
-
size_t
|
596
|
+
size_t sep_len = out->opts->dump_opts.before_size + out->opts->dump_opts.after_size + 2;
|
613
597
|
const char *classname = rb_obj_classname(obj);
|
614
598
|
size_t len = strlen(classname);
|
615
599
|
|
@@ -885,9 +869,7 @@ static DumpFunc custom_funcs[] = {
|
|
885
869
|
void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok) {
|
886
870
|
int type = rb_type(obj);
|
887
871
|
|
888
|
-
|
889
|
-
oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
|
890
|
-
}
|
872
|
+
TRACE(out->opts->trace, "dump", obj, depth, TraceIn);
|
891
873
|
if (MAX_DEPTH < depth) {
|
892
874
|
rb_raise(rb_eNoMemError, "Too deeply nested.\n");
|
893
875
|
}
|
@@ -896,27 +878,22 @@ void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok) {
|
|
896
878
|
|
897
879
|
if (NULL != f) {
|
898
880
|
f(obj, depth, out, true);
|
899
|
-
|
900
|
-
oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
|
901
|
-
}
|
881
|
+
TRACE(out->opts->trace, "dump", obj, depth, TraceOut);
|
902
882
|
return;
|
903
883
|
}
|
904
884
|
}
|
905
885
|
oj_dump_nil(Qnil, depth, out, false);
|
906
|
-
|
907
|
-
oj_trace("dump", Qnil, __FILE__, __LINE__, depth, TraceOut);
|
908
|
-
}
|
886
|
+
TRACE(out->opts->trace, "dump", Qnil, depth, TraceOut);
|
909
887
|
}
|
910
888
|
|
911
889
|
///// load functions /////
|
912
890
|
|
913
891
|
static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *orig) {
|
914
|
-
const char *
|
915
|
-
int
|
916
|
-
Val
|
917
|
-
volatile VALUE rkey = kval->key_val;
|
892
|
+
const char *key = kval->key;
|
893
|
+
int klen = kval->klen;
|
894
|
+
Val parent = stack_peek(&pi->stack);
|
918
895
|
|
919
|
-
if (Qundef ==
|
896
|
+
if (Qundef == kval->key_val && Yes == pi->options.create_ok && NULL != pi->options.create_id &&
|
920
897
|
*pi->options.create_id == *key && (int)pi->options.create_id_len == klen &&
|
921
898
|
0 == strncmp(pi->options.create_id, key, klen)) {
|
922
899
|
parent->clas = oj_name2class(pi, str, len, false, rb_eArgError);
|
@@ -928,16 +905,9 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
|
|
928
905
|
}
|
929
906
|
}
|
930
907
|
} else {
|
931
|
-
|
932
|
-
|
908
|
+
volatile VALUE rstr = oj_cstr_to_value(str, len, (size_t)pi->options.cache_str);
|
909
|
+
volatile VALUE rkey = oj_calc_hash_key(pi, kval);
|
933
910
|
|
934
|
-
if (Qundef == rkey) {
|
935
|
-
if (Yes == pi->options.sym_key) {
|
936
|
-
rkey = ID2SYM(rb_intern3(key, klen, oj_utf8_encoding));
|
937
|
-
} else {
|
938
|
-
rkey = rb_utf8_str_new(key, klen);
|
939
|
-
}
|
940
|
-
}
|
941
911
|
if (Yes == pi->options.create_ok && NULL != pi->options.str_rx.head) {
|
942
912
|
VALUE clas = oj_rxclass_match(&pi->options.str_rx, str, (int)len);
|
943
913
|
|
@@ -959,9 +929,7 @@ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, c
|
|
959
929
|
break;
|
960
930
|
default: break;
|
961
931
|
}
|
962
|
-
|
963
|
-
oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rstr);
|
964
|
-
}
|
932
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_string", pi, rstr);
|
965
933
|
}
|
966
934
|
}
|
967
935
|
|
@@ -978,9 +946,7 @@ static void end_hash(struct _parseInfo *pi) {
|
|
978
946
|
}
|
979
947
|
parent->clas = Qundef;
|
980
948
|
}
|
981
|
-
|
982
|
-
oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
|
983
|
-
}
|
949
|
+
TRACE_PARSE_HASH_END(pi->options.trace, pi);
|
984
950
|
}
|
985
951
|
|
986
952
|
static void hash_set_num(struct _parseInfo *pi, Val kval, NumInfo ni) {
|
@@ -1008,20 +974,10 @@ static void hash_set_num(struct _parseInfo *pi, Val kval, NumInfo ni) {
|
|
1008
974
|
// match the expected value.
|
1009
975
|
parent->val = rb_funcall2(parent->val, oj_utc_id, 0, 0);
|
1010
976
|
} else if (ni->has_exp) {
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
sec_as_time(t, &ti);
|
1016
|
-
|
1017
|
-
args[0] = LONG2NUM(ti.year);
|
1018
|
-
args[1] = LONG2NUM(ti.mon);
|
1019
|
-
args[2] = LONG2NUM(ti.day);
|
1020
|
-
args[3] = LONG2NUM(ti.hour);
|
1021
|
-
args[4] = LONG2NUM(ti.min);
|
1022
|
-
args[5] = rb_float_new((double)ti.sec + ((double)nsec + 0.5) / 1000000000.0);
|
1023
|
-
args[6] = LONG2NUM(ni->exp);
|
1024
|
-
parent->val = rb_funcall2(rb_cTime, oj_new_id, 7, args);
|
977
|
+
struct timespec ts;
|
978
|
+
ts.tv_sec = ni->i;
|
979
|
+
ts.tv_nsec = nsec;
|
980
|
+
parent->val = rb_time_timespec_new(&ts, (int)ni->exp);
|
1025
981
|
} else {
|
1026
982
|
parent->val = rb_time_nano_new(ni->i, (long)nsec);
|
1027
983
|
}
|
@@ -1032,9 +988,7 @@ static void hash_set_num(struct _parseInfo *pi, Val kval, NumInfo ni) {
|
|
1032
988
|
break;
|
1033
989
|
default: break;
|
1034
990
|
}
|
1035
|
-
|
1036
|
-
oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rval);
|
1037
|
-
}
|
991
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_string", pi, rval);
|
1038
992
|
}
|
1039
993
|
|
1040
994
|
static void hash_set_value(ParseInfo pi, Val kval, VALUE value) {
|
@@ -1045,9 +999,7 @@ static void hash_set_value(ParseInfo pi, Val kval, VALUE value) {
|
|
1045
999
|
case T_HASH: rb_hash_aset(parent->val, oj_calc_hash_key(pi, kval), value); break;
|
1046
1000
|
default: break;
|
1047
1001
|
}
|
1048
|
-
|
1049
|
-
oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
|
1050
|
-
}
|
1002
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_value", pi, value);
|
1051
1003
|
}
|
1052
1004
|
|
1053
1005
|
static void array_append_num(ParseInfo pi, NumInfo ni) {
|
@@ -1055,9 +1007,7 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
|
|
1055
1007
|
volatile VALUE rval = oj_num_as_value(ni);
|
1056
1008
|
|
1057
1009
|
rb_ary_push(parent->val, rval);
|
1058
|
-
|
1059
|
-
oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
|
1060
|
-
}
|
1010
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_number", pi, rval);
|
1061
1011
|
}
|
1062
1012
|
|
1063
1013
|
static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
@@ -1072,9 +1022,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
|
|
1072
1022
|
}
|
1073
1023
|
}
|
1074
1024
|
rb_ary_push(stack_peek(&pi->stack)->val, rstr);
|
1075
|
-
|
1076
|
-
oj_trace_parse_call("append_string", pi, __FILE__, __LINE__, rstr);
|
1077
|
-
}
|
1025
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_string", pi, rstr);
|
1078
1026
|
}
|
1079
1027
|
|
1080
1028
|
void oj_set_custom_callbacks(ParseInfo pi) {
|
data/ext/oj/debug.c
CHANGED
@@ -30,9 +30,7 @@ static void add_int(struct _ojParser *p) {
|
|
30
30
|
switch (p->stack[p->depth]) {
|
31
31
|
case TOP_FUN: printf("*** add_int %lld at top\n", (long long)p->num.fixnum); break;
|
32
32
|
case ARRAY_FUN: printf("*** add_int %lld to array\n", (long long)p->num.fixnum); break;
|
33
|
-
case OBJECT_FUN:
|
34
|
-
printf("*** add_int %lld with '%s'\n", (long long)p->num.fixnum, buf_str(&p->key));
|
35
|
-
break;
|
33
|
+
case OBJECT_FUN: printf("*** add_int %lld with '%s'\n", (long long)p->num.fixnum, buf_str(&p->key)); break;
|
36
34
|
}
|
37
35
|
}
|
38
36
|
|
@@ -48,9 +46,7 @@ static void add_big(struct _ojParser *p) {
|
|
48
46
|
switch (p->stack[p->depth]) {
|
49
47
|
case TOP_FUN: printf("*** add_big %s at top\n", buf_str(&p->buf)); break;
|
50
48
|
case ARRAY_FUN: printf("*** add_big %s to array\n", buf_str(&p->buf)); break;
|
51
|
-
case OBJECT_FUN:
|
52
|
-
printf("*** add_big %s with '%s'\n", buf_str(&p->buf), buf_str(&p->key));
|
53
|
-
break;
|
49
|
+
case OBJECT_FUN: printf("*** add_big %s with '%s'\n", buf_str(&p->buf), buf_str(&p->key)); break;
|
54
50
|
}
|
55
51
|
}
|
56
52
|
|
@@ -58,9 +54,7 @@ static void add_str(struct _ojParser *p) {
|
|
58
54
|
switch (p->stack[p->depth]) {
|
59
55
|
case TOP_FUN: printf("*** add_str '%s' at top\n", buf_str(&p->buf)); break;
|
60
56
|
case ARRAY_FUN: printf("*** add_str '%s' to array\n", buf_str(&p->buf)); break;
|
61
|
-
case OBJECT_FUN:
|
62
|
-
printf("*** add_str '%s' with '%s'\n", buf_str(&p->buf), buf_str(&p->key));
|
63
|
-
break;
|
57
|
+
case OBJECT_FUN: printf("*** add_str '%s' with '%s'\n", buf_str(&p->buf), buf_str(&p->key)); break;
|
64
58
|
}
|
65
59
|
}
|
66
60
|
|