script_core 0.2.3 → 0.3.0

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 (529) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +35 -57
  3. data/.ruby-version +1 -1
  4. data/Gemfile +2 -2
  5. data/README.md +7 -1
  6. data/ext/enterprise_script_service/Rakefile +1 -1
  7. data/ext/enterprise_script_service/libseccomp/.travis.yml +24 -12
  8. data/ext/enterprise_script_service/libseccomp/CHANGELOG +32 -0
  9. data/ext/enterprise_script_service/libseccomp/CONTRIBUTING.md +37 -26
  10. data/ext/enterprise_script_service/libseccomp/CREDITS +11 -0
  11. data/ext/enterprise_script_service/libseccomp/README.md +21 -1
  12. data/ext/enterprise_script_service/libseccomp/configure.ac +13 -8
  13. data/ext/enterprise_script_service/libseccomp/doc/Makefile.am +6 -0
  14. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_api_get.3 +12 -2
  15. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_arch_add.3 +38 -6
  16. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_attr_set.3 +53 -2
  17. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_export_bpf.3 +20 -2
  18. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_init.3 +9 -2
  19. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_load.3 +32 -2
  20. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_merge.3 +16 -2
  21. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_alloc.3 +113 -0
  22. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_fd.3 +1 -0
  23. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_free.3 +1 -0
  24. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_id_valid.3 +1 -0
  25. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_receive.3 +1 -0
  26. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_respond.3 +1 -0
  27. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_rule_add.3 +64 -3
  28. data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_syscall_priority.3 +18 -3
  29. data/ext/enterprise_script_service/libseccomp/include/seccomp-syscalls.h +19 -0
  30. data/ext/enterprise_script_service/libseccomp/include/seccomp.h.in +116 -0
  31. data/ext/enterprise_script_service/libseccomp/src/.gitignore +2 -0
  32. data/ext/enterprise_script_service/libseccomp/src/Makefile.am +31 -17
  33. data/ext/enterprise_script_service/libseccomp/src/api.c +254 -58
  34. data/ext/enterprise_script_service/libseccomp/src/arch-aarch64.h +1 -9
  35. data/ext/enterprise_script_service/libseccomp/src/arch-arm.c +47 -2
  36. data/ext/enterprise_script_service/libseccomp/src/arch-arm.h +1 -9
  37. data/ext/enterprise_script_service/libseccomp/src/arch-gperf-generate +40 -0
  38. data/ext/enterprise_script_service/libseccomp/src/arch-mips.c +41 -4
  39. data/ext/enterprise_script_service/libseccomp/src/arch-mips.h +2 -10
  40. data/ext/enterprise_script_service/libseccomp/src/arch-mips64.c +41 -4
  41. data/ext/enterprise_script_service/libseccomp/src/arch-mips64.h +3 -11
  42. data/ext/enterprise_script_service/libseccomp/src/arch-mips64n32.c +41 -4
  43. data/ext/enterprise_script_service/libseccomp/src/arch-mips64n32.h +2 -10
  44. data/ext/enterprise_script_service/libseccomp/src/arch-parisc.h +1 -10
  45. data/ext/enterprise_script_service/libseccomp/src/arch-parisc64.c +3 -3
  46. data/ext/enterprise_script_service/libseccomp/src/arch-parisc64.h +29 -0
  47. data/ext/enterprise_script_service/libseccomp/src/arch-ppc.h +1 -9
  48. data/ext/enterprise_script_service/libseccomp/src/arch-ppc64.c +606 -8
  49. data/ext/enterprise_script_service/libseccomp/src/arch-ppc64.h +2 -10
  50. data/ext/enterprise_script_service/libseccomp/src/arch-riscv64.c +31 -0
  51. data/ext/enterprise_script_service/libseccomp/src/arch-riscv64.h +22 -0
  52. data/ext/enterprise_script_service/libseccomp/src/arch-s390.c +171 -12
  53. data/ext/enterprise_script_service/libseccomp/src/arch-s390.h +1 -17
  54. data/ext/enterprise_script_service/libseccomp/src/arch-s390x.c +166 -10
  55. data/ext/enterprise_script_service/libseccomp/src/arch-s390x.h +1 -20
  56. data/ext/enterprise_script_service/libseccomp/src/arch-syscall-dump.c +8 -1
  57. data/ext/enterprise_script_service/libseccomp/src/arch-syscall-validate +359 -143
  58. data/ext/enterprise_script_service/libseccomp/src/arch-x32.c +36 -2
  59. data/ext/enterprise_script_service/libseccomp/src/arch-x32.h +2 -10
  60. data/ext/enterprise_script_service/libseccomp/src/arch-x86.c +172 -10
  61. data/ext/enterprise_script_service/libseccomp/src/arch-x86.h +1 -14
  62. data/ext/enterprise_script_service/libseccomp/src/arch-x86_64.h +1 -9
  63. data/ext/enterprise_script_service/libseccomp/src/arch.c +11 -3
  64. data/ext/enterprise_script_service/libseccomp/src/arch.h +7 -0
  65. data/ext/enterprise_script_service/libseccomp/src/db.c +268 -57
  66. data/ext/enterprise_script_service/libseccomp/src/db.h +16 -2
  67. data/ext/enterprise_script_service/libseccomp/src/gen_bpf.c +503 -148
  68. data/ext/enterprise_script_service/libseccomp/src/gen_bpf.h +2 -1
  69. data/ext/enterprise_script_service/libseccomp/src/gen_pfc.c +165 -37
  70. data/ext/enterprise_script_service/libseccomp/src/python/libseccomp.pxd +37 -1
  71. data/ext/enterprise_script_service/libseccomp/src/python/seccomp.pyx +295 -5
  72. data/ext/enterprise_script_service/libseccomp/src/syscalls.c +56 -0
  73. data/ext/enterprise_script_service/libseccomp/src/syscalls.csv +470 -0
  74. data/ext/enterprise_script_service/libseccomp/src/syscalls.h +62 -0
  75. data/ext/enterprise_script_service/libseccomp/src/syscalls.perf.template +82 -0
  76. data/ext/enterprise_script_service/libseccomp/src/system.c +196 -16
  77. data/ext/enterprise_script_service/libseccomp/src/system.h +68 -13
  78. data/ext/enterprise_script_service/libseccomp/tests/.gitignore +10 -2
  79. data/ext/enterprise_script_service/libseccomp/tests/06-sim-actions.tests +1 -1
  80. data/ext/enterprise_script_service/libseccomp/tests/11-basic-basic_errors.c +5 -5
  81. data/ext/enterprise_script_service/libseccomp/tests/13-basic-attrs.c +35 -1
  82. data/ext/enterprise_script_service/libseccomp/tests/13-basic-attrs.py +10 -1
  83. data/ext/enterprise_script_service/libseccomp/tests/15-basic-resolver.c +4 -3
  84. data/ext/enterprise_script_service/libseccomp/tests/16-sim-arch_basic.c +12 -0
  85. data/ext/enterprise_script_service/libseccomp/tests/16-sim-arch_basic.py +1 -0
  86. data/ext/enterprise_script_service/libseccomp/tests/{18-sim-basic_whitelist.c → 18-sim-basic_allowlist.c} +0 -0
  87. data/ext/enterprise_script_service/libseccomp/tests/{18-sim-basic_whitelist.py → 18-sim-basic_allowlist.py} +0 -0
  88. data/ext/enterprise_script_service/libseccomp/tests/18-sim-basic_allowlist.tests +32 -0
  89. data/ext/enterprise_script_service/libseccomp/tests/23-sim-arch_all_le_basic.c +3 -0
  90. data/ext/enterprise_script_service/libseccomp/tests/23-sim-arch_all_le_basic.py +1 -0
  91. data/ext/enterprise_script_service/libseccomp/tests/30-sim-socket_syscalls.c +3 -0
  92. data/ext/enterprise_script_service/libseccomp/tests/30-sim-socket_syscalls.py +1 -0
  93. data/ext/enterprise_script_service/libseccomp/tests/30-sim-socket_syscalls.tests +33 -17
  94. data/ext/enterprise_script_service/libseccomp/tests/{34-sim-basic_blacklist.c → 34-sim-basic_denylist.c} +0 -0
  95. data/ext/enterprise_script_service/libseccomp/tests/{34-sim-basic_blacklist.py → 34-sim-basic_denylist.py} +0 -0
  96. data/ext/enterprise_script_service/libseccomp/tests/34-sim-basic_denylist.tests +32 -0
  97. data/ext/enterprise_script_service/libseccomp/tests/36-sim-ipc_syscalls.c +3 -0
  98. data/ext/enterprise_script_service/libseccomp/tests/36-sim-ipc_syscalls.py +1 -0
  99. data/ext/enterprise_script_service/libseccomp/tests/36-sim-ipc_syscalls.tests +25 -25
  100. data/ext/enterprise_script_service/libseccomp/tests/39-basic-api_level.c +24 -3
  101. data/ext/enterprise_script_service/libseccomp/tests/39-basic-api_level.py +16 -1
  102. data/ext/enterprise_script_service/libseccomp/tests/47-live-kill_process.c +3 -3
  103. data/ext/enterprise_script_service/libseccomp/tests/51-live-user_notification.c +112 -0
  104. data/ext/enterprise_script_service/libseccomp/tests/51-live-user_notification.py +60 -0
  105. data/ext/enterprise_script_service/libseccomp/tests/51-live-user_notification.tests +11 -0
  106. data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.c +48 -0
  107. data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.py +38 -0
  108. data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.tests +11 -0
  109. data/ext/enterprise_script_service/libseccomp/tests/53-sim-binary_tree.c +156 -0
  110. data/ext/enterprise_script_service/libseccomp/tests/53-sim-binary_tree.py +95 -0
  111. data/ext/enterprise_script_service/libseccomp/tests/53-sim-binary_tree.tests +65 -0
  112. data/ext/enterprise_script_service/libseccomp/tests/54-live-binary_tree.c +128 -0
  113. data/ext/enterprise_script_service/libseccomp/tests/54-live-binary_tree.py +95 -0
  114. data/ext/enterprise_script_service/libseccomp/tests/54-live-binary_tree.tests +11 -0
  115. data/ext/enterprise_script_service/libseccomp/tests/55-basic-pfc_binary_tree.c +134 -0
  116. data/ext/enterprise_script_service/libseccomp/tests/55-basic-pfc_binary_tree.sh +46 -0
  117. data/ext/enterprise_script_service/libseccomp/tests/55-basic-pfc_binary_tree.tests +11 -0
  118. data/ext/enterprise_script_service/libseccomp/tests/56-basic-iterate_syscalls.c +90 -0
  119. data/ext/enterprise_script_service/libseccomp/tests/56-basic-iterate_syscalls.py +65 -0
  120. data/ext/enterprise_script_service/libseccomp/tests/56-basic-iterate_syscalls.tests +11 -0
  121. data/ext/enterprise_script_service/libseccomp/tests/57-basic-rawsysrc.c +64 -0
  122. data/ext/enterprise_script_service/libseccomp/tests/57-basic-rawsysrc.py +46 -0
  123. data/ext/enterprise_script_service/libseccomp/tests/57-basic-rawsysrc.tests +11 -0
  124. data/ext/enterprise_script_service/libseccomp/tests/58-live-tsync_notify.c +116 -0
  125. data/ext/enterprise_script_service/libseccomp/tests/58-live-tsync_notify.py +61 -0
  126. data/ext/enterprise_script_service/libseccomp/tests/58-live-tsync_notify.tests +11 -0
  127. data/ext/enterprise_script_service/libseccomp/tests/Makefile.am +34 -10
  128. data/ext/enterprise_script_service/libseccomp/tests/regression +10 -3
  129. data/ext/enterprise_script_service/libseccomp/tests/util.c +3 -3
  130. data/ext/enterprise_script_service/libseccomp/tools/Makefile.am +0 -3
  131. data/ext/enterprise_script_service/libseccomp/tools/check-syntax +1 -1
  132. data/ext/enterprise_script_service/libseccomp/tools/scmp_arch_detect.c +3 -0
  133. data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_disasm.c +4 -2
  134. data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_sim.c +4 -0
  135. data/ext/enterprise_script_service/libseccomp/tools/util.c +14 -12
  136. data/ext/enterprise_script_service/libseccomp/tools/util.h +7 -0
  137. data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +149 -0
  138. data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +55 -0
  139. data/ext/enterprise_script_service/mruby/.github/workflows/lint.yml +23 -0
  140. data/ext/enterprise_script_service/mruby/.github/workflows/oss-fuzz.yml +27 -0
  141. data/ext/enterprise_script_service/mruby/.github/workflows/spell-checker.yml +17 -0
  142. data/ext/enterprise_script_service/mruby/.gitignore +3 -0
  143. data/ext/enterprise_script_service/mruby/.gitlab-ci.yml +3 -3
  144. data/ext/enterprise_script_service/mruby/.markdownlint.yml +16 -0
  145. data/ext/enterprise_script_service/mruby/.travis.yml +7 -10
  146. data/ext/enterprise_script_service/mruby/.yamllint +8 -0
  147. data/ext/enterprise_script_service/mruby/AUTHORS +4 -0
  148. data/ext/enterprise_script_service/mruby/CODEOWNERS +1 -0
  149. data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +6 -13
  150. data/ext/enterprise_script_service/mruby/Doxyfile +4 -4
  151. data/ext/enterprise_script_service/mruby/LICENSE +1 -1
  152. data/ext/enterprise_script_service/mruby/Makefile +1 -1
  153. data/ext/enterprise_script_service/mruby/README.md +5 -11
  154. data/ext/enterprise_script_service/mruby/Rakefile +18 -108
  155. data/ext/enterprise_script_service/mruby/TODO.md +17 -0
  156. data/ext/enterprise_script_service/mruby/appveyor.yml +29 -26
  157. data/ext/enterprise_script_service/mruby/benchmark/bm_ao_render.rb +1 -1
  158. data/ext/enterprise_script_service/mruby/build_config.rb +9 -152
  159. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_ArduinoDue.rb → build_config/ArduinoDue.rb} +4 -21
  160. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +4 -4
  161. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +3 -20
  162. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +4 -21
  163. data/ext/enterprise_script_service/mruby/build_config/android_arm64-v8a.rb +11 -0
  164. data/ext/enterprise_script_service/mruby/build_config/android_armeabi.rb +11 -0
  165. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_android_armeabi_v7a_neon_hard.rb → build_config/android_armeabi_v7a_neon_hard.rb} +0 -15
  166. data/ext/enterprise_script_service/mruby/build_config/bench.rb +11 -0
  167. data/ext/enterprise_script_service/mruby/build_config/boxing.rb +21 -0
  168. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_chipKITMax32.rb → build_config/chipKITMax32.rb} +4 -21
  169. data/ext/enterprise_script_service/mruby/{appveyor_config.rb → build_config/ci/gcc-clang.rb} +11 -8
  170. data/ext/enterprise_script_service/mruby/build_config/ci/msvc.rb +20 -0
  171. data/ext/enterprise_script_service/mruby/build_config/clang-asan.rb +11 -0
  172. data/ext/enterprise_script_service/mruby/build_config/cross-32bit.rb +14 -0
  173. data/ext/enterprise_script_service/mruby/build_config/default.rb +80 -0
  174. data/ext/enterprise_script_service/mruby/build_config/dreamcast_shelf.rb +94 -0
  175. data/ext/enterprise_script_service/mruby/build_config/gameboyadvance.rb +73 -0
  176. data/ext/enterprise_script_service/mruby/build_config/host-cxx.rb +12 -0
  177. data/ext/enterprise_script_service/mruby/build_config/host-debug.rb +20 -0
  178. data/ext/enterprise_script_service/mruby/build_config/host-gprof.rb +14 -0
  179. data/ext/enterprise_script_service/mruby/build_config/host-m32.rb +15 -0
  180. data/ext/enterprise_script_service/mruby/build_config/host-shared.rb +36 -0
  181. data/ext/enterprise_script_service/mruby/build_config/mrbc.rb +11 -0
  182. data/ext/enterprise_script_service/mruby/build_config/no-float.rb +17 -0
  183. data/ext/enterprise_script_service/mruby/doc/guides/compile.md +142 -49
  184. data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +5 -4
  185. data/ext/enterprise_script_service/mruby/doc/guides/gc-arena-howto.md +1 -1
  186. data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +53 -30
  187. data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +31 -14
  188. data/ext/enterprise_script_service/mruby/doc/guides/symbol.md +83 -0
  189. data/ext/enterprise_script_service/mruby/doc/limitations.md +35 -36
  190. data/ext/enterprise_script_service/mruby/doc/mruby3.md +163 -0
  191. data/ext/enterprise_script_service/mruby/doc/opcode.md +102 -103
  192. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +1 -1
  193. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +5 -1
  194. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_extension_example/src/example.c +5 -1
  195. data/ext/enterprise_script_service/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +1 -1
  196. data/ext/enterprise_script_service/mruby/include/mrbconf.h +88 -66
  197. data/ext/enterprise_script_service/mruby/include/mruby.h +160 -104
  198. data/ext/enterprise_script_service/mruby/include/mruby/array.h +27 -6
  199. data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +80 -46
  200. data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
  201. data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +76 -55
  202. data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
  203. data/ext/enterprise_script_service/mruby/include/mruby/common.h +14 -1
  204. data/ext/enterprise_script_service/mruby/include/mruby/compile.h +20 -6
  205. data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
  206. data/ext/enterprise_script_service/mruby/include/mruby/dump.h +18 -52
  207. data/ext/enterprise_script_service/mruby/include/mruby/endian.h +44 -0
  208. data/ext/enterprise_script_service/mruby/include/mruby/error.h +39 -5
  209. data/ext/enterprise_script_service/mruby/include/mruby/gc.h +1 -0
  210. data/ext/enterprise_script_service/mruby/include/mruby/hash.h +33 -13
  211. data/ext/enterprise_script_service/mruby/include/mruby/irep.h +74 -14
  212. data/ext/enterprise_script_service/mruby/include/mruby/istruct.h +4 -1
  213. data/ext/enterprise_script_service/mruby/include/mruby/khash.h +19 -9
  214. data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +37 -63
  215. data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
  216. data/ext/enterprise_script_service/mruby/include/mruby/ops.h +29 -24
  217. data/ext/enterprise_script_service/mruby/include/mruby/presym.h +40 -0
  218. data/ext/enterprise_script_service/mruby/include/mruby/presym/disable.h +70 -0
  219. data/ext/enterprise_script_service/mruby/include/mruby/presym/enable.h +37 -0
  220. data/ext/enterprise_script_service/mruby/include/mruby/presym/scanning.h +73 -0
  221. data/ext/enterprise_script_service/mruby/include/mruby/proc.h +93 -21
  222. data/ext/enterprise_script_service/mruby/include/mruby/string.h +12 -16
  223. data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
  224. data/ext/enterprise_script_service/mruby/include/mruby/value.h +60 -59
  225. data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
  226. data/ext/enterprise_script_service/mruby/include/mruby/version.h +25 -6
  227. data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -72
  228. data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +71 -78
  229. data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +12 -10
  230. data/ext/enterprise_script_service/mruby/lib/{mruby-core-ext.rb → mruby/core_ext.rb} +10 -3
  231. data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +84 -32
  232. data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +1 -1
  233. data/ext/enterprise_script_service/mruby/lib/mruby/presym.rb +132 -0
  234. data/ext/enterprise_script_service/mruby/lib/mruby/source.rb +3 -1
  235. data/ext/enterprise_script_service/mruby/mrbgems/default-no-fpu.gembox +3 -0
  236. data/ext/enterprise_script_service/mruby/mrbgems/default-no-stdio.gembox +4 -0
  237. data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +9 -81
  238. data/ext/enterprise_script_service/mruby/mrbgems/full-core.gembox +1 -4
  239. data/ext/enterprise_script_service/mruby/mrbgems/math.gembox +10 -0
  240. data/ext/enterprise_script_service/mruby/mrbgems/metaprog.gembox +15 -0
  241. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +1 -32
  242. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +10 -12
  243. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/test/array.rb +0 -13
  244. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +30 -18
  245. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mruby-config +18 -8
  246. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +3 -6
  247. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +10 -10
  248. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +14 -9
  249. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +3 -2
  250. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +4 -4
  251. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +2 -6
  252. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +6 -2
  253. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +23 -5
  254. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +11 -2
  255. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +46 -35
  256. data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb +0 -0
  257. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +3 -4
  258. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +41 -28
  259. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +25 -4
  260. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -2
  261. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +26 -6
  262. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +1 -1
  263. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +6 -2
  264. data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
  265. data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrblib/catch.rb +27 -0
  266. data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +7 -1
  267. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +495 -436
  268. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +5 -0
  269. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +49 -44
  270. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +637 -220
  271. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +13734 -0
  272. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +20 -23
  273. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +2 -2
  274. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +9 -9
  275. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +4 -4
  276. data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +1 -0
  277. data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +2 -2
  278. data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/mrbgem.rake +2 -2
  279. data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/src/exception.c +3 -3
  280. data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +19 -238
  281. data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/test/eval.rb +21 -0
  282. data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +19 -15
  283. data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +31 -5
  284. data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +7 -0
  285. data/ext/enterprise_script_service/mruby/mrbgems/mruby-inline-struct/test/inline.c +5 -6
  286. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +18 -16
  287. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +39 -7
  288. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrbgem.rake +2 -8
  289. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
  290. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +0 -16
  291. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +9 -14
  292. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +107 -59
  293. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +22 -38
  294. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +417 -203
  295. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +20 -12
  296. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +33 -2
  297. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +58 -50
  298. data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +13 -14
  299. data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +13 -12
  300. data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/test/math.rb +5 -4
  301. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +56 -73
  302. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +13 -4
  303. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/README.md +4 -3
  304. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +80 -78
  305. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +4 -4
  306. data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +14 -13
  307. data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +8 -16
  308. data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -13
  309. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
  310. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/src/memsize.c +231 -0
  311. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
  312. data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/README.md +15 -18
  313. data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +120 -67
  314. data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +1 -30
  315. data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +65 -26
  316. data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +34 -21
  317. data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.c +1 -1
  318. data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +98 -43
  319. data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +2 -2
  320. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +39 -6
  321. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +21 -43
  322. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +27 -3
  323. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +12 -20
  324. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +216 -38
  325. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +6 -6
  326. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/README.md +6 -4
  327. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +5 -5
  328. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
  329. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/mrbgem.rake +1 -1
  330. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
  331. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/test/sockettest.c +3 -2
  332. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +161 -93
  333. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +9 -25
  334. data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +23 -1
  335. data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +17 -14
  336. data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +1 -1
  337. data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +23 -36
  338. data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +7 -6
  339. data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
  340. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/README.md +0 -1
  341. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +5 -5
  342. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +17 -44
  343. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +4 -4
  344. data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +37 -41
  345. data/ext/enterprise_script_service/mruby/mrbgems/stdlib-ext.gembox +18 -0
  346. data/ext/enterprise_script_service/mruby/mrbgems/stdlib-io.gembox +12 -0
  347. data/ext/enterprise_script_service/mruby/mrbgems/stdlib.gembox +54 -0
  348. data/ext/enterprise_script_service/mruby/mrblib/00class.rb +10 -0
  349. data/ext/enterprise_script_service/mruby/mrblib/10error.rb +4 -0
  350. data/ext/enterprise_script_service/mruby/mrblib/array.rb +17 -9
  351. data/ext/enterprise_script_service/mruby/mrblib/enum.rb +1 -1
  352. data/ext/enterprise_script_service/mruby/mrblib/hash.rb +3 -23
  353. data/ext/enterprise_script_service/mruby/mrblib/init_mrblib.c +0 -11
  354. data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +36 -11
  355. data/ext/enterprise_script_service/mruby/mrblib/range.rb +25 -3
  356. data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +2 -2
  357. data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +1 -1
  358. data/ext/enterprise_script_service/mruby/src/array.c +67 -90
  359. data/ext/enterprise_script_service/mruby/src/backtrace.c +18 -19
  360. data/ext/enterprise_script_service/mruby/src/class.c +819 -211
  361. data/ext/enterprise_script_service/mruby/src/codedump.c +226 -197
  362. data/ext/enterprise_script_service/mruby/src/debug.c +14 -11
  363. data/ext/enterprise_script_service/mruby/src/dump.c +470 -207
  364. data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
  365. data/ext/enterprise_script_service/mruby/src/error.c +94 -20
  366. data/ext/enterprise_script_service/mruby/src/etc.c +56 -39
  367. data/ext/enterprise_script_service/mruby/src/fmt_fp.c +103 -27
  368. data/ext/enterprise_script_service/mruby/src/gc.c +86 -349
  369. data/ext/enterprise_script_service/mruby/src/hash.c +1058 -723
  370. data/ext/enterprise_script_service/mruby/src/kernel.c +78 -226
  371. data/ext/enterprise_script_service/mruby/src/load.c +215 -159
  372. data/ext/enterprise_script_service/mruby/src/numeric.c +400 -382
  373. data/ext/enterprise_script_service/mruby/src/object.c +115 -90
  374. data/ext/enterprise_script_service/mruby/src/print.c +31 -6
  375. data/ext/enterprise_script_service/mruby/src/proc.c +56 -45
  376. data/ext/enterprise_script_service/mruby/src/range.c +49 -33
  377. data/ext/enterprise_script_service/mruby/src/state.c +58 -42
  378. data/ext/enterprise_script_service/mruby/src/string.c +151 -156
  379. data/ext/enterprise_script_service/mruby/src/symbol.c +132 -66
  380. data/ext/enterprise_script_service/mruby/src/value_array.h +1 -0
  381. data/ext/enterprise_script_service/mruby/src/variable.c +158 -158
  382. data/ext/enterprise_script_service/mruby/src/vm.c +655 -645
  383. data/ext/enterprise_script_service/mruby/tasks/benchmark.rake +6 -6
  384. data/ext/enterprise_script_service/mruby/tasks/bin.rake +23 -0
  385. data/ext/enterprise_script_service/mruby/tasks/core.rake +12 -0
  386. data/ext/enterprise_script_service/mruby/tasks/doc.rake +50 -38
  387. data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +64 -61
  388. data/ext/enterprise_script_service/mruby/tasks/libmruby.rake +10 -1
  389. data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +13 -1
  390. data/ext/enterprise_script_service/mruby/tasks/mrblib.rake +40 -0
  391. data/ext/enterprise_script_service/mruby/tasks/presym.rake +44 -0
  392. data/ext/enterprise_script_service/mruby/tasks/test.rake +68 -0
  393. data/ext/enterprise_script_service/mruby/tasks/toolchains/android.rake +46 -1
  394. data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +8 -7
  395. data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +13 -17
  396. data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +21 -25
  397. data/ext/enterprise_script_service/mruby/test/assert.rb +5 -4
  398. data/ext/enterprise_script_service/mruby/test/bintest.rb +5 -5
  399. data/ext/enterprise_script_service/mruby/test/t/argumenterror.rb +16 -0
  400. data/ext/enterprise_script_service/mruby/test/t/array.rb +7 -3
  401. data/ext/enterprise_script_service/mruby/test/t/bs_literal.rb +1 -1
  402. data/ext/enterprise_script_service/mruby/test/t/ensure.rb +8 -26
  403. data/ext/enterprise_script_service/mruby/test/t/exception.rb +2 -2
  404. data/ext/enterprise_script_service/mruby/test/t/float.rb +18 -8
  405. data/ext/enterprise_script_service/mruby/test/t/hash.rb +903 -281
  406. data/ext/enterprise_script_service/mruby/test/t/integer.rb +10 -38
  407. data/ext/enterprise_script_service/mruby/test/t/kernel.rb +16 -25
  408. data/ext/enterprise_script_service/mruby/test/t/literals.rb +50 -0
  409. data/ext/enterprise_script_service/mruby/test/t/module.rb +2 -2
  410. data/ext/enterprise_script_service/mruby/test/t/numeric.rb +1 -1
  411. data/ext/enterprise_script_service/mruby/test/t/range.rb +83 -1
  412. data/ext/enterprise_script_service/mruby/test/t/string.rb +4 -0
  413. data/ext/enterprise_script_service/mruby/test/t/superclass.rb +10 -10
  414. data/ext/enterprise_script_service/mruby/test/t/syntax.rb +24 -0
  415. data/ext/enterprise_script_service/mruby/test/t/vformat.rb +3 -3
  416. data/ext/enterprise_script_service/mruby_config.rb +2 -5
  417. data/ext/enterprise_script_service/mruby_engine.cpp +1 -1
  418. data/ext/enterprise_script_service/msgpack/.github/depends/boost.sh +56 -0
  419. data/ext/enterprise_script_service/msgpack/.github/workflows/coverage.yml +62 -0
  420. data/ext/enterprise_script_service/msgpack/.github/workflows/gha.yml +304 -0
  421. data/ext/enterprise_script_service/msgpack/CHANGELOG.md +11 -0
  422. data/ext/enterprise_script_service/msgpack/CMakeLists.txt +82 -39
  423. data/ext/enterprise_script_service/msgpack/Files.cmake +22 -12
  424. data/ext/enterprise_script_service/msgpack/QUICKSTART-C.md +26 -29
  425. data/ext/enterprise_script_service/msgpack/README.md +3 -2
  426. data/ext/enterprise_script_service/msgpack/appveyor.yml +6 -2
  427. data/ext/enterprise_script_service/msgpack/ci/build_cmake.sh +3 -1
  428. data/ext/enterprise_script_service/msgpack/cmake/CodeCoverage.cmake +55 -0
  429. data/ext/enterprise_script_service/msgpack/codecov.yml +36 -0
  430. data/ext/enterprise_script_service/msgpack/example/CMakeLists.txt +9 -5
  431. data/ext/enterprise_script_service/msgpack/example/boost/CMakeLists.txt +1 -1
  432. data/ext/enterprise_script_service/msgpack/example/c/CMakeLists.txt +17 -6
  433. data/ext/enterprise_script_service/msgpack/example/c/boundary.c +296 -0
  434. data/ext/enterprise_script_service/msgpack/example/c/jsonconv.c +419 -0
  435. data/ext/enterprise_script_service/msgpack/example/c/simple_c.c +1 -1
  436. data/ext/enterprise_script_service/msgpack/example/cpp03/CMakeLists.txt +3 -3
  437. data/ext/enterprise_script_service/msgpack/example/cpp11/CMakeLists.txt +2 -2
  438. data/ext/enterprise_script_service/msgpack/example/x3/CMakeLists.txt +2 -2
  439. data/ext/enterprise_script_service/msgpack/include/msgpack/pack.h +24 -1
  440. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/array_ref.hpp +5 -4
  441. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/boost/optional.hpp +4 -4
  442. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/cpp17/vector_byte.hpp +8 -8
  443. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/map.hpp +4 -4
  444. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector.hpp +4 -4
  445. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_char.hpp +8 -8
  446. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_unsigned_char.hpp +8 -8
  447. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/wstring.hpp +4 -4
  448. data/ext/enterprise_script_service/msgpack/include/msgpack/v3/unpack.hpp +6 -6
  449. data/ext/enterprise_script_service/msgpack/include/msgpack/version_master.h +2 -2
  450. data/ext/enterprise_script_service/msgpack/include/msgpack/zbuffer.h +4 -4
  451. data/ext/enterprise_script_service/msgpack/make_file_list.sh +38 -11
  452. data/ext/enterprise_script_service/msgpack/src/vrefbuffer.c +6 -0
  453. data/ext/enterprise_script_service/msgpack/test/CMakeLists.txt +86 -64
  454. data/ext/enterprise_script_service/msgpack/test/array_ref.cpp +4 -0
  455. data/ext/enterprise_script_service/msgpack/test/boost_fusion.cpp +4 -0
  456. data/ext/enterprise_script_service/msgpack/test/boost_optional.cpp +4 -0
  457. data/ext/enterprise_script_service/msgpack/test/boost_string_ref.cpp +4 -1
  458. data/ext/enterprise_script_service/msgpack/test/boost_string_view.cpp +4 -0
  459. data/ext/enterprise_script_service/msgpack/test/boost_variant.cpp +4 -0
  460. data/ext/enterprise_script_service/msgpack/test/buffer.cpp +4 -47
  461. data/ext/enterprise_script_service/msgpack/test/buffer_c.cpp +148 -0
  462. data/ext/enterprise_script_service/msgpack/test/carray.cpp +4 -0
  463. data/ext/enterprise_script_service/msgpack/test/cases.cpp +8 -4
  464. data/ext/enterprise_script_service/msgpack/test/convert.cpp +8 -4
  465. data/ext/enterprise_script_service/msgpack/test/fixint.cpp +4 -0
  466. data/ext/enterprise_script_service/msgpack/test/fixint_c.cpp +4 -0
  467. data/ext/enterprise_script_service/msgpack/test/fuzz_unpack_pack_fuzzer_cpp11.cpp +4 -0
  468. data/ext/enterprise_script_service/msgpack/test/iterator_cpp11.cpp +4 -0
  469. data/ext/enterprise_script_service/msgpack/test/json.cpp +4 -0
  470. data/ext/enterprise_script_service/msgpack/test/limit.cpp +8 -4
  471. data/ext/enterprise_script_service/msgpack/test/msgpack_basic.cpp +4 -0
  472. data/ext/enterprise_script_service/msgpack/test/msgpack_c.cpp +159 -0
  473. data/ext/enterprise_script_service/msgpack/test/msgpack_container.cpp +4 -0
  474. data/ext/enterprise_script_service/msgpack/test/msgpack_cpp11.cpp +32 -27
  475. data/ext/enterprise_script_service/msgpack/test/msgpack_cpp17.cpp +4 -0
  476. data/ext/enterprise_script_service/msgpack/test/msgpack_stream.cpp +4 -0
  477. data/ext/enterprise_script_service/msgpack/test/msgpack_tuple.cpp +4 -1
  478. data/ext/enterprise_script_service/msgpack/test/msgpack_vref.cpp +4 -0
  479. data/ext/enterprise_script_service/msgpack/test/msgpack_x3_parse.cpp +4 -0
  480. data/ext/enterprise_script_service/msgpack/test/object.cpp +4 -1
  481. data/ext/enterprise_script_service/msgpack/test/object_with_zone.cpp +12 -8
  482. data/ext/enterprise_script_service/msgpack/test/pack_unpack.cpp +30 -26
  483. data/ext/enterprise_script_service/msgpack/test/pack_unpack_c.cpp +4 -0
  484. data/ext/enterprise_script_service/msgpack/test/raw.cpp +4 -0
  485. data/ext/enterprise_script_service/msgpack/test/reference.cpp +4 -0
  486. data/ext/enterprise_script_service/msgpack/test/reference_cpp11.cpp +4 -0
  487. data/ext/enterprise_script_service/msgpack/test/reference_wrapper_cpp11.cpp +4 -0
  488. data/ext/enterprise_script_service/msgpack/test/shared_ptr_cpp11.cpp +4 -0
  489. data/ext/enterprise_script_service/msgpack/test/size_equal_only.cpp +4 -0
  490. data/ext/enterprise_script_service/msgpack/test/streaming.cpp +8 -4
  491. data/ext/enterprise_script_service/msgpack/test/streaming_c.cpp +4 -0
  492. data/ext/enterprise_script_service/msgpack/test/unique_ptr_cpp11.cpp +4 -0
  493. data/ext/enterprise_script_service/msgpack/test/user_class.cpp +16 -12
  494. data/ext/enterprise_script_service/msgpack/test/version.cpp +4 -0
  495. data/ext/enterprise_script_service/msgpack/test/visitor.cpp +4 -0
  496. data/ext/enterprise_script_service/msgpack/test/zone.cpp +4 -0
  497. data/lib/script_core/engine.rb +24 -5
  498. data/lib/script_core/executable.rb +4 -3
  499. data/lib/script_core/version.rb +1 -1
  500. data/lib/tasks/script_core.rake +3 -1
  501. data/script_core.gemspec +1 -2
  502. data/spec/dummy/app/lib/script_engine.rb +64 -5
  503. data/spec/script_core_spec.rb +13 -0
  504. metadata +123 -61
  505. data/ext/enterprise_script_service/libseccomp/src/arch-aarch64-syscalls.c +0 -559
  506. data/ext/enterprise_script_service/libseccomp/src/arch-arm-syscalls.c +0 -570
  507. data/ext/enterprise_script_service/libseccomp/src/arch-mips-syscalls.c +0 -562
  508. data/ext/enterprise_script_service/libseccomp/src/arch-mips64-syscalls.c +0 -562
  509. data/ext/enterprise_script_service/libseccomp/src/arch-mips64n32-syscalls.c +0 -562
  510. data/ext/enterprise_script_service/libseccomp/src/arch-parisc-syscalls.c +0 -542
  511. data/ext/enterprise_script_service/libseccomp/src/arch-ppc-syscalls.c +0 -559
  512. data/ext/enterprise_script_service/libseccomp/src/arch-ppc64-syscalls.c +0 -559
  513. data/ext/enterprise_script_service/libseccomp/src/arch-s390-syscalls.c +0 -626
  514. data/ext/enterprise_script_service/libseccomp/src/arch-s390x-syscalls.c +0 -626
  515. data/ext/enterprise_script_service/libseccomp/src/arch-x32-syscalls.c +0 -558
  516. data/ext/enterprise_script_service/libseccomp/src/arch-x86-syscalls.c +0 -692
  517. data/ext/enterprise_script_service/libseccomp/src/arch-x86_64-syscalls.c +0 -559
  518. data/ext/enterprise_script_service/libseccomp/tests/18-sim-basic_whitelist.tests +0 -32
  519. data/ext/enterprise_script_service/libseccomp/tests/34-sim-basic_blacklist.tests +0 -32
  520. data/ext/enterprise_script_service/mruby/TODO +0 -8
  521. data/ext/enterprise_script_service/mruby/benchmark/build_config_boxing.rb +0 -28
  522. data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_arm64-v8a.rb +0 -26
  523. data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_armeabi.rb +0 -26
  524. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +0 -30
  525. data/ext/enterprise_script_service/mruby/mrblib/mrblib.rake +0 -18
  526. data/ext/enterprise_script_service/mruby/src/crc.c +0 -39
  527. data/ext/enterprise_script_service/mruby/src/mruby_core.rake +0 -19
  528. data/ext/enterprise_script_service/mruby/travis_config.rb +0 -54
  529. data/ext/enterprise_script_service/msgpack/.travis.yml +0 -258
@@ -4,88 +4,320 @@
4
4
  ** See Copyright Notice in mruby.h
5
5
  */
6
6
 
7
+ #include <string.h>
7
8
  #include <mruby.h>
8
9
  #include <mruby/array.h>
9
10
  #include <mruby/class.h>
10
11
  #include <mruby/hash.h>
11
12
  #include <mruby/string.h>
12
13
  #include <mruby/variable.h>
14
+ #include <mruby/presym.h>
13
15
 
14
- #ifndef MRB_WITHOUT_FLOAT
15
- /* a function to get hash value of a float number */
16
- mrb_int mrb_float_id(mrb_float f);
16
+ /*
17
+ * === Glossary
18
+ *
19
+ * [EA]
20
+ * Entry Array. Store `Hash' entries in insertion order.
21
+ *
22
+ * [AR]
23
+ * Array Table Implementation. The structure of `Hash` that doesn't have a
24
+ * hash table and linearly searches EA. It is used when `Hash` size <= 16.
25
+ *
26
+ * [IB]
27
+ * Index Buckets. The buckets of hash table, where the bucket value is EA
28
+ * index. The index is represented by variable length bits according to
29
+ * the capacity.
30
+ *
31
+ * [HT]
32
+ * Hash Table Implementation. The structure of `Hash` that has IB and is
33
+ * searched by hash table algorithm. It is used when `Hash` size > 16.
34
+ * Collision resolution strategy is open addressing method.
35
+ *
36
+ * [size]
37
+ * The number of `Hash` entries (value of `Hash#size`).
38
+ *
39
+ * [slot]
40
+ * The generic term for EA or IB elements.
41
+ *
42
+ * [active]
43
+ * The state in which a slot is recognized as a `Hash` entry.
44
+ *
45
+ * [deleted]
46
+ * The state in which a slot is marked as deleted.
47
+ *
48
+ * [used]
49
+ * The state in which a slot is active or deleted.
50
+ *
51
+ * [empty]
52
+ * The state in which a slot is not used. Capacity is equal to the sum of
53
+ * the number of used slots and the number of empty slots.
54
+ */
55
+
56
+ #define EA_N_RESERVED_INDICES 2 /* empty and deleted */
57
+ #define EA_INCREASE_RATIO 6 / 5 + 6
58
+ #define EA_MAX_INCREASE UINT16_MAX
59
+ #define EA_MAX_CAPA U32(lesser(IB_MAX_CAPA - EA_N_RESERVED_INDICES, MRB_INT_MAX))
60
+ #define IB_MAX_CAPA (U32(1) << IB_MAX_BIT)
61
+ #define IB_TYPE_BIT 32
62
+ #define IB_INIT_BIT ( \
63
+ ib_upper_bound_for(32) <= AR_MAX_SIZE ? 6 : \
64
+ ib_upper_bound_for(16) <= AR_MAX_SIZE ? 5 : \
65
+ 4 \
66
+ )
67
+ #define IB_MAX_BIT (IB_TYPE_BIT - 1)
68
+ #define AR_DEFAULT_CAPA 4
69
+ #define AR_MAX_SIZE 16
70
+ #define H_MAX_SIZE EA_MAX_CAPA
71
+
72
+ mrb_static_assert1(offsetof(struct RHash, iv) == offsetof(struct RObject, iv));
73
+ mrb_static_assert1(AR_MAX_SIZE < (1 << MRB_HASH_AR_EA_CAPA_BIT));
74
+
75
+ typedef struct hash_entry {
76
+ mrb_value key;
77
+ mrb_value val;
78
+ } hash_entry;
79
+
80
+ typedef struct hash_table {
81
+ hash_entry *ea;
82
+ #ifdef MRB_32BIT
83
+ uint32_t ea_capa;
84
+ uint32_t ea_n_used;
85
+ #endif
86
+ uint32_t ib[];
87
+ } hash_table;
88
+
89
+ typedef struct index_buckets_iter {
90
+ struct RHash *h;
91
+ uint32_t bit;
92
+ uint32_t mask;
93
+ uint32_t pos;
94
+ uint32_t ary_index;
95
+ uint32_t ea_index;
96
+ uint32_t shift1;
97
+ uint32_t shift2;
98
+ uint32_t step;
99
+ } index_buckets_iter;
100
+
101
+ /*
102
+ * `c_` :: receiver class (category)
103
+ * `n_` :: attribute name
104
+ * `t_` :: attribute type
105
+ * `p_` :: struct member path
106
+ * `k_` :: macro key
107
+ */
108
+ #define DEFINE_GETTER(c_, n_, t_, p_) \
109
+ MRB_INLINE t_ c_##_##n_(const struct RHash *h) {return h->p_;}
110
+ #define DEFINE_SETTER(c_, n_, t_, p_) \
111
+ MRB_INLINE void c_##_set_##n_(struct RHash *h, t_ v) {h->p_ = v;}
112
+ #define DEFINE_ACCESSOR(c_, n_, t_, p_) \
113
+ DEFINE_GETTER(c_, n_, t_, p_) \
114
+ DEFINE_SETTER(c_, n_, t_, p_)
115
+ #define DEFINE_FLAG_GETTER(c_, n_, t_, k_) \
116
+ MRB_INLINE t_ c_##_##n_(const struct RHash *h) { \
117
+ return (t_)((h->flags & MRB_HASH_##k_##_MASK) >> MRB_HASH_##k_##_SHIFT); \
118
+ }
119
+ #define DEFINE_FLAG_SETTER(c_, n_, t_, k_) \
120
+ MRB_INLINE void c_##_set_##n_(struct RHash *h, t_ v) { \
121
+ h->flags &= ~MRB_HASH_##k_##_MASK; \
122
+ h->flags |= v << MRB_HASH_##k_##_SHIFT; \
123
+ }
124
+ #define DEFINE_FLAG_ACCESSOR(c_, n_, t_, k_) \
125
+ DEFINE_FLAG_GETTER(c_, n_, t_, k_) \
126
+ DEFINE_FLAG_SETTER(c_, n_, t_, k_)
127
+ #define DEFINE_INCREMENTER(c_, n_) \
128
+ MRB_INLINE void c_##_inc_##n_(struct RHash *h) { \
129
+ c_##_set_##n_(h, c_##_##n_(h) + 1); \
130
+ }
131
+ #define DEFINE_DECREMENTER(c_, n_) \
132
+ MRB_INLINE void c_##_dec_##n_(struct RHash *h) { \
133
+ c_##_set_##n_(h, c_##_##n_(h) - 1); \
134
+ }
135
+ #define DEFINE_SWITCHER(n_, k_) \
136
+ MRB_INLINE void h_##n_##_on(struct RHash *h) { \
137
+ h->flags |= MRB_HASH_##k_; \
138
+ } \
139
+ MRB_INLINE void h_##n_##_off(struct RHash *h) { \
140
+ h->flags &= ~MRB_HASH_##k_; \
141
+ } \
142
+ MRB_INLINE mrb_bool h_##n_##_p(const struct RHash *h) { \
143
+ return (h->flags & MRB_HASH_##k_) == MRB_HASH_##k_; \
144
+ }
145
+
146
+ #ifdef MRB_64BIT
147
+ DEFINE_ACCESSOR(ar, ea_capa, uint32_t, ea_capa)
148
+ DEFINE_ACCESSOR(ar, ea_n_used, uint32_t, ea_n_used)
149
+ DEFINE_ACCESSOR(ht, ea_capa, uint32_t, ea_capa)
150
+ DEFINE_ACCESSOR(ht, ea_n_used, uint32_t, ea_n_used)
151
+ #else
152
+ DEFINE_FLAG_ACCESSOR(ar, ea_capa, uint32_t, AR_EA_CAPA)
153
+ DEFINE_FLAG_ACCESSOR(ar, ea_n_used, uint32_t, AR_EA_N_USED)
154
+ DEFINE_ACCESSOR(ht, ea_capa, uint32_t, ht->ea_capa)
155
+ DEFINE_ACCESSOR(ht, ea_n_used, uint32_t, ht->ea_n_used)
17
156
  #endif
157
+ DEFINE_FLAG_ACCESSOR(ib, bit, uint32_t, IB_BIT)
158
+ DEFINE_ACCESSOR(ar, size, uint32_t, size)
159
+ DEFINE_ACCESSOR(ar, ea, hash_entry*, ea)
160
+ DEFINE_DECREMENTER(ar, size)
161
+ DEFINE_ACCESSOR(ht, size, uint32_t, size)
162
+ DEFINE_ACCESSOR(ht, ea, hash_entry*, ht->ea)
163
+ DEFINE_GETTER(ht, ib, uint32_t*, ht->ib)
164
+ DEFINE_INCREMENTER(ht, size)
165
+ DEFINE_DECREMENTER(ht, size)
166
+ DEFINE_GETTER(h, size, uint32_t, size)
167
+ DEFINE_ACCESSOR(h, ht, hash_table*, ht)
168
+ DEFINE_SWITCHER(ht, HT)
169
+
170
+ #define ea_each_used(ea, n_used, entry_var, code) do { \
171
+ hash_entry *entry_var = ea, *ea_end__ = entry_var + (n_used); \
172
+ for (; entry_var < ea_end__; ++entry_var) { \
173
+ code; \
174
+ } \
175
+ } while (0)
176
+
177
+ #define ea_each(ea, size, entry_var, code) do { \
178
+ hash_entry *entry_var = ea; \
179
+ uint32_t size__ = size; \
180
+ for (; 0 < size__; ++entry_var) { \
181
+ if (entry_deleted_p(entry_var)) continue; \
182
+ --size__; \
183
+ code; \
184
+ } \
185
+ } while (0)
186
+
187
+ #define ib_cycle_by_key(mrb, h, key, it_var, code) do { \
188
+ index_buckets_iter it_var[1]; \
189
+ ib_it_init(mrb, it_var, h, key); \
190
+ for (;;) { \
191
+ ib_it_next(it_var); \
192
+ code; \
193
+ } \
194
+ } while (0)
195
+
196
+ #define ib_find_by_key(mrb, h_, key_, it_var, code) do { \
197
+ mrb_value ib_fbk_key__ = key_; \
198
+ ib_cycle_by_key(mrb, h_, ib_fbk_key__, it_var, { \
199
+ if (ib_it_empty_p(it_var)) break; \
200
+ if (ib_it_deleted_p(it_var)) continue; \
201
+ if (obj_eql(mrb, ib_fbk_key__, ib_it_entry(it_var)->key, it_var->h)) { \
202
+ code; \
203
+ break; \
204
+ } \
205
+ }); \
206
+ } while (0)
207
+
208
+ #define h_each(h, entry_var, code) do { \
209
+ struct RHash *h__ = h; \
210
+ hash_entry *h_e_ea__; \
211
+ uint32_t h_e_size__; \
212
+ h_ar_p(h) ? (h_e_ea__ = ar_ea(h__), h_e_size__ = ar_size(h__)) : \
213
+ (h_e_ea__ = ht_ea(h__), h_e_size__ = ht_size(h__)); \
214
+ ea_each(h_e_ea__, h_e_size__, entry_var, code); \
215
+ } while (0)
18
216
 
19
- #ifndef MRB_HT_INIT_SIZE
20
- #define MRB_HT_INIT_SIZE 4
217
+ /*
218
+ * `h_check_modified` raises an exception when a dangerous modification is
219
+ * made to `h` by executing `code`.
220
+ *
221
+ * This macro is not called if `h->ht` (`h->ea`) is `NULL` (`Hash` size is
222
+ * zero). And because the `hash_entry` is rather large, `h->ht->ea` and
223
+ * `h->ht->ea_capa` are able to be safely accessed even in AR. This nature
224
+ * is used to eliminate branch of AR or HT.
225
+ *
226
+ * `HT_ASSERT_SAFE_READ` checks if members can be accessed according to its
227
+ * assumptions.
228
+ */
229
+ #define HT_ASSERT_SAFE_READ(attr_name) \
230
+ mrb_static_assert1( \
231
+ offsetof(hash_table, attr_name) + sizeof(((hash_table*)0)->attr_name) <= \
232
+ sizeof(hash_entry))
233
+ HT_ASSERT_SAFE_READ(ea);
234
+ #ifdef MRB_32BIT
235
+ HT_ASSERT_SAFE_READ(ea_capa);
21
236
  #endif
22
- #define HT_SEG_INCREASE_RATIO 6 / 5
237
+ #undef HT_ASSERT_SAFE_READ
238
+ #define h_check_modified(mrb, h, code) do { \
239
+ struct RHash *h__ = h; \
240
+ uint32_t mask = MRB_HASH_HT|MRB_HASH_IB_BIT_MASK|MRB_HASH_AR_EA_CAPA_MASK; \
241
+ uint32_t flags = h__->flags & mask; \
242
+ void* tbl__ = (mrb_assert(h__->ht), h__->ht); \
243
+ uint32_t ht_ea_capa__ = ht_ea_capa(h__); \
244
+ hash_entry *ht_ea__ = ht_ea(h__); \
245
+ code; \
246
+ if (flags != (h__->flags & mask) || \
247
+ tbl__ != h__->ht || \
248
+ ht_ea_capa__ != ht_ea_capa(h__) || \
249
+ ht_ea__ != ht_ea(h__)) { \
250
+ mrb_raise(mrb, E_RUNTIME_ERROR, "hash modified"); \
251
+ } \
252
+ } while (0)
23
253
 
24
- struct segkv {
25
- mrb_value key;
26
- mrb_value val;
27
- };
28
-
29
- typedef struct segment {
30
- uint16_t size;
31
- struct segment *next;
32
- struct segkv e[];
33
- } segment;
34
-
35
- typedef struct segindex {
36
- size_t size;
37
- size_t capa;
38
- struct segkv *table[];
39
- } segindex;
40
-
41
- /* hash table structure */
42
- typedef struct htable {
43
- segment *rootseg;
44
- segment *lastseg;
45
- mrb_int size;
46
- uint16_t last_len;
47
- segindex *index;
48
- } htable;
49
-
50
- static /* inline */ size_t
51
- ht_hash_func(mrb_state *mrb, htable *t, mrb_value key)
254
+ #define U32(v) ((uint32_t)(v))
255
+ #define h_ar_p(h) (!h_ht_p(h))
256
+ #define h_ar_on(h) h_ht_off(h)
257
+ #define lesser(a, b) ((a) < (b) ? (a) : (b))
258
+ #define RHASH_IFNONE(hash) mrb_iv_get(mrb, (hash), MRB_SYM(ifnone))
259
+ #define RHASH_PROCDEFAULT(hash) RHASH_IFNONE(hash)
260
+
261
+ static uint32_t ib_upper_bound_for(uint32_t capa);
262
+ static uint32_t ib_bit_to_capa(uint32_t bit);
263
+ static void ht_init(
264
+ mrb_state *mrb, struct RHash *h, uint32_t size,
265
+ hash_entry *ea, uint32_t ea_capa, hash_table *ht, uint32_t ib_bit);
266
+ static void ht_set_without_ib_adjustment(
267
+ mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value val);
268
+
269
+ static uint32_t
270
+ next_power2(uint32_t v)
52
271
  {
53
- enum mrb_vtype tt = mrb_type(key);
54
- mrb_value hv;
55
- size_t h;
56
- segindex *index = t->index;
57
- size_t capa = index ? index->capa : 0;
272
+ mrb_assert(v != 0);
273
+ #ifdef __GNUC__
274
+ return U32(1) << ((sizeof(unsigned) * CHAR_BIT) - __builtin_clz(v));
275
+ #else
276
+ v |= v >> 1;
277
+ v |= v >> 2;
278
+ v |= v >> 4;
279
+ v |= v >> 8;
280
+ v |= v >> 16;
281
+ ++v;
282
+ return v;
283
+ #endif
284
+ }
58
285
 
286
+ static uint32_t
287
+ obj_hash_code(mrb_state *mrb, mrb_value key, struct RHash *h)
288
+ {
289
+ enum mrb_vtype tt = mrb_type(key);
290
+ uint32_t hash_code;
291
+ mrb_value hash_code_obj;
59
292
  switch (tt) {
60
293
  case MRB_TT_STRING:
61
- h = mrb_str_hash(mrb, key);
294
+ hash_code = mrb_str_hash(mrb, key);
62
295
  break;
63
-
64
296
  case MRB_TT_TRUE:
65
297
  case MRB_TT_FALSE:
66
298
  case MRB_TT_SYMBOL:
67
- case MRB_TT_FIXNUM:
68
- #ifndef MRB_WITHOUT_FLOAT
299
+ case MRB_TT_INTEGER:
300
+ #ifndef MRB_NO_FLOAT
69
301
  case MRB_TT_FLOAT:
70
302
  #endif
71
- h = (size_t)mrb_obj_id(key);
303
+ hash_code = U32(mrb_obj_id(key));
72
304
  break;
73
-
74
305
  default:
75
- hv = mrb_funcall(mrb, key, "hash", 0);
76
- h = (size_t)t ^ (size_t)mrb_fixnum(hv);
306
+ h_check_modified(mrb, h, {
307
+ hash_code_obj = mrb_funcall_argv(mrb, key, MRB_SYM(hash), 0, NULL);
308
+ });
309
+
310
+ hash_code = U32(tt) ^ U32(mrb_integer(hash_code_obj));
77
311
  break;
78
312
  }
79
- if (index && (index != t->index || capa != index->capa)) {
80
- mrb_raise(mrb, E_RUNTIME_ERROR, "hash modified");
81
- }
82
- return ((h)^((h)<<2)^((h)>>2));
313
+ return hash_code ^ (hash_code << 2) ^ (hash_code >> 2);
83
314
  }
84
315
 
85
- static inline mrb_bool
86
- ht_hash_equal(mrb_state *mrb, htable *t, mrb_value a, mrb_value b)
316
+ static mrb_bool
317
+ obj_eql(mrb_state *mrb, mrb_value a, mrb_value b, struct RHash *h)
87
318
  {
88
319
  enum mrb_vtype tt = mrb_type(a);
320
+ mrb_bool eql;
89
321
 
90
322
  switch (tt) {
91
323
  case MRB_TT_STRING:
@@ -95,611 +327,848 @@ ht_hash_equal(mrb_state *mrb, htable *t, mrb_value a, mrb_value b)
95
327
  if (!mrb_symbol_p(b)) return FALSE;
96
328
  return mrb_symbol(a) == mrb_symbol(b);
97
329
 
98
- case MRB_TT_FIXNUM:
99
- switch (mrb_type(b)) {
100
- case MRB_TT_FIXNUM:
101
- return mrb_fixnum(a) == mrb_fixnum(b);
102
- #ifndef MRB_WITHOUT_FLOAT
103
- case MRB_TT_FLOAT:
104
- return (mrb_float)mrb_fixnum(a) == mrb_float(b);
105
- #endif
106
- default:
107
- return FALSE;
108
- }
330
+ case MRB_TT_INTEGER:
331
+ if (!mrb_integer_p(b)) return FALSE;
332
+ return mrb_integer(a) == mrb_integer(b);
109
333
 
110
- #ifndef MRB_WITHOUT_FLOAT
334
+ #ifndef MRB_NO_FLOAT
111
335
  case MRB_TT_FLOAT:
112
- switch (mrb_type(b)) {
113
- case MRB_TT_FIXNUM:
114
- return mrb_float(a) == (mrb_float)mrb_fixnum(b);
115
- case MRB_TT_FLOAT:
116
- return mrb_float(a) == mrb_float(b);
117
- default:
118
- return FALSE;
119
- }
336
+ if (!mrb_float_p(b)) return FALSE;
337
+ return mrb_float(a) == mrb_float(b);
120
338
  #endif
121
339
 
122
340
  default:
123
- {
124
- segindex *index = t->index;
125
- size_t capa = index ? index->capa : 0;
126
- mrb_bool eql = mrb_eql(mrb, a, b);
127
- if (index && (index != t->index || capa != index->capa)) {
128
- mrb_raise(mrb, E_RUNTIME_ERROR, "hash modified");
129
- }
130
- return eql;
131
- }
132
- }
341
+ h_check_modified(mrb, h, {eql = mrb_eql(mrb, a, b);});
342
+ return eql;
343
+ }
133
344
  }
134
345
 
135
- /* Creates the hash table. */
136
- static htable*
137
- ht_new(mrb_state *mrb)
346
+ static mrb_bool
347
+ entry_deleted_p(const hash_entry* entry)
138
348
  {
139
- htable *t;
349
+ return mrb_undef_p(entry->key);
350
+ }
140
351
 
141
- t = (htable*)mrb_malloc(mrb, sizeof(htable));
142
- t->size = 0;
143
- t->rootseg = NULL;
144
- t->lastseg = NULL;
145
- t->last_len = 0;
146
- t->index = NULL;
352
+ static void
353
+ entry_delete(hash_entry* entry)
354
+ {
355
+ entry->key = mrb_undef_value();
356
+ }
147
357
 
148
- return t;
358
+ static uint32_t
359
+ ea_next_capa_for(uint32_t size, uint32_t max_capa)
360
+ {
361
+ if (size < AR_DEFAULT_CAPA) {
362
+ return AR_DEFAULT_CAPA;
363
+ }
364
+ else {
365
+ /*
366
+ * For 32-bit CPU, the theoretical value of maximum EA capacity is
367
+ * `UINT32_MAX / sizeof (hash_entry)`. At this time, if
368
+ * `EA_INCREASE_RATIO` is the current value, 32-bit range will not be
369
+ * exceeded during the calculation of `capa`, so `size_t` is used.
370
+ */
371
+ size_t capa = (size_t)size * EA_INCREASE_RATIO, inc = capa - size;
372
+ if (EA_MAX_INCREASE < inc) capa = size + EA_MAX_INCREASE;
373
+ return capa <= max_capa ? U32(capa) : max_capa;
374
+ }
149
375
  }
150
376
 
151
- #define power2(v) do { \
152
- v--;\
153
- v |= v >> 1;\
154
- v |= v >> 2;\
155
- v |= v >> 4;\
156
- v |= v >> 8;\
157
- v |= v >> 16;\
158
- v++;\
159
- } while (0)
377
+ static hash_entry*
378
+ ea_resize(mrb_state *mrb, hash_entry *ea, uint32_t capa)
379
+ {
380
+ return (hash_entry*)mrb_realloc(mrb, ea, sizeof(hash_entry) * capa);
381
+ }
160
382
 
161
- #ifndef UPPER_BOUND
162
- #define UPPER_BOUND(x) ((x)>>2|(x)>>1)
163
- #endif
383
+ static void
384
+ ea_compress(hash_entry *ea, uint32_t n_used)
385
+ {
386
+ hash_entry *w_entry = ea;
387
+ ea_each_used(ea, n_used, r_entry, {
388
+ if (entry_deleted_p(r_entry)) continue;
389
+ if (r_entry != w_entry) *w_entry = *r_entry;
390
+ ++w_entry;
391
+ });
392
+ }
393
+
394
+ /*
395
+ * Increase or decrease capacity of `ea` to a standard size that can
396
+ * accommodate `*capap + 1` entries (but, not exceed `max_capa`). Set the
397
+ * changed capacity to `*capap` and return a pointer to `mrb_realloc`ed EA.
398
+ */
399
+ static hash_entry*
400
+ ea_adjust(mrb_state *mrb, hash_entry *ea, uint32_t *capap, uint32_t max_capa)
401
+ {
402
+ *capap = ea_next_capa_for(*capap, max_capa);
403
+ return ea_resize(mrb, ea, *capap);
404
+ }
164
405
 
165
- #define HT_MASK(index) ((index->capa)-1)
406
+ static hash_entry*
407
+ ea_dup(mrb_state *mrb, const hash_entry *ea, uint32_t capa)
408
+ {
409
+ size_t byte_size = sizeof(hash_entry) * capa;
410
+ hash_entry *new_ea = (hash_entry*)mrb_malloc(mrb, byte_size);
411
+ return (hash_entry*)memcpy(new_ea, ea, byte_size);
412
+ }
413
+
414
+ static hash_entry*
415
+ ea_get_by_key(mrb_state *mrb, hash_entry *ea, uint32_t size, mrb_value key,
416
+ struct RHash *h)
417
+ {
418
+ ea_each(ea, size, entry, {
419
+ if (obj_eql(mrb, key, entry->key, h)) return entry;
420
+ });
421
+ return NULL;
422
+ }
423
+
424
+ static hash_entry*
425
+ ea_get(hash_entry *ea, uint32_t index)
426
+ {
427
+ return &ea[index];
428
+ }
166
429
 
167
- /* Build index for the hash table */
168
430
  static void
169
- ht_index(mrb_state *mrb, htable *t)
431
+ ea_set(hash_entry *ea, uint32_t index, mrb_value key, mrb_value val)
170
432
  {
171
- size_t size = (size_t)t->size;
172
- size_t mask;
173
- segindex *index = t->index;
174
- segment *seg;
175
- size_t i;
433
+ ea[index].key = key;
434
+ ea[index].val = val;
435
+ }
176
436
 
177
- /* allocate index table */
178
- if (index && index->size >= UPPER_BOUND(index->capa)) {
179
- size = index->capa+1;
180
- }
181
- power2(size);
182
- if (!index || index->capa < size) {
183
- index = (segindex*)mrb_realloc_simple(mrb, index, sizeof(segindex)+sizeof(struct segkv*)*size);
184
- if (index == NULL) {
185
- mrb_free(mrb, t->index);
186
- t->index = NULL;
187
- return;
188
- }
189
- t->index = index;
190
- }
191
- index->size = t->size;
192
- index->capa = size;
193
- for (i=0; i<size; i++) {
194
- index->table[i] = NULL;
195
- }
437
+ static void
438
+ ar_init(struct RHash *h, uint32_t size,
439
+ hash_entry *ea, uint32_t ea_capa, uint32_t ea_n_used)
440
+ {
441
+ h_ar_on(h);
442
+ ar_set_size(h, size);
443
+ ar_set_ea(h, ea);
444
+ ar_set_ea_capa(h, ea_capa);
445
+ ar_set_ea_n_used(h, ea_n_used);
446
+ }
196
447
 
197
- /* rebuld index */
198
- mask = HT_MASK(index);
199
- seg = t->rootseg;
200
- while (seg) {
201
- for (i=0; i<seg->size; i++) {
202
- mrb_value key;
203
- size_t k, step = 0;
448
+ static void
449
+ ar_free(mrb_state *mrb, struct RHash *h)
450
+ {
451
+ mrb_free(mrb, ar_ea(h));
452
+ }
204
453
 
205
- if (!seg->next && i >= (size_t)t->last_len) {
206
- return;
207
- }
208
- key = seg->e[i].key;
209
- if (mrb_undef_p(key)) continue;
210
- k = ht_hash_func(mrb, t, key) & mask;
211
- while (index->table[k]) {
212
- k = (k+(++step)) & mask;
213
- }
214
- index->table[k] = &seg->e[i];
215
- }
216
- seg = seg->next;
217
- }
454
+ static void
455
+ ar_adjust_ea(mrb_state *mrb, struct RHash *h, uint32_t size, uint32_t max_ea_capa)
456
+ {
457
+ uint32_t ea_capa = size;
458
+ hash_entry *ea = ea_adjust(mrb, ar_ea(h), &ea_capa, max_ea_capa);
459
+ ar_set_ea(h, ea);
460
+ ar_set_ea_capa(h, ea_capa);
218
461
  }
219
462
 
220
- /* Compacts the hash table removing deleted entries. */
221
463
  static void
222
- ht_compact(mrb_state *mrb, htable *t)
223
- {
224
- segment *seg;
225
- mrb_int i;
226
- segment *seg2 = NULL;
227
- mrb_int i2;
228
- mrb_int size = 0;
229
-
230
- if (t == NULL) return;
231
- seg = t->rootseg;
232
- if (t->index && (size_t)t->size == t->index->size) {
233
- ht_index(mrb, t);
234
- return;
235
- }
236
- while (seg) {
237
- for (i=0; i<seg->size; i++) {
238
- mrb_value k = seg->e[i].key;
464
+ ar_compress(mrb_state *mrb, struct RHash *h)
465
+ {
466
+ uint32_t size = ar_size(h);
467
+ ea_compress(ar_ea(h), ar_ea_n_used(h));
468
+ ar_set_ea_n_used(h, size);
469
+ ar_adjust_ea(mrb, h, size, lesser(ar_ea_capa(h), AR_MAX_SIZE));
470
+ }
239
471
 
240
- if (!seg->next && i >= t->last_len) {
241
- goto exit;
242
- }
243
- if (mrb_undef_p(k)) { /* found deleted key */
244
- if (seg2 == NULL) {
245
- seg2 = seg;
246
- i2 = i;
472
+ static mrb_bool
473
+ ar_get(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value *valp)
474
+ {
475
+ ea_each(ar_ea(h), ar_size(h), entry, {
476
+ if (!obj_eql(mrb, key, entry->key, h)) continue;
477
+ *valp = entry->val;
478
+ return TRUE;
479
+ });
480
+ return FALSE;
481
+ }
482
+
483
+ static void
484
+ ar_set(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value val)
485
+ {
486
+ uint32_t size = ar_size(h);
487
+ hash_entry *entry;
488
+ if ((entry = ea_get_by_key(mrb, ar_ea(h), size, key, h))) {
489
+ entry->val = val;
490
+ }
491
+ else {
492
+ uint32_t ea_capa = ar_ea_capa(h), ea_n_used = ar_ea_n_used(h);
493
+ if (ea_capa == ea_n_used) {
494
+ if (size == ea_n_used) {
495
+ if (size == AR_MAX_SIZE) {
496
+ hash_entry *ea = ea_adjust(mrb, ar_ea(h), &ea_capa, EA_MAX_CAPA);
497
+ ea_set(ea, ea_n_used, key, val);
498
+ ht_init(mrb, h, ++size, ea, ea_capa, NULL, IB_INIT_BIT);
499
+ return;
500
+ }
501
+ else {
502
+ ar_adjust_ea(mrb, h, size, AR_MAX_SIZE);
247
503
  }
248
504
  }
249
505
  else {
250
- size++;
251
- if (seg2 != NULL) {
252
- seg2->e[i2++] = seg->e[i];
253
- if (i2 >= seg2->size) {
254
- seg2 = seg2->next;
255
- i2 = 0;
256
- }
257
- }
506
+ ar_compress(mrb, h);
507
+ ea_n_used = size;
258
508
  }
259
509
  }
260
- seg = seg->next;
510
+ ea_set(ar_ea(h), ea_n_used, key, val);
511
+ ar_set_size(h, ++size);
512
+ ar_set_ea_n_used(h, ++ea_n_used);
261
513
  }
262
- exit:
263
- /* reached at end */
264
- t->size = size;
265
- if (seg2) {
266
- seg = seg2->next;
267
- seg2->next = NULL;
268
- t->last_len = i2;
269
- t->lastseg = seg2;
270
- while (seg) {
271
- seg2 = seg->next;
272
- mrb_free(mrb, seg);
273
- seg = seg2;
514
+ }
515
+
516
+ static mrb_bool
517
+ ar_delete(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value *valp)
518
+ {
519
+ hash_entry *entry = ea_get_by_key(mrb, ar_ea(h), ar_size(h), key, h);
520
+ if (!entry) return FALSE;
521
+ *valp = entry->val;
522
+ entry_delete(entry);
523
+ ar_dec_size(h);
524
+ return TRUE;
525
+ }
526
+
527
+ static void
528
+ ar_shift(mrb_state *mrb, struct RHash *h, mrb_value *keyp, mrb_value *valp)
529
+ {
530
+ uint32_t size = ar_size(h);
531
+ ea_each(ar_ea(h), size, entry, {
532
+ *keyp = entry->key;
533
+ *valp = entry->val;
534
+ entry_delete(entry);
535
+ ar_set_size(h, --size);
536
+ return;
537
+ });
538
+ }
539
+
540
+ static void
541
+ ar_rehash(mrb_state *mrb, struct RHash *h)
542
+ {
543
+ /* see comments in `h_rehash` */
544
+ uint32_t size = ar_size(h), w_size = 0, ea_capa = ar_ea_capa(h);
545
+ hash_entry *ea = ar_ea(h), *w_entry;
546
+ ea_each(ea, size, r_entry, {
547
+ if ((w_entry = ea_get_by_key(mrb, ea, w_size, r_entry->key, h))) {
548
+ w_entry->val = r_entry->val;
549
+ ar_set_size(h, --size);
550
+ entry_delete(r_entry);
274
551
  }
275
- }
276
- if (t->index) {
277
- ht_index(mrb, t);
278
- }
552
+ else {
553
+ if (w_size != U32(r_entry - ea)) {
554
+ ea_set(ea, w_size, r_entry->key, r_entry->val);
555
+ entry_delete(r_entry);
556
+ }
557
+ ++w_size;
558
+ }
559
+ });
560
+ mrb_assert(size == w_size);
561
+ ar_set_ea_n_used(h, size);
562
+ ar_adjust_ea(mrb, h, size, ea_capa);
279
563
  }
280
564
 
281
- static segment*
282
- segment_alloc(mrb_state *mrb, segment *seg)
565
+ static uint32_t
566
+ ib_it_pos_for(index_buckets_iter *it, uint32_t v)
283
567
  {
284
- uint32_t size;
568
+ return v & it->mask;
569
+ }
285
570
 
286
- if (!seg) size = MRB_HT_INIT_SIZE;
287
- else {
288
- size = seg->size*HT_SEG_INCREASE_RATIO + 1;
289
- if (size > UINT16_MAX) size = UINT16_MAX;
290
- }
571
+ static uint32_t
572
+ ib_it_empty_value(const index_buckets_iter *it)
573
+ {
574
+ return it->mask;
575
+ }
291
576
 
292
- seg = (segment*)mrb_malloc(mrb, sizeof(segment)+sizeof(struct segkv)*size);
293
- seg->size = size;
294
- seg->next = NULL;
577
+ static uint32_t
578
+ ib_it_deleted_value(const index_buckets_iter *it)
579
+ {
580
+ return it->mask - 1;
581
+ }
295
582
 
296
- return seg;
583
+ static mrb_bool
584
+ ib_it_empty_p(const index_buckets_iter *it)
585
+ {
586
+ return it->ea_index == ib_it_empty_value(it);
587
+ }
588
+
589
+ static mrb_bool
590
+ ib_it_deleted_p(const index_buckets_iter *it)
591
+ {
592
+ return it->ea_index == ib_it_deleted_value(it);
593
+ }
594
+
595
+ static mrb_bool
596
+ ib_it_active_p(const index_buckets_iter *it)
597
+ {
598
+ return it->ea_index < ib_it_deleted_value(it);
297
599
  }
298
600
 
299
- /* Set the value for the key in the indexed table. */
300
601
  static void
301
- ht_index_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
602
+ ib_it_init(mrb_state *mrb, index_buckets_iter *it, struct RHash *h, mrb_value key)
302
603
  {
303
- segindex *index = t->index;
304
- size_t k, sp, step = 0, mask;
305
- segment *seg;
604
+ it->h = h;
605
+ it->bit = ib_bit(h);
606
+ it->mask = ib_bit_to_capa(it->bit) - 1;
607
+ it->pos = ib_it_pos_for(it, obj_hash_code(mrb, key, h));
608
+ it->step = 0;
609
+ }
306
610
 
307
- if (index->size >= UPPER_BOUND(index->capa)) {
308
- /* need to expand table */
309
- ht_compact(mrb, t);
310
- index = t->index;
311
- }
312
- mask = HT_MASK(index);
313
- sp = index->capa;
314
- k = ht_hash_func(mrb, t, key) & mask;
315
- while (index->table[k]) {
316
- mrb_value key2 = index->table[k]->key;
317
- if (mrb_undef_p(key2)) {
318
- if (sp == index->capa) sp = k;
319
- }
320
- else if (ht_hash_equal(mrb, t, key, key2)) {
321
- index->table[k]->val = val;
322
- return;
323
- }
324
- k = (k+(++step)) & mask;
611
+ static void
612
+ ib_it_next(index_buckets_iter *it)
613
+ {
614
+ /*
615
+ * [IB image]
616
+ *
617
+ * ary_index(1) --.
618
+ * \ .-- shift1(3) .-- shift2(29)
619
+ * pos(6) --. \ / /
620
+ * View | \ \ <-o-> <----------o---------->
621
+ * -------- +---------------------\----\--+-----------------------------+-----
622
+ * array | 0 `--. `-|--- o 1 | ...
623
+ * +---------+---------+-----+\--+-----+---------+---------+---+-----
624
+ * buckets | 0 | 1 | ... | o 6 | 7 | 8 | ...
625
+ * +---------+---------+-----+=========+---------+---------+---------
626
+ * bit set |1 1 1 0 0|0 0 0 1 1| ... |0 1 0 1 1|0 1 1 1 0|0 1 0 1 0| ...
627
+ * +---------+---------+-----+========*+---------+---------+---------
628
+ * <---o---> \
629
+ * \ `-- bit_pos(34)
630
+ * `-- bit(5)
631
+ */
632
+
633
+ /* Slide to handle as `capa == 32` to avoid 64-bit operations */
634
+ uint32_t slid_pos = it->pos & (IB_TYPE_BIT - 1);
635
+ uint32_t slid_bit_pos = it->bit * (slid_pos + 1) - 1;
636
+ uint32_t slid_ary_index = slid_bit_pos / IB_TYPE_BIT;
637
+ it->ary_index = slid_ary_index + it->pos / IB_TYPE_BIT * it->bit;
638
+ it->shift2 = (slid_ary_index + 1) * IB_TYPE_BIT - slid_bit_pos - 1;
639
+ it->ea_index = (ht_ib(it->h)[it->ary_index] >> it->shift2) & it->mask;
640
+ if (IB_TYPE_BIT - it->bit < it->shift2) {
641
+ it->shift1 = IB_TYPE_BIT - it->shift2;
642
+ it->ea_index |= (ht_ib(it->h)[it->ary_index - 1] << it->shift1) & it->mask;
325
643
  }
326
- if (sp < index->capa) {
327
- k = sp;
644
+ else {
645
+ it->shift1 = 0;
328
646
  }
647
+ it->pos = ib_it_pos_for(it, it->pos + (++it->step));
648
+ }
329
649
 
330
- /* put the value at the last */
331
- seg = t->lastseg;
332
- if (t->last_len < seg->size) {
333
- index->table[k] = &seg->e[t->last_len++];
334
- }
335
- else { /* append a new segment */
336
- seg->next = segment_alloc(mrb, seg);
337
- seg = seg->next;
338
- seg->next = NULL;
339
- t->lastseg = seg;
340
- t->last_len = 1;
341
- index->table[k] = &seg->e[0];
650
+ static uint32_t
651
+ ib_it_get(const index_buckets_iter *it)
652
+ {
653
+ return it->ea_index;
654
+ }
655
+
656
+ static void
657
+ ib_it_set(index_buckets_iter *it, uint32_t ea_index)
658
+ {
659
+ uint32_t mask, i;
660
+ it->ea_index = ea_index;
661
+ if (it->shift1) {
662
+ i = it->ary_index - 1;
663
+ mask = it->mask >> it->shift1;
664
+ ht_ib(it->h)[i] = (ht_ib(it->h)[i] & ~mask) | (ea_index >> it->shift1);
342
665
  }
343
- index->table[k]->key = key;
344
- index->table[k]->val = val;
345
- index->size++;
346
- t->size++;
666
+ i = it->ary_index;
667
+ mask = it->mask << it->shift2;
668
+ ht_ib(it->h)[i] = (ht_ib(it->h)[i] & ~mask) | (ea_index << it->shift2);
347
669
  }
348
670
 
349
- /* Set the value for the key in the hash table. */
350
671
  static void
351
- ht_put(mrb_state *mrb, htable *t, mrb_value key, mrb_value val)
672
+ ib_it_delete(index_buckets_iter *it)
352
673
  {
353
- segment *seg;
354
- mrb_int i, deleted = 0;
674
+ ib_it_set(it, ib_it_deleted_value(it));
675
+ }
355
676
 
356
- if (t == NULL) return;
357
- if (t->index) {
358
- ht_index_put(mrb, t, key, val);
359
- return;
360
- }
361
- seg = t->rootseg;
362
- while (seg) {
363
- for (i=0; i<seg->size; i++) {
364
- mrb_value k = seg->e[i].key;
365
- /* Found room in last segment after last_len */
366
- if (!seg->next && i >= t->last_len) {
367
- seg->e[i].key = key;
368
- seg->e[i].val = val;
369
- t->last_len = i+1;
370
- t->size++;
371
- return;
372
- }
373
- if (mrb_undef_p(k)) {
374
- deleted++;
375
- continue;
376
- }
377
- if (ht_hash_equal(mrb, t, k, key)) {
378
- seg->e[i].val = val;
379
- return;
380
- }
381
- }
382
- seg = seg->next;
383
- }
384
- /* Not found */
677
+ static hash_entry*
678
+ ib_it_entry(index_buckets_iter *it)
679
+ {
680
+ return ea_get(ht_ea(it->h), it->ea_index);
681
+ }
385
682
 
386
- /* Compact if last segment has room */
387
- if (deleted > 0 && deleted > MRB_HT_INIT_SIZE) {
388
- ht_compact(mrb, t);
389
- }
390
- t->size++;
683
+ static uint32_t
684
+ ib_capa_to_bit(uint32_t capa)
685
+ {
686
+ #ifdef __GNUC__
687
+ return U32(__builtin_ctz(capa));
688
+ #else
689
+ /* http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn */
690
+ static const uint32_t MultiplyDeBruijnBitPosition2[] = {
691
+ 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
692
+ 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
693
+ };
694
+ return MultiplyDeBruijnBitPosition2[U32(capa * 0x077CB531U) >> 27];
695
+ #endif
696
+ }
391
697
 
392
- /* check if thre's room after compaction */
393
- if (t->lastseg && t->last_len < t->lastseg->size) {
394
- seg = t->lastseg;
395
- i = t->last_len;
396
- }
397
- else {
398
- /* append new segment */
399
- seg = segment_alloc(mrb, t->lastseg);
400
- i = 0;
401
- if (t->rootseg == NULL) {
402
- t->rootseg = seg;
403
- }
404
- else {
405
- t->lastseg->next = seg;
406
- }
407
- t->lastseg = seg;
408
- }
409
- seg->e[i].key = key;
410
- seg->e[i].val = val;
411
- t->last_len = i+1;
412
- if (t->index == NULL && t->size > MRB_HT_INIT_SIZE*4) {
413
- ht_index(mrb, t);
414
- }
698
+ static uint32_t
699
+ ib_bit_to_capa(uint32_t bit)
700
+ {
701
+ return U32(1) << bit;
415
702
  }
416
703
 
417
- /* Get a value for a key from the indexed table. */
418
- static mrb_bool
419
- ht_index_get(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp)
420
- {
421
- segindex *index = t->index;
422
- size_t mask = HT_MASK(index);
423
- size_t k = ht_hash_func(mrb, t, key) & mask;
424
- size_t step = 0;
425
-
426
- while (index->table[k]) {
427
- mrb_value key2 = index->table[k]->key;
428
- if (!mrb_undef_p(key2) && ht_hash_equal(mrb, t, key, key2)) {
429
- if (vp) *vp = index->table[k]->val;
430
- return TRUE;
431
- }
432
- k = (k+(++step)) & mask;
433
- }
434
- return FALSE;
704
+ static uint32_t
705
+ ib_upper_bound_for(uint32_t capa)
706
+ {
707
+ return (capa >> 2) | (capa >> 1); /* 3/4 */
435
708
  }
436
709
 
437
- /* Get a value for a key from the hash table. */
438
- static mrb_bool
439
- ht_get(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp)
710
+ static uint32_t
711
+ ib_bit_for(uint32_t size)
440
712
  {
441
- segment *seg;
442
- mrb_int i;
713
+ uint32_t capa = next_power2(size);
714
+ if (capa != IB_MAX_CAPA && ib_upper_bound_for(capa) < size) capa *= 2;
715
+ return ib_capa_to_bit(capa);
716
+ }
443
717
 
444
- if (t == NULL) return FALSE;
445
- if (t->index) {
446
- return ht_index_get(mrb, t, key, vp);
447
- }
718
+ static uint32_t
719
+ ib_byte_size_for(uint32_t ib_bit)
720
+ {
721
+ uint32_t ary_size = IB_INIT_BIT == 4 ?
722
+ ib_bit_to_capa(ib_bit) * 2 / IB_TYPE_BIT * ib_bit / 2 :
723
+ ib_bit_to_capa(ib_bit) / IB_TYPE_BIT * ib_bit;
724
+ return U32(sizeof(uint32_t) * ary_size);
725
+ }
448
726
 
449
- seg = t->rootseg;
450
- while (seg) {
451
- for (i=0; i<seg->size; i++) {
452
- mrb_value k = seg->e[i].key;
727
+ static void
728
+ ib_init(mrb_state *mrb, struct RHash *h, uint32_t ib_bit, size_t ib_byte_size)
729
+ {
730
+ hash_entry *ea = ht_ea(h);
731
+ memset(ht_ib(h), 0xff, ib_byte_size);
732
+ ib_set_bit(h, ib_bit);
733
+ ea_each_used(ea, ht_ea_n_used(h), entry, {
734
+ ib_cycle_by_key(mrb, h, entry->key, it, {
735
+ if (!ib_it_empty_p(it)) continue;
736
+ ib_it_set(it, U32(entry - ea));
737
+ break;
738
+ });
739
+ });
740
+ }
453
741
 
454
- if (!seg->next && i >= t->last_len) {
455
- return FALSE;
456
- }
457
- if (mrb_undef_p(k)) continue;
458
- if (ht_hash_equal(mrb, t, k, key)) {
459
- if (vp) *vp = seg->e[i].val;
460
- return TRUE;
461
- }
462
- }
463
- seg = seg->next;
464
- }
465
- return FALSE;
742
+ static void
743
+ ht_init(mrb_state *mrb, struct RHash *h, uint32_t size,
744
+ hash_entry *ea, uint32_t ea_capa, hash_table *ht, uint32_t ib_bit)
745
+ {
746
+ size_t ib_byte_size = ib_byte_size_for(ib_bit);
747
+ size_t ht_byte_size = sizeof(hash_table) + ib_byte_size;
748
+ h_ht_on(h);
749
+ h_set_ht(h, (hash_table*)mrb_realloc(mrb, ht, ht_byte_size));
750
+ ht_set_size(h, size);
751
+ ht_set_ea(h, ea);
752
+ ht_set_ea_capa(h, ea_capa);
753
+ ht_set_ea_n_used(h, size);
754
+ ib_init(mrb, h, ib_bit, ib_byte_size);
755
+ }
756
+
757
+ static void
758
+ ht_free(mrb_state *mrb, struct RHash *h)
759
+ {
760
+ mrb_free(mrb, ht_ea(h));
761
+ mrb_free(mrb, h_ht(h));
762
+ }
763
+
764
+ static hash_table*
765
+ ht_dup(mrb_state *mrb, const struct RHash *h)
766
+ {
767
+ size_t ib_byte_size = ib_byte_size_for(ib_bit(h));
768
+ size_t ht_byte_size = sizeof(hash_table) + ib_byte_size;
769
+ hash_table *new_ht = (hash_table*)mrb_malloc(mrb, ht_byte_size);
770
+ return (hash_table*)memcpy(new_ht, h_ht(h), ht_byte_size);
771
+ }
772
+
773
+ static void
774
+ ht_adjust_ea(mrb_state *mrb, struct RHash *h, uint32_t size, uint32_t max_ea_capa)
775
+ {
776
+ uint32_t ea_capa = size;
777
+ hash_entry *ea = ea_adjust(mrb, ht_ea(h), &ea_capa, max_ea_capa);
778
+ ht_set_ea(h, ea);
779
+ ht_set_ea_capa(h, ea_capa);
780
+ }
781
+
782
+ static void
783
+ ht_to_ar(mrb_state *mrb, struct RHash *h)
784
+ {
785
+ uint32_t size = ht_size(h), ea_capa = size;
786
+ hash_entry *ea = ht_ea(h);
787
+ ea_compress(ea, ht_ea_n_used(h));
788
+ ea = ea_adjust(mrb, ea, &ea_capa, AR_MAX_SIZE);
789
+ mrb_free(mrb, h_ht(h));
790
+ ar_init(h, size, ea, ea_capa, size);
466
791
  }
467
792
 
468
- /* Deletes the value for the symbol from the hash table. */
469
- /* Deletion is done by overwriting keys by `undef`. */
470
793
  static mrb_bool
471
- ht_del(mrb_state *mrb, htable *t, mrb_value key, mrb_value *vp)
794
+ ht_get(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value *valp)
472
795
  {
473
- segment *seg;
474
- mrb_int i;
796
+ ib_find_by_key(mrb, h, key, it, {
797
+ *valp = ib_it_entry(it)->val;
798
+ return TRUE;
799
+ });
800
+ return FALSE;
801
+ }
475
802
 
476
- if (t == NULL) return FALSE;
477
- seg = t->rootseg;
478
- while (seg) {
479
- for (i=0; i<seg->size; i++) {
480
- mrb_value key2;
803
+ static void
804
+ ht_set_as_ar(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value val)
805
+ {
806
+ ht_to_ar(mrb, h);
807
+ ar_set(mrb, h, key, val);
808
+ }
481
809
 
482
- if (!seg->next && i >= t->last_len) {
483
- /* not found */
484
- return FALSE;
810
+ static void
811
+ ht_set_without_ib_adjustment(mrb_state *mrb, struct RHash *h,
812
+ mrb_value key, mrb_value val)
813
+ {
814
+ mrb_assert(ht_size(h) < ib_bit_to_capa(ib_bit(h)));
815
+ ib_cycle_by_key(mrb, h, key, it, {
816
+ if (ib_it_active_p(it)) {
817
+ if (!obj_eql(mrb, key, ib_it_entry(it)->key, h)) continue;
818
+ ib_it_entry(it)->val = val;
819
+ }
820
+ else {
821
+ uint32_t ea_n_used = ht_ea_n_used(h);
822
+ if (ea_n_used == H_MAX_SIZE) {
823
+ mrb_assert(ht_size(h) == ea_n_used);
824
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "hash too big");
485
825
  }
486
- key2 = seg->e[i].key;
487
- if (!mrb_undef_p(key2) && ht_hash_equal(mrb, t, key, key2)) {
488
- if (vp) *vp = seg->e[i].val;
489
- seg->e[i].key = mrb_undef_value();
490
- t->size--;
491
- return TRUE;
826
+ if (ea_n_used == ht_ea_capa(h)) ht_adjust_ea(mrb, h, ea_n_used, EA_MAX_CAPA);
827
+ ib_it_set(it, ea_n_used);
828
+ ea_set(ht_ea(h), ea_n_used, key, val);
829
+ ht_inc_size(h);
830
+ ht_set_ea_n_used(h, ++ea_n_used);
831
+ }
832
+ return;
833
+ });
834
+ }
835
+
836
+ static void
837
+ ht_set(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value val)
838
+ {
839
+ uint32_t size = ht_size(h);
840
+ uint32_t ib_bit_width = ib_bit(h), ib_capa = ib_bit_to_capa(ib_bit_width);
841
+ if (ib_upper_bound_for(ib_capa) <= size) {
842
+ if (size != ht_ea_n_used(h)) ea_compress(ht_ea(h), ht_ea_n_used(h));
843
+ ht_init(mrb, h, size, ht_ea(h), ht_ea_capa(h), h_ht(h), ++ib_bit_width);
844
+ }
845
+ else if (size != ht_ea_n_used(h)) {
846
+ if (ib_capa - EA_N_RESERVED_INDICES <= ht_ea_n_used(h)) goto compress;
847
+ if (ht_ea_capa(h) == ht_ea_n_used(h)) {
848
+ if (size <= AR_MAX_SIZE) {ht_set_as_ar(mrb, h, key, val); return;}
849
+ if (ea_next_capa_for(size, EA_MAX_CAPA) <= ht_ea_capa(h)) {
850
+ compress:
851
+ ea_compress(ht_ea(h), ht_ea_n_used(h));
852
+ ht_adjust_ea(mrb, h, size, ht_ea_capa(h));
853
+ ht_init(mrb, h, size, ht_ea(h), ht_ea_capa(h), h_ht(h), ib_bit_width);
492
854
  }
493
855
  }
494
- seg = seg->next;
495
856
  }
857
+ ht_set_without_ib_adjustment(mrb, h, key, val);
858
+ }
859
+
860
+ static mrb_bool
861
+ ht_delete(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value *valp)
862
+ {
863
+ ib_find_by_key(mrb, h, key, it, {
864
+ hash_entry *entry = ib_it_entry(it);
865
+ *valp = entry->val;
866
+ ib_it_delete(it);
867
+ entry_delete(entry);
868
+ ht_dec_size(h);
869
+ return TRUE;
870
+ });
496
871
  return FALSE;
497
872
  }
498
873
 
499
- /* Iterates over the hash table. */
500
874
  static void
501
- ht_foreach(mrb_state *mrb, htable *t, mrb_hash_foreach_func *func, void *p)
502
- {
503
- segment *seg;
504
- mrb_int i;
505
-
506
- if (t == NULL) return;
507
- seg = t->rootseg;
508
- while (seg) {
509
- for (i=0; i<seg->size; i++) {
510
- /* no value in last segment after last_len */
511
- if (!seg->next && i >= t->last_len) {
512
- return;
875
+ ht_shift(mrb_state *mrb, struct RHash *h, mrb_value *keyp, mrb_value *valp)
876
+ {
877
+ hash_entry *ea = ht_ea(h);
878
+ ea_each(ea, ht_size(h), entry, {
879
+ ib_cycle_by_key(mrb, h, entry->key, it, {
880
+ if (ib_it_get(it) != U32(entry - ea)) continue;
881
+ *keyp = entry->key;
882
+ *valp = entry->val;
883
+ ib_it_delete(it);
884
+ entry_delete(entry);
885
+ ht_dec_size(h);
886
+ return;
887
+ });
888
+ });
889
+ }
890
+
891
+ static void
892
+ ht_rehash(mrb_state *mrb, struct RHash *h)
893
+ {
894
+ /* see comments in `h_rehash` */
895
+ uint32_t size = ht_size(h), w_size = 0, ea_capa = ht_ea_capa(h);
896
+ hash_entry *ea = ht_ea(h);
897
+ ht_init(mrb, h, 0, ea, ea_capa, h_ht(h), ib_bit_for(size));
898
+ ht_set_size(h, size);
899
+ ht_set_ea_n_used(h, ht_ea_n_used(h));
900
+ ea_each(ea, size, r_entry, {
901
+ ib_cycle_by_key(mrb, h, r_entry->key, it, {
902
+ if (ib_it_active_p(it)) {
903
+ if (!obj_eql(mrb, r_entry->key, ib_it_entry(it)->key, h)) continue;
904
+ ib_it_entry(it)->val = r_entry->val;
905
+ ht_set_size(h, --size);
906
+ entry_delete(r_entry);
513
907
  }
514
- if (mrb_undef_p(seg->e[i].key)) continue;
515
- if ((*func)(mrb, seg->e[i].key, seg->e[i].val, p) != 0)
516
- return;
517
- }
518
- seg = seg->next;
908
+ else {
909
+ if (w_size != U32(r_entry - ea)) {
910
+ ea_set(ea, w_size, r_entry->key, r_entry->val);
911
+ entry_delete(r_entry);
912
+ }
913
+ ib_it_set(it, w_size++);
914
+ }
915
+ break;
916
+ });
917
+ });
918
+ mrb_assert(size == w_size);
919
+ ht_set_ea_n_used(h, size);
920
+ size <= AR_MAX_SIZE ? ht_to_ar(mrb, h) : ht_adjust_ea(mrb, h, size, ea_capa);
921
+ }
922
+
923
+ static mrb_value
924
+ h_key_for(mrb_state *mrb, mrb_value key)
925
+ {
926
+ if (mrb_string_p(key) && !MRB_FROZEN_P(mrb_str_ptr(key))) {
927
+ key = mrb_str_dup(mrb, key);
928
+ MRB_SET_FROZEN_FLAG(mrb_str_ptr(key));
519
929
  }
930
+ return key;
520
931
  }
521
932
 
522
- /* Iterates over the hash table. */
523
- MRB_API void
524
- mrb_hash_foreach(mrb_state *mrb, struct RHash *hash, mrb_hash_foreach_func *func, void *p)
933
+ static struct RHash*
934
+ h_alloc(mrb_state *mrb)
525
935
  {
526
- ht_foreach(mrb, hash->ht, func, p);
936
+ return (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
527
937
  }
528
938
 
529
- /* Copy the hash table. */
530
- static htable*
531
- ht_copy(mrb_state *mrb, htable *t)
939
+ static void
940
+ h_init(struct RHash *h)
532
941
  {
533
- segment *seg;
534
- htable *t2;
535
- mrb_int i;
942
+ ar_init(h, 0, NULL, 0, 0);
943
+ }
536
944
 
537
- seg = t->rootseg;
538
- t2 = ht_new(mrb);
539
- if (t->size == 0) return t2;
945
+ static void
946
+ h_free_table(mrb_state *mrb, struct RHash *h)
947
+ {
948
+ (h_ar_p(h) ? ar_free : ht_free)(mrb, h);
949
+ }
540
950
 
541
- while (seg) {
542
- for (i=0; i<seg->size; i++) {
543
- mrb_value key = seg->e[i].key;
544
- mrb_value val = seg->e[i].val;
951
+ static void
952
+ h_clear(mrb_state *mrb, struct RHash *h)
953
+ {
954
+ h_free_table(mrb, h);
955
+ h_init(h);
956
+ }
545
957
 
546
- if ((seg->next == NULL) && (i >= t->last_len)) {
547
- return t2;
548
- }
549
- if (mrb_undef_p(key)) continue; /* skip deleted key */
550
- ht_put(mrb, t2, key, val);
551
- }
552
- seg = seg->next;
553
- }
554
- return t2;
958
+ static mrb_bool
959
+ h_get(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value *valp)
960
+ {
961
+ return (h_ar_p(h) ? ar_get : ht_get)(mrb, h, key, valp);
555
962
  }
556
963
 
557
- /* Free memory of the hash table. */
558
964
  static void
559
- ht_free(mrb_state *mrb, htable *t)
965
+ h_set(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value val)
560
966
  {
561
- segment *seg;
967
+ (h_ar_p(h) ? ar_set : ht_set)(mrb, h, key, val);
968
+ }
562
969
 
563
- if (!t) return;
564
- seg = t->rootseg;
565
- while (seg) {
566
- segment *p = seg;
567
- seg = seg->next;
568
- mrb_free(mrb, p);
569
- }
570
- if (t->index) mrb_free(mrb, t->index);
571
- mrb_free(mrb, t);
970
+ static mrb_bool
971
+ h_delete(mrb_state *mrb, struct RHash *h, mrb_value key, mrb_value *valp)
972
+ {
973
+ return (h_ar_p(h) ? ar_delete : ht_delete)(mrb, h, key, valp);
572
974
  }
573
975
 
574
- static void mrb_hash_modify(mrb_state *mrb, mrb_value hash);
976
+ /* find first element in the table, and remove it. */
977
+ static void
978
+ h_shift(mrb_state *mrb, struct RHash *h, mrb_value *keyp, mrb_value *valp)
979
+ {
980
+ (h_ar_p(h) ? ar_shift : ht_shift)(mrb, h, keyp, valp);
981
+ }
575
982
 
576
- static inline mrb_value
577
- ht_key(mrb_state *mrb, mrb_value key)
983
+ static void
984
+ h_rehash(mrb_state *mrb, struct RHash *h)
578
985
  {
579
- if (mrb_string_p(key) && !mrb_frozen_p(mrb_str_ptr(key))) {
580
- key = mrb_str_dup(mrb, key);
581
- MRB_SET_FROZEN_FLAG(mrb_str_ptr(key));
986
+ /*
987
+ * ==== Comments common to `ar_rehash` and `ht_rehash`
988
+ *
989
+ * - Because reindex (such as elimination of duplicate keys) must be
990
+ * guaranteed, it is necessary to set one by one.
991
+ *
992
+ * - To prevent EA from breaking if an exception occurs in the middle,
993
+ * delete the slot before moving when moving the entry, and update size
994
+ * at any time when overwriting.
995
+ */
996
+ (h_size(h) == 0 ? h_clear : h_ar_p(h) ? ar_rehash : ht_rehash)(mrb, h);
997
+ }
998
+
999
+ static void
1000
+ h_replace(mrb_state *mrb, struct RHash *h, struct RHash *orig_h)
1001
+ {
1002
+ uint32_t size = h_size(orig_h);
1003
+ if (size == 0) {
1004
+ h_clear(mrb, h);
1005
+ }
1006
+ else if (h_ar_p(orig_h)) {
1007
+ uint32_t ea_capa = ar_ea_capa(orig_h);
1008
+ hash_entry *ea = ea_dup(mrb, ar_ea(orig_h), ea_capa);
1009
+ h_free_table(mrb, h);
1010
+ ar_init(h, size, ea, ea_capa, ar_ea_n_used(orig_h));
1011
+ }
1012
+ else { /* HT */
1013
+ uint32_t ea_capa = ht_ea_capa(orig_h);
1014
+ hash_entry *ea = ea_dup(mrb, ht_ea(orig_h), ea_capa);
1015
+ hash_table *ht = ht_dup(mrb, orig_h);
1016
+ h_free_table(mrb, h);
1017
+ h_ht_on(h);
1018
+ h_set_ht(h, ht);
1019
+ ht_set_size(h, size);
1020
+ ht_set_ea(h, ea);
1021
+ #ifdef MRB_64BIT
1022
+ ht_set_ea_capa(h, ea_capa);
1023
+ ht_set_ea_n_used(h, ht_ea_n_used(orig_h));
1024
+ #endif
1025
+ ib_set_bit(h, ib_bit(orig_h));
582
1026
  }
583
- return key;
584
1027
  }
585
1028
 
586
- #define KEY(key) ht_key(mrb, key)
1029
+ void
1030
+ mrb_gc_mark_hash(mrb_state *mrb, struct RHash *h)
1031
+ {
1032
+ h_each(h, entry, {
1033
+ mrb_gc_mark_value(mrb, entry->key);
1034
+ mrb_gc_mark_value(mrb, entry->val);
1035
+ });
1036
+ }
587
1037
 
588
- static int
589
- hash_mark_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
1038
+ size_t
1039
+ mrb_gc_mark_hash_size(mrb_state *mrb, struct RHash *h)
590
1040
  {
591
- mrb_gc_mark_value(mrb, key);
592
- mrb_gc_mark_value(mrb, val);
593
- return 0;
1041
+ return h_size(h) * 2;
594
1042
  }
595
1043
 
596
1044
  void
597
- mrb_gc_mark_hash(mrb_state *mrb, struct RHash *hash)
1045
+ mrb_gc_free_hash(mrb_state *mrb, struct RHash *h)
598
1046
  {
599
- ht_foreach(mrb, hash->ht, hash_mark_i, NULL);
1047
+ h_free_table(mrb, h);
600
1048
  }
601
1049
 
602
1050
  size_t
603
- mrb_gc_mark_hash_size(mrb_state *mrb, struct RHash *hash)
1051
+ mrb_hash_memsize(mrb_value self)
604
1052
  {
605
- if (!hash->ht) return 0;
606
- return hash->ht->size*2;
1053
+ struct RHash *h = mrb_hash_ptr(self);
1054
+ return mrb_obj_iv_tbl_memsize(self) +
1055
+ (h_ar_p(h) ? (ar_ea_capa(h) * sizeof(hash_entry)) :
1056
+ (ht_ea_capa(h) * sizeof(hash_entry) +
1057
+ sizeof(hash_table) +
1058
+ ib_byte_size_for(ib_bit(h))));
607
1059
  }
608
1060
 
609
- void
610
- mrb_gc_free_hash(mrb_state *mrb, struct RHash *hash)
1061
+ /* Iterates over the key/value pairs. */
1062
+ MRB_API void
1063
+ mrb_hash_foreach(mrb_state *mrb, struct RHash *h, mrb_hash_foreach_func *func, void *data)
611
1064
  {
612
- ht_free(mrb, hash->ht);
1065
+ h_each(h, entry, {
1066
+ if (func(mrb, entry->key, entry->val, data) != 0) return;
1067
+ });
613
1068
  }
614
1069
 
615
1070
  MRB_API mrb_value
616
1071
  mrb_hash_new(mrb_state *mrb)
617
1072
  {
618
- struct RHash *h;
619
-
620
- h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
621
- h->ht = 0;
622
- h->iv = 0;
1073
+ struct RHash *h = h_alloc(mrb);
623
1074
  return mrb_obj_value(h);
624
1075
  }
625
1076
 
1077
+ /*
1078
+ * Set the capacity of EA and IB to minimum capacity (and appropriate load
1079
+ * factor) that does not cause expansion when inserting `capa` elements.
1080
+ */
626
1081
  MRB_API mrb_value
627
1082
  mrb_hash_new_capa(mrb_state *mrb, mrb_int capa)
628
1083
  {
629
- struct RHash *h;
630
-
631
- h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
632
- /* preallocate hash table */
633
- h->ht = ht_new(mrb);
634
- /* capacity ignored */
635
- h->iv = 0;
636
- return mrb_obj_value(h);
1084
+ if (capa < 0 || EA_MAX_CAPA < capa) {
1085
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "hash too big");
1086
+ return mrb_nil_value(); /* not reached */
1087
+ }
1088
+ else if (capa == 0) {
1089
+ return mrb_hash_new(mrb);
1090
+ }
1091
+ else {
1092
+ uint32_t size = U32(capa);
1093
+ struct RHash *h = h_alloc(mrb);
1094
+ hash_entry *ea = ea_resize(mrb, NULL, size);
1095
+ if (size <= AR_MAX_SIZE) {
1096
+ ar_init(h, 0, ea, size, 0);
1097
+ }
1098
+ else {
1099
+ ht_init(mrb, h, 0, ea, size, NULL, ib_bit_for(size));
1100
+ }
1101
+ return mrb_obj_value(h);
1102
+ }
637
1103
  }
638
1104
 
639
1105
  static mrb_value mrb_hash_default(mrb_state *mrb, mrb_value hash);
640
- static mrb_value hash_default(mrb_state *mrb, mrb_value hash, mrb_value key);
1106
+
1107
+ static void
1108
+ hash_modify(mrb_state *mrb, mrb_value hash)
1109
+ {
1110
+ mrb_check_frozen(mrb, mrb_hash_ptr(hash));
1111
+ }
641
1112
 
642
1113
  static mrb_value
643
- mrb_hash_init_copy(mrb_state *mrb, mrb_value self)
1114
+ hash_default(mrb_state *mrb, mrb_value hash, mrb_value key)
644
1115
  {
645
- mrb_value orig;
646
- struct RHash* copy;
647
- htable *orig_h;
648
- mrb_value ifnone, vret;
649
-
650
- mrb_get_args(mrb, "o", &orig);
651
- if (mrb_obj_equal(mrb, self, orig)) return self;
652
- if ((mrb_type(self) != mrb_type(orig)) || (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig))) {
653
- mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
1116
+ if (MRB_RHASH_DEFAULT_P(hash)) {
1117
+ if (MRB_RHASH_PROCDEFAULT_P(hash)) {
1118
+ return mrb_funcall_id(mrb, RHASH_PROCDEFAULT(hash), MRB_SYM(call), 2, hash, key);
1119
+ }
1120
+ else {
1121
+ return RHASH_IFNONE(hash);
1122
+ }
654
1123
  }
1124
+ return mrb_nil_value();
1125
+ }
655
1126
 
656
- orig_h = RHASH_TBL(self);
657
- copy = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
658
- copy->ht = ht_copy(mrb, orig_h);
659
-
660
- if (MRB_RHASH_DEFAULT_P(self)) {
661
- copy->flags |= MRB_HASH_DEFAULT;
662
- }
663
- if (MRB_RHASH_PROCDEFAULT_P(self)) {
664
- copy->flags |= MRB_HASH_PROC_DEFAULT;
1127
+ static void
1128
+ hash_replace(mrb_state *mrb, mrb_value self, mrb_value orig)
1129
+ {
1130
+ struct RHash *h = mrb_hash_ptr(self), *orig_h = mrb_hash_ptr(orig);
1131
+ uint32_t mask = MRB_HASH_DEFAULT | MRB_HASH_PROC_DEFAULT;
1132
+ mrb_sym name;
1133
+ h_replace(mrb, h, orig_h);
1134
+ name = MRB_SYM(ifnone);
1135
+ if (orig_h->flags & MRB_HASH_DEFAULT) {
1136
+ mrb_iv_set(mrb, self, name, mrb_iv_get(mrb, orig, name));
665
1137
  }
666
- vret = mrb_obj_value(copy);
667
- ifnone = RHASH_IFNONE(self);
668
- if (!mrb_nil_p(ifnone)) {
669
- mrb_iv_set(mrb, vret, mrb_intern_lit(mrb, "ifnone"), ifnone);
1138
+ else {
1139
+ mrb_iv_remove(mrb, self, name);
670
1140
  }
671
- return vret;
1141
+ h->flags &= ~mask;
1142
+ h->flags |= orig_h->flags & mask;
672
1143
  }
673
1144
 
674
- static int
675
- check_kdict_i(mrb_state *mrb, mrb_value key, mrb_value val, void *data)
1145
+ static mrb_value
1146
+ mrb_hash_init_copy(mrb_state *mrb, mrb_value self)
676
1147
  {
677
- if (!mrb_symbol_p(key)) {
678
- mrb_raise(mrb, E_ARGUMENT_ERROR, "keyword argument hash with non symbol keys");
679
- }
680
- return 0;
1148
+ mrb_value orig;
1149
+ mrb_get_args(mrb, "H", &orig);
1150
+ hash_modify(mrb, self);
1151
+ if (mrb_hash_ptr(self) != mrb_hash_ptr(orig)) hash_replace(mrb, self, orig);
1152
+ return self;
681
1153
  }
682
1154
 
683
1155
  void
684
1156
  mrb_hash_check_kdict(mrb_state *mrb, mrb_value self)
685
1157
  {
686
- htable *t;
687
-
688
- t = RHASH_TBL(self);
689
- if (!t || t->size == 0) return;
690
- ht_foreach(mrb, t, check_kdict_i, NULL);
1158
+ h_each(mrb_hash_ptr(self), entry, {
1159
+ if (mrb_symbol_p(entry->key)) continue;
1160
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "keyword argument hash with non symbol keys");
1161
+ });
691
1162
  }
692
1163
 
693
1164
  MRB_API mrb_value
694
1165
  mrb_hash_dup(mrb_state *mrb, mrb_value self)
695
1166
  {
696
- struct RHash* copy;
697
- htable *orig_h;
698
-
699
- orig_h = RHASH_TBL(self);
700
- copy = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
701
- copy->ht = orig_h ? ht_copy(mrb, orig_h) : NULL;
702
- return mrb_obj_value(copy);
1167
+ struct RHash* copy_h = h_alloc(mrb);
1168
+ mrb_value copy = mrb_obj_value(copy_h);
1169
+ copy_h->c = mrb_hash_ptr(self)->c;
1170
+ hash_replace(mrb, copy, self);
1171
+ return copy;
703
1172
  }
704
1173
 
705
1174
  MRB_API mrb_value
@@ -708,11 +1177,11 @@ mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key)
708
1177
  mrb_value val;
709
1178
  mrb_sym mid;
710
1179
 
711
- if (ht_get(mrb, RHASH_TBL(hash), key, &val)) {
1180
+ if (h_get(mrb, mrb_hash_ptr(hash), key, &val)) {
712
1181
  return val;
713
1182
  }
714
1183
 
715
- mid = mrb_intern_lit(mrb, "default");
1184
+ mid = MRB_SYM(default);
716
1185
  if (mrb_func_basic_p(mrb, hash, mid, mrb_hash_default)) {
717
1186
  return hash_default(mrb, hash, key);
718
1187
  }
@@ -725,7 +1194,7 @@ mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def)
725
1194
  {
726
1195
  mrb_value val;
727
1196
 
728
- if (ht_get(mrb, RHASH_TBL(hash), key, &val)) {
1197
+ if (h_get(mrb, mrb_hash_ptr(hash), key, &val)) {
729
1198
  return val;
730
1199
  }
731
1200
  /* not found */
@@ -735,22 +1204,11 @@ mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def)
735
1204
  MRB_API void
736
1205
  mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)
737
1206
  {
738
- mrb_hash_modify(mrb, hash);
739
-
740
- key = KEY(key);
741
- ht_put(mrb, RHASH_TBL(hash), key, val);
742
- mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), key);
743
- mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), val);
744
- return;
745
- }
746
-
747
- static void
748
- mrb_hash_modify(mrb_state *mrb, mrb_value hash)
749
- {
750
- mrb_check_frozen(mrb, mrb_hash_ptr(hash));
751
- if (!RHASH_TBL(hash)) {
752
- RHASH_TBL(hash) = ht_new(mrb);
753
- }
1207
+ hash_modify(mrb, hash);
1208
+ key = h_key_for(mrb, key);
1209
+ h_set(mrb, mrb_hash_ptr(hash), key, val);
1210
+ mrb_field_write_barrier_value(mrb, mrb_basic_ptr(hash), key);
1211
+ mrb_field_write_barrier_value(mrb, mrb_basic_ptr(hash), val);
754
1212
  }
755
1213
 
756
1214
  /* 15.2.13.4.16 */
@@ -797,7 +1255,7 @@ mrb_hash_init(mrb_state *mrb, mrb_value hash)
797
1255
 
798
1256
  ifnone = mrb_nil_value();
799
1257
  mrb_get_args(mrb, "&|o?", &block, &ifnone, &ifnone_p);
800
- mrb_hash_modify(mrb, hash);
1258
+ hash_modify(mrb, hash);
801
1259
  if (!mrb_nil_p(block)) {
802
1260
  if (ifnone_p) {
803
1261
  mrb_argnum_error(mrb, 1, 0, 0);
@@ -807,7 +1265,7 @@ mrb_hash_init(mrb_state *mrb, mrb_value hash)
807
1265
  }
808
1266
  if (!mrb_nil_p(ifnone)) {
809
1267
  RHASH(hash)->flags |= MRB_HASH_DEFAULT;
810
- mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
1268
+ mrb_iv_set(mrb, hash, MRB_SYM(ifnone), ifnone);
811
1269
  }
812
1270
  return hash;
813
1271
  }
@@ -829,26 +1287,11 @@ mrb_hash_init(mrb_state *mrb, mrb_value hash)
829
1287
  static mrb_value
830
1288
  mrb_hash_aget(mrb_state *mrb, mrb_value self)
831
1289
  {
832
- mrb_value key;
1290
+ mrb_value key = mrb_get_arg1(mrb);
833
1291
 
834
- mrb_get_args(mrb, "o", &key);
835
1292
  return mrb_hash_get(mrb, self, key);
836
1293
  }
837
1294
 
838
- static mrb_value
839
- hash_default(mrb_state *mrb, mrb_value hash, mrb_value key)
840
- {
841
- if (MRB_RHASH_DEFAULT_P(hash)) {
842
- if (MRB_RHASH_PROCDEFAULT_P(hash)) {
843
- return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
844
- }
845
- else {
846
- return RHASH_IFNONE(hash);
847
- }
848
- }
849
- return mrb_nil_value();
850
- }
851
-
852
1295
  /* 15.2.13.4.5 */
853
1296
  /*
854
1297
  * call-seq:
@@ -881,7 +1324,7 @@ mrb_hash_default(mrb_state *mrb, mrb_value hash)
881
1324
  if (MRB_RHASH_DEFAULT_P(hash)) {
882
1325
  if (MRB_RHASH_PROCDEFAULT_P(hash)) {
883
1326
  if (!given) return mrb_nil_value();
884
- return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
1327
+ return mrb_funcall_id(mrb, RHASH_PROCDEFAULT(hash), MRB_SYM(call), 2, hash, key);
885
1328
  }
886
1329
  else {
887
1330
  return RHASH_IFNONE(hash);
@@ -914,11 +1357,10 @@ mrb_hash_default(mrb_state *mrb, mrb_value hash)
914
1357
  static mrb_value
915
1358
  mrb_hash_set_default(mrb_state *mrb, mrb_value hash)
916
1359
  {
917
- mrb_value ifnone;
1360
+ mrb_value ifnone = mrb_get_arg1(mrb);
918
1361
 
919
- mrb_get_args(mrb, "o", &ifnone);
920
- mrb_hash_modify(mrb, hash);
921
- mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
1362
+ hash_modify(mrb, hash);
1363
+ mrb_iv_set(mrb, hash, MRB_SYM(ifnone), ifnone);
922
1364
  RHASH(hash)->flags &= ~MRB_HASH_PROC_DEFAULT;
923
1365
  if (!mrb_nil_p(ifnone)) {
924
1366
  RHASH(hash)->flags |= MRB_HASH_DEFAULT;
@@ -944,7 +1386,6 @@ mrb_hash_set_default(mrb_state *mrb, mrb_value hash)
944
1386
  * a #=> [nil, nil, 4]
945
1387
  */
946
1388
 
947
-
948
1389
  static mrb_value
949
1390
  mrb_hash_default_proc(mrb_state *mrb, mrb_value hash)
950
1391
  {
@@ -970,11 +1411,10 @@ mrb_hash_default_proc(mrb_state *mrb, mrb_value hash)
970
1411
  static mrb_value
971
1412
  mrb_hash_set_default_proc(mrb_state *mrb, mrb_value hash)
972
1413
  {
973
- mrb_value ifnone;
1414
+ mrb_value ifnone = mrb_get_arg1(mrb);
974
1415
 
975
- mrb_get_args(mrb, "o", &ifnone);
976
- mrb_hash_modify(mrb, hash);
977
- mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
1416
+ hash_modify(mrb, hash);
1417
+ mrb_iv_set(mrb, hash, MRB_SYM(ifnone), ifnone);
978
1418
  if (!mrb_nil_p(ifnone)) {
979
1419
  RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
980
1420
  RHASH(hash)->flags |= MRB_HASH_DEFAULT;
@@ -990,10 +1430,10 @@ mrb_hash_set_default_proc(mrb_state *mrb, mrb_value hash)
990
1430
  MRB_API mrb_value
991
1431
  mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key)
992
1432
  {
993
- htable *t = RHASH_TBL(hash);
994
1433
  mrb_value del_val;
995
1434
 
996
- if (ht_del(mrb, t, key, &del_val)) {
1435
+ hash_modify(mrb, hash);
1436
+ if (h_delete(mrb, mrb_hash_ptr(hash), key, &del_val)) {
997
1437
  return del_val;
998
1438
  }
999
1439
 
@@ -1004,40 +1444,10 @@ mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key)
1004
1444
  static mrb_value
1005
1445
  mrb_hash_delete(mrb_state *mrb, mrb_value self)
1006
1446
  {
1007
- mrb_value key;
1008
-
1009
- mrb_get_args(mrb, "o", &key);
1010
- mrb_hash_modify(mrb, self);
1447
+ mrb_value key = mrb_get_arg1(mrb);
1011
1448
  return mrb_hash_delete_key(mrb, self, key);
1012
1449
  }
1013
1450
 
1014
- /* find first element in the hash table, and remove it. */
1015
- static void
1016
- ht_shift(mrb_state *mrb, htable *t, mrb_value *kp, mrb_value *vp)
1017
- {
1018
- segment *seg = t->rootseg;
1019
- mrb_int i;
1020
-
1021
- while (seg) {
1022
- for (i=0; i<seg->size; i++) {
1023
- mrb_value key;
1024
-
1025
- if (!seg->next && i >= t->last_len) {
1026
- return;
1027
- }
1028
- key = seg->e[i].key;
1029
- if (mrb_undef_p(key)) continue;
1030
- *kp = key;
1031
- *vp = seg->e[i].val;
1032
- /* delete element */
1033
- seg->e[i].key = mrb_undef_value();
1034
- t->size--;
1035
- return;
1036
- }
1037
- seg = seg->next;
1038
- }
1039
- }
1040
-
1041
1451
  /* 15.2.13.4.24 */
1042
1452
  /*
1043
1453
  * call-seq:
@@ -1055,27 +1465,19 @@ ht_shift(mrb_state *mrb, htable *t, mrb_value *kp, mrb_value *vp)
1055
1465
  static mrb_value
1056
1466
  mrb_hash_shift(mrb_state *mrb, mrb_value hash)
1057
1467
  {
1058
- htable *t = RHASH_TBL(hash);
1468
+ struct RHash *h = mrb_hash_ptr(hash);
1059
1469
 
1060
- mrb_hash_modify(mrb, hash);
1061
- if (t && t->size > 0) {
1470
+ hash_modify(mrb, hash);
1471
+ if (h_size(h) == 0) {
1472
+ return hash_default(mrb, hash, mrb_nil_value());
1473
+ }
1474
+ else {
1062
1475
  mrb_value del_key, del_val;
1063
-
1064
- ht_shift(mrb, t, &del_key, &del_val);
1476
+ h_shift(mrb, h, &del_key, &del_val);
1065
1477
  mrb_gc_protect(mrb, del_key);
1066
1478
  mrb_gc_protect(mrb, del_val);
1067
1479
  return mrb_assoc_new(mrb, del_key, del_val);
1068
1480
  }
1069
-
1070
- if (MRB_RHASH_DEFAULT_P(hash)) {
1071
- if (MRB_RHASH_PROCDEFAULT_P(hash)) {
1072
- return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, mrb_nil_value());
1073
- }
1074
- else {
1075
- return RHASH_IFNONE(hash);
1076
- }
1077
- }
1078
- return mrb_nil_value();
1079
1481
  }
1080
1482
 
1081
1483
  /* 15.2.13.4.4 */
@@ -1093,13 +1495,8 @@ mrb_hash_shift(mrb_state *mrb, mrb_value hash)
1093
1495
  MRB_API mrb_value
1094
1496
  mrb_hash_clear(mrb_state *mrb, mrb_value hash)
1095
1497
  {
1096
- htable *t = RHASH_TBL(hash);
1097
-
1098
- mrb_hash_modify(mrb, hash);
1099
- if (t) {
1100
- ht_free(mrb, t);
1101
- RHASH_TBL(hash) = NULL;
1102
- }
1498
+ hash_modify(mrb, hash);
1499
+ h_clear(mrb, mrb_hash_ptr(hash));
1103
1500
  return hash;
1104
1501
  }
1105
1502
 
@@ -1135,18 +1532,15 @@ mrb_hash_aset(mrb_state *mrb, mrb_value self)
1135
1532
  MRB_API mrb_int
1136
1533
  mrb_hash_size(mrb_state *mrb, mrb_value hash)
1137
1534
  {
1138
- htable *t = RHASH_TBL(hash);
1139
-
1140
- if (!t) return 0;
1141
- return t->size;
1535
+ return (mrb_int)h_size(mrb_hash_ptr(hash));
1142
1536
  }
1143
1537
 
1144
1538
  /* 15.2.13.4.20 */
1145
1539
  /* 15.2.13.4.25 */
1146
1540
  /*
1147
1541
  * call-seq:
1148
- * hsh.length -> fixnum
1149
- * hsh.size -> fixnum
1542
+ * hsh.length -> integer
1543
+ * hsh.size -> integer
1150
1544
  *
1151
1545
  * Returns the number of key-value pairs in the hash.
1152
1546
  *
@@ -1159,16 +1553,13 @@ static mrb_value
1159
1553
  mrb_hash_size_m(mrb_state *mrb, mrb_value self)
1160
1554
  {
1161
1555
  mrb_int size = mrb_hash_size(mrb, self);
1162
- return mrb_fixnum_value(size);
1556
+ return mrb_int_value(mrb, size);
1163
1557
  }
1164
1558
 
1165
1559
  MRB_API mrb_bool
1166
1560
  mrb_hash_empty_p(mrb_state *mrb, mrb_value self)
1167
1561
  {
1168
- htable *t = RHASH_TBL(self);
1169
-
1170
- if (!t) return TRUE;
1171
- return t->size == 0;
1562
+ return h_size(mrb_hash_ptr(self)) == 0;
1172
1563
  }
1173
1564
 
1174
1565
  /* 15.2.13.4.12 */
@@ -1187,13 +1578,6 @@ mrb_hash_empty_m(mrb_state *mrb, mrb_value self)
1187
1578
  return mrb_bool_value(mrb_hash_empty_p(mrb, self));
1188
1579
  }
1189
1580
 
1190
- static int
1191
- hash_keys_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
1192
- {
1193
- mrb_ary_push(mrb, *(mrb_value*)p, key);
1194
- return 0;
1195
- }
1196
-
1197
1581
  /* 15.2.13.4.19 */
1198
1582
  /*
1199
1583
  * call-seq:
@@ -1210,24 +1594,14 @@ hash_keys_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
1210
1594
  MRB_API mrb_value
1211
1595
  mrb_hash_keys(mrb_state *mrb, mrb_value hash)
1212
1596
  {
1213
- htable *t = RHASH_TBL(hash);
1214
- mrb_int size;
1215
- mrb_value ary;
1216
-
1217
- if (!t || (size = t->size) == 0)
1218
- return mrb_ary_new(mrb);
1219
- ary = mrb_ary_new_capa(mrb, size);
1220
- ht_foreach(mrb, t, hash_keys_i, (void*)&ary);
1597
+ struct RHash *h = mrb_hash_ptr(hash);
1598
+ mrb_value ary = mrb_ary_new_capa(mrb, (mrb_int)h_size(h));
1599
+ h_each(h, entry, {
1600
+ mrb_ary_push(mrb, ary, entry->key);
1601
+ });
1221
1602
  return ary;
1222
1603
  }
1223
1604
 
1224
- static int
1225
- hash_vals_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
1226
- {
1227
- mrb_ary_push(mrb, *(mrb_value*)p, val);
1228
- return 0;
1229
- }
1230
-
1231
1605
  /* 15.2.13.4.28 */
1232
1606
  /*
1233
1607
  * call-seq:
@@ -1244,14 +1618,11 @@ hash_vals_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
1244
1618
  MRB_API mrb_value
1245
1619
  mrb_hash_values(mrb_state *mrb, mrb_value hash)
1246
1620
  {
1247
- htable *t = RHASH_TBL(hash);
1248
- mrb_int size;
1249
- mrb_value ary;
1250
-
1251
- if (!t || (size = t->size) == 0)
1252
- return mrb_ary_new(mrb);
1253
- ary = mrb_ary_new_capa(mrb, size);
1254
- ht_foreach(mrb, t, hash_vals_i, (void*)&ary);
1621
+ struct RHash *h = mrb_hash_ptr(hash);
1622
+ mrb_value ary = mrb_ary_new_capa(mrb, (mrb_int)h_size(h));
1623
+ h_each(h, entry, {
1624
+ mrb_ary_push(mrb, ary, entry->val);
1625
+ });
1255
1626
  return ary;
1256
1627
  }
1257
1628
 
@@ -1277,43 +1648,20 @@ mrb_hash_values(mrb_state *mrb, mrb_value hash)
1277
1648
  MRB_API mrb_bool
1278
1649
  mrb_hash_key_p(mrb_state *mrb, mrb_value hash, mrb_value key)
1279
1650
  {
1280
- htable *t;
1281
-
1282
- t = RHASH_TBL(hash);
1283
- if (ht_get(mrb, t, key, NULL)) {
1284
- return TRUE;
1285
- }
1286
- return FALSE;
1651
+ mrb_value val;
1652
+ return h_get(mrb, mrb_hash_ptr(hash), key, &val);
1287
1653
  }
1288
1654
 
1289
1655
  static mrb_value
1290
1656
  mrb_hash_has_key(mrb_state *mrb, mrb_value hash)
1291
1657
  {
1292
- mrb_value key;
1658
+ mrb_value key = mrb_get_arg1(mrb);
1293
1659
  mrb_bool key_p;
1294
1660
 
1295
- mrb_get_args(mrb, "o", &key);
1296
1661
  key_p = mrb_hash_key_p(mrb, hash, key);
1297
1662
  return mrb_bool_value(key_p);
1298
1663
  }
1299
1664
 
1300
- struct has_v_arg {
1301
- mrb_bool found;
1302
- mrb_value val;
1303
- };
1304
-
1305
- static int
1306
- hash_has_value_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
1307
- {
1308
- struct has_v_arg *arg = (struct has_v_arg*)p;
1309
-
1310
- if (mrb_equal(mrb, arg->val, val)) {
1311
- arg->found = TRUE;
1312
- return 1;
1313
- }
1314
- return 0;
1315
- }
1316
-
1317
1665
  /* 15.2.13.4.14 */
1318
1666
  /* 15.2.13.4.27 */
1319
1667
  /*
@@ -1332,43 +1680,33 @@ hash_has_value_i(mrb_state *mrb, mrb_value key, mrb_value val, void *p)
1332
1680
  static mrb_value
1333
1681
  mrb_hash_has_value(mrb_state *mrb, mrb_value hash)
1334
1682
  {
1335
- mrb_value val;
1336
- struct has_v_arg arg;
1337
-
1338
- mrb_get_args(mrb, "o", &val);
1339
- arg.found = FALSE;
1340
- arg.val = val;
1341
- ht_foreach(mrb, RHASH_TBL(hash), hash_has_value_i, &arg);
1342
- return mrb_bool_value(arg.found);
1343
- }
1344
-
1345
- static int
1346
- merge_i(mrb_state *mrb, mrb_value key, mrb_value val, void *data)
1347
- {
1348
- htable *h1 = (htable*)data;
1349
-
1350
- ht_put(mrb, h1, key, val);
1351
- return 0;
1683
+ mrb_value val = mrb_get_arg1(mrb);
1684
+ struct RHash *h = mrb_hash_ptr(hash);
1685
+ h_each(h, entry, {
1686
+ h_check_modified(mrb, h, {
1687
+ if (mrb_equal(mrb, val, entry->val)) return mrb_true_value();
1688
+ });
1689
+ });
1690
+ return mrb_false_value();
1352
1691
  }
1353
1692
 
1354
1693
  MRB_API void
1355
1694
  mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2)
1356
1695
  {
1357
- htable *h1, *h2;
1358
-
1359
- mrb_hash_modify(mrb, hash1);
1360
- hash2 = mrb_ensure_hash_type(mrb, hash2);
1361
- h1 = RHASH_TBL(hash1);
1362
- h2 = RHASH_TBL(hash2);
1363
-
1364
- if (!h2) return;
1365
- if (!h1) {
1366
- RHASH_TBL(hash1) = ht_copy(mrb, h2);
1367
- return;
1368
- }
1369
- ht_foreach(mrb, h2, merge_i, h1);
1370
- mrb_write_barrier(mrb, (struct RBasic*)RHASH(hash1));
1371
- return;
1696
+ struct RHash *h1, *h2;
1697
+
1698
+ hash_modify(mrb, hash1);
1699
+ mrb_ensure_hash_type(mrb, hash2);
1700
+ h1 = mrb_hash_ptr(hash1);
1701
+ h2 = mrb_hash_ptr(hash2);
1702
+
1703
+ if (h1 == h2) return;
1704
+ if (h_size(h2) == 0) return;
1705
+ h_each(h2, entry, {
1706
+ h_check_modified(mrb, h2, {h_set(mrb, h1, entry->key, entry->val);});
1707
+ mrb_field_write_barrier_value(mrb, (struct RBasic *)h1, entry->key);
1708
+ mrb_field_write_barrier_value(mrb, (struct RBasic *)h1, entry->val);
1709
+ });
1372
1710
  }
1373
1711
 
1374
1712
  /*
@@ -1383,14 +1721,10 @@ mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2)
1383
1721
  * k = keys[0]
1384
1722
  * h = {}
1385
1723
  * keys.each{|key| h[key] = key[0]}
1386
- * h #=> { [1]=> 1, [2]=> 2, [3]=> 3, [4]=> 4, [5]=> 5, [6]=> 6, [7]=> 7,
1387
- * [8]=> 8, [9]=> 9,[10]=>10,[11]=>11,[12]=>12,[13]=>13,[14]=>14,
1388
- * [15]=>15,[16]=>16,[17]=>17}
1724
+ * h #=> { [1]=>1, [2]=>2, ... [16]=>16, [17]=>17}
1389
1725
  * h[k] #=> 1
1390
1726
  * k[0] = keys.size + 1
1391
- * h #=> {[18]=> 1, [2]=> 2, [3]=> 3, [4]=> 4, [5]=> 5, [6]=> 6, [7]=> 7,
1392
- * [8]=> 8, [9]=> 9,[10]=>10,[11]=>11,[12]=>12,[13]=>13,[14]=>14,
1393
- * [15]=>15,[16]=>16,[17]=>17}
1727
+ * h #=> {[18]=>1, [2]=>2, ... [16]=>16, [17]=>17}
1394
1728
  * h[k] #=> nil
1395
1729
  * h.rehash
1396
1730
  * h[k] #=> 1
@@ -1398,7 +1732,7 @@ mrb_hash_merge(mrb_state *mrb, mrb_value hash1, mrb_value hash2)
1398
1732
  static mrb_value
1399
1733
  mrb_hash_rehash(mrb_state *mrb, mrb_value self)
1400
1734
  {
1401
- ht_compact(mrb, RHASH_TBL(self));
1735
+ h_rehash(mrb, mrb_hash_ptr(self));
1402
1736
  return self;
1403
1737
  }
1404
1738
 
@@ -1410,11 +1744,10 @@ mrb_init_hash(mrb_state *mrb)
1410
1744
  mrb->hash_class = h = mrb_define_class(mrb, "Hash", mrb->object_class); /* 15.2.13 */
1411
1745
  MRB_SET_INSTANCE_TT(h, MRB_TT_HASH);
1412
1746
 
1413
- mrb_define_method(mrb, h, "initialize_copy", mrb_hash_init_copy, MRB_ARGS_REQ(1));
1414
1747
  mrb_define_method(mrb, h, "[]", mrb_hash_aget, MRB_ARGS_REQ(1)); /* 15.2.13.4.2 */
1415
1748
  mrb_define_method(mrb, h, "[]=", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.3 */
1416
1749
  mrb_define_method(mrb, h, "clear", mrb_hash_clear, MRB_ARGS_NONE()); /* 15.2.13.4.4 */
1417
- mrb_define_method(mrb, h, "default", mrb_hash_default, MRB_ARGS_OPT(1)); /* 15.2.13.4.5 */
1750
+ mrb_define_method(mrb, h, "default", mrb_hash_default, MRB_ARGS_OPT(1)); /* 15.2.13.4.5 */
1418
1751
  mrb_define_method(mrb, h, "default=", mrb_hash_set_default, MRB_ARGS_REQ(1)); /* 15.2.13.4.6 */
1419
1752
  mrb_define_method(mrb, h, "default_proc", mrb_hash_default_proc,MRB_ARGS_NONE()); /* 15.2.13.4.7 */
1420
1753
  mrb_define_method(mrb, h, "default_proc=", mrb_hash_set_default_proc,MRB_ARGS_REQ(1)); /* 15.2.13.4.7 */
@@ -1424,10 +1757,12 @@ mrb_init_hash(mrb_state *mrb)
1424
1757
  mrb_define_method(mrb, h, "has_value?", mrb_hash_has_value, MRB_ARGS_REQ(1)); /* 15.2.13.4.14 */
1425
1758
  mrb_define_method(mrb, h, "include?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.15 */
1426
1759
  mrb_define_method(mrb, h, "initialize", mrb_hash_init, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); /* 15.2.13.4.16 */
1760
+ mrb_define_method(mrb, h, "initialize_copy", mrb_hash_init_copy, MRB_ARGS_REQ(1)); /* 15.2.13.4.17 */
1427
1761
  mrb_define_method(mrb, h, "key?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.18 */
1428
1762
  mrb_define_method(mrb, h, "keys", mrb_hash_keys, MRB_ARGS_NONE()); /* 15.2.13.4.19 */
1429
1763
  mrb_define_method(mrb, h, "length", mrb_hash_size_m, MRB_ARGS_NONE()); /* 15.2.13.4.20 */
1430
1764
  mrb_define_method(mrb, h, "member?", mrb_hash_has_key, MRB_ARGS_REQ(1)); /* 15.2.13.4.21 */
1765
+ mrb_define_method(mrb, h, "replace", mrb_hash_init_copy, MRB_ARGS_REQ(1)); /* 15.2.13.4.23 */
1431
1766
  mrb_define_method(mrb, h, "shift", mrb_hash_shift, MRB_ARGS_NONE()); /* 15.2.13.4.24 */
1432
1767
  mrb_define_method(mrb, h, "size", mrb_hash_size_m, MRB_ARGS_NONE()); /* 15.2.13.4.25 */
1433
1768
  mrb_define_method(mrb, h, "store", mrb_hash_aset, MRB_ARGS_REQ(2)); /* 15.2.13.4.26 */