oj 3.7.4 → 3.13.23

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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1360 -0
  3. data/README.md +31 -8
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +53 -72
  6. data/ext/oj/cache.c +326 -0
  7. data/ext/oj/cache.h +21 -0
  8. data/ext/oj/cache8.c +61 -64
  9. data/ext/oj/cache8.h +12 -39
  10. data/ext/oj/circarray.c +37 -43
  11. data/ext/oj/circarray.h +16 -17
  12. data/ext/oj/code.c +165 -179
  13. data/ext/oj/code.h +27 -29
  14. data/ext/oj/compat.c +174 -194
  15. data/ext/oj/custom.c +790 -866
  16. data/ext/oj/debug.c +132 -0
  17. data/ext/oj/dump.c +848 -863
  18. data/ext/oj/dump.h +81 -67
  19. data/ext/oj/dump_compat.c +85 -123
  20. data/ext/oj/dump_leaf.c +100 -188
  21. data/ext/oj/dump_object.c +527 -656
  22. data/ext/oj/dump_strict.c +315 -338
  23. data/ext/oj/encode.h +7 -34
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +40 -29
  26. data/ext/oj/err.h +48 -48
  27. data/ext/oj/extconf.rb +17 -4
  28. data/ext/oj/fast.c +1073 -1088
  29. data/ext/oj/intern.c +298 -0
  30. data/ext/oj/intern.h +26 -0
  31. data/ext/oj/mimic_json.c +469 -436
  32. data/ext/oj/object.c +532 -599
  33. data/ext/oj/odd.c +154 -138
  34. data/ext/oj/odd.h +37 -38
  35. data/ext/oj/oj.c +1333 -986
  36. data/ext/oj/oj.h +336 -316
  37. data/ext/oj/parse.c +1002 -846
  38. data/ext/oj/parse.h +92 -87
  39. data/ext/oj/parser.c +1587 -0
  40. data/ext/oj/parser.h +102 -0
  41. data/ext/oj/rails.c +888 -878
  42. data/ext/oj/rails.h +11 -14
  43. data/ext/oj/reader.c +141 -147
  44. data/ext/oj/reader.h +73 -89
  45. data/ext/oj/resolve.c +41 -62
  46. data/ext/oj/resolve.h +7 -9
  47. data/ext/oj/rxclass.c +71 -75
  48. data/ext/oj/rxclass.h +18 -19
  49. data/ext/oj/saj.c +443 -486
  50. data/ext/oj/saj2.c +596 -0
  51. data/ext/oj/saj2.h +23 -0
  52. data/ext/oj/scp.c +88 -113
  53. data/ext/oj/sparse.c +787 -709
  54. data/ext/oj/stream_writer.c +133 -159
  55. data/ext/oj/strict.c +127 -118
  56. data/ext/oj/string_writer.c +230 -249
  57. data/ext/oj/trace.c +34 -41
  58. data/ext/oj/trace.h +19 -19
  59. data/ext/oj/usual.c +1207 -0
  60. data/ext/oj/usual.h +68 -0
  61. data/ext/oj/util.c +136 -0
  62. data/ext/oj/util.h +20 -0
  63. data/ext/oj/val_stack.c +60 -68
  64. data/ext/oj/val_stack.h +91 -129
  65. data/ext/oj/validate.c +46 -0
  66. data/ext/oj/wab.c +342 -353
  67. data/lib/oj/bag.rb +1 -0
  68. data/lib/oj/easy_hash.rb +5 -4
  69. data/lib/oj/error.rb +1 -1
  70. data/lib/oj/json.rb +1 -1
  71. data/lib/oj/mimic.rb +48 -14
  72. data/lib/oj/saj.rb +20 -6
  73. data/lib/oj/state.rb +9 -8
  74. data/lib/oj/version.rb +2 -2
  75. data/lib/oj.rb +0 -8
  76. data/pages/Compatibility.md +1 -1
  77. data/pages/JsonGem.md +15 -0
  78. data/pages/Modes.md +53 -46
  79. data/pages/Options.md +78 -11
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +73 -22
  82. data/pages/Security.md +1 -1
  83. data/test/activerecord/result_test.rb +7 -2
  84. data/test/activesupport5/abstract_unit.rb +45 -0
  85. data/test/activesupport5/decoding_test.rb +68 -60
  86. data/test/activesupport5/encoding_test.rb +111 -96
  87. data/test/activesupport5/encoding_test_cases.rb +33 -25
  88. data/test/activesupport5/test_helper.rb +43 -21
  89. data/test/activesupport5/time_zone_test_helpers.rb +18 -3
  90. data/test/activesupport6/abstract_unit.rb +44 -0
  91. data/test/activesupport6/decoding_test.rb +133 -0
  92. data/test/activesupport6/encoding_test.rb +507 -0
  93. data/test/activesupport6/encoding_test_cases.rb +98 -0
  94. data/test/activesupport6/test_common.rb +17 -0
  95. data/test/activesupport6/test_helper.rb +163 -0
  96. data/test/activesupport6/time_zone_test_helpers.rb +39 -0
  97. data/test/activesupport7/abstract_unit.rb +49 -0
  98. data/test/activesupport7/decoding_test.rb +125 -0
  99. data/test/activesupport7/encoding_test.rb +486 -0
  100. data/test/activesupport7/encoding_test_cases.rb +104 -0
  101. data/test/activesupport7/time_zone_test_helpers.rb +47 -0
  102. data/test/bar.rb +6 -12
  103. data/test/baz.rb +16 -0
  104. data/test/bug.rb +16 -0
  105. data/test/foo.rb +69 -75
  106. data/test/helper.rb +16 -0
  107. data/test/json_gem/json_common_interface_test.rb +8 -3
  108. data/test/json_gem/json_generator_test.rb +21 -8
  109. data/test/json_gem/json_parser_test.rb +8 -1
  110. data/test/json_gem/test_helper.rb +12 -0
  111. data/test/mem.rb +33 -0
  112. data/test/perf.rb +1 -1
  113. data/test/perf_dump.rb +50 -0
  114. data/test/perf_once.rb +58 -0
  115. data/test/perf_parser.rb +189 -0
  116. data/test/perf_scp.rb +11 -10
  117. data/test/perf_strict.rb +17 -23
  118. data/test/prec.rb +23 -0
  119. data/test/sample_json.rb +1 -1
  120. data/test/test_compat.rb +46 -10
  121. data/test/test_custom.rb +145 -7
  122. data/test/test_fast.rb +62 -2
  123. data/test/test_file.rb +23 -7
  124. data/test/test_gc.rb +11 -0
  125. data/test/test_generate.rb +21 -0
  126. data/test/test_hash.rb +11 -1
  127. data/test/test_integer_range.rb +1 -2
  128. data/test/test_object.rb +43 -12
  129. data/test/test_parser.rb +11 -0
  130. data/test/test_parser_debug.rb +27 -0
  131. data/test/test_parser_saj.rb +335 -0
  132. data/test/test_parser_usual.rb +217 -0
  133. data/test/test_rails.rb +35 -0
  134. data/test/test_saj.rb +1 -1
  135. data/test/test_scp.rb +3 -5
  136. data/test/test_strict.rb +26 -1
  137. data/test/test_various.rb +86 -65
  138. data/test/test_wab.rb +2 -0
  139. data/test/test_writer.rb +19 -2
  140. data/test/tests.rb +10 -1
  141. data/test/tests_mimic.rb +9 -0
  142. data/test/tests_mimic_addition.rb +9 -0
  143. data/test/zoo.rb +13 -0
  144. metadata +63 -110
  145. data/ext/oj/hash.c +0 -163
  146. data/ext/oj/hash.h +0 -46
  147. data/ext/oj/hash_test.c +0 -512
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oj
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.4
4
+ version: 3.13.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-29 00:00:00.000000000 Z
11
+ date: 2022-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -58,20 +58,6 @@ dependencies:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '3.0'
61
- - !ruby/object:Gem::Dependency
62
- name: wwtd
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '0'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
61
  description: The fastest JSON parser and object serializer.
76
62
  email: peter@ohler.com
77
63
  executables: []
@@ -79,20 +65,28 @@ extensions:
79
65
  - ext/oj/extconf.rb
80
66
  extra_rdoc_files:
81
67
  - README.md
82
- - pages/Rails.md
83
- - pages/JsonGem.md
84
- - pages/Encoding.md
85
- - pages/WAB.md
86
- - pages/Custom.md
68
+ - LICENSE
69
+ - CHANGELOG.md
70
+ - RELEASE_NOTES.md
87
71
  - pages/Advanced.md
88
- - pages/Options.md
89
72
  - pages/Compatibility.md
73
+ - pages/Custom.md
74
+ - pages/Encoding.md
75
+ - pages/JsonGem.md
90
76
  - pages/Modes.md
77
+ - pages/Options.md
78
+ - pages/Parser.md
79
+ - pages/Rails.md
91
80
  - pages/Security.md
81
+ - pages/WAB.md
92
82
  files:
83
+ - CHANGELOG.md
93
84
  - LICENSE
94
85
  - README.md
86
+ - RELEASE_NOTES.md
95
87
  - ext/oj/buf.h
88
+ - ext/oj/cache.c
89
+ - ext/oj/cache.h
96
90
  - ext/oj/cache8.c
97
91
  - ext/oj/cache8.h
98
92
  - ext/oj/circarray.c
@@ -101,6 +95,7 @@ files:
101
95
  - ext/oj/code.h
102
96
  - ext/oj/compat.c
103
97
  - ext/oj/custom.c
98
+ - ext/oj/debug.c
104
99
  - ext/oj/dump.c
105
100
  - ext/oj/dump.h
106
101
  - ext/oj/dump_compat.c
@@ -108,13 +103,13 @@ files:
108
103
  - ext/oj/dump_object.c
109
104
  - ext/oj/dump_strict.c
110
105
  - ext/oj/encode.h
106
+ - ext/oj/encoder.c
111
107
  - ext/oj/err.c
112
108
  - ext/oj/err.h
113
109
  - ext/oj/extconf.rb
114
110
  - ext/oj/fast.c
115
- - ext/oj/hash.c
116
- - ext/oj/hash.h
117
- - ext/oj/hash_test.c
111
+ - ext/oj/intern.c
112
+ - ext/oj/intern.h
118
113
  - ext/oj/mimic_json.c
119
114
  - ext/oj/object.c
120
115
  - ext/oj/odd.c
@@ -123,6 +118,8 @@ files:
123
118
  - ext/oj/oj.h
124
119
  - ext/oj/parse.c
125
120
  - ext/oj/parse.h
121
+ - ext/oj/parser.c
122
+ - ext/oj/parser.h
126
123
  - ext/oj/rails.c
127
124
  - ext/oj/rails.h
128
125
  - ext/oj/reader.c
@@ -132,6 +129,8 @@ files:
132
129
  - ext/oj/rxclass.c
133
130
  - ext/oj/rxclass.h
134
131
  - ext/oj/saj.c
132
+ - ext/oj/saj2.c
133
+ - ext/oj/saj2.h
135
134
  - ext/oj/scp.c
136
135
  - ext/oj/sparse.c
137
136
  - ext/oj/stream_writer.c
@@ -139,8 +138,13 @@ files:
139
138
  - ext/oj/string_writer.c
140
139
  - ext/oj/trace.c
141
140
  - ext/oj/trace.h
141
+ - ext/oj/usual.c
142
+ - ext/oj/usual.h
143
+ - ext/oj/util.c
144
+ - ext/oj/util.h
142
145
  - ext/oj/val_stack.c
143
146
  - ext/oj/val_stack.h
147
+ - ext/oj/validate.c
144
148
  - ext/oj/wab.c
145
149
  - lib/oj.rb
146
150
  - lib/oj/active_support_helper.rb
@@ -160,6 +164,7 @@ files:
160
164
  - pages/JsonGem.md
161
165
  - pages/Modes.md
162
166
  - pages/Options.md
167
+ - pages/Parser.md
163
168
  - pages/Rails.md
164
169
  - pages/Security.md
165
170
  - pages/WAB.md
@@ -170,12 +175,27 @@ files:
170
175
  - test/activesupport4/decoding_test.rb
171
176
  - test/activesupport4/encoding_test.rb
172
177
  - test/activesupport4/test_helper.rb
178
+ - test/activesupport5/abstract_unit.rb
173
179
  - test/activesupport5/decoding_test.rb
174
180
  - test/activesupport5/encoding_test.rb
175
181
  - test/activesupport5/encoding_test_cases.rb
176
182
  - test/activesupport5/test_helper.rb
177
183
  - test/activesupport5/time_zone_test_helpers.rb
184
+ - test/activesupport6/abstract_unit.rb
185
+ - test/activesupport6/decoding_test.rb
186
+ - test/activesupport6/encoding_test.rb
187
+ - test/activesupport6/encoding_test_cases.rb
188
+ - test/activesupport6/test_common.rb
189
+ - test/activesupport6/test_helper.rb
190
+ - test/activesupport6/time_zone_test_helpers.rb
191
+ - test/activesupport7/abstract_unit.rb
192
+ - test/activesupport7/decoding_test.rb
193
+ - test/activesupport7/encoding_test.rb
194
+ - test/activesupport7/encoding_test_cases.rb
195
+ - test/activesupport7/time_zone_test_helpers.rb
178
196
  - test/bar.rb
197
+ - test/baz.rb
198
+ - test/bug.rb
179
199
  - test/files.rb
180
200
  - test/foo.rb
181
201
  - test/helper.rb
@@ -198,16 +218,21 @@ files:
198
218
  - test/json_gem/json_parser_test.rb
199
219
  - test/json_gem/json_string_matching_test.rb
200
220
  - test/json_gem/test_helper.rb
221
+ - test/mem.rb
201
222
  - test/perf.rb
202
223
  - test/perf_compat.rb
224
+ - test/perf_dump.rb
203
225
  - test/perf_fast.rb
204
226
  - test/perf_file.rb
205
227
  - test/perf_object.rb
228
+ - test/perf_once.rb
229
+ - test/perf_parser.rb
206
230
  - test/perf_saj.rb
207
231
  - test/perf_scp.rb
208
232
  - test/perf_simple.rb
209
233
  - test/perf_strict.rb
210
234
  - test/perf_wab.rb
235
+ - test/prec.rb
211
236
  - test/sample.rb
212
237
  - test/sample/change.rb
213
238
  - test/sample/dir.rb
@@ -228,10 +253,16 @@ files:
228
253
  - test/test_fast.rb
229
254
  - test/test_file.rb
230
255
  - test/test_gc.rb
256
+ - test/test_generate.rb
231
257
  - test/test_hash.rb
232
258
  - test/test_integer_range.rb
233
259
  - test/test_null.rb
234
260
  - test/test_object.rb
261
+ - test/test_parser.rb
262
+ - test/test_parser_debug.rb
263
+ - test/test_parser_saj.rb
264
+ - test/test_parser_usual.rb
265
+ - test/test_rails.rb
235
266
  - test/test_saj.rb
236
267
  - test/test_scp.rb
237
268
  - test/test_strict.rb
@@ -241,6 +272,7 @@ files:
241
272
  - test/tests.rb
242
273
  - test/tests_mimic.rb
243
274
  - test/tests_mimic_addition.rb
275
+ - test/zoo.rb
244
276
  homepage: http://www.ohler.com/oj
245
277
  licenses:
246
278
  - MIT
@@ -251,7 +283,7 @@ metadata:
251
283
  homepage_uri: http://www.ohler.com/oj/
252
284
  source_code_uri: https://github.com/ohler55/oj
253
285
  wiki_uri: https://github.com/ohler55/oj/wiki
254
- post_install_message:
286
+ post_install_message:
255
287
  rdoc_options:
256
288
  - "--title"
257
289
  - Oj
@@ -263,94 +295,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
263
295
  requirements:
264
296
  - - ">="
265
297
  - !ruby/object:Gem::Version
266
- version: '2.0'
298
+ version: '2.4'
267
299
  required_rubygems_version: !ruby/object:Gem::Requirement
268
300
  requirements:
269
301
  - - ">="
270
302
  - !ruby/object:Gem::Version
271
303
  version: '0'
272
304
  requirements: []
273
- rubyforge_project:
274
- rubygems_version: 2.7.6
275
- signing_key:
305
+ rubygems_version: 3.3.3
306
+ signing_key:
276
307
  specification_version: 4
277
308
  summary: A fast JSON parser and serializer.
278
- test_files:
279
- - test/foo.rb
280
- - test/test_integer_range.rb
281
- - test/test_strict.rb
282
- - test/perf_strict.rb
283
- - test/tests.rb
284
- - test/perf_saj.rb
285
- - test/test_compat.rb
286
- - test/helper.rb
287
- - test/perf_file.rb
288
- - test/test_scp.rb
289
- - test/perf_compat.rb
290
- - test/json_gem/json_common_interface_test.rb
291
- - test/json_gem/json_addition_test.rb
292
- - test/json_gem/json_fixtures_test.rb
293
- - test/json_gem/json_ext_parser_test.rb
294
- - test/json_gem/json_string_matching_test.rb
295
- - test/json_gem/json_generic_object_test.rb
296
- - test/json_gem/json_generator_test.rb
297
- - test/json_gem/test_helper.rb
298
- - test/json_gem/json_encoding_test.rb
299
- - test/json_gem/json_parser_test.rb
300
- - test/perf_wab.rb
301
- - test/test_file.rb
302
- - test/test_object.rb
303
- - test/sample.rb
304
- - test/perf_object.rb
305
- - test/test_hash.rb
306
- - test/test_custom.rb
307
- - test/bar.rb
308
- - test/activesupport4/encoding_test.rb
309
- - test/activesupport4/test_helper.rb
310
- - test/activesupport4/decoding_test.rb
311
- - test/sample_json.rb
312
- - test/activesupport5/encoding_test_cases.rb
313
- - test/activesupport5/encoding_test.rb
314
- - test/activesupport5/time_zone_test_helpers.rb
315
- - test/activesupport5/test_helper.rb
316
- - test/activesupport5/decoding_test.rb
317
- - test/test_saj.rb
318
- - test/perf_scp.rb
319
- - test/test_wab.rb
320
- - test/test_null.rb
321
- - test/_test_active.rb
322
- - test/_test_mimic_rails.rb
323
- - test/test_fast.rb
324
- - test/perf_fast.rb
325
- - test/sample/change.rb
326
- - test/sample/text.rb
327
- - test/sample/doc.rb
328
- - test/sample/shape.rb
329
- - test/sample/layer.rb
330
- - test/sample/group.rb
331
- - test/sample/file.rb
332
- - test/sample/rect.rb
333
- - test/sample/hasprops.rb
334
- - test/sample/line.rb
335
- - test/sample/dir.rb
336
- - test/sample/oval.rb
337
- - test/tests_mimic.rb
338
- - test/perf_simple.rb
339
- - test/activerecord/result_test.rb
340
- - test/_test_active_mimic.rb
341
- - test/tests_mimic_addition.rb
342
- - test/test_writer.rb
343
- - test/perf.rb
344
- - test/isolated/test_mimic_define.rb
345
- - test/isolated/test_mimic_after.rb
346
- - test/isolated/test_mimic_rails_after.rb
347
- - test/isolated/test_mimic_before.rb
348
- - test/isolated/test_mimic_rails_before.rb
349
- - test/isolated/test_mimic_redefine.rb
350
- - test/isolated/shared.rb
351
- - test/isolated/test_mimic_alone.rb
352
- - test/isolated/test_mimic_as_json.rb
353
- - test/test_debian.rb
354
- - test/test_gc.rb
355
- - test/files.rb
356
- - test/test_various.rb
309
+ test_files: []
data/ext/oj/hash.c DELETED
@@ -1,163 +0,0 @@
1
- /* hash.c
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- */
30
-
31
- #include "hash.h"
32
- #include <stdint.h>
33
-
34
- #define HASH_MASK 0x000003FF
35
- #define HASH_SLOT_CNT 1024
36
-
37
- typedef struct _KeyVal {
38
- struct _KeyVal *next;
39
- const char *key;
40
- size_t len;
41
- VALUE val;
42
- } *KeyVal;
43
-
44
- struct _Hash {
45
- struct _KeyVal slots[HASH_SLOT_CNT];
46
- };
47
-
48
- struct _Hash class_hash;
49
- struct _Hash intern_hash;
50
-
51
- // almost the Murmur hash algorithm
52
- #define M 0x5bd1e995
53
- #define C1 0xCC9E2D51
54
- #define C2 0x1B873593
55
- #define N 0xE6546B64
56
-
57
- static uint32_t
58
- hash_calc(const uint8_t *key, size_t len) {
59
- const uint8_t *end = key + len;
60
- const uint8_t *endless = key + (len / 4 * 4);
61
- uint32_t h = (uint32_t)len;
62
- uint32_t k;
63
-
64
- while (key < endless) {
65
- k = (uint32_t)*key++;
66
- k |= (uint32_t)*key++ << 8;
67
- k |= (uint32_t)*key++ << 16;
68
- k |= (uint32_t)*key++ << 24;
69
-
70
- k *= M;
71
- k ^= k >> 24;
72
- h *= M;
73
- h ^= k * M;
74
- }
75
- if (1 < end - key) {
76
- uint16_t k16 = (uint16_t)*key++;
77
-
78
- k16 |= (uint16_t)*key++ << 8;
79
- h ^= k16 << 8;
80
- }
81
- if (key < end) {
82
- h ^= *key;
83
- }
84
- h *= M;
85
- h ^= h >> 13;
86
- h *= M;
87
- h ^= h >> 15;
88
-
89
- return h;
90
- }
91
-
92
- void
93
- oj_hash_init() {
94
- memset(class_hash.slots, 0, sizeof(class_hash.slots));
95
- memset(intern_hash.slots, 0, sizeof(intern_hash.slots));
96
- }
97
-
98
- // if slotp is 0 then just lookup
99
- static VALUE
100
- hash_get(Hash hash, const char *key, size_t len, VALUE **slotp, VALUE def_value) {
101
- uint32_t h = hash_calc((const uint8_t*)key, len) & HASH_MASK;
102
- KeyVal bucket = hash->slots + h;
103
-
104
- if (0 != bucket->key) {
105
- KeyVal b;
106
-
107
- for (b = bucket; 0 != b; b = b->next) {
108
- if (len == b->len && 0 == strncmp(b->key, key, len)) {
109
- *slotp = &b->val;
110
- return b->val;
111
- }
112
- bucket = b;
113
- }
114
- }
115
- if (0 != slotp) {
116
- if (0 != bucket->key) {
117
- KeyVal b = ALLOC(struct _KeyVal);
118
-
119
- b->next = 0;
120
- bucket->next = b;
121
- bucket = b;
122
- }
123
- bucket->key = oj_strndup(key, len);
124
- bucket->len = len;
125
- bucket->val = def_value;
126
- *slotp = &bucket->val;
127
- }
128
- return def_value;
129
- }
130
-
131
- void
132
- oj_hash_print() {
133
- int i;
134
- KeyVal b;
135
-
136
- for (i = 0; i < HASH_SLOT_CNT; i++) {
137
- printf("%4d:", i);
138
- for (b = class_hash.slots + i; 0 != b && 0 != b->key; b = b->next) {
139
- printf(" %s", b->key);
140
- }
141
- printf("\n");
142
- }
143
- }
144
-
145
- VALUE
146
- oj_class_hash_get(const char *key, size_t len, VALUE **slotp) {
147
- return hash_get(&class_hash, key, len, slotp, Qnil);
148
- }
149
-
150
- ID
151
- oj_attr_hash_get(const char *key, size_t len, ID **slotp) {
152
- return (ID)hash_get(&intern_hash, key, len, (VALUE**)slotp, 0);
153
- }
154
-
155
- char*
156
- oj_strndup(const char *s, size_t len) {
157
- char *d = ALLOC_N(char, len + 1);
158
-
159
- memcpy(d, s, len);
160
- d[len] = '\0';
161
-
162
- return d;
163
- }
data/ext/oj/hash.h DELETED
@@ -1,46 +0,0 @@
1
- /* hash.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- */
30
-
31
- #ifndef __OJ_HASH_H__
32
- #define __OJ_HASH_H__
33
-
34
- #include "ruby.h"
35
-
36
- typedef struct _Hash *Hash;
37
-
38
- extern void oj_hash_init();
39
-
40
- extern VALUE oj_class_hash_get(const char *key, size_t len, VALUE **slotp);
41
- extern ID oj_attr_hash_get(const char *key, size_t len, ID **slotp);
42
-
43
- extern void oj_hash_print();
44
- extern char* oj_strndup(const char *s, size_t len);
45
-
46
- #endif /* __OJ_HASH_H__ */