oj 3.11.5 → 3.16.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +19 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +20 -6
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +10 -9
  9. data/ext/oj/circarray.c +8 -6
  10. data/ext/oj/circarray.h +2 -2
  11. data/ext/oj/code.c +19 -33
  12. data/ext/oj/code.h +2 -2
  13. data/ext/oj/compat.c +27 -77
  14. data/ext/oj/custom.c +86 -179
  15. data/ext/oj/debug.c +126 -0
  16. data/ext/oj/dump.c +256 -249
  17. data/ext/oj/dump.h +26 -12
  18. data/ext/oj/dump_compat.c +565 -642
  19. data/ext/oj/dump_leaf.c +17 -63
  20. data/ext/oj/dump_object.c +65 -187
  21. data/ext/oj/dump_strict.c +27 -51
  22. data/ext/oj/encoder.c +43 -0
  23. data/ext/oj/err.c +2 -13
  24. data/ext/oj/err.h +24 -8
  25. data/ext/oj/extconf.rb +21 -6
  26. data/ext/oj/fast.c +149 -149
  27. data/ext/oj/intern.c +313 -0
  28. data/ext/oj/intern.h +22 -0
  29. data/ext/oj/mem.c +318 -0
  30. data/ext/oj/mem.h +53 -0
  31. data/ext/oj/mimic_json.c +121 -106
  32. data/ext/oj/object.c +85 -162
  33. data/ext/oj/odd.c +89 -67
  34. data/ext/oj/odd.h +15 -15
  35. data/ext/oj/oj.c +542 -411
  36. data/ext/oj/oj.h +99 -73
  37. data/ext/oj/parse.c +175 -187
  38. data/ext/oj/parse.h +26 -24
  39. data/ext/oj/parser.c +1600 -0
  40. data/ext/oj/parser.h +101 -0
  41. data/ext/oj/rails.c +112 -159
  42. data/ext/oj/rails.h +1 -1
  43. data/ext/oj/reader.c +11 -14
  44. data/ext/oj/reader.h +4 -2
  45. data/ext/oj/resolve.c +5 -24
  46. data/ext/oj/rxclass.c +7 -6
  47. data/ext/oj/rxclass.h +1 -1
  48. data/ext/oj/saj.c +22 -33
  49. data/ext/oj/saj2.c +584 -0
  50. data/ext/oj/saj2.h +23 -0
  51. data/ext/oj/scp.c +5 -28
  52. data/ext/oj/sparse.c +28 -72
  53. data/ext/oj/stream_writer.c +50 -40
  54. data/ext/oj/strict.c +56 -61
  55. data/ext/oj/string_writer.c +72 -39
  56. data/ext/oj/trace.h +31 -4
  57. data/ext/oj/usual.c +1218 -0
  58. data/ext/oj/usual.h +69 -0
  59. data/ext/oj/util.h +1 -1
  60. data/ext/oj/val_stack.c +14 -3
  61. data/ext/oj/val_stack.h +8 -7
  62. data/ext/oj/validate.c +46 -0
  63. data/ext/oj/wab.c +63 -88
  64. data/lib/oj/active_support_helper.rb +1 -3
  65. data/lib/oj/bag.rb +7 -1
  66. data/lib/oj/easy_hash.rb +4 -5
  67. data/lib/oj/error.rb +1 -2
  68. data/lib/oj/json.rb +162 -150
  69. data/lib/oj/mimic.rb +9 -7
  70. data/lib/oj/saj.rb +20 -6
  71. data/lib/oj/schandler.rb +5 -4
  72. data/lib/oj/state.rb +12 -8
  73. data/lib/oj/version.rb +1 -2
  74. data/lib/oj.rb +2 -0
  75. data/pages/Compatibility.md +1 -1
  76. data/pages/InstallOptions.md +20 -0
  77. data/pages/JsonGem.md +15 -0
  78. data/pages/Modes.md +8 -3
  79. data/pages/Options.md +43 -5
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +14 -2
  82. data/test/_test_active.rb +8 -9
  83. data/test/_test_active_mimic.rb +7 -8
  84. data/test/_test_mimic_rails.rb +17 -20
  85. data/test/activerecord/result_test.rb +5 -6
  86. data/test/activesupport6/encoding_test.rb +63 -28
  87. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  88. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  89. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  90. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  91. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  92. data/test/files.rb +15 -15
  93. data/test/foo.rb +16 -45
  94. data/test/helper.rb +11 -8
  95. data/test/isolated/shared.rb +3 -2
  96. data/test/json_gem/json_addition_test.rb +2 -2
  97. data/test/json_gem/json_common_interface_test.rb +8 -6
  98. data/test/json_gem/json_encoding_test.rb +0 -0
  99. data/test/json_gem/json_ext_parser_test.rb +1 -0
  100. data/test/json_gem/json_fixtures_test.rb +3 -2
  101. data/test/json_gem/json_generator_test.rb +56 -38
  102. data/test/json_gem/json_generic_object_test.rb +11 -11
  103. data/test/json_gem/json_parser_test.rb +54 -47
  104. data/test/json_gem/json_string_matching_test.rb +9 -9
  105. data/test/json_gem/test_helper.rb +7 -3
  106. data/test/mem.rb +34 -0
  107. data/test/perf.rb +22 -27
  108. data/test/perf_compat.rb +31 -33
  109. data/test/perf_dump.rb +50 -0
  110. data/test/perf_fast.rb +80 -82
  111. data/test/perf_file.rb +27 -29
  112. data/test/perf_object.rb +65 -69
  113. data/test/perf_once.rb +59 -0
  114. data/test/perf_parser.rb +183 -0
  115. data/test/perf_saj.rb +46 -54
  116. data/test/perf_scp.rb +58 -69
  117. data/test/perf_simple.rb +41 -39
  118. data/test/perf_strict.rb +74 -82
  119. data/test/perf_wab.rb +67 -69
  120. data/test/prec.rb +5 -5
  121. data/test/sample/change.rb +0 -1
  122. data/test/sample/dir.rb +0 -1
  123. data/test/sample/doc.rb +0 -1
  124. data/test/sample/file.rb +0 -1
  125. data/test/sample/group.rb +0 -1
  126. data/test/sample/hasprops.rb +0 -1
  127. data/test/sample/layer.rb +0 -1
  128. data/test/sample/rect.rb +0 -1
  129. data/test/sample/shape.rb +0 -1
  130. data/test/sample/text.rb +0 -1
  131. data/test/sample.rb +16 -16
  132. data/test/sample_json.rb +8 -8
  133. data/test/test_compat.rb +95 -43
  134. data/test/test_custom.rb +73 -51
  135. data/test/test_debian.rb +7 -10
  136. data/test/test_fast.rb +135 -79
  137. data/test/test_file.rb +41 -30
  138. data/test/test_gc.rb +16 -5
  139. data/test/test_generate.rb +5 -5
  140. data/test/test_hash.rb +5 -5
  141. data/test/test_integer_range.rb +9 -9
  142. data/test/test_null.rb +20 -20
  143. data/test/test_object.rb +99 -96
  144. data/test/test_parser.rb +11 -0
  145. data/test/test_parser_debug.rb +27 -0
  146. data/test/test_parser_saj.rb +337 -0
  147. data/test/test_parser_usual.rb +251 -0
  148. data/test/test_rails.rb +2 -2
  149. data/test/test_saj.rb +10 -8
  150. data/test/test_scp.rb +37 -39
  151. data/test/test_strict.rb +40 -32
  152. data/test/test_various.rb +165 -84
  153. data/test/test_wab.rb +48 -44
  154. data/test/test_writer.rb +47 -47
  155. data/test/tests.rb +13 -5
  156. data/test/tests_mimic.rb +12 -3
  157. data/test/tests_mimic_addition.rb +12 -3
  158. metadata +74 -128
  159. data/ext/oj/hash.c +0 -131
  160. data/ext/oj/hash.h +0 -19
  161. data/ext/oj/hash_test.c +0 -491
  162. data/test/activesupport4/decoding_test.rb +0 -108
  163. data/test/activesupport4/encoding_test.rb +0 -531
  164. data/test/activesupport4/test_helper.rb +0 -41
  165. data/test/activesupport5/test_helper.rb +0 -72
  166. data/test/bar.rb +0 -35
  167. data/test/baz.rb +0 -16
  168. data/test/zoo.rb +0 -13
data/ext/oj/dump_leaf.c CHANGED
@@ -8,45 +8,16 @@
8
8
 
9
9
  static void dump_leaf(Leaf leaf, int depth, Out out);
10
10
 
11
- static void grow(Out out, size_t len) {
12
- size_t size = out->end - out->buf;
13
- long pos = out->cur - out->buf;
14
- char * buf;
15
-
16
- size *= 2;
17
- if (size <= len * 2 + pos) {
18
- size += len;
19
- }
20
- if (out->allocated) {
21
- buf = REALLOC_N(out->buf, char, (size + BUFFER_EXTRA));
22
- } else {
23
- buf = ALLOC_N(char, (size + BUFFER_EXTRA));
24
- out->allocated = true;
25
- memcpy(buf, out->buf, out->end - out->buf + BUFFER_EXTRA);
26
- }
27
- if (0 == buf) {
28
- rb_raise(rb_eNoMemError, "Failed to create string. [%d:%s]\n", ENOSPC, strerror(ENOSPC));
29
- }
30
- out->buf = buf;
31
- out->end = buf + size;
32
- out->cur = out->buf + pos;
33
- }
34
-
35
11
  inline static void dump_chars(const char *s, size_t size, Out out) {
36
- if (out->end - out->cur <= (long)size) {
37
- grow(out, size);
38
- }
39
- memcpy(out->cur, s, size);
40
- out->cur += size;
12
+ assure_size(out, size);
13
+ APPEND_CHARS(out->cur, s, size);
41
14
  *out->cur = '\0';
42
15
  }
43
16
 
44
17
  static void dump_leaf_str(Leaf leaf, Out out) {
45
18
  switch (leaf->value_type) {
46
19
  case STR_VAL: oj_dump_cstr(leaf->str, strlen(leaf->str), 0, 0, out); break;
47
- case RUBY_VAL:
48
- oj_dump_cstr(rb_string_value_cstr(&leaf->value), (int)RSTRING_LEN(leaf->value), 0, 0, out);
49
- break;
20
+ case RUBY_VAL: oj_dump_cstr(StringValueCStr(leaf->value), (int)RSTRING_LEN(leaf->value), 0, 0, out); break;
50
21
  case COL_VAL:
51
22
  default: rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type); break;
52
23
  }
@@ -81,9 +52,7 @@ static void dump_leaf_array(Leaf leaf, int depth, Out out) {
81
52
  int d2 = depth + 1;
82
53
 
83
54
  size = 2;
84
- if (out->end - out->cur <= (long)size) {
85
- grow(out, size);
86
- }
55
+ assure_size(out, size);
87
56
  *out->cur++ = '[';
88
57
  if (0 == leaf->elements) {
89
58
  *out->cur++ = ']';
@@ -93,9 +62,7 @@ static void dump_leaf_array(Leaf leaf, int depth, Out out) {
93
62
 
94
63
  size = d2 * out->indent + 2;
95
64
  do {
96
- if (out->end - out->cur <= (long)size) {
97
- grow(out, size);
98
- }
65
+ assure_size(out, size);
99
66
  fill_indent(out, d2);
100
67
  dump_leaf(e, d2, out);
101
68
  if (e->next != first) {
@@ -104,9 +71,7 @@ static void dump_leaf_array(Leaf leaf, int depth, Out out) {
104
71
  e = e->next;
105
72
  } while (e != first);
106
73
  size = depth * out->indent + 1;
107
- if (out->end - out->cur <= (long)size) {
108
- grow(out, size);
109
- }
74
+ assure_size(out, size);
110
75
  fill_indent(out, depth);
111
76
  *out->cur++ = ']';
112
77
  }
@@ -118,9 +83,7 @@ static void dump_leaf_hash(Leaf leaf, int depth, Out out) {
118
83
  int d2 = depth + 1;
119
84
 
120
85
  size = 2;
121
- if (out->end - out->cur <= (long)size) {
122
- grow(out, size);
123
- }
86
+ assure_size(out, size);
124
87
  *out->cur++ = '{';
125
88
  if (0 == leaf->elements) {
126
89
  *out->cur++ = '}';
@@ -130,9 +93,7 @@ static void dump_leaf_hash(Leaf leaf, int depth, Out out) {
130
93
 
131
94
  size = d2 * out->indent + 2;
132
95
  do {
133
- if (out->end - out->cur <= (long)size) {
134
- grow(out, size);
135
- }
96
+ assure_size(out, size);
136
97
  fill_indent(out, d2);
137
98
  oj_dump_cstr(e->key, strlen(e->key), 0, 0, out);
138
99
  *out->cur++ = ':';
@@ -143,9 +104,7 @@ static void dump_leaf_hash(Leaf leaf, int depth, Out out) {
143
104
  e = e->next;
144
105
  } while (e != first);
145
106
  size = depth * out->indent + 1;
146
- if (out->end - out->cur <= (long)size) {
147
- grow(out, size);
148
- }
107
+ assure_size(out, size);
149
108
  fill_indent(out, depth);
150
109
  *out->cur++ = '}';
151
110
  }
@@ -168,10 +127,7 @@ static void dump_leaf(Leaf leaf, int depth, Out out) {
168
127
 
169
128
  void oj_dump_leaf_to_json(Leaf leaf, Options copts, Out out) {
170
129
  if (0 == out->buf) {
171
- out->buf = ALLOC_N(char, 4096);
172
- out->end = out->buf + 4095 -
173
- BUFFER_EXTRA; // 1 less than end plus extra for possible errors
174
- out->allocated = true;
130
+ oj_out_init(out);
175
131
  }
176
132
  out->cur = out->buf;
177
133
  out->circ_cnt = 0;
@@ -182,15 +138,13 @@ void oj_dump_leaf_to_json(Leaf leaf, Options copts, Out out) {
182
138
  }
183
139
 
184
140
  void oj_write_leaf_to_file(Leaf leaf, const char *path, Options copts) {
185
- char buf[4096];
186
141
  struct _out out;
187
142
  size_t size;
188
- FILE * f;
143
+ FILE *f;
189
144
 
190
- out.buf = buf;
191
- out.end = buf + sizeof(buf) - BUFFER_EXTRA;
192
- out.allocated = false;
193
- out.omit_nil = copts->dump_opts.omit_nil;
145
+ oj_out_init(&out);
146
+
147
+ out.omit_nil = copts->dump_opts.omit_nil;
194
148
  oj_dump_leaf_to_json(leaf, copts, &out);
195
149
  size = out.cur - out.buf;
196
150
  if (0 == (f = fopen(path, "w"))) {
@@ -201,8 +155,8 @@ void oj_write_leaf_to_file(Leaf leaf, const char *path, Options copts) {
201
155
 
202
156
  rb_raise(rb_eIOError, "Write failed. [%d:%s]\n", err, strerror(err));
203
157
  }
204
- if (out.allocated) {
205
- xfree(out.buf);
206
- }
158
+
159
+ oj_out_free(&out);
160
+
207
161
  fclose(f);
208
162
  }