oj 3.9.1 → 3.16.11

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1452 -0
  3. data/README.md +21 -6
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +50 -68
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +60 -62
  9. data/ext/oj/cache8.h +9 -36
  10. data/ext/oj/circarray.c +38 -42
  11. data/ext/oj/circarray.h +12 -13
  12. data/ext/oj/code.c +158 -179
  13. data/ext/oj/code.h +20 -22
  14. data/ext/oj/compat.c +145 -205
  15. data/ext/oj/custom.c +740 -880
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +1145 -844
  18. data/ext/oj/dump.h +71 -57
  19. data/ext/oj/dump_compat.c +575 -655
  20. data/ext/oj/dump_leaf.c +96 -186
  21. data/ext/oj/dump_object.c +533 -660
  22. data/ext/oj/dump_strict.c +306 -340
  23. data/ext/oj/encode.h +4 -33
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +28 -28
  26. data/ext/oj/err.h +39 -42
  27. data/ext/oj/extconf.rb +28 -7
  28. data/ext/oj/fast.c +1052 -1113
  29. data/ext/oj/intern.c +313 -0
  30. data/ext/oj/intern.h +22 -0
  31. data/ext/oj/mem.c +318 -0
  32. data/ext/oj/mem.h +53 -0
  33. data/ext/oj/mimic_json.c +471 -430
  34. data/ext/oj/object.c +532 -580
  35. data/ext/oj/odd.c +156 -142
  36. data/ext/oj/odd.h +25 -26
  37. data/ext/oj/oj.c +1346 -961
  38. data/ext/oj/oj.h +307 -290
  39. data/ext/oj/parse.c +954 -858
  40. data/ext/oj/parse.h +74 -72
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +103 -0
  43. data/ext/oj/rails.c +819 -836
  44. data/ext/oj/rails.h +8 -11
  45. data/ext/oj/reader.c +136 -147
  46. data/ext/oj/reader.h +69 -83
  47. data/ext/oj/resolve.c +41 -63
  48. data/ext/oj/resolve.h +4 -6
  49. data/ext/oj/rxclass.c +69 -72
  50. data/ext/oj/rxclass.h +12 -13
  51. data/ext/oj/saj.c +440 -485
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +79 -118
  55. data/ext/oj/simd.h +10 -0
  56. data/ext/oj/sparse.c +739 -709
  57. data/ext/oj/stream_writer.c +141 -175
  58. data/ext/oj/strict.c +103 -128
  59. data/ext/oj/string_writer.c +244 -261
  60. data/ext/oj/trace.c +34 -41
  61. data/ext/oj/trace.h +42 -15
  62. data/ext/oj/usual.c +1218 -0
  63. data/ext/oj/usual.h +69 -0
  64. data/ext/oj/util.c +107 -107
  65. data/ext/oj/util.h +4 -3
  66. data/ext/oj/val_stack.c +61 -78
  67. data/ext/oj/val_stack.h +80 -114
  68. data/ext/oj/validate.c +46 -0
  69. data/ext/oj/wab.c +316 -361
  70. data/lib/oj/active_support_helper.rb +1 -3
  71. data/lib/oj/bag.rb +8 -1
  72. data/lib/oj/easy_hash.rb +9 -9
  73. data/lib/oj/error.rb +1 -2
  74. data/lib/oj/json.rb +162 -150
  75. data/lib/oj/mimic.rb +54 -20
  76. data/lib/oj/saj.rb +20 -6
  77. data/lib/oj/schandler.rb +5 -4
  78. data/lib/oj/state.rb +12 -8
  79. data/lib/oj/version.rb +1 -2
  80. data/lib/oj.rb +2 -8
  81. data/pages/Compatibility.md +1 -1
  82. data/pages/Encoding.md +1 -1
  83. data/pages/InstallOptions.md +20 -0
  84. data/pages/JsonGem.md +15 -0
  85. data/pages/Modes.md +9 -3
  86. data/pages/Options.md +62 -12
  87. data/pages/Parser.md +309 -0
  88. data/pages/Rails.md +73 -22
  89. metadata +68 -192
  90. data/ext/oj/hash.c +0 -163
  91. data/ext/oj/hash.h +0 -46
  92. data/ext/oj/hash_test.c +0 -512
  93. data/test/_test_active.rb +0 -76
  94. data/test/_test_active_mimic.rb +0 -96
  95. data/test/_test_mimic_rails.rb +0 -126
  96. data/test/activerecord/result_test.rb +0 -27
  97. data/test/activesupport4/decoding_test.rb +0 -108
  98. data/test/activesupport4/encoding_test.rb +0 -531
  99. data/test/activesupport4/test_helper.rb +0 -41
  100. data/test/activesupport5/decoding_test.rb +0 -125
  101. data/test/activesupport5/encoding_test.rb +0 -485
  102. data/test/activesupport5/encoding_test_cases.rb +0 -90
  103. data/test/activesupport5/test_helper.rb +0 -50
  104. data/test/activesupport5/time_zone_test_helpers.rb +0 -24
  105. data/test/bar.rb +0 -25
  106. data/test/files.rb +0 -29
  107. data/test/foo.rb +0 -21
  108. data/test/helper.rb +0 -26
  109. data/test/isolated/shared.rb +0 -308
  110. data/test/isolated/test_mimic_after.rb +0 -13
  111. data/test/isolated/test_mimic_alone.rb +0 -12
  112. data/test/isolated/test_mimic_as_json.rb +0 -45
  113. data/test/isolated/test_mimic_before.rb +0 -13
  114. data/test/isolated/test_mimic_define.rb +0 -28
  115. data/test/isolated/test_mimic_rails_after.rb +0 -22
  116. data/test/isolated/test_mimic_rails_before.rb +0 -21
  117. data/test/isolated/test_mimic_redefine.rb +0 -15
  118. data/test/json_gem/json_addition_test.rb +0 -216
  119. data/test/json_gem/json_common_interface_test.rb +0 -148
  120. data/test/json_gem/json_encoding_test.rb +0 -107
  121. data/test/json_gem/json_ext_parser_test.rb +0 -20
  122. data/test/json_gem/json_fixtures_test.rb +0 -35
  123. data/test/json_gem/json_generator_test.rb +0 -383
  124. data/test/json_gem/json_generic_object_test.rb +0 -90
  125. data/test/json_gem/json_parser_test.rb +0 -470
  126. data/test/json_gem/json_string_matching_test.rb +0 -42
  127. data/test/json_gem/test_helper.rb +0 -18
  128. data/test/perf.rb +0 -107
  129. data/test/perf_compat.rb +0 -130
  130. data/test/perf_fast.rb +0 -164
  131. data/test/perf_file.rb +0 -64
  132. data/test/perf_object.rb +0 -138
  133. data/test/perf_saj.rb +0 -109
  134. data/test/perf_scp.rb +0 -151
  135. data/test/perf_simple.rb +0 -287
  136. data/test/perf_strict.rb +0 -145
  137. data/test/perf_wab.rb +0 -131
  138. data/test/sample/change.rb +0 -14
  139. data/test/sample/dir.rb +0 -19
  140. data/test/sample/doc.rb +0 -36
  141. data/test/sample/file.rb +0 -48
  142. data/test/sample/group.rb +0 -16
  143. data/test/sample/hasprops.rb +0 -16
  144. data/test/sample/layer.rb +0 -12
  145. data/test/sample/line.rb +0 -20
  146. data/test/sample/oval.rb +0 -10
  147. data/test/sample/rect.rb +0 -10
  148. data/test/sample/shape.rb +0 -35
  149. data/test/sample/text.rb +0 -20
  150. data/test/sample.rb +0 -54
  151. data/test/sample_json.rb +0 -37
  152. data/test/test_compat.rb +0 -509
  153. data/test/test_custom.rb +0 -503
  154. data/test/test_debian.rb +0 -53
  155. data/test/test_fast.rb +0 -470
  156. data/test/test_file.rb +0 -239
  157. data/test/test_gc.rb +0 -49
  158. data/test/test_hash.rb +0 -29
  159. data/test/test_integer_range.rb +0 -73
  160. data/test/test_null.rb +0 -376
  161. data/test/test_object.rb +0 -1018
  162. data/test/test_saj.rb +0 -186
  163. data/test/test_scp.rb +0 -433
  164. data/test/test_strict.rb +0 -410
  165. data/test/test_various.rb +0 -741
  166. data/test/test_wab.rb +0 -307
  167. data/test/test_writer.rb +0 -380
  168. data/test/tests.rb +0 -24
  169. data/test/tests_mimic.rb +0 -14
  170. data/test/tests_mimic_addition.rb +0 -7
  171. data/test/zoo.rb +0 -13
data/ext/oj/dump_leaf.c CHANGED
@@ -1,252 +1,162 @@
1
- /* dump_leaf.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
5
3
 
6
4
  #include <errno.h>
7
5
 
8
- #include "oj.h"
9
6
  #include "dump.h"
7
+ #include "oj.h"
10
8
 
11
- static void dump_leaf(Leaf leaf, int depth, Out out);
12
-
13
- static void
14
- grow(Out out, size_t len) {
15
- size_t size = out->end - out->buf;
16
- long pos = out->cur - out->buf;
17
- char *buf;
18
-
19
- size *= 2;
20
- if (size <= len * 2 + pos) {
21
- size += len;
22
- }
23
- if (out->allocated) {
24
- buf = REALLOC_N(out->buf, char, (size + BUFFER_EXTRA));
25
- } else {
26
- buf = ALLOC_N(char, (size + BUFFER_EXTRA));
27
- out->allocated = true;
28
- memcpy(buf, out->buf, out->end - out->buf + BUFFER_EXTRA);
29
- }
30
- if (0 == buf) {
31
- rb_raise(rb_eNoMemError, "Failed to create string. [%d:%s]\n", ENOSPC, strerror(ENOSPC));
32
- }
33
- out->buf = buf;
34
- out->end = buf + size;
35
- out->cur = out->buf + pos;
36
- }
37
-
9
+ static void dump_leaf(Leaf leaf, int depth, Out out);
38
10
 
39
- inline static void
40
- dump_chars(const char *s, size_t size, Out out) {
41
- if (out->end - out->cur <= (long)size) {
42
- grow(out, size);
43
- }
44
- memcpy(out->cur, s, size);
45
- out->cur += size;
11
+ inline static void dump_chars(const char *s, size_t size, Out out) {
12
+ assure_size(out, size);
13
+ APPEND_CHARS(out->cur, s, size);
46
14
  *out->cur = '\0';
47
15
  }
48
16
 
49
- static void
50
- dump_leaf_str(Leaf leaf, Out out) {
17
+ static void dump_leaf_str(Leaf leaf, Out out) {
51
18
  switch (leaf->value_type) {
52
- case STR_VAL:
53
- oj_dump_cstr(leaf->str, strlen(leaf->str), 0, 0, out);
54
- break;
55
- case RUBY_VAL:
56
- oj_dump_cstr(rb_string_value_cstr(&leaf->value), (int)RSTRING_LEN(leaf->value), 0, 0, out);
57
- break;
19
+ case STR_VAL: oj_dump_cstr(leaf->str, strlen(leaf->str), 0, 0, out); break;
20
+ case RUBY_VAL: oj_dump_cstr(StringValueCStr(leaf->value), RSTRING_LEN(leaf->value), 0, 0, out); break;
58
21
  case COL_VAL:
59
- default:
60
- rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type);
61
- break;
22
+ default: rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type); break;
62
23
  }
63
24
  }
64
25
 
65
- static void
66
- dump_leaf_fixnum(Leaf leaf, Out out) {
26
+ static void dump_leaf_fixnum(Leaf leaf, Out out) {
67
27
  switch (leaf->value_type) {
68
- case STR_VAL:
69
- dump_chars(leaf->str, strlen(leaf->str), out);
70
- break;
28
+ case STR_VAL: dump_chars(leaf->str, strlen(leaf->str), out); break;
71
29
  case RUBY_VAL:
72
- if (T_BIGNUM == rb_type(leaf->value)) {
73
- oj_dump_bignum(leaf->value, 0, out, false);
74
- } else {
75
- oj_dump_fixnum(leaf->value, 0, out, false);
76
- }
77
- break;
30
+ if (T_BIGNUM == rb_type(leaf->value)) {
31
+ oj_dump_bignum(leaf->value, 0, out, false);
32
+ } else {
33
+ oj_dump_fixnum(leaf->value, 0, out, false);
34
+ }
35
+ break;
78
36
  case COL_VAL:
79
- default:
80
- rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type);
81
- break;
37
+ default: rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type); break;
82
38
  }
83
39
  }
84
40
 
85
- static void
86
- dump_leaf_float(Leaf leaf, Out out) {
41
+ static void dump_leaf_float(Leaf leaf, Out out) {
87
42
  switch (leaf->value_type) {
88
- case STR_VAL:
89
- dump_chars(leaf->str, strlen(leaf->str), out);
90
- break;
91
- case RUBY_VAL:
92
- oj_dump_float(leaf->value, 0, out, false);
93
- break;
43
+ case STR_VAL: dump_chars(leaf->str, strlen(leaf->str), out); break;
44
+ case RUBY_VAL: oj_dump_float(leaf->value, 0, out, false); break;
94
45
  case COL_VAL:
95
- default:
96
- rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type);
97
- break;
46
+ default: rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type); break;
98
47
  }
99
48
  }
100
49
 
101
- static void
102
- dump_leaf_array(Leaf leaf, int depth, Out out) {
103
- size_t size;
104
- int d2 = depth + 1;
50
+ static void dump_leaf_array(Leaf leaf, int depth, Out out) {
51
+ size_t size;
52
+ int d2 = depth + 1;
105
53
 
106
54
  size = 2;
107
- if (out->end - out->cur <= (long)size) {
108
- grow(out, size);
109
- }
55
+ assure_size(out, size);
110
56
  *out->cur++ = '[';
111
57
  if (0 == leaf->elements) {
112
- *out->cur++ = ']';
58
+ *out->cur++ = ']';
113
59
  } else {
114
- Leaf first = leaf->elements->next;
115
- Leaf e = first;
116
-
117
- size = d2 * out->indent + 2;
118
- do {
119
- if (out->end - out->cur <= (long)size) {
120
- grow(out, size);
121
- }
122
- fill_indent(out, d2);
123
- dump_leaf(e, d2, out);
124
- if (e->next != first) {
125
- *out->cur++ = ',';
126
- }
127
- e = e->next;
128
- } while (e != first);
129
- size = depth * out->indent + 1;
130
- if (out->end - out->cur <= (long)size) {
131
- grow(out, size);
132
- }
133
- fill_indent(out, depth);
134
- *out->cur++ = ']';
60
+ Leaf first = leaf->elements->next;
61
+ Leaf e = first;
62
+
63
+ size = d2 * out->indent + 2;
64
+ do {
65
+ assure_size(out, size);
66
+ fill_indent(out, d2);
67
+ dump_leaf(e, d2, out);
68
+ if (e->next != first) {
69
+ *out->cur++ = ',';
70
+ }
71
+ e = e->next;
72
+ } while (e != first);
73
+ size = depth * out->indent + 1;
74
+ assure_size(out, size);
75
+ fill_indent(out, depth);
76
+ *out->cur++ = ']';
135
77
  }
136
78
  *out->cur = '\0';
137
79
  }
138
80
 
139
- static void
140
- dump_leaf_hash(Leaf leaf, int depth, Out out) {
141
- size_t size;
142
- int d2 = depth + 1;
81
+ static void dump_leaf_hash(Leaf leaf, int depth, Out out) {
82
+ size_t size;
83
+ int d2 = depth + 1;
143
84
 
144
85
  size = 2;
145
- if (out->end - out->cur <= (long)size) {
146
- grow(out, size);
147
- }
86
+ assure_size(out, size);
148
87
  *out->cur++ = '{';
149
88
  if (0 == leaf->elements) {
150
- *out->cur++ = '}';
89
+ *out->cur++ = '}';
151
90
  } else {
152
- Leaf first = leaf->elements->next;
153
- Leaf e = first;
154
-
155
- size = d2 * out->indent + 2;
156
- do {
157
- if (out->end - out->cur <= (long)size) {
158
- grow(out, size);
159
- }
160
- fill_indent(out, d2);
161
- oj_dump_cstr(e->key, strlen(e->key), 0, 0, out);
162
- *out->cur++ = ':';
163
- dump_leaf(e, d2, out);
164
- if (e->next != first) {
165
- *out->cur++ = ',';
166
- }
167
- e = e->next;
168
- } while (e != first);
169
- size = depth * out->indent + 1;
170
- if (out->end - out->cur <= (long)size) {
171
- grow(out, size);
172
- }
173
- fill_indent(out, depth);
174
- *out->cur++ = '}';
91
+ Leaf first = leaf->elements->next;
92
+ Leaf e = first;
93
+
94
+ size = d2 * out->indent + 2;
95
+ do {
96
+ assure_size(out, size);
97
+ fill_indent(out, d2);
98
+ oj_dump_cstr(e->key, strlen(e->key), 0, 0, out);
99
+ *out->cur++ = ':';
100
+ dump_leaf(e, d2, out);
101
+ if (e->next != first) {
102
+ *out->cur++ = ',';
103
+ }
104
+ e = e->next;
105
+ } while (e != first);
106
+ size = depth * out->indent + 1;
107
+ assure_size(out, size);
108
+ fill_indent(out, depth);
109
+ *out->cur++ = '}';
175
110
  }
176
111
  *out->cur = '\0';
177
112
  }
178
113
 
179
- static void
180
- dump_leaf(Leaf leaf, int depth, Out out) {
114
+ static void dump_leaf(Leaf leaf, int depth, Out out) {
181
115
  switch (leaf->rtype) {
182
- case T_NIL:
183
- oj_dump_nil(Qnil, 0, out, false);
184
- break;
185
- case T_TRUE:
186
- oj_dump_true(Qtrue, 0, out, false);
187
- break;
188
- case T_FALSE:
189
- oj_dump_false(Qfalse, 0, out, false);
190
- break;
191
- case T_STRING:
192
- dump_leaf_str(leaf, out);
193
- break;
194
- case T_FIXNUM:
195
- dump_leaf_fixnum(leaf, out);
196
- break;
197
- case T_FLOAT:
198
- dump_leaf_float(leaf, out);
199
- break;
200
- case T_ARRAY:
201
- dump_leaf_array(leaf, depth, out);
202
- break;
203
- case T_HASH:
204
- dump_leaf_hash(leaf, depth, out);
205
- break;
206
- default:
207
- rb_raise(rb_eTypeError, "Unexpected type %02x.\n", leaf->rtype);
208
- break;
116
+ case T_NIL: oj_dump_nil(Qnil, 0, out, false); break;
117
+ case T_TRUE: oj_dump_true(Qtrue, 0, out, false); break;
118
+ case T_FALSE: oj_dump_false(Qfalse, 0, out, false); break;
119
+ case T_STRING: dump_leaf_str(leaf, out); break;
120
+ case T_FIXNUM: dump_leaf_fixnum(leaf, out); break;
121
+ case T_FLOAT: dump_leaf_float(leaf, out); break;
122
+ case T_ARRAY: dump_leaf_array(leaf, depth, out); break;
123
+ case T_HASH: dump_leaf_hash(leaf, depth, out); break;
124
+ default: rb_raise(rb_eTypeError, "Unexpected type %02x.\n", leaf->rtype); break;
209
125
  }
210
126
  }
211
127
 
212
- void
213
- oj_dump_leaf_to_json(Leaf leaf, Options copts, Out out) {
128
+ void oj_dump_leaf_to_json(Leaf leaf, Options copts, Out out) {
214
129
  if (0 == out->buf) {
215
- out->buf = ALLOC_N(char, 4096);
216
- out->end = out->buf + 4095 - BUFFER_EXTRA; // 1 less than end plus extra for possible errors
217
- out->allocated = true;
130
+ oj_out_init(out);
218
131
  }
219
- out->cur = out->buf;
132
+ out->cur = out->buf;
220
133
  out->circ_cnt = 0;
221
- out->opts = copts;
134
+ out->opts = copts;
222
135
  out->hash_cnt = 0;
223
- out->indent = copts->indent;
136
+ out->indent = copts->indent;
224
137
  dump_leaf(leaf, 0, out);
225
138
  }
226
139
 
227
- void
228
- oj_write_leaf_to_file(Leaf leaf, const char *path, Options copts) {
229
- char buf[4096];
140
+ void oj_write_leaf_to_file(Leaf leaf, const char *path, Options copts) {
230
141
  struct _out out;
231
- size_t size;
232
- FILE *f;
142
+ size_t size;
143
+ FILE *f;
144
+
145
+ oj_out_init(&out);
233
146
 
234
- out.buf = buf;
235
- out.end = buf + sizeof(buf) - BUFFER_EXTRA;
236
- out.allocated = false;
237
147
  out.omit_nil = copts->dump_opts.omit_nil;
238
148
  oj_dump_leaf_to_json(leaf, copts, &out);
239
149
  size = out.cur - out.buf;
240
150
  if (0 == (f = fopen(path, "w"))) {
241
- rb_raise(rb_eIOError, "%s\n", strerror(errno));
151
+ rb_raise(rb_eIOError, "%s\n", strerror(errno));
242
152
  }
243
153
  if (size != fwrite(out.buf, 1, size, f)) {
244
- int err = ferror(f);
154
+ int err = ferror(f);
245
155
 
246
- rb_raise(rb_eIOError, "Write failed. [%d:%s]\n", err, strerror(err));
247
- }
248
- if (out.allocated) {
249
- xfree(out.buf);
156
+ rb_raise(rb_eIOError, "Write failed. [%d:%s]\n", err, strerror(err));
250
157
  }
158
+
159
+ oj_out_free(&out);
160
+
251
161
  fclose(f);
252
162
  }