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.h CHANGED
@@ -1,7 +1,5 @@
1
- /* dump.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- */
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.
5
3
 
6
4
  #ifndef OJ_DUMP_H
7
5
  #define OJ_DUMP_H
@@ -9,87 +7,103 @@
9
7
  #include <ruby.h>
10
8
 
11
9
  #include "oj.h"
10
+ #include "simd.h"
12
11
 
13
12
  #define MAX_DEPTH 1000
14
13
 
15
14
  // Extra padding at end of buffer.
16
15
  #define BUFFER_EXTRA 64
17
16
 
18
- extern void oj_dump_nil(VALUE obj, int depth, Out out, bool as_ok);
19
- extern void oj_dump_true(VALUE obj, int depth, Out out, bool as_ok);
20
- extern void oj_dump_false(VALUE obj, int depth, Out out, bool as_ok);
21
- extern void oj_dump_fixnum(VALUE obj, int depth, Out out, bool as_ok);
22
- extern void oj_dump_bignum(VALUE obj, int depth, Out out, bool as_ok);
23
- extern void oj_dump_float(VALUE obj, int depth, Out out, bool as_ok);
24
- extern void oj_dump_str(VALUE obj, int depth, Out out, bool as_ok);
25
- extern void oj_dump_sym(VALUE obj, int depth, Out out, bool as_ok);
26
- extern void oj_dump_class(VALUE obj, int depth, Out out, bool as_ok);
17
+ #ifdef HAVE_SIMD_NEON
18
+ extern void initialize_neon(void);
19
+ #endif /* HAVE_SIMD_NEON */
27
20
 
28
- extern void oj_dump_raw(const char *str, size_t cnt, Out out);
29
- extern void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out);
30
- extern void oj_dump_ruby_time(VALUE obj, Out out);
31
- extern void oj_dump_xml_time(VALUE obj, Out out);
32
- extern void oj_dump_time(VALUE obj, Out out, int withZone);
33
- extern void oj_dump_obj_to_s(VALUE obj, Out out);
21
+ extern void oj_dump_nil(VALUE obj, int depth, Out out, bool as_ok);
22
+ extern void oj_dump_true(VALUE obj, int depth, Out out, bool as_ok);
23
+ extern void oj_dump_false(VALUE obj, int depth, Out out, bool as_ok);
24
+ extern void oj_dump_fixnum(VALUE obj, int depth, Out out, bool as_ok);
25
+ extern void oj_dump_bignum(VALUE obj, int depth, Out out, bool as_ok);
26
+ extern void oj_dump_float(VALUE obj, int depth, Out out, bool as_ok);
27
+ extern void oj_dump_str(VALUE obj, int depth, Out out, bool as_ok);
28
+ extern void oj_dump_sym(VALUE obj, int depth, Out out, bool as_ok);
29
+ extern void oj_dump_class(VALUE obj, int depth, Out out, bool as_ok);
34
30
 
35
- extern const char* oj_nan_str(VALUE obj, int opt, int mode, bool plus, int *lenp);
31
+ extern void oj_dump_raw(const char *str, size_t cnt, Out out);
32
+ extern void oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out);
33
+ extern void oj_dump_ruby_time(VALUE obj, Out out);
34
+ extern void oj_dump_xml_time(VALUE obj, Out out);
35
+ extern void oj_dump_time(VALUE obj, Out out, int withZone);
36
+ extern void oj_dump_obj_to_s(VALUE obj, Out out);
36
37
 
37
- extern void oj_grow_out(Out out, size_t len);
38
- extern long oj_check_circular(VALUE obj, Out out);
38
+ extern const char *oj_nan_str(VALUE obj, int opt, int mode, bool plus, size_t *lenp);
39
39
 
40
- extern void oj_dump_strict_val(VALUE obj, int depth, Out out);
41
- extern void oj_dump_null_val(VALUE obj, int depth, Out out);
42
- extern void oj_dump_obj_val(VALUE obj, int depth, Out out);
43
- extern void oj_dump_compat_val(VALUE obj, int depth, Out out, bool as_ok);
44
- extern void oj_dump_rails_val(VALUE obj, int depth, Out out);
45
- extern void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok);
46
- extern void oj_dump_wab_val(VALUE obj, int depth, Out out);
40
+ // initialize an out buffer with the provided stack allocated memory
41
+ extern void oj_out_init(Out out);
42
+ // clean up the out buffer if it uses heap allocated memory
43
+ extern void oj_out_free(Out out);
47
44
 
48
- extern void oj_dump_raw_json(VALUE obj, int depth, Out out);
45
+ extern void oj_grow_out(Out out, size_t len);
46
+ extern long oj_check_circular(VALUE obj, Out out);
49
47
 
50
- extern VALUE oj_add_to_json(int argc, VALUE *argv, VALUE self);
51
- extern VALUE oj_remove_to_json(int argc, VALUE *argv, VALUE self);
48
+ extern void oj_dump_strict_val(VALUE obj, int depth, Out out);
49
+ extern void oj_dump_null_val(VALUE obj, int depth, Out out);
50
+ extern void oj_dump_obj_val(VALUE obj, int depth, Out out);
51
+ extern void oj_dump_compat_val(VALUE obj, int depth, Out out, bool as_ok);
52
+ extern void oj_dump_rails_val(VALUE obj, int depth, Out out);
53
+ extern void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok);
54
+ extern void oj_dump_wab_val(VALUE obj, int depth, Out out);
52
55
 
53
- extern int oj_dump_float_printf(char *buf, size_t blen, VALUE obj, double d, const char *format);
56
+ extern void oj_dump_raw_json(VALUE obj, int depth, Out out);
54
57
 
55
- extern bool oj_dump_ignore(Options opts, VALUE obj);
56
- extern time_t oj_sec_from_time_hard_way(VALUE obj);
58
+ extern VALUE oj_add_to_json(int argc, VALUE *argv, VALUE self);
59
+ extern VALUE oj_remove_to_json(int argc, VALUE *argv, VALUE self);
57
60
 
58
- inline static void
59
- assure_size(Out out, size_t len) {
61
+ extern size_t oj_dump_float_printf(char *buf, size_t blen, VALUE obj, double d, const char *format);
62
+
63
+ extern time_t oj_sec_from_time_hard_way(VALUE obj);
64
+
65
+ inline static void assure_size(Out out, size_t len) {
60
66
  if (out->end - out->cur <= (long)len) {
61
- oj_grow_out(out, len);
67
+ oj_grow_out(out, len);
62
68
  }
63
69
  }
64
70
 
65
- inline static void
66
- fill_indent(Out out, int cnt) {
71
+ inline static void fill_indent(Out out, int cnt) {
67
72
  if (0 < out->indent) {
68
- cnt *= out->indent;
69
- *out->cur++ = '\n';
70
- for (; 0 < cnt; cnt--) {
71
- *out->cur++ = ' ';
72
- }
73
+ cnt *= out->indent;
74
+ *out->cur++ = '\n';
75
+ memset(out->cur, ' ', cnt);
76
+ out->cur += cnt;
73
77
  }
74
78
  }
75
79
 
76
- inline static void
77
- dump_ulong(unsigned long num, Out out) {
78
- char buf[32];
79
- char *b = buf + sizeof(buf) - 1;
80
+ inline static bool dump_ignore(Options opts, VALUE obj) {
81
+ if (NULL != opts->ignore && (ObjectMode == opts->mode || CustomMode == opts->mode)) {
82
+ VALUE *vp = opts->ignore;
83
+ VALUE clas = rb_obj_class(obj);
84
+
85
+ for (; Qnil != *vp; vp++) {
86
+ if (clas == *vp) {
87
+ return true;
88
+ }
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+
94
+ inline static void dump_ulong(unsigned long num, Out out) {
95
+ char buf[32];
96
+ char *b = buf + sizeof(buf) - 1;
97
+ size_t cnt = 0;
80
98
 
81
99
  *b-- = '\0';
82
100
  if (0 < num) {
83
- for (; 0 < num; num /= 10, b--) {
84
- *b = (num % 10) + '0';
85
- }
86
- b++;
101
+ b = oj_longlong_to_string((long long)num, false, b);
87
102
  } else {
88
- *b = '0';
89
- }
90
- for (; '\0' != *b; b++) {
91
- *out->cur++ = *b;
103
+ *b = '0';
92
104
  }
105
+ cnt = sizeof(buf) - (b - buf) - 1;
106
+ APPEND_CHARS(out->cur, b, cnt);
93
107
  *out->cur = '\0';
94
108
  }
95
109