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.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +101 -0
  3. data/README.md +13 -2
  4. data/ext/oj/buf.h +11 -6
  5. data/ext/oj/cache.c +25 -24
  6. data/ext/oj/cache8.c +10 -9
  7. data/ext/oj/circarray.c +8 -6
  8. data/ext/oj/circarray.h +2 -2
  9. data/ext/oj/code.c +19 -33
  10. data/ext/oj/code.h +2 -2
  11. data/ext/oj/compat.c +20 -60
  12. data/ext/oj/custom.c +76 -155
  13. data/ext/oj/debug.c +3 -9
  14. data/ext/oj/dump.c +203 -213
  15. data/ext/oj/dump.h +26 -12
  16. data/ext/oj/dump_compat.c +565 -642
  17. data/ext/oj/dump_leaf.c +17 -63
  18. data/ext/oj/dump_object.c +59 -181
  19. data/ext/oj/dump_strict.c +24 -48
  20. data/ext/oj/encoder.c +43 -0
  21. data/ext/oj/err.c +2 -13
  22. data/ext/oj/err.h +9 -12
  23. data/ext/oj/extconf.rb +18 -7
  24. data/ext/oj/fast.c +83 -108
  25. data/ext/oj/intern.c +52 -50
  26. data/ext/oj/intern.h +4 -8
  27. data/ext/oj/mem.c +318 -0
  28. data/ext/oj/mem.h +53 -0
  29. data/ext/oj/mimic_json.c +104 -81
  30. data/ext/oj/object.c +50 -67
  31. data/ext/oj/odd.c +89 -67
  32. data/ext/oj/odd.h +15 -15
  33. data/ext/oj/oj.c +171 -106
  34. data/ext/oj/oj.h +96 -74
  35. data/ext/oj/parse.c +169 -189
  36. data/ext/oj/parse.h +23 -24
  37. data/ext/oj/parser.c +89 -34
  38. data/ext/oj/parser.h +20 -9
  39. data/ext/oj/rails.c +86 -151
  40. data/ext/oj/rails.h +1 -1
  41. data/ext/oj/reader.c +12 -15
  42. data/ext/oj/reader.h +4 -2
  43. data/ext/oj/resolve.c +3 -4
  44. data/ext/oj/rxclass.c +6 -5
  45. data/ext/oj/rxclass.h +1 -1
  46. data/ext/oj/saj.c +21 -32
  47. data/ext/oj/saj2.c +329 -93
  48. data/ext/oj/saj2.h +23 -0
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +26 -70
  51. data/ext/oj/stream_writer.c +12 -22
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +21 -22
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +105 -150
  56. data/ext/oj/usual.h +68 -0
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +1 -1
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/validate.c +21 -26
  61. data/ext/oj/wab.c +32 -69
  62. data/lib/oj/active_support_helper.rb +1 -3
  63. data/lib/oj/bag.rb +7 -1
  64. data/lib/oj/easy_hash.rb +4 -5
  65. data/lib/oj/error.rb +0 -1
  66. data/lib/oj/json.rb +162 -150
  67. data/lib/oj/mimic.rb +6 -2
  68. data/lib/oj/saj.rb +20 -6
  69. data/lib/oj/state.rb +9 -6
  70. data/lib/oj/version.rb +1 -2
  71. data/lib/oj.rb +2 -0
  72. data/pages/Compatibility.md +1 -1
  73. data/pages/InstallOptions.md +20 -0
  74. data/pages/JsonGem.md +15 -0
  75. data/pages/Modes.md +6 -3
  76. data/pages/Options.md +10 -0
  77. data/pages/Rails.md +12 -0
  78. data/test/_test_active.rb +8 -9
  79. data/test/_test_active_mimic.rb +7 -8
  80. data/test/_test_mimic_rails.rb +17 -20
  81. data/test/activerecord/result_test.rb +5 -6
  82. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  83. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  84. data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
  85. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  86. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  87. data/test/files.rb +15 -15
  88. data/test/foo.rb +15 -15
  89. data/test/helper.rb +11 -8
  90. data/test/isolated/shared.rb +3 -2
  91. data/test/json_gem/json_addition_test.rb +2 -2
  92. data/test/json_gem/json_common_interface_test.rb +8 -6
  93. data/test/json_gem/json_encoding_test.rb +0 -0
  94. data/test/json_gem/json_ext_parser_test.rb +1 -0
  95. data/test/json_gem/json_fixtures_test.rb +3 -2
  96. data/test/json_gem/json_generator_test.rb +49 -37
  97. data/test/json_gem/json_generic_object_test.rb +11 -11
  98. data/test/json_gem/json_parser_test.rb +54 -47
  99. data/test/json_gem/json_string_matching_test.rb +9 -9
  100. data/test/json_gem/test_helper.rb +7 -3
  101. data/test/mem.rb +13 -12
  102. data/test/perf.rb +21 -26
  103. data/test/perf_compat.rb +31 -33
  104. data/test/perf_dump.rb +50 -0
  105. data/test/perf_fast.rb +80 -82
  106. data/test/perf_file.rb +27 -29
  107. data/test/perf_object.rb +65 -69
  108. data/test/perf_once.rb +12 -11
  109. data/test/perf_parser.rb +42 -48
  110. data/test/perf_saj.rb +46 -54
  111. data/test/perf_scp.rb +57 -69
  112. data/test/perf_simple.rb +41 -39
  113. data/test/perf_strict.rb +68 -70
  114. data/test/perf_wab.rb +67 -69
  115. data/test/prec.rb +3 -3
  116. data/test/sample/change.rb +0 -1
  117. data/test/sample/dir.rb +0 -1
  118. data/test/sample/doc.rb +0 -1
  119. data/test/sample/file.rb +0 -1
  120. data/test/sample/group.rb +0 -1
  121. data/test/sample/hasprops.rb +0 -1
  122. data/test/sample/layer.rb +0 -1
  123. data/test/sample/rect.rb +0 -1
  124. data/test/sample/shape.rb +0 -1
  125. data/test/sample/text.rb +0 -1
  126. data/test/sample.rb +16 -16
  127. data/test/sample_json.rb +8 -8
  128. data/test/test_compat.rb +95 -43
  129. data/test/test_custom.rb +72 -51
  130. data/test/test_debian.rb +7 -10
  131. data/test/test_fast.rb +102 -87
  132. data/test/test_file.rb +41 -30
  133. data/test/test_gc.rb +16 -5
  134. data/test/test_generate.rb +5 -5
  135. data/test/test_hash.rb +4 -4
  136. data/test/test_integer_range.rb +9 -9
  137. data/test/test_null.rb +20 -20
  138. data/test/test_object.rb +85 -96
  139. data/test/test_parser.rb +6 -22
  140. data/test/test_parser_debug.rb +27 -0
  141. data/test/test_parser_saj.rb +115 -23
  142. data/test/test_parser_usual.rb +6 -6
  143. data/test/test_rails.rb +2 -2
  144. data/test/test_saj.rb +10 -8
  145. data/test/test_scp.rb +37 -39
  146. data/test/test_strict.rb +40 -32
  147. data/test/test_various.rb +163 -84
  148. data/test/test_wab.rb +48 -44
  149. data/test/test_writer.rb +47 -47
  150. data/test/tests.rb +13 -5
  151. data/test/tests_mimic.rb +12 -3
  152. data/test/tests_mimic_addition.rb +12 -3
  153. metadata +34 -144
  154. data/test/activesupport4/decoding_test.rb +0 -108
  155. data/test/activesupport4/encoding_test.rb +0 -531
  156. data/test/activesupport4/test_helper.rb +0 -41
  157. data/test/activesupport5/test_helper.rb +0 -72
  158. data/test/bar.rb +0 -16
  159. data/test/baz.rb +0 -16
  160. data/test/bug.rb +0 -16
  161. 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 * key = kval->key;
16
- int klen = kval->klen;
17
- Val parent = stack_peek(&pi->stack);
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 == rkey && Yes == pi->options.create_ok && NULL != pi->options.create_id &&
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
- if (Yes == pi->options.trace) {
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
- if (Yes == pi->options.trace) {
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
- xfree((char *)parent->classname);
76
+ OJ_R_FREE((char *)parent->classname);
93
77
  parent->classname = 0;
94
78
  }
95
79
  }
96
- if (Yes == pi->options.trace) {
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
- if (Yes == pi->options.trace) {
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
- if (Yes == pi->options.trace) {
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 (!oj_use_hash_alt && rb_cHash != rb_obj_class(parent->val)) {
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
- if (Yes == pi->options.trace) {
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
- if (Yes == pi->options.trace) {
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
- if (Yes == pi->options.trace) {
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
- if (Yes == pi->options.trace) {
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
- if (Yes == pi->options.trace) {
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) {