oj 3.11.0 → 3.16.5

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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +20 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +48 -38
  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 +8 -7
  10. data/ext/oj/circarray.c +35 -35
  11. data/ext/oj/circarray.h +11 -9
  12. data/ext/oj/code.c +156 -174
  13. data/ext/oj/code.h +19 -18
  14. data/ext/oj/compat.c +140 -197
  15. data/ext/oj/custom.c +737 -879
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +830 -835
  18. data/ext/oj/dump.h +65 -53
  19. data/ext/oj/dump_compat.c +566 -642
  20. data/ext/oj/dump_leaf.c +95 -182
  21. data/ext/oj/dump_object.c +518 -659
  22. data/ext/oj/dump_strict.c +301 -334
  23. data/ext/oj/encode.h +3 -4
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +27 -24
  26. data/ext/oj/err.h +38 -13
  27. data/ext/oj/extconf.rb +23 -7
  28. data/ext/oj/fast.c +1043 -1073
  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 +449 -423
  34. data/ext/oj/object.c +530 -576
  35. data/ext/oj/odd.c +155 -138
  36. data/ext/oj/odd.h +24 -22
  37. data/ext/oj/oj.c +1331 -993
  38. data/ext/oj/oj.h +306 -292
  39. data/ext/oj/parse.c +934 -938
  40. data/ext/oj/parse.h +73 -70
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +101 -0
  43. data/ext/oj/rails.c +795 -845
  44. data/ext/oj/rails.h +7 -7
  45. data/ext/oj/reader.c +132 -140
  46. data/ext/oj/reader.h +67 -78
  47. data/ext/oj/resolve.c +40 -59
  48. data/ext/oj/resolve.h +3 -2
  49. data/ext/oj/rxclass.c +67 -67
  50. data/ext/oj/rxclass.h +11 -9
  51. data/ext/oj/saj.c +441 -480
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +78 -111
  55. data/ext/oj/sparse.c +726 -730
  56. data/ext/oj/stream_writer.c +146 -165
  57. data/ext/oj/strict.c +103 -123
  58. data/ext/oj/string_writer.c +241 -253
  59. data/ext/oj/trace.c +29 -33
  60. data/ext/oj/trace.h +41 -11
  61. data/ext/oj/usual.c +1218 -0
  62. data/ext/oj/usual.h +69 -0
  63. data/ext/oj/util.c +103 -103
  64. data/ext/oj/util.h +3 -2
  65. data/ext/oj/val_stack.c +60 -49
  66. data/ext/oj/val_stack.h +79 -85
  67. data/ext/oj/validate.c +46 -0
  68. data/ext/oj/wab.c +307 -350
  69. data/lib/oj/active_support_helper.rb +1 -3
  70. data/lib/oj/bag.rb +8 -1
  71. data/lib/oj/easy_hash.rb +9 -9
  72. data/lib/oj/error.rb +1 -2
  73. data/lib/oj/json.rb +162 -150
  74. data/lib/oj/mimic.rb +9 -19
  75. data/lib/oj/saj.rb +20 -6
  76. data/lib/oj/schandler.rb +5 -4
  77. data/lib/oj/state.rb +12 -8
  78. data/lib/oj/version.rb +1 -2
  79. data/lib/oj.rb +2 -0
  80. data/pages/Compatibility.md +1 -1
  81. data/pages/InstallOptions.md +20 -0
  82. data/pages/JsonGem.md +15 -0
  83. data/pages/Modes.md +8 -3
  84. data/pages/Options.md +43 -5
  85. data/pages/Parser.md +309 -0
  86. data/pages/Rails.md +14 -2
  87. data/test/_test_active.rb +8 -9
  88. data/test/_test_active_mimic.rb +7 -8
  89. data/test/_test_mimic_rails.rb +17 -20
  90. data/test/activerecord/result_test.rb +12 -8
  91. data/test/activesupport6/encoding_test.rb +63 -28
  92. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  93. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  94. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  95. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  96. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  97. data/test/files.rb +15 -15
  98. data/test/foo.rb +17 -43
  99. data/test/helper.rb +16 -3
  100. data/test/isolated/shared.rb +3 -2
  101. data/test/json_gem/json_addition_test.rb +2 -2
  102. data/test/json_gem/json_common_interface_test.rb +8 -6
  103. data/test/json_gem/json_encoding_test.rb +0 -0
  104. data/test/json_gem/json_ext_parser_test.rb +1 -0
  105. data/test/json_gem/json_fixtures_test.rb +3 -2
  106. data/test/json_gem/json_generator_test.rb +71 -41
  107. data/test/json_gem/json_generic_object_test.rb +11 -11
  108. data/test/json_gem/json_parser_test.rb +54 -47
  109. data/test/json_gem/json_string_matching_test.rb +9 -9
  110. data/test/json_gem/test_helper.rb +12 -0
  111. data/test/mem.rb +34 -0
  112. data/test/perf.rb +22 -27
  113. data/test/perf_compat.rb +31 -33
  114. data/test/perf_dump.rb +50 -0
  115. data/test/perf_fast.rb +80 -82
  116. data/test/perf_file.rb +27 -29
  117. data/test/perf_object.rb +65 -69
  118. data/test/perf_once.rb +59 -0
  119. data/test/perf_parser.rb +183 -0
  120. data/test/perf_saj.rb +46 -54
  121. data/test/perf_scp.rb +58 -69
  122. data/test/perf_simple.rb +41 -39
  123. data/test/perf_strict.rb +74 -82
  124. data/test/perf_wab.rb +67 -69
  125. data/test/prec.rb +5 -5
  126. data/test/sample/change.rb +0 -1
  127. data/test/sample/dir.rb +0 -1
  128. data/test/sample/doc.rb +0 -1
  129. data/test/sample/file.rb +0 -1
  130. data/test/sample/group.rb +0 -1
  131. data/test/sample/hasprops.rb +0 -1
  132. data/test/sample/layer.rb +0 -1
  133. data/test/sample/rect.rb +0 -1
  134. data/test/sample/shape.rb +0 -1
  135. data/test/sample/text.rb +0 -1
  136. data/test/sample.rb +16 -16
  137. data/test/sample_json.rb +8 -8
  138. data/test/test_compat.rb +97 -45
  139. data/test/test_custom.rb +73 -51
  140. data/test/test_debian.rb +7 -10
  141. data/test/test_fast.rb +135 -79
  142. data/test/test_file.rb +41 -30
  143. data/test/test_gc.rb +16 -5
  144. data/test/test_generate.rb +21 -0
  145. data/test/test_hash.rb +15 -5
  146. data/test/test_integer_range.rb +9 -9
  147. data/test/test_null.rb +20 -20
  148. data/test/test_object.rb +99 -96
  149. data/test/test_parser.rb +11 -0
  150. data/test/test_parser_debug.rb +27 -0
  151. data/test/test_parser_saj.rb +337 -0
  152. data/test/test_parser_usual.rb +251 -0
  153. data/test/test_rails.rb +2 -2
  154. data/test/test_saj.rb +10 -8
  155. data/test/test_scp.rb +38 -40
  156. data/test/test_strict.rb +40 -32
  157. data/test/test_various.rb +165 -84
  158. data/test/test_wab.rb +48 -44
  159. data/test/test_writer.rb +47 -47
  160. data/test/tests.rb +13 -5
  161. data/test/tests_mimic.rb +12 -3
  162. data/test/tests_mimic_addition.rb +12 -3
  163. metadata +75 -127
  164. data/ext/oj/hash.c +0 -135
  165. data/ext/oj/hash.h +0 -18
  166. data/ext/oj/hash_test.c +0 -484
  167. data/test/activesupport4/decoding_test.rb +0 -108
  168. data/test/activesupport4/encoding_test.rb +0 -531
  169. data/test/activesupport4/test_helper.rb +0 -41
  170. data/test/activesupport5/test_helper.rb +0 -72
  171. data/test/bar.rb +0 -35
  172. data/test/baz.rb +0 -16
  173. data/test/zoo.rb +0 -13
data/ext/oj/dump.h CHANGED
@@ -1,4 +1,5 @@
1
1
  // Copyright (c) 2011 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
2
3
 
3
4
  #ifndef OJ_DUMP_H
4
5
  #define OJ_DUMP_H
@@ -12,81 +13,92 @@
12
13
  // Extra padding at end of buffer.
13
14
  #define BUFFER_EXTRA 64
14
15
 
15
- extern void oj_dump_nil(VALUE obj, int depth, Out out, bool as_ok);
16
- extern void oj_dump_true(VALUE obj, int depth, Out out, bool as_ok);
17
- extern void oj_dump_false(VALUE obj, int depth, Out out, bool as_ok);
18
- extern void oj_dump_fixnum(VALUE obj, int depth, Out out, bool as_ok);
19
- extern void oj_dump_bignum(VALUE obj, int depth, Out out, bool as_ok);
20
- extern void oj_dump_float(VALUE obj, int depth, Out out, bool as_ok);
21
- extern void oj_dump_str(VALUE obj, int depth, Out out, bool as_ok);
22
- extern void oj_dump_sym(VALUE obj, int depth, Out out, bool as_ok);
23
- extern void oj_dump_class(VALUE obj, int depth, Out out, bool as_ok);
16
+ extern void oj_dump_nil(VALUE obj, int depth, Out out, bool as_ok);
17
+ extern void oj_dump_true(VALUE obj, int depth, Out out, bool as_ok);
18
+ extern void oj_dump_false(VALUE obj, int depth, Out out, bool as_ok);
19
+ extern void oj_dump_fixnum(VALUE obj, int depth, Out out, bool as_ok);
20
+ extern void oj_dump_bignum(VALUE obj, int depth, Out out, bool as_ok);
21
+ extern void oj_dump_float(VALUE obj, int depth, Out out, bool as_ok);
22
+ extern void oj_dump_str(VALUE obj, int depth, Out out, bool as_ok);
23
+ extern void oj_dump_sym(VALUE obj, int depth, Out out, bool as_ok);
24
+ extern void oj_dump_class(VALUE obj, int depth, Out out, bool as_ok);
24
25
 
25
- extern void oj_dump_raw(const char *str, size_t cnt, Out out);
26
- extern void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out);
27
- extern void oj_dump_ruby_time(VALUE obj, Out out);
28
- extern void oj_dump_xml_time(VALUE obj, Out out);
29
- extern void oj_dump_time(VALUE obj, Out out, int withZone);
30
- extern void oj_dump_obj_to_s(VALUE obj, Out out);
26
+ extern void oj_dump_raw(const char *str, size_t cnt, Out out);
27
+ extern void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out);
28
+ extern void oj_dump_ruby_time(VALUE obj, Out out);
29
+ extern void oj_dump_xml_time(VALUE obj, Out out);
30
+ extern void oj_dump_time(VALUE obj, Out out, int withZone);
31
+ extern void oj_dump_obj_to_s(VALUE obj, Out out);
31
32
 
32
- extern const char* oj_nan_str(VALUE obj, int opt, int mode, bool plus, int *lenp);
33
+ extern const char *oj_nan_str(VALUE obj, int opt, int mode, bool plus, int *lenp);
33
34
 
34
- extern void oj_grow_out(Out out, size_t len);
35
- extern long oj_check_circular(VALUE obj, Out out);
35
+ // initialize an out buffer with the provided stack allocated memory
36
+ extern void oj_out_init(Out out);
37
+ // clean up the out buffer if it uses heap allocated memory
38
+ extern void oj_out_free(Out out);
36
39
 
37
- extern void oj_dump_strict_val(VALUE obj, int depth, Out out);
38
- extern void oj_dump_null_val(VALUE obj, int depth, Out out);
39
- extern void oj_dump_obj_val(VALUE obj, int depth, Out out);
40
- extern void oj_dump_compat_val(VALUE obj, int depth, Out out, bool as_ok);
41
- extern void oj_dump_rails_val(VALUE obj, int depth, Out out);
42
- extern void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok);
43
- extern void oj_dump_wab_val(VALUE obj, int depth, Out out);
40
+ extern void oj_grow_out(Out out, size_t len);
41
+ extern long oj_check_circular(VALUE obj, Out out);
44
42
 
45
- extern void oj_dump_raw_json(VALUE obj, int depth, Out out);
43
+ extern void oj_dump_strict_val(VALUE obj, int depth, Out out);
44
+ extern void oj_dump_null_val(VALUE obj, int depth, Out out);
45
+ extern void oj_dump_obj_val(VALUE obj, int depth, Out out);
46
+ extern void oj_dump_compat_val(VALUE obj, int depth, Out out, bool as_ok);
47
+ extern void oj_dump_rails_val(VALUE obj, int depth, Out out);
48
+ extern void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok);
49
+ extern void oj_dump_wab_val(VALUE obj, int depth, Out out);
46
50
 
47
- extern VALUE oj_add_to_json(int argc, VALUE *argv, VALUE self);
48
- extern VALUE oj_remove_to_json(int argc, VALUE *argv, VALUE self);
51
+ extern void oj_dump_raw_json(VALUE obj, int depth, Out out);
49
52
 
50
- extern int oj_dump_float_printf(char *buf, size_t blen, VALUE obj, double d, const char *format);
53
+ extern VALUE oj_add_to_json(int argc, VALUE *argv, VALUE self);
54
+ extern VALUE oj_remove_to_json(int argc, VALUE *argv, VALUE self);
51
55
 
52
- extern bool oj_dump_ignore(Options opts, VALUE obj);
53
- extern time_t oj_sec_from_time_hard_way(VALUE obj);
56
+ extern int oj_dump_float_printf(char *buf, size_t blen, VALUE obj, double d, const char *format);
54
57
 
55
- inline static void
56
- assure_size(Out out, size_t len) {
58
+ extern time_t oj_sec_from_time_hard_way(VALUE obj);
59
+
60
+ inline static void assure_size(Out out, size_t len) {
57
61
  if (out->end - out->cur <= (long)len) {
58
- oj_grow_out(out, len);
62
+ oj_grow_out(out, len);
59
63
  }
60
64
  }
61
65
 
62
- inline static void
63
- fill_indent(Out out, int cnt) {
66
+ inline static void fill_indent(Out out, int cnt) {
64
67
  if (0 < out->indent) {
65
- cnt *= out->indent;
66
- *out->cur++ = '\n';
67
- for (; 0 < cnt; cnt--) {
68
- *out->cur++ = ' ';
69
- }
68
+ cnt *= out->indent;
69
+ *out->cur++ = '\n';
70
+ memset(out->cur, ' ', cnt);
71
+ out->cur += cnt;
72
+ }
73
+ }
74
+
75
+ inline static bool dump_ignore(Options opts, VALUE obj) {
76
+ if (NULL != opts->ignore && (ObjectMode == opts->mode || CustomMode == opts->mode)) {
77
+ VALUE *vp = opts->ignore;
78
+ VALUE clas = rb_obj_class(obj);
79
+
80
+ for (; Qnil != *vp; vp++) {
81
+ if (clas == *vp) {
82
+ return true;
83
+ }
84
+ }
70
85
  }
86
+ return false;
71
87
  }
72
88
 
73
- inline static void
74
- dump_ulong(unsigned long num, Out out) {
75
- char buf[32];
76
- char *b = buf + sizeof(buf) - 1;
89
+ inline static void dump_ulong(unsigned long num, Out out) {
90
+ char buf[32];
91
+ char *b = buf + sizeof(buf) - 1;
92
+ size_t cnt = 0;
77
93
 
78
94
  *b-- = '\0';
79
95
  if (0 < num) {
80
- for (; 0 < num; num /= 10, b--) {
81
- *b = (num % 10) + '0';
82
- }
83
- b++;
96
+ b = oj_longlong_to_string((long long)num, false, b);
84
97
  } else {
85
- *b = '0';
86
- }
87
- for (; '\0' != *b; b++) {
88
- *out->cur++ = *b;
98
+ *b = '0';
89
99
  }
100
+ cnt = sizeof(buf) - (b - buf) - 1;
101
+ APPEND_CHARS(out->cur, b, cnt);
90
102
  *out->cur = '\0';
91
103
  }
92
104