enclave 0.1.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 (739) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +182 -0
  3. data/Rakefile +30 -0
  4. data/ext/enclave/enclave.c +390 -0
  5. data/ext/enclave/extconf.rb +33 -0
  6. data/ext/enclave/mruby/Makefile +63 -0
  7. data/ext/enclave/mruby/Rakefile +102 -0
  8. data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
  9. data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
  10. data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
  11. data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
  12. data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
  13. data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
  14. data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
  15. data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
  16. data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
  17. data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
  18. data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
  19. data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
  20. data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
  21. data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
  22. data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
  23. data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
  24. data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
  25. data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
  26. data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
  27. data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
  28. data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
  29. data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
  30. data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
  31. data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
  32. data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
  33. data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
  34. data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
  35. data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
  36. data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
  37. data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
  38. data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
  39. data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
  40. data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
  41. data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
  42. data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
  43. data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
  44. data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
  45. data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
  46. data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
  47. data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
  48. data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
  49. data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
  50. data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
  51. data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
  52. data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
  53. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
  54. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
  55. data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
  56. data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
  57. data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
  58. data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
  59. data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
  60. data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
  61. data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
  62. data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
  63. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
  64. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
  65. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
  66. data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
  67. data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
  68. data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
  69. data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
  70. data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
  71. data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
  72. data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
  73. data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
  74. data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
  75. data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
  76. data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
  77. data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
  78. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
  79. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
  80. data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
  81. data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
  82. data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
  83. data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
  84. data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
  85. data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
  86. data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
  87. data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
  88. data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
  89. data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
  90. data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
  91. data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
  92. data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
  93. data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
  94. data/ext/enclave/mruby/build_config/RX630.rb +63 -0
  95. data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
  96. data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
  97. data/ext/enclave/mruby/build_config/bench.rb +11 -0
  98. data/ext/enclave/mruby/build_config/boxing.rb +19 -0
  99. data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
  100. data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
  101. data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
  102. data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
  103. data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
  104. data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
  105. data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
  106. data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
  107. data/ext/enclave/mruby/build_config/default.rb +83 -0
  108. data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
  109. data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
  110. data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
  111. data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
  112. data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
  113. data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
  114. data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
  115. data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
  116. data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
  117. data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
  118. data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
  119. data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
  120. data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
  121. data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
  122. data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
  123. data/ext/enclave/mruby/build_config/minimal.rb +4 -0
  124. data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
  125. data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
  126. data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
  127. data/ext/enclave/mruby/build_config/no-float.rb +17 -0
  128. data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
  129. data/ext/enclave/mruby/build_config/serenity.rb +26 -0
  130. data/ext/enclave/mruby/build_config.rb +9 -0
  131. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
  132. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
  133. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
  134. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
  135. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
  136. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
  137. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
  138. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
  139. data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
  140. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
  141. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
  142. data/ext/enclave/mruby/include/mrbconf.h +230 -0
  143. data/ext/enclave/mruby/include/mruby/array.h +303 -0
  144. data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
  145. data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
  146. data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
  147. data/ext/enclave/mruby/include/mruby/class.h +157 -0
  148. data/ext/enclave/mruby/include/mruby/common.h +127 -0
  149. data/ext/enclave/mruby/include/mruby/compile.h +187 -0
  150. data/ext/enclave/mruby/include/mruby/data.h +76 -0
  151. data/ext/enclave/mruby/include/mruby/debug.h +75 -0
  152. data/ext/enclave/mruby/include/mruby/dump.h +159 -0
  153. data/ext/enclave/mruby/include/mruby/endian.h +44 -0
  154. data/ext/enclave/mruby/include/mruby/error.h +168 -0
  155. data/ext/enclave/mruby/include/mruby/gc.h +77 -0
  156. data/ext/enclave/mruby/include/mruby/hash.h +234 -0
  157. data/ext/enclave/mruby/include/mruby/internal.h +278 -0
  158. data/ext/enclave/mruby/include/mruby/irep.h +142 -0
  159. data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
  160. data/ext/enclave/mruby/include/mruby/khash.h +455 -0
  161. data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
  162. data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
  163. data/ext/enclave/mruby/include/mruby/object.h +44 -0
  164. data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
  165. data/ext/enclave/mruby/include/mruby/ops.h +133 -0
  166. data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
  167. data/ext/enclave/mruby/include/mruby/presym.h +65 -0
  168. data/ext/enclave/mruby/include/mruby/proc.h +184 -0
  169. data/ext/enclave/mruby/include/mruby/range.h +77 -0
  170. data/ext/enclave/mruby/include/mruby/re.h +16 -0
  171. data/ext/enclave/mruby/include/mruby/string.h +428 -0
  172. data/ext/enclave/mruby/include/mruby/throw.h +81 -0
  173. data/ext/enclave/mruby/include/mruby/value.h +471 -0
  174. data/ext/enclave/mruby/include/mruby/variable.h +108 -0
  175. data/ext/enclave/mruby/include/mruby/version.h +143 -0
  176. data/ext/enclave/mruby/include/mruby.h +1632 -0
  177. data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
  178. data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
  179. data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
  180. data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
  181. data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
  182. data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
  183. data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
  184. data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
  185. data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
  186. data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
  187. data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
  188. data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
  189. data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
  190. data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
  191. data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
  192. data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
  193. data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
  194. data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
  195. data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
  196. data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
  197. data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
  198. data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
  199. data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
  200. data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
  201. data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
  202. data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
  203. data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
  204. data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
  205. data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
  206. data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
  207. data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
  208. data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
  209. data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
  210. data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
  211. data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
  212. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
  213. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
  214. data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
  215. data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
  216. data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
  217. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
  218. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
  219. data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
  220. data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
  221. data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
  222. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
  223. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
  224. data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
  225. data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
  226. data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
  227. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
  228. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
  229. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
  230. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
  231. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
  232. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
  233. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
  234. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
  235. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  236. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
  237. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  238. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
  239. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  240. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
  241. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
  242. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
  243. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
  244. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
  245. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
  246. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
  247. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
  248. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
  249. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
  250. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
  251. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
  252. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
  253. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
  254. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
  255. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
  256. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
  257. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
  258. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
  259. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
  260. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
  261. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
  262. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
  263. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
  264. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
  265. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
  266. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
  267. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
  268. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
  269. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
  270. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
  271. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
  272. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
  273. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
  274. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
  275. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
  276. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
  277. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
  278. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
  279. data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
  280. data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
  281. data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
  282. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
  283. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
  284. data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
  285. data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
  286. data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
  287. data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
  288. data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
  289. data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
  290. data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
  291. data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
  292. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
  293. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
  294. data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
  295. data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
  296. data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
  297. data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
  298. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
  299. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
  300. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
  301. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
  302. data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
  303. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
  304. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
  305. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
  306. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
  307. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
  308. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
  309. data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
  310. data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
  311. data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
  312. data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
  313. data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
  314. data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
  315. data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
  316. data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
  317. data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
  318. data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
  319. data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
  320. data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
  321. data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
  322. data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
  323. data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
  324. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
  325. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
  326. data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
  327. data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
  328. data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
  329. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
  330. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
  331. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
  332. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
  333. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
  334. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
  335. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
  336. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
  337. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
  338. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
  339. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
  340. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  341. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
  342. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
  343. data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
  344. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
  345. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
  346. data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
  347. data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
  348. data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
  349. data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
  350. data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
  351. data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
  352. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
  353. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
  354. data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
  355. data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
  356. data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
  357. data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
  358. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
  359. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
  360. data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
  361. data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
  362. data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
  363. data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
  364. data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
  365. data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
  366. data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
  367. data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
  368. data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
  369. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
  370. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
  371. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
  372. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
  373. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
  374. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
  375. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
  376. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
  377. data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
  378. data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
  379. data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
  380. data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
  381. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
  382. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
  383. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
  384. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
  385. data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
  386. data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
  387. data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
  388. data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
  389. data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
  390. data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
  391. data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
  392. data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
  393. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
  394. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  395. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
  396. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
  397. data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
  398. data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
  399. data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
  400. data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
  401. data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
  402. data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
  403. data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
  404. data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
  405. data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
  406. data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
  407. data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
  408. data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
  409. data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
  410. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
  411. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
  412. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
  413. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
  414. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
  415. data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
  416. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
  417. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
  418. data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
  419. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
  420. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
  421. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
  422. data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
  423. data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
  424. data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
  425. data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
  426. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
  427. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
  428. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
  429. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
  430. data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
  431. data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
  432. data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
  433. data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
  434. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
  435. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
  436. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
  437. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
  438. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
  439. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
  440. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
  441. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
  442. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
  443. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
  444. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
  445. data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
  446. data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
  447. data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
  448. data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
  449. data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
  450. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
  451. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
  452. data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
  453. data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
  454. data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
  455. data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
  456. data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
  457. data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
  458. data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
  459. data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
  460. data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
  461. data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
  462. data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
  463. data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
  464. data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
  465. data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
  466. data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
  467. data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
  468. data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
  469. data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
  470. data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
  471. data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
  472. data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
  473. data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
  474. data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
  475. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
  476. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
  477. data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
  478. data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
  479. data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
  480. data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
  481. data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
  482. data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
  483. data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
  484. data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
  485. data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
  486. data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
  487. data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
  488. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
  489. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
  490. data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
  491. data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
  492. data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
  493. data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
  494. data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
  495. data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
  496. data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
  497. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
  498. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
  499. data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
  500. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
  501. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
  502. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
  503. data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
  504. data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
  505. data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
  506. data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
  507. data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
  508. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
  509. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
  510. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
  511. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
  512. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
  513. data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
  514. data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
  515. data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
  516. data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
  517. data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
  518. data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
  519. data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
  520. data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
  521. data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
  522. data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
  523. data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
  524. data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
  525. data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
  526. data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
  527. data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
  528. data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
  529. data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
  530. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
  531. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
  532. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
  533. data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
  534. data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
  535. data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
  536. data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
  537. data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
  538. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
  539. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
  540. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
  541. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
  542. data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
  543. data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
  544. data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
  545. data/ext/enclave/mruby/mrblib/10error.rb +23 -0
  546. data/ext/enclave/mruby/mrblib/array.rb +102 -0
  547. data/ext/enclave/mruby/mrblib/compar.rb +102 -0
  548. data/ext/enclave/mruby/mrblib/enum.rb +358 -0
  549. data/ext/enclave/mruby/mrblib/hash.rb +276 -0
  550. data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
  551. data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
  552. data/ext/enclave/mruby/mrblib/range.rb +98 -0
  553. data/ext/enclave/mruby/mrblib/string.rb +173 -0
  554. data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
  555. data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
  556. data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
  557. data/ext/enclave/mruby/src/allocf.c +37 -0
  558. data/ext/enclave/mruby/src/array.c +2302 -0
  559. data/ext/enclave/mruby/src/backtrace.c +294 -0
  560. data/ext/enclave/mruby/src/cdump.c +498 -0
  561. data/ext/enclave/mruby/src/class.c +4394 -0
  562. data/ext/enclave/mruby/src/codedump.c +693 -0
  563. data/ext/enclave/mruby/src/debug.c +290 -0
  564. data/ext/enclave/mruby/src/dump.c +998 -0
  565. data/ext/enclave/mruby/src/enum.c +30 -0
  566. data/ext/enclave/mruby/src/error.c +937 -0
  567. data/ext/enclave/mruby/src/etc.c +421 -0
  568. data/ext/enclave/mruby/src/fmt_fp.c +372 -0
  569. data/ext/enclave/mruby/src/gc.c +1610 -0
  570. data/ext/enclave/mruby/src/hash.c +2355 -0
  571. data/ext/enclave/mruby/src/init.c +50 -0
  572. data/ext/enclave/mruby/src/kernel.c +718 -0
  573. data/ext/enclave/mruby/src/load.c +760 -0
  574. data/ext/enclave/mruby/src/mempool.c +225 -0
  575. data/ext/enclave/mruby/src/numeric.c +2420 -0
  576. data/ext/enclave/mruby/src/numops.c +112 -0
  577. data/ext/enclave/mruby/src/object.c +883 -0
  578. data/ext/enclave/mruby/src/print.c +136 -0
  579. data/ext/enclave/mruby/src/proc.c +572 -0
  580. data/ext/enclave/mruby/src/range.c +597 -0
  581. data/ext/enclave/mruby/src/readfloat.c +228 -0
  582. data/ext/enclave/mruby/src/readint.c +27 -0
  583. data/ext/enclave/mruby/src/readnum.c +43 -0
  584. data/ext/enclave/mruby/src/state.c +247 -0
  585. data/ext/enclave/mruby/src/string.c +3577 -0
  586. data/ext/enclave/mruby/src/symbol.c +1023 -0
  587. data/ext/enclave/mruby/src/value_array.h +28 -0
  588. data/ext/enclave/mruby/src/variable.c +1475 -0
  589. data/ext/enclave/mruby/src/version.c +17 -0
  590. data/ext/enclave/mruby/src/vm.c +3696 -0
  591. data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
  592. data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
  593. data/ext/enclave/mruby/tasks/bin.rake +23 -0
  594. data/ext/enclave/mruby/tasks/core.rake +12 -0
  595. data/ext/enclave/mruby/tasks/doc.rake +118 -0
  596. data/ext/enclave/mruby/tasks/install.rake +40 -0
  597. data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
  598. data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
  599. data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
  600. data/ext/enclave/mruby/tasks/presym.rake +57 -0
  601. data/ext/enclave/mruby/tasks/test.rake +84 -0
  602. data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
  603. data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
  604. data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
  605. data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
  606. data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
  607. data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
  608. data/ext/enclave/mruby/test/assert.rb +404 -0
  609. data/ext/enclave/mruby/test/bintest.rb +55 -0
  610. data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
  611. data/ext/enclave/mruby/test/t/array.rb +478 -0
  612. data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
  613. data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
  614. data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
  615. data/ext/enclave/mruby/test/t/class.rb +505 -0
  616. data/ext/enclave/mruby/test/t/codegen.rb +196 -0
  617. data/ext/enclave/mruby/test/t/comparable.rb +79 -0
  618. data/ext/enclave/mruby/test/t/ensure.rb +36 -0
  619. data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
  620. data/ext/enclave/mruby/test/t/exception.rb +425 -0
  621. data/ext/enclave/mruby/test/t/false.rb +31 -0
  622. data/ext/enclave/mruby/test/t/float.rb +296 -0
  623. data/ext/enclave/mruby/test/t/gc.rb +45 -0
  624. data/ext/enclave/mruby/test/t/hash.rb +976 -0
  625. data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
  626. data/ext/enclave/mruby/test/t/integer.rb +247 -0
  627. data/ext/enclave/mruby/test/t/iterations.rb +61 -0
  628. data/ext/enclave/mruby/test/t/kernel.rb +462 -0
  629. data/ext/enclave/mruby/test/t/lang.rb +74 -0
  630. data/ext/enclave/mruby/test/t/literals.rb +386 -0
  631. data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
  632. data/ext/enclave/mruby/test/t/methods.rb +138 -0
  633. data/ext/enclave/mruby/test/t/module.rb +931 -0
  634. data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
  635. data/ext/enclave/mruby/test/t/nil.rb +39 -0
  636. data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
  637. data/ext/enclave/mruby/test/t/numeric.rb +114 -0
  638. data/ext/enclave/mruby/test/t/object.rb +10 -0
  639. data/ext/enclave/mruby/test/t/proc.rb +198 -0
  640. data/ext/enclave/mruby/test/t/range.rb +194 -0
  641. data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
  642. data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
  643. data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
  644. data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
  645. data/ext/enclave/mruby/test/t/string.rb +981 -0
  646. data/ext/enclave/mruby/test/t/superclass.rb +46 -0
  647. data/ext/enclave/mruby/test/t/symbol.rb +30 -0
  648. data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
  649. data/ext/enclave/mruby/test/t/true.rb +31 -0
  650. data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
  651. data/ext/enclave/mruby/test/t/unicode.rb +39 -0
  652. data/ext/enclave/mruby/test/t/vformat.rb +57 -0
  653. data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
  654. data/ext/enclave/mruby/tools/lrama/MIT +21 -0
  655. data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
  656. data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
  657. data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
  658. data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
  659. data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
  660. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
  661. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
  662. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
  663. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
  664. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
  665. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
  666. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
  667. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
  668. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
  669. data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
  670. data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
  671. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
  672. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
  673. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
  674. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
  675. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
  676. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
  677. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
  678. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
  679. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
  680. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
  681. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
  682. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
  683. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
  684. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
  685. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
  686. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
  687. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
  688. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
  689. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
  690. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
  691. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
  692. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
  693. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
  694. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
  695. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
  696. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
  697. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
  698. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
  699. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
  700. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
  701. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
  702. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
  703. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
  704. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
  705. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
  706. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
  707. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
  708. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
  709. data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
  710. data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
  711. data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
  712. data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
  713. data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
  714. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
  715. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
  716. data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
  717. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
  718. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
  719. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
  720. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
  721. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
  722. data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
  723. data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
  724. data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
  725. data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
  726. data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
  727. data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
  728. data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
  729. data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
  730. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
  731. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
  732. data/ext/enclave/sandbox_build_config.rb +15 -0
  733. data/ext/enclave/sandbox_core.c +722 -0
  734. data/ext/enclave/sandbox_core.h +87 -0
  735. data/lib/enclave/result.rb +29 -0
  736. data/lib/enclave/tool.rb +38 -0
  737. data/lib/enclave/version.rb +3 -0
  738. data/lib/enclave.rb +73 -0
  739. metadata +819 -0
@@ -0,0 +1,1535 @@
1
+ /*
2
+ ** set.c - Set class
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #include <mruby.h>
8
+ #include <mruby/array.h>
9
+ #include <mruby/class.h>
10
+ #include <mruby/hash.h>
11
+ #include <mruby/string.h>
12
+ #include <mruby/variable.h>
13
+ #include <mruby/proc.h>
14
+ #include <mruby/data.h>
15
+ #include <mruby/internal.h>
16
+ #include <mruby/presym.h>
17
+ #include <mruby/error.h>
18
+ #include <mruby/khash.h>
19
+
20
+ /* Use khash.h for set implementation - set mode (no values, only keys) */
21
+ KHASH_DECLARE(set_val, mrb_value, char, FALSE) /* FALSE = set mode */
22
+
23
+ /* Helper for protected hash computation */
24
+ static mrb_value
25
+ kset_hash_body(mrb_state *mrb, void *data)
26
+ {
27
+ mrb_value *key = (mrb_value*)data;
28
+ return mrb_int_value(mrb, mrb_obj_hash_code(mrb, *key));
29
+ }
30
+
31
+ /* Helper for protected equality check */
32
+ struct kset_eql_data {
33
+ mrb_value a;
34
+ mrb_value b;
35
+ };
36
+
37
+ static mrb_value
38
+ kset_eql_body(mrb_state *mrb, void *data)
39
+ {
40
+ struct kset_eql_data *d = (struct kset_eql_data*)data;
41
+ return mrb_bool_value(mrb_eql(mrb, d->a, d->b));
42
+ }
43
+
44
+ /* Hash and equality functions for mrb_value keys */
45
+ /* These use mrb_protect_error to catch exceptions and prevent leaks in khash rebuild */
46
+ static inline khint_t
47
+ kset_hash_value(mrb_state *mrb, mrb_value key)
48
+ {
49
+ mrb_bool error;
50
+ mrb_value result = mrb_protect_error(mrb, kset_hash_body, &key, &error);
51
+ if (error) {
52
+ mrb->exc = mrb_obj_ptr(result); /* Store exception to raise later */
53
+ return 0; /* Return default hash value */
54
+ }
55
+ return (khint_t)mrb_integer(result);
56
+ }
57
+
58
+ static inline mrb_bool
59
+ kset_equal_value(mrb_state *mrb, mrb_value a, mrb_value b)
60
+ {
61
+ struct kset_eql_data data = { a, b };
62
+ mrb_bool error;
63
+ mrb_value result = mrb_protect_error(mrb, kset_eql_body, &data, &error);
64
+ if (error) {
65
+ mrb->exc = mrb_obj_ptr(result); /* Store exception to raise later */
66
+ return FALSE; /* Return not-equal */
67
+ }
68
+ return mrb_test(result);
69
+ }
70
+
71
+ KHASH_DEFINE(set_val, mrb_value, char, FALSE, kset_hash_value, kset_equal_value)
72
+
73
+ #define KSET_INITIAL_SIZE 4
74
+ #define GOLDEN_RATIO_PRIME 0x9e3779b97f4a7c15ULL
75
+
76
+ /* Compatibility layer and type definitions */
77
+ typedef kh_set_val_t kset_t;
78
+ typedef khint_t kset_iter_t;
79
+
80
+ /* API Aliases to khash.h */
81
+ #define kset_init(mrb) kh_init(set_val, mrb)
82
+ #define kset_init_data(mrb, s, sz) kh_init_data(set_val, mrb, s, sz)
83
+ #define kset_destroy_data(mrb, s) kh_destroy_data(set_val, mrb, s)
84
+ #define kset_clear(mrb, s) kh_clear(set_val, mrb, s)
85
+ #define kset_resize(mrb, s, sz) kh_resize(set_val, mrb, s, sz)
86
+ #define kset_put(mrb, s, k) kh_put(set_val, mrb, s, k)
87
+ #define kset_put2(mrb, s, k, r) kh_put2(set_val, mrb, s, k, r)
88
+ #define kset_get(mrb, s, k) kh_get(set_val, mrb, s, k)
89
+ #define kset_del(mrb, s, k) kh_del(set_val, mrb, s, k)
90
+ #define kset_exist(s, k) kh_exist(set_val, s, k)
91
+ #define kset_key(s, k) kh_key(set_val, s, k)
92
+ #define kset_size(s) kh_size(s)
93
+ #define kset_end(s) kh_end(s)
94
+ #define kset_is_end(s, k) kh_is_end(s, k)
95
+
96
+ #define KSET_FOREACH(s, k) KHASH_FOREACH(set_val, s, k)
97
+
98
+ /* Helper macros for set state checking */
99
+ #define kset_is_uninitialized(s) ((s)->data == NULL)
100
+ #define kset_is_empty(s) (kset_is_uninitialized(s) || kset_size(s) == 0)
101
+
102
+ /* Embedded set structure in RSet - exactly 3 pointers */
103
+ struct RSet {
104
+ MRB_OBJECT_HEADER;
105
+ kset_t set; /* Embedded directly, not a pointer */
106
+ };
107
+
108
+ mrb_static_assert_object_size(struct RSet);
109
+
110
+ #define mrb_set_ptr(o) ((struct RSet*)mrb_obj_ptr(o))
111
+
112
+ /* Get pointer to embedded set */
113
+ static kset_t*
114
+ set_get_kset(mrb_state *mrb, mrb_value self)
115
+ {
116
+ mrb_check_type(mrb, self, MRB_TT_SET);
117
+ return &mrb_set_ptr(self)->set;
118
+ }
119
+
120
+ /* Get RSet pointer from embedded kset_t pointer */
121
+ #define kset_to_rset(kset) ((struct RBasic*)((char*)(kset) - offsetof(struct RSet, set)))
122
+
123
+ /* Copy all elements from src to dst (merge operation) */
124
+ static void
125
+ kset_copy_merge(mrb_state *mrb, kset_t *dst, kset_t *src)
126
+ {
127
+ if (!kset_is_empty(src)) {
128
+ struct RBasic *dst_obj = kset_to_rset(dst);
129
+ int ai = mrb_gc_arena_save(mrb);
130
+ KSET_FOREACH(src, k) {
131
+ mrb_value key = kset_key(src, k);
132
+ kset_put(mrb, dst, key);
133
+ mrb_field_write_barrier_value(mrb, dst_obj, key);
134
+ mrb_gc_arena_restore(mrb, ai);
135
+ }
136
+ }
137
+ }
138
+
139
+ /* Helper function to ensure set is initialized */
140
+ static void
141
+ set_ensure_initialized(mrb_state *mrb, kset_t *set)
142
+ {
143
+ if (kset_is_uninitialized(set)) {
144
+ mrb_raise(mrb, E_RUNTIME_ERROR, "uninitialized Set");
145
+ }
146
+ }
147
+
148
+ /* Mark function for Set instances */
149
+ size_t
150
+ mrb_gc_mark_set(mrb_state *mrb, struct RBasic *obj)
151
+ {
152
+ struct RSet *s = (struct RSet*)obj;
153
+ kset_t *set = &s->set;
154
+ if (kset_is_empty(set)) return 0;
155
+
156
+ KSET_FOREACH(set, k) {
157
+ mrb_gc_mark_value(mrb, kset_key(set, k));
158
+ }
159
+ return set->size;
160
+ }
161
+
162
+ void
163
+ mrb_gc_free_set(mrb_state *mrb, struct RBasic *obj)
164
+ {
165
+ struct RSet *s = (struct RSet*)obj;
166
+ kset_destroy_data(mrb, &s->set);
167
+ }
168
+
169
+ size_t
170
+ mrb_set_memsize(mrb_value set)
171
+ {
172
+ size_t size = sizeof(struct RSet);
173
+ struct RSet *s = mrb_set_ptr(set);
174
+ kset_t *kset = &s->set;
175
+ if (kset->data) {
176
+ /* New khash layout: keys + flags in single allocation */
177
+ size += sizeof(mrb_value) * kset->n_buckets; /* keys */
178
+ size += kset->n_buckets / 4; /* flags */
179
+ }
180
+ return size;
181
+ }
182
+
183
+ /* Helper function to check if a value is a Set and return a boolean result */
184
+ static mrb_bool
185
+ set_is_set(mrb_value obj)
186
+ {
187
+ return mrb_type(obj) == MRB_TT_SET;
188
+ }
189
+
190
+ /* Helper function to check if a value is a Set and raise an error if not */
191
+ static void
192
+ set_check_type(mrb_state *mrb, mrb_value obj)
193
+ {
194
+ if (!set_is_set(obj)) {
195
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "value must be a set");
196
+ }
197
+ }
198
+
199
+ static mrb_value
200
+ set_init(mrb_state *mrb, mrb_value self)
201
+ {
202
+ kset_t *set = set_get_kset(mrb, self);
203
+ if (!kset_is_uninitialized(set)) {
204
+ mrb_raise(mrb, E_RUNTIME_ERROR, "already initialized set");
205
+ }
206
+ kset_init_data(mrb, set, KSET_INITIAL_SIZE);
207
+ return self;
208
+ }
209
+
210
+ /*
211
+ * call-seq:
212
+ * set.initialize_copy(orig)
213
+ * Copy constructor.
214
+ */
215
+ static mrb_value
216
+ set_init_copy(mrb_state *mrb, mrb_value self)
217
+ {
218
+ mrb_value orig = mrb_get_arg1(mrb);
219
+
220
+ if (mrb_type(orig) != MRB_TT_SET) {
221
+ mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take a Set object");
222
+ }
223
+ if (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig)) {
224
+ mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
225
+ }
226
+
227
+ kset_t *orig_set = set_get_kset(mrb, orig);
228
+ set_ensure_initialized(mrb, orig_set);
229
+
230
+ kset_t *self_set = set_get_kset(mrb, self);
231
+ /* Free existing data if already initialized (for replace semantics) */
232
+ if (!kset_is_uninitialized(self_set)) {
233
+ kset_destroy_data(mrb, self_set);
234
+ }
235
+ kset_init_data(mrb, self_set, kset_size(orig_set));
236
+ kh_replace(set_val, mrb, self_set, orig_set);
237
+
238
+ return self;
239
+ }
240
+
241
+ /*
242
+ * call-seq:
243
+ * set.size -> integer
244
+ * set.length -> integer
245
+ *
246
+ * Returns the number of elements.
247
+ */
248
+ static mrb_value
249
+ set_size(mrb_state *mrb, mrb_value self)
250
+ {
251
+ kset_t *set = set_get_kset(mrb, self);
252
+ if (kset_is_empty(set)) return mrb_fixnum_value(0);
253
+ return mrb_fixnum_value(kset_size(set));
254
+ }
255
+
256
+ /*
257
+ * call-seq:
258
+ * set.empty? -> true or false
259
+ *
260
+ * Returns true if the set contains no elements.
261
+ */
262
+ static mrb_value
263
+ set_empty_p(mrb_state *mrb, mrb_value self)
264
+ {
265
+ kset_t *set = set_get_kset(mrb, self);
266
+ return mrb_bool_value(kset_is_empty(set));
267
+ }
268
+
269
+ /*
270
+ * call-seq:
271
+ * set.clear -> self
272
+ *
273
+ * Removes all elements and returns self.
274
+ */
275
+ static mrb_value
276
+ set_clear(mrb_state *mrb, mrb_value self)
277
+ {
278
+ kset_t *set = set_get_kset(mrb, self);
279
+ if (!kset_is_empty(set)) {
280
+ kset_clear(mrb, set);
281
+ }
282
+ return self;
283
+ }
284
+
285
+ /*
286
+ * call-seq:
287
+ * set.to_a -> array
288
+ *
289
+ * Converts the set to an array.
290
+ */
291
+ static mrb_value
292
+ set_to_a(mrb_state *mrb, mrb_value self)
293
+ {
294
+ kset_t *set = set_get_kset(mrb, self);
295
+
296
+ if (kset_is_empty(set)) return mrb_ary_new(mrb);
297
+
298
+ mrb_value ary = mrb_ary_new_capa(mrb, kset_size(set));
299
+
300
+ int ai = mrb_gc_arena_save(mrb);
301
+ KSET_FOREACH(set, k) {
302
+ mrb_ary_push(mrb, ary, kset_key(set, k));
303
+ mrb_gc_arena_restore(mrb, ai);
304
+ }
305
+
306
+ return ary;
307
+ }
308
+
309
+ /*
310
+ * call-seq:
311
+ * set.include?(object) -> true or false
312
+ * set.member?(object) -> true or false
313
+ * set === object -> true or false
314
+ *
315
+ * Returns true if the set contains the given object.
316
+ */
317
+ static mrb_value
318
+ set_include_p(mrb_state *mrb, mrb_value self)
319
+ {
320
+ mrb_value obj = mrb_get_arg1(mrb);
321
+ kset_t *set = set_get_kset(mrb, self);
322
+ if (kset_is_empty(set)) return mrb_false_value();
323
+
324
+ return mrb_bool_value(!kset_is_end(set, kset_get(mrb, set, obj)));
325
+ }
326
+
327
+ /*
328
+ * call-seq:
329
+ * set.add(object) -> self
330
+ * set << object -> self
331
+ *
332
+ * Adds the given object to the set and returns self.
333
+ */
334
+ static mrb_value
335
+ set_add(mrb_state *mrb, mrb_value self)
336
+ {
337
+ mrb_value obj = mrb_get_arg1(mrb);
338
+ kset_t *set = set_get_kset(mrb, self);
339
+ set_ensure_initialized(mrb, set);
340
+
341
+ kset_put(mrb, set, obj);
342
+ mrb_field_write_barrier_value(mrb, kset_to_rset(set), obj);
343
+ return self;
344
+ }
345
+
346
+ /*
347
+ * call-seq:
348
+ * set.add?(object) -> self or nil
349
+ *
350
+ * Adds the given object to the set and returns self. If the object is already
351
+ * in the set, returns nil.
352
+ */
353
+ static mrb_value
354
+ set_add_p(mrb_state *mrb, mrb_value self)
355
+ {
356
+ mrb_value obj = mrb_get_arg1(mrb);
357
+ kset_t *set = set_get_kset(mrb, self);
358
+ set_ensure_initialized(mrb, set);
359
+
360
+ int ret;
361
+ kset_put2(mrb, set, obj, &ret);
362
+ mrb_field_write_barrier_value(mrb, kset_to_rset(set), obj);
363
+ return (ret == 0) ? mrb_nil_value() : self;
364
+ }
365
+
366
+ /*
367
+ * call-seq:
368
+ * set.delete(object) -> self
369
+ *
370
+ * Deletes the given object from the set and returns self.
371
+ */
372
+ static mrb_value
373
+ set_delete(mrb_state *mrb, mrb_value self)
374
+ {
375
+ mrb_value obj = mrb_get_arg1(mrb);
376
+ kset_t *set = set_get_kset(mrb, self);
377
+ if (kset_is_empty(set)) return self;
378
+
379
+ kset_iter_t k = kset_get(mrb, set, obj);
380
+ if (!kset_is_end(set, k)) {
381
+ kset_del(mrb, set, k);
382
+ }
383
+ return self;
384
+ }
385
+
386
+ /*
387
+ * call-seq:
388
+ * set.delete?(object) -> self or nil
389
+ *
390
+ * Deletes the given object from the set and returns self. If the object is not
391
+ * in the set, returns nil.
392
+ */
393
+ static mrb_value
394
+ set_delete_p(mrb_state *mrb, mrb_value self)
395
+ {
396
+ mrb_value obj = mrb_get_arg1(mrb);
397
+ kset_t *set = set_get_kset(mrb, self);
398
+ if (kset_is_empty(set)) return mrb_nil_value();
399
+
400
+ kset_iter_t k = kset_get(mrb, set, obj);
401
+ if (!kset_is_end(set, k)) {
402
+ kset_del(mrb, set, k);
403
+ return self;
404
+ }
405
+ else {
406
+ return mrb_nil_value();
407
+ }
408
+ }
409
+
410
+ /*
411
+ * Core implementation of Set-to-Set merge (mutating version)
412
+ * This is an internal method that will be called from Ruby
413
+ */
414
+ static mrb_value
415
+ set_core_merge(mrb_state *mrb, mrb_value self)
416
+ {
417
+ mrb_value other = mrb_get_arg1(mrb);
418
+
419
+ if (!set_is_set(other)) {
420
+ return mrb_false_value();
421
+ }
422
+
423
+ kset_t *self_set = set_get_kset(mrb, self);
424
+ kset_t *other_set = set_get_kset(mrb, other);
425
+
426
+ set_ensure_initialized(mrb, self_set);
427
+ if (!kset_is_empty(other_set)) {
428
+ kset_copy_merge(mrb, self_set, other_set);
429
+ }
430
+
431
+ return mrb_true_value();
432
+ }
433
+
434
+ /*
435
+ * Core implementation of Set-to-Set subtraction (mutating version)
436
+ * This is an internal method that will be called from Ruby
437
+ */
438
+ static mrb_value
439
+ set_core_subtract(mrb_state *mrb, mrb_value self)
440
+ {
441
+ mrb_value other = mrb_get_arg1(mrb);
442
+
443
+ if (!set_is_set(other)) {
444
+ return mrb_false_value();
445
+ }
446
+
447
+ kset_t *self_set = set_get_kset(mrb, self);
448
+ if (kset_is_empty(self_set)) return mrb_true_value();
449
+
450
+ kset_t *other_set = set_get_kset(mrb, other);
451
+ if (kset_is_empty(other_set)) return mrb_true_value();
452
+
453
+ /* Remove all elements that are in other set */
454
+ KSET_FOREACH(other_set, k) {
455
+ mrb_value key = kset_key(other_set, k);
456
+ kset_iter_t self_k = kset_get(mrb, self_set, key);
457
+ if (!kset_is_end(self_set, self_k)) {
458
+ kset_del(mrb, self_set, self_k);
459
+ }
460
+ }
461
+
462
+ return mrb_true_value();
463
+ }
464
+
465
+ /*
466
+ * Core implementation of Set-to-Set union
467
+ * This is an internal method that will be called from Ruby
468
+ */
469
+ static mrb_value
470
+ set_core_union(mrb_state *mrb, mrb_value self)
471
+ {
472
+ mrb_value other = mrb_get_arg1(mrb);
473
+
474
+ if (!set_is_set(other)) {
475
+ return mrb_nil_value();
476
+ }
477
+
478
+ /* Create a new set by duplicating self */
479
+ mrb_value result = mrb_obj_dup(mrb, self);
480
+ kset_t *result_set = set_get_kset(mrb, result);
481
+ if (kset_is_uninitialized(result_set)) {
482
+ /* If self is empty, initialize the set */
483
+ kset_init_data(mrb, result_set, KSET_INITIAL_SIZE);
484
+ }
485
+
486
+ /* Add all elements from other set */
487
+ kset_t *other_set = set_get_kset(mrb, other);
488
+ if (!kset_is_uninitialized(other_set)) {
489
+ kset_copy_merge(mrb, result_set, other_set);
490
+ }
491
+
492
+ return result;
493
+ }
494
+
495
+ /*
496
+ * Core implementation of Set-to-Set difference
497
+ * This is an internal method that will be called from Ruby
498
+ */
499
+ static mrb_value
500
+ set_core_difference(mrb_state *mrb, mrb_value self)
501
+ {
502
+ mrb_value other = mrb_get_arg1(mrb);
503
+
504
+ if (!set_is_set(other)) {
505
+ return mrb_nil_value();
506
+ }
507
+
508
+ /* Create a new set by duplicating self */
509
+ mrb_value result = mrb_obj_dup(mrb, self);
510
+ kset_t *result_set = set_get_kset(mrb, result);
511
+ if (kset_is_uninitialized(result_set)) {
512
+ /* If self is empty, return an empty set */
513
+ return result;
514
+ }
515
+
516
+ /* Remove all elements that are in other set */
517
+ kset_t *other_set = set_get_kset(mrb, other);
518
+ if (!kset_is_uninitialized(other_set)) {
519
+ KSET_FOREACH(other_set, k) {
520
+ mrb_value key = kset_key(other_set, k);
521
+ kset_iter_t result_k = kset_get(mrb, result_set, key);
522
+ if (!kset_is_end(result_set, result_k)) {
523
+ kset_del(mrb, result_set, result_k);
524
+ }
525
+ }
526
+ }
527
+
528
+ return result;
529
+ }
530
+
531
+
532
+ /*
533
+ * Core implementation of Set-to-Set intersection
534
+ * This is an internal method that will be called from Ruby
535
+ */
536
+ static mrb_value
537
+ set_core_intersection(mrb_state *mrb, mrb_value self)
538
+ {
539
+ mrb_value other = mrb_get_arg1(mrb);
540
+
541
+ if (!set_is_set(other)) {
542
+ return mrb_nil_value();
543
+ }
544
+
545
+ /* Create a new empty set of the same class as self */
546
+ mrb_value result = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
547
+ kset_t *result_set = set_get_kset(mrb, result);
548
+
549
+ kset_t *self_set = set_get_kset(mrb, self);
550
+ if (kset_is_uninitialized(self_set)) return result;
551
+
552
+ kset_t *other_set = set_get_kset(mrb, other);
553
+ if (kset_is_uninitialized(other_set)) return result;
554
+
555
+ KSET_FOREACH(other_set, k) {
556
+ mrb_value key = kset_key(other_set, k);
557
+ kset_iter_t self_k = kset_get(mrb, self_set, key);
558
+
559
+ /* If key exists in self, add it to result */
560
+ if (!kset_is_end(self_set, self_k)) {
561
+ kset_put(mrb, result_set, key);
562
+ mrb_field_write_barrier_value(mrb, kset_to_rset(result_set), key);
563
+ }
564
+ }
565
+
566
+ return result;
567
+ }
568
+
569
+
570
+ /*
571
+ * Core implementation of Set-to-Set XOR (symmetric difference)
572
+ * This is an internal method that will be called from Ruby
573
+ */
574
+ static mrb_value
575
+ set_core_xor(mrb_state *mrb, mrb_value self)
576
+ {
577
+ mrb_value other = mrb_get_arg1(mrb);
578
+
579
+ if (!set_is_set(other)) {
580
+ return mrb_nil_value();
581
+ }
582
+
583
+ mrb_value result = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
584
+ kset_t *result_set = set_get_kset(mrb, result);
585
+ kset_t *self_set, *other_set;
586
+
587
+ self_set = set_get_kset(mrb, self);
588
+ other_set = set_get_kset(mrb, other);
589
+
590
+ /* Handle empty sets */
591
+ if (kset_is_empty(self_set)) {
592
+ if (!kset_is_empty(other_set)) {
593
+ kset_copy_merge(mrb, result_set, other_set);
594
+ }
595
+ return result;
596
+ }
597
+ if (kset_is_empty(other_set)) {
598
+ kh_replace(set_val, mrb, result_set, self_set);
599
+ return result;
600
+ }
601
+
602
+ /* Add elements from self that are not in other */
603
+ int ai = mrb_gc_arena_save(mrb);
604
+ KSET_FOREACH(self_set, k) {
605
+ mrb_value key = kset_key(self_set, k);
606
+ kset_iter_t other_k = kset_get(mrb, other_set, key);
607
+
608
+ /* Add to result if not in other */
609
+ if (kset_is_end(other_set, other_k)) {
610
+ kset_put(mrb, result_set, key);
611
+ mrb_field_write_barrier_value(mrb, kset_to_rset(result_set), key);
612
+ }
613
+ mrb_gc_arena_restore(mrb, ai);
614
+ }
615
+
616
+ /* Add elements from other that are not in self */
617
+ KSET_FOREACH(other_set, k) {
618
+ mrb_value key = kset_key(other_set, k);
619
+ kset_iter_t self_k = kset_get(mrb, self_set, key);
620
+
621
+ /* Add to result if not in self */
622
+ if (kset_is_end(self_set, self_k)) {
623
+ kset_put(mrb, result_set, key);
624
+ mrb_field_write_barrier_value(mrb, kset_to_rset(result_set), key);
625
+ }
626
+ mrb_gc_arena_restore(mrb, ai);
627
+ }
628
+
629
+ return result;
630
+ }
631
+
632
+ /*
633
+ * call-seq:
634
+ * set == other -> true or false
635
+ *
636
+ * Returns true if two sets are equal.
637
+ */
638
+ /*
639
+ * call-seq:
640
+ * set.eql?(other) -> true or false
641
+ *
642
+ * Returns true if two sets are equal.
643
+ */
644
+ static mrb_value
645
+ set_equal(mrb_state *mrb, mrb_value self)
646
+ {
647
+ mrb_value other = mrb_get_arg1(mrb);
648
+
649
+ /* Fast path: same object */
650
+ if (mrb_obj_equal(mrb, self, other)) {
651
+ return mrb_true_value();
652
+ }
653
+
654
+ /* Only compare with other Set objects */
655
+ if (!set_is_set(other)) {
656
+ return mrb_false_value();
657
+ }
658
+
659
+ kset_t *self_set = set_get_kset(mrb, self);
660
+ kset_t *other_set = set_get_kset(mrb, other);
661
+
662
+ /* Fast path: both empty */
663
+ if (kset_is_empty(self_set) && kset_is_empty(other_set)) {
664
+ return mrb_true_value();
665
+ }
666
+
667
+ /* Fast path: different sizes */
668
+ if (kset_size(self_set) != kset_size(other_set)) {
669
+ return mrb_false_value();
670
+ }
671
+
672
+ /* Compare elements: iterate through the smaller hash for efficiency */
673
+ int ai = mrb_gc_arena_save(mrb);
674
+ KSET_FOREACH(self_set, k) {
675
+ kset_iter_t k2 = kset_get(mrb, other_set, kset_key(self_set, k));
676
+ if (kset_is_end(other_set, k2)) {
677
+ return mrb_false_value(); /* Element in self not found in other */
678
+ }
679
+ mrb_gc_arena_restore(mrb, ai);
680
+ }
681
+
682
+ return mrb_true_value();
683
+ }
684
+
685
+ /*
686
+ * call-seq:
687
+ * set.hash -> integer
688
+ *
689
+ * Compute a hash-code for this set.
690
+ * Uses an improved hash algorithm for better distribution.
691
+ */
692
+ static mrb_value
693
+ set_hash_m(mrb_state *mrb, mrb_value self)
694
+ {
695
+ kset_t *set = set_get_kset(mrb, self);
696
+
697
+ /* Use order-independent hash algorithm for sets */
698
+ uint64_t hash = 0; /* Start with zero for XOR accumulation */
699
+
700
+ /* Include the size of the set in the hash */
701
+ size_t size = kset_size(set);
702
+ hash ^= size * GOLDEN_RATIO_PRIME;
703
+
704
+ if (!kset_is_uninitialized(set) && size > 0) {
705
+ /* Process each element - order independent using XOR */
706
+ int ai = mrb_gc_arena_save(mrb);
707
+ KSET_FOREACH(set, k) {
708
+ /* Get element's hash code */
709
+ khint_t elem_hash = (khint_t)mrb_obj_hash_code(mrb, kset_key(set, k));
710
+
711
+ /* XOR is commutative, so order doesn't matter */
712
+ hash ^= elem_hash * GOLDEN_RATIO_PRIME;
713
+
714
+ mrb_gc_arena_restore(mrb, ai);
715
+ }
716
+ }
717
+
718
+ /* Final mixing to improve distribution */
719
+ hash ^= hash >> 32;
720
+
721
+ return mrb_fixnum_value((mrb_int)hash);
722
+ }
723
+
724
+ /*
725
+ * call-seq:
726
+ * set.superset?(other) -> true or false
727
+ * set >= other -> true or false
728
+ *
729
+ * Returns true if the set is a superset of the given set.
730
+ */
731
+ static mrb_value
732
+ set_superset_p(mrb_state *mrb, mrb_value self)
733
+ {
734
+ mrb_value other = mrb_get_arg1(mrb);
735
+
736
+ /* Check if other is a Set */
737
+ set_check_type(mrb, other);
738
+
739
+ kset_t *self_set = set_get_kset(mrb, self);
740
+ kset_t *other_set = set_get_kset(mrb, other);
741
+
742
+ /* Handle empty sets */
743
+ if (kset_is_empty(other_set)) {
744
+ return mrb_true_value(); /* Empty set is a subset of any set */
745
+ }
746
+
747
+ if (kset_is_uninitialized(self_set)) {
748
+ return mrb_false_value(); /* Empty set is not a superset of a non-empty set */
749
+ }
750
+
751
+ /* Check size first - a superset must be at least as large as the subset */
752
+ if (kset_size(self_set) < kset_size(other_set)) {
753
+ return mrb_false_value();
754
+ }
755
+
756
+ /* Check if all elements in other are in self */
757
+ int ai = mrb_gc_arena_save(mrb);
758
+ KSET_FOREACH(other_set, k) {
759
+ kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
760
+ if (kset_is_end(self_set, self_k)) {
761
+ return mrb_false_value(); /* Element in other not found in self */
762
+ }
763
+ mrb_gc_arena_restore(mrb, ai);
764
+ }
765
+
766
+ return mrb_true_value();
767
+ }
768
+
769
+ /*
770
+ * call-seq:
771
+ * set.proper_superset?(other) -> true or false
772
+ * set > other -> true or false
773
+ *
774
+ * Returns true if the set is a proper superset of the given set.
775
+ */
776
+ static mrb_value
777
+ set_proper_superset_p(mrb_state *mrb, mrb_value self)
778
+ {
779
+ mrb_value other = mrb_get_arg1(mrb);
780
+
781
+ /* Check if other is a Set */
782
+ set_check_type(mrb, other);
783
+
784
+ kset_t *self_set = set_get_kset(mrb, self);
785
+ kset_t *other_set = set_get_kset(mrb, other);
786
+
787
+ /* Handle empty sets */
788
+ if (kset_is_empty(other_set)) {
789
+ /* Empty set is a proper subset of any non-empty set */
790
+ return !kset_is_empty(self_set) ? mrb_true_value() : mrb_false_value();
791
+ }
792
+
793
+ if (kset_is_uninitialized(self_set)) {
794
+ return mrb_false_value(); /* Empty set is not a proper superset of any set */
795
+ }
796
+
797
+ /* For a proper superset, self must be strictly larger than other */
798
+ if (kset_size(self_set) <= kset_size(other_set)) {
799
+ return mrb_false_value();
800
+ }
801
+
802
+ /* Check if all elements in other are in self */
803
+ int ai = mrb_gc_arena_save(mrb);
804
+ KSET_FOREACH(other_set, k) {
805
+ kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
806
+ if (kset_is_end(self_set, self_k)) {
807
+ return mrb_false_value(); /* Element in other not found in self */
808
+ }
809
+ mrb_gc_arena_restore(mrb, ai);
810
+ }
811
+
812
+ return mrb_true_value();
813
+ }
814
+
815
+ /*
816
+ * call-seq:
817
+ * set.subset?(other) -> true or false
818
+ * set <= other -> true or false
819
+ *
820
+ * Returns true if the set is a subset of the given set.
821
+ */
822
+ static mrb_value
823
+ set_subset_p(mrb_state *mrb, mrb_value self)
824
+ {
825
+ mrb_value other = mrb_get_arg1(mrb);
826
+
827
+ /* Check if other is a Set */
828
+ set_check_type(mrb, other);
829
+
830
+ kset_t *self_set = set_get_kset(mrb, self);
831
+ kset_t *other_set = set_get_kset(mrb, other);
832
+
833
+ /* Handle empty sets */
834
+ if (kset_is_empty(self_set)) {
835
+ return mrb_true_value(); /* Empty set is a subset of any set */
836
+ }
837
+
838
+ if (kset_is_uninitialized(other_set)) {
839
+ return mrb_false_value(); /* Non-empty set is not a subset of an empty set */
840
+ }
841
+
842
+ /* Check size first - a subset cannot be larger than its superset */
843
+ if (kset_size(other_set) < kset_size(self_set)) {
844
+ return mrb_false_value();
845
+ }
846
+
847
+ /* Check if all elements in self are in other */
848
+ int ai = mrb_gc_arena_save(mrb);
849
+ KSET_FOREACH(self_set, k) {
850
+ kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
851
+ if (kset_is_end(other_set, other_k)) {
852
+ return mrb_false_value(); /* Element in self not found in other */
853
+ }
854
+ mrb_gc_arena_restore(mrb, ai);
855
+ }
856
+
857
+ return mrb_true_value();
858
+ }
859
+
860
+ /*
861
+ * call-seq:
862
+ * set.proper_subset?(other) -> true or false
863
+ * set < other -> true or false
864
+ *
865
+ * Returns true if the set is a proper subset of the given set.
866
+ */
867
+ static mrb_value
868
+ set_proper_subset_p(mrb_state *mrb, mrb_value self)
869
+ {
870
+ mrb_value other = mrb_get_arg1(mrb);
871
+
872
+ /* Check if other is a Set */
873
+ set_check_type(mrb, other);
874
+
875
+ kset_t *self_set = set_get_kset(mrb, self);
876
+ kset_t *other_set = set_get_kset(mrb, other);
877
+
878
+ /* Handle empty sets */
879
+ if (kset_is_empty(self_set)) {
880
+ /* Empty set is a proper subset of any non-empty set */
881
+ return !kset_is_empty(other_set) ? mrb_true_value() : mrb_false_value();
882
+ }
883
+
884
+ if (kset_is_uninitialized(other_set)) {
885
+ return mrb_false_value(); /* Non-empty set is not a proper subset of an empty set */
886
+ }
887
+
888
+ /* For a proper subset, self must be strictly smaller than other */
889
+ if (kset_size(other_set) <= kset_size(self_set)) {
890
+ return mrb_false_value();
891
+ }
892
+
893
+ /* Check if all elements in self are in other */
894
+ int ai = mrb_gc_arena_save(mrb);
895
+ KSET_FOREACH(self_set, k) {
896
+ kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
897
+ if (kset_is_end(other_set, other_k)) {
898
+ return mrb_false_value(); /* Element in self not found in other */
899
+ }
900
+ mrb_gc_arena_restore(mrb, ai);
901
+ }
902
+
903
+ return mrb_true_value();
904
+ }
905
+
906
+ /*
907
+ * call-seq:
908
+ * set.intersect?(other) -> true or false
909
+ *
910
+ * Returns true if the set and the given set have at least one element in common.
911
+ */
912
+ static mrb_value
913
+ set_intersect_p(mrb_state *mrb, mrb_value self)
914
+ {
915
+ mrb_value other = mrb_get_arg1(mrb);
916
+
917
+ /* Check if other is a Set */
918
+ set_check_type(mrb, other);
919
+
920
+ kset_t *self_set = set_get_kset(mrb, self);
921
+ kset_t *other_set = set_get_kset(mrb, other);
922
+
923
+ /* Handle empty sets */
924
+ if (kset_is_empty(self_set) || kset_is_empty(other_set)) {
925
+ return mrb_false_value(); /* Empty sets have no elements in common */
926
+ }
927
+
928
+ /* Iterate through the smaller set for efficiency */
929
+ int ai = mrb_gc_arena_save(mrb);
930
+ if (kset_size(self_set) < kset_size(other_set)) {
931
+ KSET_FOREACH(self_set, k) {
932
+ kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
933
+ if (!kset_is_end(other_set, other_k)) {
934
+ return mrb_true_value(); /* Found a common element */
935
+ }
936
+ mrb_gc_arena_restore(mrb, ai);
937
+ }
938
+ }
939
+ else {
940
+ KSET_FOREACH(other_set, k) {
941
+ kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
942
+ if (!kset_is_end(self_set, self_k)) {
943
+ return mrb_true_value(); /* Found a common element */
944
+ }
945
+ mrb_gc_arena_restore(mrb, ai);
946
+ }
947
+ }
948
+
949
+ return mrb_false_value(); /* No common elements found */
950
+ }
951
+
952
+ /*
953
+ * call-seq:
954
+ * set.disjoint?(other) -> true or false
955
+ *
956
+ * Returns true if the set and the given set have no elements in common.
957
+ */
958
+ static mrb_value
959
+ set_disjoint_p(mrb_state *mrb, mrb_value self)
960
+ {
961
+ mrb_value result = set_intersect_p(mrb, self);
962
+ return mrb_bool_value(!mrb_test(result));
963
+ }
964
+
965
+ /*
966
+ * call-seq:
967
+ * set <=> other -> -1, 0, +1, or nil
968
+ *
969
+ * Compares this set with another set.
970
+ * Returns -1 if this set is a proper subset of the other set,
971
+ * +1 if this set is a proper superset of the other set,
972
+ * 0 if the sets are equal,
973
+ * or nil if the sets cannot be compared (they are neither subsets nor supersets).
974
+ */
975
+ static mrb_value
976
+ set_cmp(mrb_state *mrb, mrb_value self)
977
+ {
978
+ mrb_value other = mrb_get_arg1(mrb);
979
+
980
+ if (!set_is_set(other)) {
981
+ return mrb_nil_value();
982
+ }
983
+
984
+ kset_t *self_set = set_get_kset(mrb, self);
985
+ kset_t *other_set = set_get_kset(mrb, other);
986
+
987
+ /* Handle empty sets */
988
+ if (kset_is_empty(self_set)) {
989
+ if (kset_is_empty(other_set)) {
990
+ return mrb_fixnum_value(0); /* Both empty, they're equal */
991
+ }
992
+ return mrb_fixnum_value(-1); /* Empty set is a proper subset of any non-empty set */
993
+ }
994
+
995
+ if (kset_is_empty(other_set)) {
996
+ return mrb_fixnum_value(1); /* Any non-empty set is a proper superset of an empty set */
997
+ }
998
+
999
+ /* Compare sizes */
1000
+ mrb_int size_diff = kset_size(self_set) - kset_size(other_set);
1001
+
1002
+ if (size_diff < 0) {
1003
+ /* self might be a proper subset of other */
1004
+ int ai = mrb_gc_arena_save(mrb);
1005
+ KSET_FOREACH(self_set, k) {
1006
+ kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
1007
+ if (kset_is_end(other_set, other_k)) {
1008
+ /* Not a subset */
1009
+ return mrb_nil_value(); /* Not comparable */
1010
+ }
1011
+ mrb_gc_arena_restore(mrb, ai);
1012
+ }
1013
+
1014
+ /* All elements of self are in other, and self is smaller than other */
1015
+ return mrb_fixnum_value(-1); /* self is a proper subset of other */
1016
+ }
1017
+ else if (size_diff > 0) {
1018
+ /* self might be a proper superset of other */
1019
+ int ai = mrb_gc_arena_save(mrb);
1020
+ KSET_FOREACH(other_set, k) {
1021
+ kset_iter_t self_k = kset_get(mrb, self_set, kset_key(other_set, k));
1022
+ if (kset_is_end(self_set, self_k)) {
1023
+ /* Not a superset */
1024
+ return mrb_nil_value(); /* Not comparable */
1025
+ }
1026
+ mrb_gc_arena_restore(mrb, ai);
1027
+ }
1028
+
1029
+ /* All elements of other are in self, and self is larger than other */
1030
+ return mrb_fixnum_value(1); /* self is a proper superset of other */
1031
+ }
1032
+ else { /* size_diff == 0 */
1033
+ /* Same size, check if they're equal */
1034
+ mrb_bool is_equal = TRUE;
1035
+
1036
+ int ai3 = mrb_gc_arena_save(mrb);
1037
+ KSET_FOREACH(self_set, k) {
1038
+ kset_iter_t other_k = kset_get(mrb, other_set, kset_key(self_set, k));
1039
+ if (kset_is_end(other_set, other_k)) {
1040
+ is_equal = FALSE;
1041
+ break;
1042
+ }
1043
+ mrb_gc_arena_restore(mrb, ai3);
1044
+ }
1045
+
1046
+ if (is_equal) {
1047
+ return mrb_fixnum_value(0); /* Sets are equal */
1048
+ }
1049
+ }
1050
+
1051
+ /* Sets are not comparable */
1052
+ return mrb_nil_value();
1053
+ }
1054
+
1055
+ /*
1056
+ * call-seq:
1057
+ * set.join(separator = nil) -> string
1058
+ *
1059
+ * Returns a string created by converting each element of the set to a string,
1060
+ * separated by the given separator.
1061
+ */
1062
+ static mrb_value
1063
+ set_join(mrb_state *mrb, mrb_value self)
1064
+ {
1065
+ mrb_value separator = mrb_nil_value();
1066
+ mrb_get_args(mrb, "|S", &separator);
1067
+
1068
+ kset_t *set = set_get_kset(mrb, self);
1069
+ if (kset_is_empty(set)) {
1070
+ return mrb_str_new_lit(mrb, "");
1071
+ }
1072
+
1073
+ /* Create result string */
1074
+ mrb_value result = mrb_str_new_capa(mrb, 64); /* Initial capacity */
1075
+ mrb_bool first = TRUE;
1076
+
1077
+ /* Iterate through all elements */
1078
+ int ai = mrb_gc_arena_save(mrb);
1079
+ KSET_FOREACH(set, k) {
1080
+ if (!first) {
1081
+ if (!mrb_nil_p(separator)) {
1082
+ mrb_str_cat(mrb, result, RSTRING_PTR(separator), RSTRING_LEN(separator));
1083
+ }
1084
+ }
1085
+ else {
1086
+ first = FALSE;
1087
+ }
1088
+
1089
+ mrb_value elem = kset_key(set, k);
1090
+ mrb_value str = mrb_obj_as_string(mrb, elem);
1091
+ mrb_str_cat_str(mrb, result, str);
1092
+
1093
+ mrb_gc_arena_restore(mrb, ai);
1094
+ }
1095
+
1096
+ return result;
1097
+ }
1098
+
1099
+ /*
1100
+ * call-seq:
1101
+ * set.inspect -> string
1102
+ * set.to_s -> string
1103
+ *
1104
+ * Returns a string representation of the set.
1105
+ * Format: Set[elem1, elem2, ...]
1106
+ */
1107
+ static mrb_value
1108
+ set_inspect(mrb_state *mrb, mrb_value self)
1109
+ {
1110
+ struct RClass* c = mrb_obj_class(mrb, self);
1111
+ const char* classname = mrb_class_name(mrb, c);
1112
+ kset_t *set = set_get_kset(mrb, self);
1113
+
1114
+ /* Handle empty set */
1115
+ if (kset_is_empty(set)) {
1116
+ return mrb_format(mrb, "%s[]", classname);
1117
+ }
1118
+
1119
+ /* Handle recursive inspection */
1120
+ if (MRB_RECURSIVE_UNARY_P(mrb, MRB_SYM(inspect), self)) {
1121
+ return mrb_format(mrb, "%s[...]", classname);
1122
+ }
1123
+
1124
+ /* Estimate buffer size based on set size */
1125
+ size_t size = kset_size(set);
1126
+ size_t buffer_size = 16 + strlen(classname) + (size * 8); /* Rough estimate */
1127
+
1128
+ /* Create the beginning of the string with pre-allocated capacity */
1129
+ mrb_value result_str = mrb_str_new_capa(mrb, buffer_size);
1130
+ mrb_str_cat_cstr(mrb, result_str, classname);
1131
+ mrb_str_cat_lit(mrb, result_str, "[");
1132
+
1133
+ /* Iterate through all elements */
1134
+ mrb_bool first = TRUE;
1135
+ int ai = mrb_gc_arena_save(mrb);
1136
+ KSET_FOREACH(set, k) {
1137
+ if (!first) {
1138
+ mrb_str_cat_lit(mrb, result_str, ", ");
1139
+ }
1140
+ else {
1141
+ first = FALSE;
1142
+ }
1143
+
1144
+ mrb_value elem = kset_key(set, k);
1145
+ mrb_value entry_str = mrb_inspect(mrb, elem);
1146
+ mrb_str_cat_str(mrb, result_str, entry_str);
1147
+
1148
+ mrb_gc_arena_restore(mrb, ai);
1149
+ }
1150
+
1151
+ /* Add the closing part */
1152
+ mrb_str_cat_lit(mrb, result_str, "]");
1153
+
1154
+ return result_str;
1155
+ }
1156
+
1157
+ /*
1158
+ * call-seq:
1159
+ * set.reset -> self
1160
+ *
1161
+ * Resets the internal state after modification to existing elements.
1162
+ * This is necessary when the hash value of objects in the set has changed.
1163
+ * It rebuilds the hash table to ensure all elements can be found.
1164
+ */
1165
+ static mrb_value
1166
+ set_reset(mrb_state *mrb, mrb_value self)
1167
+ {
1168
+ mrb_check_frozen_value(mrb, self);
1169
+
1170
+ kset_t *set = set_get_kset(mrb, self);
1171
+ if (!kset_is_empty(set)) {
1172
+ kset_resize(mrb, set, kset_size(set));
1173
+ }
1174
+
1175
+ return self;
1176
+ }
1177
+
1178
+ /*
1179
+ * call-seq:
1180
+ * set.add_all(*objects) -> self
1181
+ *
1182
+ * Adds multiple objects to the set and returns self.
1183
+ */
1184
+ static mrb_value
1185
+ set_add_all(mrb_state *mrb, mrb_value self)
1186
+ {
1187
+ const mrb_value *argv;
1188
+ mrb_int argc;
1189
+
1190
+ mrb_get_args(mrb, "*", &argv, &argc);
1191
+ kset_t *set = set_get_kset(mrb, self);
1192
+ set_ensure_initialized(mrb, set);
1193
+
1194
+ int ai = mrb_gc_arena_save(mrb);
1195
+ for (mrb_int i = 0; i < argc; i++) {
1196
+ kset_put(mrb, set, argv[i]);
1197
+ mrb_field_write_barrier_value(mrb, kset_to_rset(set), argv[i]);
1198
+ mrb_gc_arena_restore(mrb, ai);
1199
+ }
1200
+
1201
+ return self;
1202
+ }
1203
+
1204
+ /*
1205
+ * Optimized implementation for flattening sets
1206
+ * Uses a more efficient algorithm with minimal memory usage
1207
+ */
1208
+
1209
+ /* Small array for tracking seen object IDs to detect cycles */
1210
+ #define MAX_NESTED_DEPTH 16
1211
+
1212
+ /*
1213
+ * Recursively flattens a set by merging nested sets into the target set.
1214
+ * This is an internal helper function that does not call back to the VM.
1215
+ *
1216
+ * @param mrb The mruby state
1217
+ * @param target The target set table to add elements to
1218
+ * @param source The source set table to flatten
1219
+ * @param seen_count Pointer to the current count of seen sets (recursion depth)
1220
+ * @return 0 on success, -1 if recursion depth exceeds maximum
1221
+ */
1222
+ static int
1223
+ set_flatten_recursive(mrb_state *mrb, kset_t *target, kset_t *source, int *seen_count)
1224
+ {
1225
+ if (!source || !target) return 0;
1226
+ if (*seen_count >= MAX_NESTED_DEPTH) return -1;
1227
+
1228
+ struct RBasic *target_obj = kset_to_rset(target);
1229
+ int ai = mrb_gc_arena_save(mrb);
1230
+ /* Process each element in the source set */
1231
+ KSET_FOREACH(source, k) {
1232
+ mrb_value elem = kset_key(source, k);
1233
+
1234
+ /* Check if element is a Set */
1235
+ if (set_is_set(elem)) {
1236
+ /* Increment recursion depth */
1237
+ (*seen_count)++;
1238
+
1239
+ /* Recursively flatten the nested set */
1240
+ kset_t *nested_set = set_get_kset(mrb, elem);
1241
+ if (nested_set) {
1242
+ int nested_result = set_flatten_recursive(mrb, target, nested_set, seen_count);
1243
+ if (nested_result < 0) {
1244
+ return nested_result; /* Propagate error code */
1245
+ }
1246
+ }
1247
+
1248
+ /* Decrement recursion depth */
1249
+ (*seen_count)--;
1250
+ }
1251
+ else {
1252
+ /* Add non-Set element directly */
1253
+ kset_put(mrb, target, elem);
1254
+ mrb_field_write_barrier_value(mrb, target_obj, elem);
1255
+ }
1256
+ mrb_gc_arena_restore(mrb, ai);
1257
+ }
1258
+ return 0;
1259
+ }
1260
+
1261
+ /*
1262
+ * Helper function: Check if a set has any nested sets
1263
+ * Returns TRUE if nested sets found, FALSE otherwise
1264
+ */
1265
+ static mrb_bool
1266
+ set_has_nested_sets(mrb_state *mrb, kset_t *set)
1267
+ {
1268
+ if (kset_is_empty(set)) return FALSE;
1269
+
1270
+ int ai = mrb_gc_arena_save(mrb);
1271
+ KSET_FOREACH(set, k) {
1272
+ if (set_is_set(kset_key(set, k))) {
1273
+ return TRUE;
1274
+ }
1275
+ mrb_gc_arena_restore(mrb, ai);
1276
+ }
1277
+ return FALSE;
1278
+ }
1279
+
1280
+ /*
1281
+ * Helper function: Perform the actual flattening operation
1282
+ * Returns the flattened set (creates a new kset_t*)
1283
+ */
1284
+ static void
1285
+ set_do_flatten(mrb_state *mrb, kset_t *result_set, kset_t *source_set)
1286
+ {
1287
+ int seen_count = 0;
1288
+
1289
+ if (set_flatten_recursive(mrb, result_set, source_set, &seen_count) < 0) {
1290
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "flatten recursion depth too deep");
1291
+ }
1292
+ }
1293
+
1294
+ /*
1295
+ * call-seq:
1296
+ * set.flatten -> new_set
1297
+ *
1298
+ * Returns a new set that is a flattened version of this set.
1299
+ * Recursively flattens nested sets.
1300
+ */
1301
+ static mrb_value
1302
+ set_flatten(mrb_state *mrb, mrb_value self)
1303
+ {
1304
+ kset_t *self_set = set_get_kset(mrb, self);
1305
+
1306
+ /* Fast path for empty sets */
1307
+ if (kset_is_empty(self_set)) {
1308
+ return mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
1309
+ }
1310
+
1311
+ /* Fast path: check if there are any nested sets */
1312
+ if (!set_has_nested_sets(mrb, self_set)) {
1313
+ return mrb_obj_dup(mrb, self);
1314
+ }
1315
+
1316
+ /* Create a new set and flatten into it */
1317
+ mrb_value result = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
1318
+ kset_t *result_set = set_get_kset(mrb, result);
1319
+
1320
+ set_do_flatten(mrb, result_set, self_set);
1321
+
1322
+ return result;
1323
+ }
1324
+
1325
+ /*
1326
+ * call-seq:
1327
+ * set.flatten! -> self or nil
1328
+ *
1329
+ * Replaces the contents of this set with a flattened version of itself.
1330
+ * Returns self if flattened, nil if no changes were made.
1331
+ */
1332
+ static mrb_value
1333
+ set_flatten_bang(mrb_state *mrb, mrb_value self)
1334
+ {
1335
+ mrb_check_frozen_value(mrb, self);
1336
+
1337
+ kset_t *self_set = set_get_kset(mrb, self);
1338
+ if (kset_is_empty(self_set)) {
1339
+ return mrb_nil_value(); /* No changes needed for empty set */
1340
+ }
1341
+
1342
+ /* Check if there are any nested sets */
1343
+ if (!set_has_nested_sets(mrb, self_set)) {
1344
+ return mrb_nil_value(); /* No nested sets, no changes needed */
1345
+ }
1346
+
1347
+ /* Create a temporary set to flatten into (GC-protected) */
1348
+ mrb_value temp = mrb_obj_new(mrb, mrb_obj_class(mrb, self), 0, NULL);
1349
+ kset_t *temp_set = set_get_kset(mrb, temp);
1350
+
1351
+ set_do_flatten(mrb, temp_set, self_set);
1352
+
1353
+ /* Swap the data between self and temp */
1354
+ kset_t temp_data = *self_set;
1355
+ *self_set = *temp_set;
1356
+ *temp_set = temp_data;
1357
+
1358
+ return self;
1359
+ }
1360
+
1361
+ /*
1362
+ * call-seq:
1363
+ * set.delete_all(*objects) -> self
1364
+ *
1365
+ * Deletes multiple objects from the set and returns self.
1366
+ */
1367
+ static mrb_value
1368
+ set_delete_all(mrb_state *mrb, mrb_value self)
1369
+ {
1370
+ const mrb_value *argv;
1371
+ mrb_int argc;
1372
+
1373
+ mrb_get_args(mrb, "*", &argv, &argc);
1374
+ kset_t *ks = set_get_kset(mrb, self);
1375
+ if (kset_is_uninitialized(ks)) return self;
1376
+
1377
+ int ai = mrb_gc_arena_save(mrb);
1378
+ for (mrb_int i = 0; i < argc; i++) {
1379
+ kset_iter_t k = kset_get(mrb, ks, argv[i]);
1380
+ if (!kset_is_end(ks, k)) {
1381
+ kset_del(mrb, ks, k);
1382
+ }
1383
+ mrb_gc_arena_restore(mrb, ai);
1384
+ }
1385
+
1386
+ return self;
1387
+ }
1388
+
1389
+ /*
1390
+ * call-seq:
1391
+ * set.include_all?(*objects) -> true or false
1392
+ *
1393
+ * Returns true if the set contains all of the given objects.
1394
+ */
1395
+ static mrb_value
1396
+ set_include_all_p(mrb_state *mrb, mrb_value self)
1397
+ {
1398
+ const mrb_value *argv;
1399
+ mrb_int argc;
1400
+
1401
+ mrb_get_args(mrb, "*", &argv, &argc);
1402
+ kset_t *ks = set_get_kset(mrb, self);
1403
+ if (kset_is_uninitialized(ks)) return mrb_false_value();
1404
+
1405
+ for (mrb_int i = 0; i < argc; i++) {
1406
+ kset_iter_t k = kset_get(mrb, ks, argv[i]);
1407
+ if (kset_is_end(ks, k)) {
1408
+ return mrb_false_value();
1409
+ }
1410
+ }
1411
+
1412
+ return mrb_true_value();
1413
+ }
1414
+
1415
+ /*
1416
+ * call-seq:
1417
+ * set.include_any?(*objects) -> true or false
1418
+ *
1419
+ * Returns true if the set contains any of the given objects.
1420
+ */
1421
+ static mrb_value
1422
+ set_include_any_p(mrb_state *mrb, mrb_value self)
1423
+ {
1424
+ const mrb_value *argv;
1425
+ mrb_int argc;
1426
+
1427
+ mrb_get_args(mrb, "*", &argv, &argc);
1428
+ kset_t *ks = set_get_kset(mrb, self);
1429
+ if (kset_is_empty(ks)) return mrb_false_value();
1430
+
1431
+ for (mrb_int i = 0; i < argc; i++) {
1432
+ kset_iter_t k = kset_get(mrb, ks, argv[i]);
1433
+ if (!kset_is_end(ks, k)) {
1434
+ return mrb_true_value();
1435
+ }
1436
+ }
1437
+
1438
+ return mrb_false_value();
1439
+ }
1440
+
1441
+ /*
1442
+ * call-seq:
1443
+ * Set[*ary] -> new_set
1444
+ *
1445
+ * Creates a new set containing the given objects.
1446
+ */
1447
+ static mrb_value
1448
+ set_s_create(mrb_state *mrb, mrb_value klass)
1449
+ {
1450
+ const mrb_value *argv;
1451
+ mrb_int argc;
1452
+
1453
+ mrb_get_args(mrb, "*", &argv, &argc);
1454
+
1455
+ /* Optimized direct creation */
1456
+ mrb_value set = mrb_obj_new(mrb, mrb_class_ptr(klass), 0, NULL);
1457
+ kset_t *ks = set_get_kset(mrb, set);
1458
+
1459
+ for (mrb_int i = 0; i < argc; i++) {
1460
+ kset_put(mrb, ks, argv[i]);
1461
+ mrb_field_write_barrier_value(mrb, kset_to_rset(ks), argv[i]);
1462
+ }
1463
+
1464
+ return set;
1465
+ }
1466
+
1467
+ static const mrb_mt_entry set_rom_entries[] = {
1468
+ MRB_MT_ENTRY(set_size, MRB_SYM(size), MRB_ARGS_NONE()),
1469
+ MRB_MT_ENTRY(set_size, MRB_SYM(length), MRB_ARGS_NONE()),
1470
+ MRB_MT_ENTRY(set_empty_p, MRB_SYM_Q(empty), MRB_ARGS_NONE()),
1471
+ MRB_MT_ENTRY(set_clear, MRB_SYM(clear), MRB_ARGS_NONE()),
1472
+ MRB_MT_ENTRY(set_to_a, MRB_SYM(to_a), MRB_ARGS_NONE()),
1473
+ MRB_MT_ENTRY(set_include_p, MRB_SYM_Q(include), MRB_ARGS_REQ(1)),
1474
+ MRB_MT_ENTRY(set_include_p, MRB_SYM_Q(member), MRB_ARGS_REQ(1)),
1475
+ MRB_MT_ENTRY(set_include_p, MRB_OPSYM(eqq), MRB_ARGS_REQ(1)),
1476
+ MRB_MT_ENTRY(set_add, MRB_SYM(add), MRB_ARGS_REQ(1)),
1477
+ MRB_MT_ENTRY(set_add, MRB_OPSYM(lshift), MRB_ARGS_REQ(1)),
1478
+ MRB_MT_ENTRY(set_add_p, MRB_SYM_Q(add), MRB_ARGS_REQ(1)),
1479
+ MRB_MT_ENTRY(set_delete, MRB_SYM(delete), MRB_ARGS_REQ(1)),
1480
+ MRB_MT_ENTRY(set_delete_p, MRB_SYM_Q(delete), MRB_ARGS_REQ(1)),
1481
+ MRB_MT_ENTRY(set_init, MRB_SYM(__init), MRB_ARGS_NONE()),
1482
+ MRB_MT_ENTRY(set_core_merge, MRB_SYM(__merge), MRB_ARGS_REQ(1)),
1483
+ MRB_MT_ENTRY(set_core_subtract, MRB_SYM(__subtract), MRB_ARGS_REQ(1)),
1484
+ MRB_MT_ENTRY(set_core_union, MRB_SYM(__union), MRB_ARGS_REQ(1)),
1485
+ MRB_MT_ENTRY(set_core_difference, MRB_SYM(__difference), MRB_ARGS_REQ(1)),
1486
+ MRB_MT_ENTRY(set_core_intersection, MRB_SYM(__intersection), MRB_ARGS_REQ(1)),
1487
+ MRB_MT_ENTRY(set_core_xor, MRB_SYM(__xor), MRB_ARGS_REQ(1)),
1488
+ MRB_MT_ENTRY(set_equal, MRB_OPSYM(eq), MRB_ARGS_REQ(1)),
1489
+ MRB_MT_ENTRY(set_hash_m, MRB_SYM(hash), MRB_ARGS_NONE()),
1490
+ MRB_MT_ENTRY(set_join, MRB_SYM(join), MRB_ARGS_OPT(1)),
1491
+ MRB_MT_ENTRY(set_inspect, MRB_SYM(inspect), MRB_ARGS_NONE()),
1492
+ MRB_MT_ENTRY(set_inspect, MRB_SYM(to_s), MRB_ARGS_NONE()),
1493
+ MRB_MT_ENTRY(set_reset, MRB_SYM(reset), MRB_ARGS_NONE()),
1494
+ MRB_MT_ENTRY(set_add_all, MRB_SYM(add_all), MRB_ARGS_ANY()),
1495
+ MRB_MT_ENTRY(set_delete_all, MRB_SYM(delete_all), MRB_ARGS_ANY()),
1496
+ MRB_MT_ENTRY(set_include_all_p, MRB_SYM_Q(include_all), MRB_ARGS_ANY()),
1497
+ MRB_MT_ENTRY(set_include_any_p, MRB_SYM_Q(include_any), MRB_ARGS_ANY()),
1498
+ MRB_MT_ENTRY(set_superset_p, MRB_SYM_Q(superset), MRB_ARGS_REQ(1)),
1499
+ MRB_MT_ENTRY(set_superset_p, MRB_OPSYM(ge), MRB_ARGS_REQ(1)),
1500
+ MRB_MT_ENTRY(set_proper_superset_p, MRB_SYM_Q(proper_superset), MRB_ARGS_REQ(1)),
1501
+ MRB_MT_ENTRY(set_proper_superset_p, MRB_OPSYM(gt), MRB_ARGS_REQ(1)),
1502
+ MRB_MT_ENTRY(set_subset_p, MRB_SYM_Q(subset), MRB_ARGS_REQ(1)),
1503
+ MRB_MT_ENTRY(set_subset_p, MRB_OPSYM(le), MRB_ARGS_REQ(1)),
1504
+ MRB_MT_ENTRY(set_proper_subset_p, MRB_SYM_Q(proper_subset), MRB_ARGS_REQ(1)),
1505
+ MRB_MT_ENTRY(set_proper_subset_p, MRB_OPSYM(lt), MRB_ARGS_REQ(1)),
1506
+ MRB_MT_ENTRY(set_intersect_p, MRB_SYM_Q(intersect), MRB_ARGS_REQ(1)),
1507
+ MRB_MT_ENTRY(set_disjoint_p, MRB_SYM_Q(disjoint), MRB_ARGS_REQ(1)),
1508
+ MRB_MT_ENTRY(set_cmp, MRB_OPSYM(cmp), MRB_ARGS_REQ(1)),
1509
+ MRB_MT_ENTRY(set_flatten, MRB_SYM(flatten), MRB_ARGS_NONE()),
1510
+ MRB_MT_ENTRY(set_flatten_bang, MRB_SYM_B(flatten), MRB_ARGS_NONE()),
1511
+ };
1512
+
1513
+ void
1514
+ mrb_mruby_set_gem_init(mrb_state *mrb)
1515
+ {
1516
+ struct RClass *set;
1517
+
1518
+ set = mrb_define_class(mrb, "Set", mrb->object_class);
1519
+ MRB_SET_INSTANCE_TT(set, MRB_TT_SET);
1520
+
1521
+ mrb_include_module(mrb, set, mrb_module_get(mrb, "Enumerable"));
1522
+
1523
+ mrb_define_class_method(mrb, set, "[]", set_s_create, MRB_ARGS_ANY());
1524
+
1525
+ mrb_define_private_method(mrb, set, "initialize_copy", set_init_copy, MRB_ARGS_REQ(1));
1526
+
1527
+ MRB_MT_INIT_ROM(mrb, set, set_rom_entries);
1528
+
1529
+ mrb_define_alias(mrb, set, "eql?", "==");
1530
+ }
1531
+
1532
+ void
1533
+ mrb_mruby_set_gem_final(mrb_state *mrb)
1534
+ {
1535
+ }