oj 3.11.5 → 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 (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +19 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +20 -6
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +10 -9
  9. data/ext/oj/circarray.c +8 -6
  10. data/ext/oj/circarray.h +2 -2
  11. data/ext/oj/code.c +19 -33
  12. data/ext/oj/code.h +2 -2
  13. data/ext/oj/compat.c +27 -77
  14. data/ext/oj/custom.c +86 -179
  15. data/ext/oj/debug.c +126 -0
  16. data/ext/oj/dump.c +256 -249
  17. data/ext/oj/dump.h +26 -12
  18. data/ext/oj/dump_compat.c +565 -642
  19. data/ext/oj/dump_leaf.c +17 -63
  20. data/ext/oj/dump_object.c +65 -187
  21. data/ext/oj/dump_strict.c +27 -51
  22. data/ext/oj/encoder.c +43 -0
  23. data/ext/oj/err.c +2 -13
  24. data/ext/oj/err.h +24 -8
  25. data/ext/oj/extconf.rb +21 -6
  26. data/ext/oj/fast.c +149 -149
  27. data/ext/oj/intern.c +313 -0
  28. data/ext/oj/intern.h +22 -0
  29. data/ext/oj/mem.c +318 -0
  30. data/ext/oj/mem.h +53 -0
  31. data/ext/oj/mimic_json.c +121 -106
  32. data/ext/oj/object.c +85 -162
  33. data/ext/oj/odd.c +89 -67
  34. data/ext/oj/odd.h +15 -15
  35. data/ext/oj/oj.c +542 -411
  36. data/ext/oj/oj.h +99 -73
  37. data/ext/oj/parse.c +175 -187
  38. data/ext/oj/parse.h +26 -24
  39. data/ext/oj/parser.c +1600 -0
  40. data/ext/oj/parser.h +101 -0
  41. data/ext/oj/rails.c +112 -159
  42. data/ext/oj/rails.h +1 -1
  43. data/ext/oj/reader.c +11 -14
  44. data/ext/oj/reader.h +4 -2
  45. data/ext/oj/resolve.c +5 -24
  46. data/ext/oj/rxclass.c +7 -6
  47. data/ext/oj/rxclass.h +1 -1
  48. data/ext/oj/saj.c +22 -33
  49. data/ext/oj/saj2.c +584 -0
  50. data/ext/oj/saj2.h +23 -0
  51. data/ext/oj/scp.c +5 -28
  52. data/ext/oj/sparse.c +28 -72
  53. data/ext/oj/stream_writer.c +50 -40
  54. data/ext/oj/strict.c +56 -61
  55. data/ext/oj/string_writer.c +72 -39
  56. data/ext/oj/trace.h +31 -4
  57. data/ext/oj/usual.c +1218 -0
  58. data/ext/oj/usual.h +69 -0
  59. data/ext/oj/util.h +1 -1
  60. data/ext/oj/val_stack.c +14 -3
  61. data/ext/oj/val_stack.h +8 -7
  62. data/ext/oj/validate.c +46 -0
  63. data/ext/oj/wab.c +63 -88
  64. data/lib/oj/active_support_helper.rb +1 -3
  65. data/lib/oj/bag.rb +7 -1
  66. data/lib/oj/easy_hash.rb +4 -5
  67. data/lib/oj/error.rb +1 -2
  68. data/lib/oj/json.rb +162 -150
  69. data/lib/oj/mimic.rb +9 -7
  70. data/lib/oj/saj.rb +20 -6
  71. data/lib/oj/schandler.rb +5 -4
  72. data/lib/oj/state.rb +12 -8
  73. data/lib/oj/version.rb +1 -2
  74. data/lib/oj.rb +2 -0
  75. data/pages/Compatibility.md +1 -1
  76. data/pages/InstallOptions.md +20 -0
  77. data/pages/JsonGem.md +15 -0
  78. data/pages/Modes.md +8 -3
  79. data/pages/Options.md +43 -5
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +14 -2
  82. data/test/_test_active.rb +8 -9
  83. data/test/_test_active_mimic.rb +7 -8
  84. data/test/_test_mimic_rails.rb +17 -20
  85. data/test/activerecord/result_test.rb +5 -6
  86. data/test/activesupport6/encoding_test.rb +63 -28
  87. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  88. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  89. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  90. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  91. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  92. data/test/files.rb +15 -15
  93. data/test/foo.rb +16 -45
  94. data/test/helper.rb +11 -8
  95. data/test/isolated/shared.rb +3 -2
  96. data/test/json_gem/json_addition_test.rb +2 -2
  97. data/test/json_gem/json_common_interface_test.rb +8 -6
  98. data/test/json_gem/json_encoding_test.rb +0 -0
  99. data/test/json_gem/json_ext_parser_test.rb +1 -0
  100. data/test/json_gem/json_fixtures_test.rb +3 -2
  101. data/test/json_gem/json_generator_test.rb +56 -38
  102. data/test/json_gem/json_generic_object_test.rb +11 -11
  103. data/test/json_gem/json_parser_test.rb +54 -47
  104. data/test/json_gem/json_string_matching_test.rb +9 -9
  105. data/test/json_gem/test_helper.rb +7 -3
  106. data/test/mem.rb +34 -0
  107. data/test/perf.rb +22 -27
  108. data/test/perf_compat.rb +31 -33
  109. data/test/perf_dump.rb +50 -0
  110. data/test/perf_fast.rb +80 -82
  111. data/test/perf_file.rb +27 -29
  112. data/test/perf_object.rb +65 -69
  113. data/test/perf_once.rb +59 -0
  114. data/test/perf_parser.rb +183 -0
  115. data/test/perf_saj.rb +46 -54
  116. data/test/perf_scp.rb +58 -69
  117. data/test/perf_simple.rb +41 -39
  118. data/test/perf_strict.rb +74 -82
  119. data/test/perf_wab.rb +67 -69
  120. data/test/prec.rb +5 -5
  121. data/test/sample/change.rb +0 -1
  122. data/test/sample/dir.rb +0 -1
  123. data/test/sample/doc.rb +0 -1
  124. data/test/sample/file.rb +0 -1
  125. data/test/sample/group.rb +0 -1
  126. data/test/sample/hasprops.rb +0 -1
  127. data/test/sample/layer.rb +0 -1
  128. data/test/sample/rect.rb +0 -1
  129. data/test/sample/shape.rb +0 -1
  130. data/test/sample/text.rb +0 -1
  131. data/test/sample.rb +16 -16
  132. data/test/sample_json.rb +8 -8
  133. data/test/test_compat.rb +95 -43
  134. data/test/test_custom.rb +73 -51
  135. data/test/test_debian.rb +7 -10
  136. data/test/test_fast.rb +135 -79
  137. data/test/test_file.rb +41 -30
  138. data/test/test_gc.rb +16 -5
  139. data/test/test_generate.rb +5 -5
  140. data/test/test_hash.rb +5 -5
  141. data/test/test_integer_range.rb +9 -9
  142. data/test/test_null.rb +20 -20
  143. data/test/test_object.rb +99 -96
  144. data/test/test_parser.rb +11 -0
  145. data/test/test_parser_debug.rb +27 -0
  146. data/test/test_parser_saj.rb +337 -0
  147. data/test/test_parser_usual.rb +251 -0
  148. data/test/test_rails.rb +2 -2
  149. data/test/test_saj.rb +10 -8
  150. data/test/test_scp.rb +37 -39
  151. data/test/test_strict.rb +40 -32
  152. data/test/test_various.rb +165 -84
  153. data/test/test_wab.rb +48 -44
  154. data/test/test_writer.rb +47 -47
  155. data/test/tests.rb +13 -5
  156. data/test/tests_mimic.rb +12 -3
  157. data/test/tests_mimic_addition.rb +12 -3
  158. metadata +74 -128
  159. data/ext/oj/hash.c +0 -131
  160. data/ext/oj/hash.h +0 -19
  161. data/ext/oj/hash_test.c +0 -491
  162. data/test/activesupport4/decoding_test.rb +0 -108
  163. data/test/activesupport4/encoding_test.rb +0 -531
  164. data/test/activesupport4/test_helper.rb +0 -41
  165. data/test/activesupport5/test_helper.rb +0 -72
  166. data/test/bar.rb +0 -35
  167. data/test/baz.rb +0 -16
  168. data/test/zoo.rb +0 -13
metadata CHANGED
@@ -1,35 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oj
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.11.5
4
+ version: 3.16.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-15 00:00:00.000000000 Z
11
+ date: 2024-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake-compiler
14
+ name: bigdecimal
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.9'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '2.0'
23
- type: :development
19
+ version: '3.0'
20
+ type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: '0.9'
30
- - - "<"
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ostruct
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
- version: '2.0'
33
+ version: '0.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0.2'
33
41
  - !ruby/object:Gem::Dependency
34
42
  name: minitest
35
43
  requirement: !ruby/object:Gem::Requirement
@@ -45,33 +53,39 @@ dependencies:
45
53
  - !ruby/object:Gem::Version
46
54
  version: '5'
47
55
  - !ruby/object:Gem::Dependency
48
- name: test-unit
56
+ name: rake-compiler
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  requirements:
51
- - - "~>"
59
+ - - ">="
52
60
  - !ruby/object:Gem::Version
53
- version: '3.0'
61
+ version: '0.9'
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '2.0'
54
65
  type: :development
55
66
  prerelease: false
56
67
  version_requirements: !ruby/object:Gem::Requirement
57
68
  requirements:
58
- - - "~>"
69
+ - - ">="
59
70
  - !ruby/object:Gem::Version
60
- version: '3.0'
71
+ version: '0.9'
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
61
75
  - !ruby/object:Gem::Dependency
62
- name: wwtd
76
+ name: test-unit
63
77
  requirement: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: '0'
81
+ version: '3.0'
68
82
  type: :development
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: '0'
88
+ version: '3.0'
75
89
  description: The fastest JSON parser and object serializer.
76
90
  email: peter@ohler.com
77
91
  executables: []
@@ -79,20 +93,29 @@ extensions:
79
93
  - ext/oj/extconf.rb
80
94
  extra_rdoc_files:
81
95
  - README.md
96
+ - LICENSE
97
+ - CHANGELOG.md
98
+ - RELEASE_NOTES.md
82
99
  - pages/Advanced.md
83
100
  - pages/Compatibility.md
84
101
  - pages/Custom.md
85
102
  - pages/Encoding.md
103
+ - pages/InstallOptions.md
86
104
  - pages/JsonGem.md
87
105
  - pages/Modes.md
88
106
  - pages/Options.md
107
+ - pages/Parser.md
89
108
  - pages/Rails.md
90
109
  - pages/Security.md
91
110
  - pages/WAB.md
92
111
  files:
112
+ - CHANGELOG.md
93
113
  - LICENSE
94
114
  - README.md
115
+ - RELEASE_NOTES.md
95
116
  - ext/oj/buf.h
117
+ - ext/oj/cache.c
118
+ - ext/oj/cache.h
96
119
  - ext/oj/cache8.c
97
120
  - ext/oj/cache8.h
98
121
  - ext/oj/circarray.c
@@ -101,6 +124,7 @@ files:
101
124
  - ext/oj/code.h
102
125
  - ext/oj/compat.c
103
126
  - ext/oj/custom.c
127
+ - ext/oj/debug.c
104
128
  - ext/oj/dump.c
105
129
  - ext/oj/dump.h
106
130
  - ext/oj/dump_compat.c
@@ -108,13 +132,15 @@ files:
108
132
  - ext/oj/dump_object.c
109
133
  - ext/oj/dump_strict.c
110
134
  - ext/oj/encode.h
135
+ - ext/oj/encoder.c
111
136
  - ext/oj/err.c
112
137
  - ext/oj/err.h
113
138
  - ext/oj/extconf.rb
114
139
  - ext/oj/fast.c
115
- - ext/oj/hash.c
116
- - ext/oj/hash.h
117
- - ext/oj/hash_test.c
140
+ - ext/oj/intern.c
141
+ - ext/oj/intern.h
142
+ - ext/oj/mem.c
143
+ - ext/oj/mem.h
118
144
  - ext/oj/mimic_json.c
119
145
  - ext/oj/object.c
120
146
  - ext/oj/odd.c
@@ -123,6 +149,8 @@ files:
123
149
  - ext/oj/oj.h
124
150
  - ext/oj/parse.c
125
151
  - ext/oj/parse.h
152
+ - ext/oj/parser.c
153
+ - ext/oj/parser.h
126
154
  - ext/oj/rails.c
127
155
  - ext/oj/rails.h
128
156
  - ext/oj/reader.c
@@ -132,6 +160,8 @@ files:
132
160
  - ext/oj/rxclass.c
133
161
  - ext/oj/rxclass.h
134
162
  - ext/oj/saj.c
163
+ - ext/oj/saj2.c
164
+ - ext/oj/saj2.h
135
165
  - ext/oj/scp.c
136
166
  - ext/oj/sparse.c
137
167
  - ext/oj/stream_writer.c
@@ -139,10 +169,13 @@ files:
139
169
  - ext/oj/string_writer.c
140
170
  - ext/oj/trace.c
141
171
  - ext/oj/trace.h
172
+ - ext/oj/usual.c
173
+ - ext/oj/usual.h
142
174
  - ext/oj/util.c
143
175
  - ext/oj/util.h
144
176
  - ext/oj/val_stack.c
145
177
  - ext/oj/val_stack.h
178
+ - ext/oj/validate.c
146
179
  - ext/oj/wab.c
147
180
  - lib/oj.rb
148
181
  - lib/oj/active_support_helper.rb
@@ -159,9 +192,11 @@ files:
159
192
  - pages/Compatibility.md
160
193
  - pages/Custom.md
161
194
  - pages/Encoding.md
195
+ - pages/InstallOptions.md
162
196
  - pages/JsonGem.md
163
197
  - pages/Modes.md
164
198
  - pages/Options.md
199
+ - pages/Parser.md
165
200
  - pages/Rails.md
166
201
  - pages/Security.md
167
202
  - pages/WAB.md
@@ -169,15 +204,6 @@ files:
169
204
  - test/_test_active_mimic.rb
170
205
  - test/_test_mimic_rails.rb
171
206
  - test/activerecord/result_test.rb
172
- - test/activesupport4/decoding_test.rb
173
- - test/activesupport4/encoding_test.rb
174
- - test/activesupport4/test_helper.rb
175
- - test/activesupport5/abstract_unit.rb
176
- - test/activesupport5/decoding_test.rb
177
- - test/activesupport5/encoding_test.rb
178
- - test/activesupport5/encoding_test_cases.rb
179
- - test/activesupport5/test_helper.rb
180
- - test/activesupport5/time_zone_test_helpers.rb
181
207
  - test/activesupport6/abstract_unit.rb
182
208
  - test/activesupport6/decoding_test.rb
183
209
  - test/activesupport6/encoding_test.rb
@@ -185,8 +211,11 @@ files:
185
211
  - test/activesupport6/test_common.rb
186
212
  - test/activesupport6/test_helper.rb
187
213
  - test/activesupport6/time_zone_test_helpers.rb
188
- - test/bar.rb
189
- - test/baz.rb
214
+ - test/activesupport7/abstract_unit.rb
215
+ - test/activesupport7/decoding_test.rb
216
+ - test/activesupport7/encoding_test.rb
217
+ - test/activesupport7/encoding_test_cases.rb
218
+ - test/activesupport7/time_zone_test_helpers.rb
190
219
  - test/files.rb
191
220
  - test/foo.rb
192
221
  - test/helper.rb
@@ -209,11 +238,15 @@ files:
209
238
  - test/json_gem/json_parser_test.rb
210
239
  - test/json_gem/json_string_matching_test.rb
211
240
  - test/json_gem/test_helper.rb
241
+ - test/mem.rb
212
242
  - test/perf.rb
213
243
  - test/perf_compat.rb
244
+ - test/perf_dump.rb
214
245
  - test/perf_fast.rb
215
246
  - test/perf_file.rb
216
247
  - test/perf_object.rb
248
+ - test/perf_once.rb
249
+ - test/perf_parser.rb
217
250
  - test/perf_saj.rb
218
251
  - test/perf_scp.rb
219
252
  - test/perf_simple.rb
@@ -245,6 +278,10 @@ files:
245
278
  - test/test_integer_range.rb
246
279
  - test/test_null.rb
247
280
  - test/test_object.rb
281
+ - test/test_parser.rb
282
+ - test/test_parser_debug.rb
283
+ - test/test_parser_saj.rb
284
+ - test/test_parser_usual.rb
248
285
  - test/test_rails.rb
249
286
  - test/test_saj.rb
250
287
  - test/test_scp.rb
@@ -255,7 +292,6 @@ files:
255
292
  - test/tests.rb
256
293
  - test/tests_mimic.rb
257
294
  - test/tests_mimic_addition.rb
258
- - test/zoo.rb
259
295
  homepage: http://www.ohler.com/oj
260
296
  licenses:
261
297
  - MIT
@@ -266,6 +302,7 @@ metadata:
266
302
  homepage_uri: http://www.ohler.com/oj/
267
303
  source_code_uri: https://github.com/ohler55/oj
268
304
  wiki_uri: https://github.com/ohler55/oj/wiki
305
+ rubygems_mfa_required: 'true'
269
306
  post_install_message:
270
307
  rdoc_options:
271
308
  - "--title"
@@ -278,106 +315,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
278
315
  requirements:
279
316
  - - ">="
280
317
  - !ruby/object:Gem::Version
281
- version: '2.4'
318
+ version: '2.7'
282
319
  required_rubygems_version: !ruby/object:Gem::Requirement
283
320
  requirements:
284
321
  - - ">="
285
322
  - !ruby/object:Gem::Version
286
323
  version: '0'
287
324
  requirements: []
288
- rubygems_version: 3.2.3
325
+ rubygems_version: 3.4.10
289
326
  signing_key:
290
327
  specification_version: 4
291
328
  summary: A fast JSON parser and serializer.
292
- test_files:
293
- - test/_test_active.rb
294
- - test/_test_active_mimic.rb
295
- - test/_test_mimic_rails.rb
296
- - test/activerecord/result_test.rb
297
- - test/activesupport4/decoding_test.rb
298
- - test/activesupport4/encoding_test.rb
299
- - test/activesupport4/test_helper.rb
300
- - test/activesupport5/abstract_unit.rb
301
- - test/activesupport5/decoding_test.rb
302
- - test/activesupport5/encoding_test.rb
303
- - test/activesupport5/encoding_test_cases.rb
304
- - test/activesupport5/test_helper.rb
305
- - test/activesupport5/time_zone_test_helpers.rb
306
- - test/activesupport6/abstract_unit.rb
307
- - test/activesupport6/decoding_test.rb
308
- - test/activesupport6/encoding_test.rb
309
- - test/activesupport6/encoding_test_cases.rb
310
- - test/activesupport6/test_common.rb
311
- - test/activesupport6/test_helper.rb
312
- - test/activesupport6/time_zone_test_helpers.rb
313
- - test/bar.rb
314
- - test/baz.rb
315
- - test/files.rb
316
- - test/foo.rb
317
- - test/helper.rb
318
- - test/isolated/shared.rb
319
- - test/isolated/test_mimic_after.rb
320
- - test/isolated/test_mimic_alone.rb
321
- - test/isolated/test_mimic_as_json.rb
322
- - test/isolated/test_mimic_before.rb
323
- - test/isolated/test_mimic_define.rb
324
- - test/isolated/test_mimic_rails_after.rb
325
- - test/isolated/test_mimic_rails_before.rb
326
- - test/isolated/test_mimic_redefine.rb
327
- - test/json_gem/json_addition_test.rb
328
- - test/json_gem/json_common_interface_test.rb
329
- - test/json_gem/json_encoding_test.rb
330
- - test/json_gem/json_ext_parser_test.rb
331
- - test/json_gem/json_fixtures_test.rb
332
- - test/json_gem/json_generator_test.rb
333
- - test/json_gem/json_generic_object_test.rb
334
- - test/json_gem/json_parser_test.rb
335
- - test/json_gem/json_string_matching_test.rb
336
- - test/json_gem/test_helper.rb
337
- - test/perf.rb
338
- - test/perf_compat.rb
339
- - test/perf_fast.rb
340
- - test/perf_file.rb
341
- - test/perf_object.rb
342
- - test/perf_saj.rb
343
- - test/perf_scp.rb
344
- - test/perf_simple.rb
345
- - test/perf_strict.rb
346
- - test/perf_wab.rb
347
- - test/prec.rb
348
- - test/sample/change.rb
349
- - test/sample/dir.rb
350
- - test/sample/doc.rb
351
- - test/sample/file.rb
352
- - test/sample/group.rb
353
- - test/sample/hasprops.rb
354
- - test/sample/layer.rb
355
- - test/sample/line.rb
356
- - test/sample/oval.rb
357
- - test/sample/rect.rb
358
- - test/sample/shape.rb
359
- - test/sample/text.rb
360
- - test/sample.rb
361
- - test/sample_json.rb
362
- - test/test_compat.rb
363
- - test/test_custom.rb
364
- - test/test_debian.rb
365
- - test/test_fast.rb
366
- - test/test_file.rb
367
- - test/test_gc.rb
368
- - test/test_generate.rb
369
- - test/test_hash.rb
370
- - test/test_integer_range.rb
371
- - test/test_null.rb
372
- - test/test_object.rb
373
- - test/test_rails.rb
374
- - test/test_saj.rb
375
- - test/test_scp.rb
376
- - test/test_strict.rb
377
- - test/test_various.rb
378
- - test/test_wab.rb
379
- - test/test_writer.rb
380
- - test/tests.rb
381
- - test/tests_mimic.rb
382
- - test/tests_mimic_addition.rb
383
- - test/zoo.rb
329
+ test_files: []
data/ext/oj/hash.c DELETED
@@ -1,131 +0,0 @@
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.
3
-
4
- #include "hash.h"
5
-
6
- #include <stdint.h>
7
-
8
- #define HASH_MASK 0x000003FF
9
- #define HASH_SLOT_CNT 1024
10
-
11
- typedef struct _keyVal {
12
- struct _keyVal *next;
13
- const char * key;
14
- size_t len;
15
- VALUE val;
16
- } * KeyVal;
17
-
18
- struct _hash {
19
- struct _keyVal slots[HASH_SLOT_CNT];
20
- };
21
-
22
- struct _hash class_hash;
23
- struct _hash intern_hash;
24
-
25
- // almost the Murmur hash algorithm
26
- #define M 0x5bd1e995
27
- #define C1 0xCC9E2D51
28
- #define C2 0x1B873593
29
- #define N 0xE6546B64
30
-
31
- static uint32_t hash_calc(const uint8_t *key, size_t len) {
32
- const uint8_t *end = key + len;
33
- const uint8_t *endless = key + (len / 4 * 4);
34
- uint32_t h = (uint32_t)len;
35
- uint32_t k;
36
-
37
- while (key < endless) {
38
- k = (uint32_t)*key++;
39
- k |= (uint32_t)*key++ << 8;
40
- k |= (uint32_t)*key++ << 16;
41
- k |= (uint32_t)*key++ << 24;
42
-
43
- k *= M;
44
- k ^= k >> 24;
45
- h *= M;
46
- h ^= k * M;
47
- }
48
- if (1 < end - key) {
49
- uint16_t k16 = (uint16_t)*key++;
50
-
51
- k16 |= (uint16_t)*key++ << 8;
52
- h ^= k16 << 8;
53
- }
54
- if (key < end) {
55
- h ^= *key;
56
- }
57
- h *= M;
58
- h ^= h >> 13;
59
- h *= M;
60
- h ^= h >> 15;
61
-
62
- return h;
63
- }
64
-
65
- void oj_hash_init() {
66
- memset(class_hash.slots, 0, sizeof(class_hash.slots));
67
- memset(intern_hash.slots, 0, sizeof(intern_hash.slots));
68
- }
69
-
70
- // if slotp is 0 then just lookup
71
- static VALUE hash_get(Hash hash, const char *key, size_t len, VALUE **slotp, VALUE def_value) {
72
- uint32_t h = hash_calc((const uint8_t *)key, len) & HASH_MASK;
73
- KeyVal bucket = hash->slots + h;
74
-
75
- if (0 != bucket->key) {
76
- KeyVal b;
77
-
78
- for (b = bucket; 0 != b; b = b->next) {
79
- if (len == b->len && 0 == strncmp(b->key, key, len)) {
80
- *slotp = &b->val;
81
- return b->val;
82
- }
83
- bucket = b;
84
- }
85
- }
86
- if (0 != slotp) {
87
- if (0 != bucket->key) {
88
- KeyVal b = ALLOC(struct _keyVal);
89
-
90
- b->next = 0;
91
- bucket->next = b;
92
- bucket = b;
93
- }
94
- bucket->key = oj_strndup(key, len);
95
- bucket->len = len;
96
- bucket->val = def_value;
97
- *slotp = &bucket->val;
98
- }
99
- return def_value;
100
- }
101
-
102
- void oj_hash_print() {
103
- int i;
104
- KeyVal b;
105
-
106
- for (i = 0; i < HASH_SLOT_CNT; i++) {
107
- printf("%4d:", i);
108
- for (b = class_hash.slots + i; 0 != b && 0 != b->key; b = b->next) {
109
- printf(" %s", b->key);
110
- }
111
- printf("\n");
112
- }
113
- }
114
-
115
- VALUE
116
- oj_class_hash_get(const char *key, size_t len, VALUE **slotp) {
117
- return hash_get(&class_hash, key, len, slotp, Qnil);
118
- }
119
-
120
- ID oj_attr_hash_get(const char *key, size_t len, ID **slotp) {
121
- return (ID)hash_get(&intern_hash, key, len, (VALUE **)slotp, 0);
122
- }
123
-
124
- char *oj_strndup(const char *s, size_t len) {
125
- char *d = ALLOC_N(char, len + 1);
126
-
127
- memcpy(d, s, len);
128
- d[len] = '\0';
129
-
130
- return d;
131
- }
data/ext/oj/hash.h DELETED
@@ -1,19 +0,0 @@
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.
3
-
4
- #ifndef OJ_HASH_H
5
- #define OJ_HASH_H
6
-
7
- #include "ruby.h"
8
-
9
- typedef struct _hash *Hash;
10
-
11
- extern void oj_hash_init();
12
-
13
- extern VALUE oj_class_hash_get(const char *key, size_t len, VALUE **slotp);
14
- extern ID oj_attr_hash_get(const char *key, size_t len, ID **slotp);
15
-
16
- extern void oj_hash_print();
17
- extern char *oj_strndup(const char *s, size_t len);
18
-
19
- #endif /* OJ_HASH_H */