oj_windows 3.16.15

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 (102) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +44 -0
  3. data/LICENSE +21 -0
  4. data/README.md +164 -0
  5. data/ext/oj_windows/buf.h +85 -0
  6. data/ext/oj_windows/cache.c +339 -0
  7. data/ext/oj_windows/cache.h +22 -0
  8. data/ext/oj_windows/cache8.c +105 -0
  9. data/ext/oj_windows/cache8.h +21 -0
  10. data/ext/oj_windows/circarray.c +64 -0
  11. data/ext/oj_windows/circarray.h +22 -0
  12. data/ext/oj_windows/code.c +214 -0
  13. data/ext/oj_windows/code.h +40 -0
  14. data/ext/oj_windows/compat.c +239 -0
  15. data/ext/oj_windows/custom.c +1074 -0
  16. data/ext/oj_windows/debug.c +126 -0
  17. data/ext/oj_windows/dump.c +1556 -0
  18. data/ext/oj_windows/dump.h +110 -0
  19. data/ext/oj_windows/dump_compat.c +901 -0
  20. data/ext/oj_windows/dump_leaf.c +162 -0
  21. data/ext/oj_windows/dump_object.c +710 -0
  22. data/ext/oj_windows/dump_strict.c +405 -0
  23. data/ext/oj_windows/encode.h +16 -0
  24. data/ext/oj_windows/err.c +57 -0
  25. data/ext/oj_windows/err.h +67 -0
  26. data/ext/oj_windows/extconf.rb +77 -0
  27. data/ext/oj_windows/fast.c +1710 -0
  28. data/ext/oj_windows/intern.c +325 -0
  29. data/ext/oj_windows/intern.h +22 -0
  30. data/ext/oj_windows/mem.c +320 -0
  31. data/ext/oj_windows/mem.h +53 -0
  32. data/ext/oj_windows/mimic_json.c +919 -0
  33. data/ext/oj_windows/object.c +726 -0
  34. data/ext/oj_windows/odd.c +245 -0
  35. data/ext/oj_windows/odd.h +43 -0
  36. data/ext/oj_windows/oj.c +2097 -0
  37. data/ext/oj_windows/oj.h +420 -0
  38. data/ext/oj_windows/parse.c +1317 -0
  39. data/ext/oj_windows/parse.h +113 -0
  40. data/ext/oj_windows/parser.c +1600 -0
  41. data/ext/oj_windows/parser.h +103 -0
  42. data/ext/oj_windows/rails.c +1484 -0
  43. data/ext/oj_windows/rails.h +18 -0
  44. data/ext/oj_windows/reader.c +222 -0
  45. data/ext/oj_windows/reader.h +137 -0
  46. data/ext/oj_windows/resolve.c +80 -0
  47. data/ext/oj_windows/resolve.h +12 -0
  48. data/ext/oj_windows/rxclass.c +144 -0
  49. data/ext/oj_windows/rxclass.h +26 -0
  50. data/ext/oj_windows/saj.c +675 -0
  51. data/ext/oj_windows/saj2.c +584 -0
  52. data/ext/oj_windows/saj2.h +23 -0
  53. data/ext/oj_windows/scp.c +187 -0
  54. data/ext/oj_windows/simd.h +47 -0
  55. data/ext/oj_windows/sparse.c +946 -0
  56. data/ext/oj_windows/stream_writer.c +329 -0
  57. data/ext/oj_windows/strict.c +189 -0
  58. data/ext/oj_windows/string_writer.c +517 -0
  59. data/ext/oj_windows/trace.c +72 -0
  60. data/ext/oj_windows/trace.h +55 -0
  61. data/ext/oj_windows/usual.c +1218 -0
  62. data/ext/oj_windows/usual.h +69 -0
  63. data/ext/oj_windows/util.c +136 -0
  64. data/ext/oj_windows/util.h +20 -0
  65. data/ext/oj_windows/val_stack.c +101 -0
  66. data/ext/oj_windows/val_stack.h +151 -0
  67. data/ext/oj_windows/validate.c +46 -0
  68. data/ext/oj_windows/wab.c +584 -0
  69. data/lib/oj/active_support_helper.rb +39 -0
  70. data/lib/oj/bag.rb +95 -0
  71. data/lib/oj/easy_hash.rb +52 -0
  72. data/lib/oj/error.rb +21 -0
  73. data/lib/oj/json.rb +188 -0
  74. data/lib/oj/mimic.rb +301 -0
  75. data/lib/oj/saj.rb +80 -0
  76. data/lib/oj/schandler.rb +143 -0
  77. data/lib/oj/state.rb +135 -0
  78. data/lib/oj/version.rb +4 -0
  79. data/lib/oj_windows/active_support_helper.rb +39 -0
  80. data/lib/oj_windows/bag.rb +95 -0
  81. data/lib/oj_windows/easy_hash.rb +52 -0
  82. data/lib/oj_windows/error.rb +21 -0
  83. data/lib/oj_windows/json.rb +188 -0
  84. data/lib/oj_windows/mimic.rb +301 -0
  85. data/lib/oj_windows/saj.rb +80 -0
  86. data/lib/oj_windows/schandler.rb +143 -0
  87. data/lib/oj_windows/state.rb +135 -0
  88. data/lib/oj_windows/version.rb +4 -0
  89. data/lib/oj_windows.rb +15 -0
  90. data/pages/Advanced.md +38 -0
  91. data/pages/Compatibility.md +49 -0
  92. data/pages/Custom.md +37 -0
  93. data/pages/Encoding.md +61 -0
  94. data/pages/InstallOptions.md +20 -0
  95. data/pages/JsonGem.md +60 -0
  96. data/pages/Modes.md +94 -0
  97. data/pages/Options.md +339 -0
  98. data/pages/Parser.md +134 -0
  99. data/pages/Rails.md +85 -0
  100. data/pages/Security.md +43 -0
  101. data/pages/WAB.md +12 -0
  102. metadata +242 -0
@@ -0,0 +1,187 @@
1
+ // Copyright (c) 2012 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
3
+
4
+ #include <math.h>
5
+ #include <stdio.h>
6
+ #include <stdlib.h>
7
+ #include <string.h>
8
+ #if !IS_WINDOWS
9
+ #include <sys/types.h>
10
+ #include <unistd.h>
11
+ #endif
12
+
13
+ #include "encode.h"
14
+ #include "intern.h"
15
+ #include "oj.h"
16
+ #include "parse.h"
17
+
18
+ static VALUE noop_start(ParseInfo pi) {
19
+ return Qnil;
20
+ }
21
+
22
+ static void noop_end(ParseInfo pi) {
23
+ }
24
+
25
+ static void noop_add_value(ParseInfo pi, VALUE val) {
26
+ }
27
+
28
+ static void noop_add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
29
+ }
30
+
31
+ static void noop_add_num(ParseInfo pi, NumInfo ni) {
32
+ }
33
+
34
+ static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
35
+ return Qundef;
36
+ }
37
+
38
+ static void noop_hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *orig) {
39
+ }
40
+
41
+ static void noop_hash_set_num(ParseInfo pi, Val kval, NumInfo ni) {
42
+ }
43
+
44
+ static void noop_hash_set_value(ParseInfo pi, Val kval, VALUE value) {
45
+ }
46
+
47
+ static void noop_array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
48
+ }
49
+
50
+ static void noop_array_append_num(ParseInfo pi, NumInfo ni) {
51
+ }
52
+
53
+ static void noop_array_append_value(ParseInfo pi, VALUE value) {
54
+ }
55
+
56
+ static void add_value(ParseInfo pi, VALUE val) {
57
+ rb_funcall(pi->handler, oj_add_value_id, 1, val);
58
+ }
59
+
60
+ static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
61
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
62
+
63
+ rb_funcall(pi->handler, oj_add_value_id, 1, rstr);
64
+ }
65
+
66
+ static void add_num(ParseInfo pi, NumInfo ni) {
67
+ rb_funcall(pi->handler, oj_add_value_id, 1, oj_num_as_value(ni));
68
+ }
69
+
70
+ static VALUE start_hash(ParseInfo pi) {
71
+ return rb_funcall(pi->handler, oj_hash_start_id, 0);
72
+ }
73
+
74
+ static void end_hash(ParseInfo pi) {
75
+ rb_funcall(pi->handler, oj_hash_end_id, 0);
76
+ }
77
+
78
+ static VALUE start_array(ParseInfo pi) {
79
+ return rb_funcall(pi->handler, oj_array_start_id, 0);
80
+ }
81
+
82
+ static void end_array(ParseInfo pi) {
83
+ rb_funcall(pi->handler, oj_array_end_id, 0);
84
+ }
85
+
86
+ static VALUE hash_key(ParseInfo pi, const char *key, size_t klen) {
87
+ return rb_funcall(pi->handler, oj_hash_key_id, 1, rb_str_new(key, klen));
88
+ }
89
+
90
+ static void hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *orig) {
91
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
92
+
93
+ rb_funcall(pi->handler, oj_hash_set_id, 3, stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, kval), rstr);
94
+ }
95
+
96
+ static void hash_set_num(ParseInfo pi, Val kval, NumInfo ni) {
97
+ rb_funcall(pi->handler,
98
+ oj_hash_set_id,
99
+ 3,
100
+ stack_peek(&pi->stack)->val,
101
+ oj_calc_hash_key(pi, kval),
102
+ oj_num_as_value(ni));
103
+ }
104
+
105
+ static void hash_set_value(ParseInfo pi, Val kval, VALUE value) {
106
+ rb_funcall(pi->handler, oj_hash_set_id, 3, stack_peek(&pi->stack)->val, oj_calc_hash_key(pi, kval), value);
107
+ }
108
+
109
+ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
110
+ volatile VALUE rstr = rb_utf8_str_new(str, len);
111
+
112
+ rb_funcall(pi->handler, oj_array_append_id, 2, stack_peek(&pi->stack)->val, rstr);
113
+ }
114
+
115
+ static void array_append_num(ParseInfo pi, NumInfo ni) {
116
+ rb_funcall(pi->handler, oj_array_append_id, 2, stack_peek(&pi->stack)->val, oj_num_as_value(ni));
117
+ }
118
+
119
+ static void array_append_value(ParseInfo pi, VALUE value) {
120
+ rb_funcall(pi->handler, oj_array_append_id, 2, stack_peek(&pi->stack)->val, value);
121
+ }
122
+
123
+ VALUE
124
+ oj_sc_parse(int argc, VALUE *argv, VALUE self) {
125
+ struct _parseInfo pi;
126
+ VALUE input = argv[1];
127
+
128
+ parse_info_init(&pi);
129
+ pi.err_class = Qnil;
130
+ pi.max_depth = 0;
131
+ pi.options = oj_default_options;
132
+ if (3 == argc) {
133
+ oj_parse_options(argv[2], &pi.options);
134
+ }
135
+ if (rb_block_given_p()) {
136
+ pi.proc = Qnil;
137
+ } else {
138
+ pi.proc = Qundef;
139
+ }
140
+ pi.handler = *argv;
141
+
142
+ pi.start_hash = rb_respond_to(pi.handler, oj_hash_start_id) ? start_hash : noop_start;
143
+ pi.end_hash = rb_respond_to(pi.handler, oj_hash_end_id) ? end_hash : noop_end;
144
+ pi.hash_key = rb_respond_to(pi.handler, oj_hash_key_id) ? hash_key : noop_hash_key;
145
+ pi.start_array = rb_respond_to(pi.handler, oj_array_start_id) ? start_array : noop_start;
146
+ pi.end_array = rb_respond_to(pi.handler, oj_array_end_id) ? end_array : noop_end;
147
+ if (rb_respond_to(pi.handler, oj_hash_set_id)) {
148
+ pi.hash_set_value = hash_set_value;
149
+ pi.hash_set_cstr = hash_set_cstr;
150
+ pi.hash_set_num = hash_set_num;
151
+ pi.expect_value = 1;
152
+ } else {
153
+ pi.hash_set_value = noop_hash_set_value;
154
+ pi.hash_set_cstr = noop_hash_set_cstr;
155
+ pi.hash_set_num = noop_hash_set_num;
156
+ pi.expect_value = 0;
157
+ }
158
+ if (rb_respond_to(pi.handler, oj_array_append_id)) {
159
+ pi.array_append_value = array_append_value;
160
+ pi.array_append_cstr = array_append_cstr;
161
+ pi.array_append_num = array_append_num;
162
+ pi.expect_value = 1;
163
+ } else {
164
+ pi.array_append_value = noop_array_append_value;
165
+ pi.array_append_cstr = noop_array_append_cstr;
166
+ pi.array_append_num = noop_array_append_num;
167
+ pi.expect_value = 0;
168
+ }
169
+ if (rb_respond_to(pi.handler, oj_add_value_id)) {
170
+ pi.add_cstr = add_cstr;
171
+ pi.add_num = add_num;
172
+ pi.add_value = add_value;
173
+ pi.expect_value = 1;
174
+ } else {
175
+ pi.add_cstr = noop_add_cstr;
176
+ pi.add_num = noop_add_num;
177
+ pi.add_value = noop_add_value;
178
+ pi.expect_value = 0;
179
+ }
180
+ pi.has_callbacks = true;
181
+
182
+ if (T_STRING == rb_type(input)) {
183
+ return oj_pi_parse(argc - 1, argv + 1, &pi, 0, 0, 1);
184
+ } else {
185
+ return oj_pi_sparse(argc - 1, argv + 1, &pi, 0);
186
+ }
187
+ }
@@ -0,0 +1,47 @@
1
+ #ifndef OJ_SIMD_H
2
+ #define OJ_SIMD_H
3
+
4
+ // SIMD architecture detection and configuration
5
+ // This header provides unified SIMD support across different CPU architectures
6
+
7
+ // x86/x86_64 SIMD detection
8
+ #if defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
9
+ #define HAVE_SIMD_X86 1
10
+
11
+ // SSE4.2 support (Intel Core i7+, AMD Bulldozer+)
12
+ // Enabled automatically when compiler has -msse4.2 flag
13
+ #if defined(__SSE4_2__)
14
+ #define HAVE_SIMD_SSE4_2 1
15
+ #include <nmmintrin.h>
16
+ #endif
17
+
18
+ // SSE2 support (fallback for older x86_64 CPUs - all x86_64 CPUs support SSE2)
19
+ #if defined(__SSE2__) && !defined(HAVE_SIMD_SSE4_2)
20
+ #define HAVE_SIMD_SSE2 1
21
+ #include <emmintrin.h>
22
+ #endif
23
+
24
+ #endif // x86/x86_64
25
+
26
+ // ARM NEON detection
27
+ #if defined(__ARM_NEON) || defined(__ARM_NEON__) || defined(__aarch64__) || defined(_M_ARM64)
28
+ #define HAVE_SIMD_NEON 1
29
+ #define SIMD_MINIMUM_THRESHOLD 6
30
+ #include <arm_neon.h>
31
+ #endif
32
+
33
+ // Define which SIMD implementation to use (priority order: SSE4.2 > NEON > SSE2)
34
+ #if defined(HAVE_SIMD_SSE4_2)
35
+ #define HAVE_SIMD_STRING_SCAN 1
36
+ #define SIMD_TYPE "SSE4.2"
37
+ #elif defined(HAVE_SIMD_NEON)
38
+ #define HAVE_SIMD_STRING_SCAN 1
39
+ #define SIMD_TYPE "NEON"
40
+ #elif defined(HAVE_SIMD_SSE2)
41
+ #define HAVE_SIMD_STRING_SCAN 1
42
+ #define SIMD_TYPE "SSE2"
43
+ #else
44
+ #define SIMD_TYPE "none"
45
+ #endif
46
+
47
+ #endif /* OJ_SIMD_H */