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/parse.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_PARSE_H
4
5
  #define OJ_PARSE_H
@@ -7,102 +8,104 @@
7
8
  #include <stdio.h>
8
9
  #include <string.h>
9
10
 
10
- #include "ruby.h"
11
- #include "oj.h"
12
- #include "val_stack.h"
13
11
  #include "circarray.h"
12
+ #include "oj.h"
14
13
  #include "reader.h"
14
+ #include "ruby.h"
15
15
  #include "rxclass.h"
16
+ #include "val_stack.h"
16
17
 
17
18
  struct _rxClass;
19
+ struct _parseInfo;
18
20
 
19
21
  typedef struct _numInfo {
20
- int64_t i;
21
- int64_t num;
22
- int64_t div;
23
- int64_t di;
24
- const char *str;
25
- size_t len;
26
- long exp;
27
- int big;
28
- int infinity;
29
- int nan;
30
- int neg;
31
- int has_exp;
32
- int no_big;
33
- int bigdec_load;
22
+ int64_t i;
23
+ int64_t num;
24
+ int64_t div;
25
+ int64_t di;
26
+ const char *str;
27
+ size_t len;
28
+ long exp;
29
+ struct _parseInfo *pi;
30
+ int big;
31
+ int infinity;
32
+ int nan;
33
+ int neg;
34
+ int has_exp;
35
+ int no_big;
36
+ int bigdec_load;
34
37
  } *NumInfo;
35
38
 
36
39
  typedef struct _parseInfo {
37
40
  // used for the string parser
38
- const char *json;
39
- const char *cur;
40
- const char *end;
41
+ const char *json;
42
+ const char *cur;
43
+ const char *end;
41
44
  // used for the stream parser
42
- struct _reader rd;
43
-
44
- struct _err err;
45
- struct _options options;
46
- VALUE handler;
47
- struct _valStack stack;
48
- CircArray circ_array;
49
- struct _rxClass str_rx;
50
- int expect_value;
51
- int max_depth; // just for the json gem
52
- VALUE proc;
53
- VALUE (*start_hash)(struct _parseInfo *pi);
54
- void (*end_hash)(struct _parseInfo *pi);
55
- VALUE (*hash_key)(struct _parseInfo *pi, const char *key, size_t klen);
56
- void (*hash_set_cstr)(struct _parseInfo *pi, Val kval, const char *str, size_t len, const char *orig);
57
- void (*hash_set_num)(struct _parseInfo *pi, Val kval, NumInfo ni);
58
- void (*hash_set_value)(struct _parseInfo *pi, Val kval, VALUE value);
59
-
60
- VALUE (*start_array)(struct _parseInfo *pi);
61
- void (*end_array)(struct _parseInfo *pi);
62
- void (*array_append_cstr)(struct _parseInfo *pi, const char *str, size_t len, const char *orig);
63
- void (*array_append_num)(struct _parseInfo *pi, NumInfo ni);
64
- void (*array_append_value)(struct _parseInfo *pi, VALUE value);
65
-
66
- void (*add_cstr)(struct _parseInfo *pi, const char *str, size_t len, const char *orig);
67
- void (*add_num)(struct _parseInfo *pi, NumInfo ni);
68
- void (*add_value)(struct _parseInfo *pi, VALUE val);
69
- VALUE err_class;
70
- bool has_callbacks;
45
+ struct _reader rd;
46
+
47
+ struct _err err;
48
+ struct _options options;
49
+ VALUE handler;
50
+ struct _valStack stack;
51
+ CircArray circ_array;
52
+ struct _rxClass str_rx;
53
+ int expect_value;
54
+ int max_depth; // just for the json gem
55
+ VALUE proc;
56
+ VALUE (*start_hash)(struct _parseInfo *pi);
57
+ void (*end_hash)(struct _parseInfo *pi);
58
+ VALUE (*hash_key)(struct _parseInfo *pi, const char *key, size_t klen);
59
+ void (*hash_set_cstr)(struct _parseInfo *pi, Val kval, const char *str, size_t len, const char *orig);
60
+ void (*hash_set_num)(struct _parseInfo *pi, Val kval, NumInfo ni);
61
+ void (*hash_set_value)(struct _parseInfo *pi, Val kval, VALUE value);
62
+
63
+ VALUE (*start_array)(struct _parseInfo *pi);
64
+ void (*end_array)(struct _parseInfo *pi);
65
+ void (*array_append_cstr)(struct _parseInfo *pi, const char *str, size_t len, const char *orig);
66
+ void (*array_append_num)(struct _parseInfo *pi, NumInfo ni);
67
+ void (*array_append_value)(struct _parseInfo *pi, VALUE value);
68
+
69
+ void (*add_cstr)(struct _parseInfo *pi, const char *str, size_t len, const char *orig);
70
+ void (*add_num)(struct _parseInfo *pi, NumInfo ni);
71
+ void (*add_value)(struct _parseInfo *pi, VALUE val);
72
+ VALUE err_class;
73
+ bool has_callbacks;
71
74
  } *ParseInfo;
72
75
 
73
- extern void oj_parse2(ParseInfo pi);
74
- extern void oj_set_error_at(ParseInfo pi, VALUE err_clas, const char* file, int line, const char *format, ...);
75
- extern VALUE oj_pi_parse(int argc, VALUE *argv, ParseInfo pi, char *json, size_t len, int yieldOk);
76
- extern VALUE oj_num_as_value(NumInfo ni);
76
+ extern void oj_parse2(ParseInfo pi);
77
+ extern void oj_set_error_at(ParseInfo pi, VALUE err_clas, const char *file, int line, const char *format, ...);
78
+ extern VALUE oj_pi_parse(int argc, VALUE *argv, ParseInfo pi, char *json, size_t len, int yieldOk);
79
+ extern VALUE oj_num_as_value(NumInfo ni);
77
80
 
78
- extern void oj_set_strict_callbacks(ParseInfo pi);
79
- extern void oj_set_object_callbacks(ParseInfo pi);
80
- extern void oj_set_compat_callbacks(ParseInfo pi);
81
- extern void oj_set_custom_callbacks(ParseInfo pi);
82
- extern void oj_set_wab_callbacks(ParseInfo pi);
81
+ extern void oj_set_strict_callbacks(ParseInfo pi);
82
+ extern void oj_set_object_callbacks(ParseInfo pi);
83
+ extern void oj_set_compat_callbacks(ParseInfo pi);
84
+ extern void oj_set_custom_callbacks(ParseInfo pi);
85
+ extern void oj_set_wab_callbacks(ParseInfo pi);
83
86
 
84
- extern void oj_sparse2(ParseInfo pi);
85
- extern VALUE oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd);
87
+ extern void oj_sparse2(ParseInfo pi);
88
+ extern VALUE oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd);
86
89
 
87
- static inline void
88
- parse_info_init(ParseInfo pi) {
90
+ extern VALUE oj_cstr_to_value(const char *str, size_t len, size_t cache_str);
91
+ extern VALUE oj_calc_hash_key(ParseInfo pi, Val parent);
92
+
93
+ static inline void parse_info_init(ParseInfo pi) {
89
94
  memset(pi, 0, sizeof(struct _parseInfo));
90
95
  }
91
96
 
92
- static inline bool
93
- empty_ok(Options options) {
97
+ extern void oj_scanner_init(void);
98
+
99
+ static inline bool empty_ok(Options options) {
94
100
  switch (options->mode) {
95
101
  case ObjectMode:
96
- case WabMode:
97
- return true;
102
+ case WabMode: return true;
98
103
  case CompatMode:
99
- case RailsMode:
100
- return false;
104
+ case RailsMode: return false;
101
105
  case StrictMode:
102
106
  case NullMode:
103
107
  case CustomMode:
104
- default:
105
- break;
108
+ default: break;
106
109
  }
107
110
  return Yes == options->empty_string;
108
111
  }