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,1583 @@
1
+ #include <mruby.h>
2
+ #include <string.h>
3
+ #include <mruby/value.h>
4
+ #include <mruby/array.h>
5
+ #include <mruby/range.h>
6
+ #include <mruby/hash.h>
7
+ #include <mruby/data.h>
8
+ #include <mruby/class.h>
9
+ #include <mruby/internal.h>
10
+ #include <mruby/presym.h>
11
+ #include <mruby/khash.h>
12
+ #include <mruby/error.h>
13
+
14
+ /* khash set for temporary array operations */
15
+ static inline khint_t
16
+ ary_set_hash_func(mrb_state *mrb, mrb_value key)
17
+ {
18
+ return (khint_t)mrb_obj_hash_code(mrb, key);
19
+ }
20
+
21
+ static inline mrb_bool
22
+ ary_set_equal_func(mrb_state *mrb, mrb_value a, mrb_value b)
23
+ {
24
+ return mrb_eql(mrb, a, b);
25
+ }
26
+
27
+ KHASH_DECLARE(ary_set, mrb_value, char, 0)
28
+ KHASH_DEFINE(ary_set, mrb_value, char, 0, ary_set_hash_func, ary_set_equal_func)
29
+
30
+ typedef khash_t(ary_set) ary_set_t;
31
+
32
+ /* Combination state structure for repeated_combination optimization */
33
+ struct mrb_combination_state {
34
+ mrb_int *indices;
35
+ mrb_int n;
36
+ mrb_int array_size;
37
+ mrb_bool permutation;
38
+ mrb_bool finished;
39
+ };
40
+
41
+ static void
42
+ mrb_combination_state_free(mrb_state *mrb, void *ptr)
43
+ {
44
+ struct mrb_combination_state *state = (struct mrb_combination_state*)ptr;
45
+ if (state) {
46
+ if (state->indices) {
47
+ mrb_free(mrb, state->indices);
48
+ }
49
+ mrb_free(mrb, state);
50
+ }
51
+ }
52
+
53
+ static struct mrb_data_type mrb_combination_state_type = {
54
+ "CombinationState", mrb_combination_state_free
55
+ };
56
+
57
+ /*
58
+ * call-seq:
59
+ * ary.assoc(obj) -> new_ary or nil
60
+ *
61
+ * Searches through an array whose elements are also arrays
62
+ * comparing _obj_ with the first element of each contained array
63
+ * using obj.==.
64
+ * Returns the first contained array that matches (that
65
+ * is, the first associated array),
66
+ * or `nil` if no match is found.
67
+ * See also `Array#rassoc`.
68
+ *
69
+ * s1 = [ "colors", "red", "blue", "green" ]
70
+ * s2 = [ "letters", "a", "b", "c" ]
71
+ * s3 = "foo"
72
+ * a = [ s1, s2, s3 ]
73
+ * a.assoc("letters") #=> [ "letters", "a", "b", "c" ]
74
+ * a.assoc("foo") #=> nil
75
+ */
76
+
77
+ static mrb_value
78
+ ary_assoc(mrb_state *mrb, mrb_value ary)
79
+ {
80
+ mrb_value k = mrb_get_arg1(mrb);
81
+
82
+ for (mrb_int i = 0; i < RARRAY_LEN(ary); i++) {
83
+ mrb_value v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
84
+ if (!mrb_nil_p(v) && RARRAY_LEN(v) > 0 &&
85
+ mrb_equal(mrb, RARRAY_PTR(v)[0], k))
86
+ return v;
87
+ }
88
+ return mrb_nil_value();
89
+ }
90
+
91
+ /*
92
+ * call-seq:
93
+ * ary.rassoc(obj) -> new_ary or nil
94
+ *
95
+ * Searches through the array whose elements are also arrays. Compares
96
+ * _obj_ with the second element of each contained array using
97
+ * `==`. Returns the first contained array that matches. See
98
+ * also `Array#assoc`.
99
+ *
100
+ * a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ]
101
+ * a.rassoc("two") #=> [2, "two"]
102
+ * a.rassoc("four") #=> nil
103
+ */
104
+
105
+ static mrb_value
106
+ ary_rassoc(mrb_state *mrb, mrb_value ary)
107
+ {
108
+ mrb_value value = mrb_get_arg1(mrb);
109
+
110
+ for (mrb_int i = 0; i < RARRAY_LEN(ary); i++) {
111
+ mrb_value v = RARRAY_PTR(ary)[i];
112
+ if (mrb_array_p(v) &&
113
+ RARRAY_LEN(v) > 1 &&
114
+ mrb_equal(mrb, RARRAY_PTR(v)[1], value))
115
+ return v;
116
+ }
117
+ return mrb_nil_value();
118
+ }
119
+
120
+ /*
121
+ * call-seq:
122
+ * ary.at(index) -> obj or nil
123
+ *
124
+ * Returns the element at _index_. A
125
+ * negative index counts from the end of `self`. Returns `nil`
126
+ * if the index is out of range. See also `Array#[]`.
127
+ *
128
+ * a = [ "a", "b", "c", "d", "e" ]
129
+ * a.at(0) #=> "a"
130
+ * a.at(-1) #=> "e"
131
+ */
132
+
133
+ static mrb_value
134
+ ary_at(mrb_state *mrb, mrb_value ary)
135
+ {
136
+ mrb_int pos = mrb_as_int(mrb, mrb_get_arg1(mrb));
137
+
138
+ return mrb_ary_entry(ary, pos);
139
+ }
140
+
141
+ /* Helper function for values_at - returns element at index n */
142
+ static mrb_value
143
+ ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n)
144
+ {
145
+ return mrb_ary_entry(ary, n);
146
+ }
147
+
148
+ /*
149
+ * call-seq:
150
+ * ary.values_at(selector, ...) -> new_ary
151
+ *
152
+ * Returns an array containing the elements in `self` corresponding to the
153
+ * given `selector`(s). The selectors may be either integer indices or ranges.
154
+ *
155
+ * a = %w{ a b c d e f }
156
+ * a.values_at(1, 3, 5) # => ["b", "d", "f"]
157
+ * a.values_at(1, 3, 5, 7) # => ["b", "d", "f", nil]
158
+ * a.values_at(-1, -2, -2, -7) # => ["f", "e", "e", nil]
159
+ * a.values_at(4..6, 3...6) # => ["e", "f", nil, "d", "e", "f"]
160
+ */
161
+
162
+ static mrb_value
163
+ ary_values_at(mrb_state *mrb, mrb_value self)
164
+ {
165
+ mrb_int argc = mrb_get_argc(mrb);
166
+ const mrb_value *argv = mrb_get_argv(mrb);
167
+
168
+ return mrb_get_values_at(mrb, self, RARRAY_LEN(self), argc, argv, ary_ref);
169
+ }
170
+
171
+ mrb_value mrb_ary_delete_at(mrb_state *mrb, mrb_value self);
172
+
173
+ /*
174
+ * call-seq:
175
+ * ary.slice!(index) -> obj or nil
176
+ * ary.slice!(start, length) -> new_ary or nil
177
+ * ary.slice!(range) -> new_ary or nil
178
+ *
179
+ * Deletes the element(s) given by an `index` (optionally up to `length`
180
+ * elements) or by a `range`.
181
+ *
182
+ * Returns the deleted object (or objects), or `nil` if the `index` is out of
183
+ * range.
184
+ *
185
+ * a = [ "a", "b", "c" ]
186
+ * a.slice!(1) #=> "b"
187
+ * a #=> ["a", "c"]
188
+ * a.slice!(-1) #=> "c"
189
+ * a #=> ["a"]
190
+ * a.slice!(100) #=> nil
191
+ * a #=> ["a"]
192
+ */
193
+
194
+ static mrb_value
195
+ ary_slice_bang(mrb_state *mrb, mrb_value self)
196
+ {
197
+ struct RArray *a = mrb_ary_ptr(self);
198
+ mrb_int i, len;
199
+
200
+ mrb_ary_modify(mrb, a);
201
+
202
+ if (mrb_get_argc(mrb) == 1) {
203
+ mrb_value index = mrb_get_arg1(mrb);
204
+
205
+ if (mrb_type(index) == MRB_TT_RANGE) {
206
+ if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) != MRB_RANGE_OK) {
207
+ return mrb_nil_value();
208
+ }
209
+ }
210
+ else {
211
+ return mrb_ary_delete_at(mrb, self);
212
+ }
213
+ }
214
+ else {
215
+ mrb_get_args(mrb, "ii", &i, &len);
216
+ }
217
+
218
+ mrb_int alen = ARY_LEN(a);
219
+ if (i < 0) i += alen;
220
+ if (i < 0 || alen < i) return mrb_nil_value();
221
+ if (len < 0) return mrb_nil_value();
222
+ if (alen == i) return mrb_ary_new(mrb);
223
+ if (len > alen - i) len = alen - i;
224
+
225
+ mrb_value ary = mrb_ary_new_from_values(mrb, len, ARY_PTR(a) + i);
226
+
227
+ /* refresh pointer after mrb_ary_new_from_values */
228
+ a = mrb_ary_ptr(self);
229
+
230
+ for (int j = i; j < alen - len; j++) {
231
+ ARY_PTR(a)[j] = ARY_PTR(a)[j+len];
232
+ }
233
+
234
+ mrb_ary_resize(mrb, self, alen - len);
235
+ return ary;
236
+ }
237
+
238
+ /*
239
+ * call-seq:
240
+ * ary.compact! -> ary or nil
241
+ *
242
+ * Removes `nil` elements from the array.
243
+ * Returns `nil` if no changes were made, otherwise returns
244
+ * *ary*.
245
+ *
246
+ * [ "a", nil, "b", nil, "c" ].compact! #=> [ "a", "b", "c" ]
247
+ * [ "a", "b", "c" ].compact! #=> nil
248
+ */
249
+ static mrb_value
250
+ ary_compact_bang(mrb_state *mrb, mrb_value self)
251
+ {
252
+ struct RArray *a = mrb_ary_ptr(self);
253
+ mrb_int i, j = 0;
254
+ mrb_int len = ARY_LEN(a);
255
+
256
+ mrb_ary_modify(mrb, a);
257
+ /* a is still valid here, as mrb_ary_modify only modifies the RArray struct, not reallocates it */
258
+ /* Hoist pointer retrieval outside loop to avoid repeated conditionals */
259
+ mrb_value *ptr = RARRAY_PTR(self);
260
+ for (i = 0; i < len; i++) {
261
+ if (!mrb_nil_p(ptr[i])) {
262
+ if (i != j) ptr[j] = ptr[i];
263
+ j++;
264
+ }
265
+ }
266
+ if (i == j) return mrb_nil_value();
267
+ ARY_SET_LEN(RARRAY(self), j);
268
+ return self;
269
+ }
270
+
271
+ /*
272
+ * call-seq:
273
+ * ary.compact -> new_ary
274
+ *
275
+ * Returns a copy of `self` with all `nil` elements removed.
276
+ *
277
+ * [ "a", nil, "b", nil, "c", nil ].compact
278
+ * #=> [ "a", "b", "c" ]
279
+ */
280
+
281
+ static mrb_value
282
+ ary_compact(mrb_state *mrb, mrb_value self)
283
+ {
284
+ mrb_value ary = mrb_ary_dup(mrb, self);
285
+ ary_compact_bang(mrb, ary);
286
+ return ary;
287
+ }
288
+
289
+
290
+ /*
291
+ * call-seq:
292
+ * ary.rotate(count=1) -> new_ary
293
+ *
294
+ * Returns a new array by rotating `self` so that the element at `count` is
295
+ * the first element of the new array.
296
+ *
297
+ * If `count` is negative then it rotates in the opposite direction, starting
298
+ * from the end of `self` where +-1+ is the last element.
299
+ *
300
+ * a = [ "a", "b", "c", "d" ]
301
+ * a.rotate #=> ["b", "c", "d", "a"]
302
+ * a #=> ["a", "b", "c", "d"]
303
+ * a.rotate(2) #=> ["c", "d", "a", "b"]
304
+ * a.rotate(-3) #=> ["b", "c", "d", "a"]
305
+ */
306
+ static mrb_value
307
+ ary_rotate(mrb_state *mrb, mrb_value self)
308
+ {
309
+ mrb_int count=1;
310
+ mrb_get_args(mrb, "|i", &count);
311
+
312
+ mrb_value ary = mrb_ary_new(mrb);
313
+ mrb_int len = RARRAY_LEN(self);
314
+ mrb_int idx;
315
+
316
+ if (len <= 0) return ary;
317
+ if (count < 0) {
318
+ idx = len - (~count % len) - 1;
319
+ }
320
+ else {
321
+ idx = count % len;
322
+ }
323
+ /* Hoist pointer retrieval outside loop */
324
+ mrb_value *ptr = RARRAY_PTR(self);
325
+ for (mrb_int i = 0; i<len; i++) {
326
+ mrb_ary_push(mrb, ary, ptr[idx++]);
327
+ if (idx == len) idx = 0;
328
+ }
329
+ return ary;
330
+ }
331
+
332
+ /* Helper function to reverse array elements in-place between beg and end indices */
333
+ static void
334
+ rev(mrb_value *p, mrb_int beg, mrb_int end)
335
+ {
336
+ for (mrb_int i=beg,j=end-1; i<j; i++,j--) {
337
+ mrb_value v = p[i];
338
+ p[i] = p[j];
339
+ p[j] = v;
340
+ }
341
+ }
342
+
343
+ /*
344
+ * call-seq:
345
+ * ary.rotate!(count=1) -> ary
346
+ *
347
+ * Rotates `self` in place so that the element at `count` comes first, and
348
+ * returns `self`.
349
+ *
350
+ * If `count` is negative then it rotates in the opposite direction, starting
351
+ * from the end of the array where `-1` is the last element.
352
+ *
353
+ * a = [ "a", "b", "c", "d" ]
354
+ * a.rotate! #=> ["b", "c", "d", "a"]
355
+ * a #=> ["b", "c", "d", "a"]
356
+ * a.rotate!(2) #=> ["d", "a", "b", "c"]
357
+ * a.rotate!(-3) #=> ["a", "b", "c", "d"]
358
+ */
359
+ static mrb_value
360
+ ary_rotate_bang(mrb_state *mrb, mrb_value self)
361
+ {
362
+ mrb_int count=1;
363
+ mrb_get_args(mrb, "|i", &count);
364
+
365
+ struct RArray *a = mrb_ary_ptr(self);
366
+ mrb_int len = ARY_LEN(a);
367
+ mrb_int idx;
368
+
369
+ mrb_ary_modify(mrb, a);
370
+ mrb_value *p = ARY_PTR(a);
371
+ if (len == 0 || count == 0) return self;
372
+ if (count == 1) {
373
+ mrb_value v = p[0];
374
+ for (mrb_int i=1; i<len; i++) {
375
+ p[i-1] = p[i];
376
+ }
377
+ p[len-1] = v;
378
+ return self;
379
+ }
380
+ if (count < 0) {
381
+ idx = len - (~count % len) - 1;
382
+ }
383
+ else {
384
+ idx = count % len;
385
+ }
386
+ /* e.g. [1,2,3,4,5].rotate!(2) -> [3,4,5,1,2] */
387
+ /* first, reverse the whole array */
388
+ /* [1,2,3,4,5] -> [5,4,3,2,1] */
389
+ rev(p, 0, len);
390
+ /* then, re-reverse part before idx */
391
+ /* [5,4,3,2,1] -> [3,4,5,2,1] */
392
+ /* ^idx ~~~~~ */
393
+ rev(p, 0, len-idx);
394
+ /* finally, re-reverse part after idx */
395
+ /* [3,4,5,2,1] -> [3,4,5,1,2] */
396
+ /* ^idx ~~~ */
397
+ rev(p, len-idx, len);
398
+ return self;
399
+ }
400
+
401
+ #define SET_OP_HASH_THRESHOLD 32
402
+
403
+ /* Helper functions for temporary khash sets */
404
+ static void
405
+ ary_init_temp_set(mrb_state *mrb, ary_set_t *set, mrb_int capacity)
406
+ {
407
+ kh_init_data(ary_set, mrb, set, (khint_t)(capacity > 0 ? capacity : 8));
408
+ }
409
+
410
+ static void
411
+ ary_populate_temp_set(mrb_state *mrb, ary_set_t *set, mrb_value ary)
412
+ {
413
+ mrb_int len = RARRAY_LEN(ary);
414
+ for (mrb_int i = 0; i < len; i++) {
415
+ kh_put(ary_set, mrb, set, RARRAY_PTR(ary)[i]);
416
+ }
417
+ }
418
+
419
+ static void
420
+ ary_destroy_temp_set(mrb_state *mrb, ary_set_t *set)
421
+ {
422
+ if (set) {
423
+ kh_destroy_data(ary_set, mrb, set);
424
+ }
425
+ }
426
+
427
+
428
+ static mrb_int
429
+ ary_get_array_args(mrb_state *mrb, mrb_int argc, const mrb_value **argv_ptr)
430
+ {
431
+ mrb_int total_len = 0;
432
+ const mrb_value *argv = *argv_ptr;
433
+ mrb_value *converted_argv = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
434
+
435
+ for (mrb_int i = 0; i < argc; i++) {
436
+ mrb_value other = mrb_check_array_type(mrb, argv[i]);
437
+ if (mrb_nil_p(other)) {
438
+ mrb_raise(mrb, E_TYPE_ERROR, "can't convert passed argument to Array");
439
+ }
440
+ converted_argv[i] = other;
441
+ total_len += RARRAY_LEN(other);
442
+ }
443
+ *argv_ptr = converted_argv;
444
+ return total_len;
445
+ }
446
+
447
+ struct ary_subtract_ctx {
448
+ ary_set_t *set;
449
+ mrb_value self;
450
+ mrb_value result;
451
+ const mrb_value *argv;
452
+ mrb_int argc;
453
+ };
454
+
455
+ static mrb_value
456
+ ary_subtract_body(mrb_state *mrb, void *data)
457
+ {
458
+ struct ary_subtract_ctx *ctx = (struct ary_subtract_ctx *)data;
459
+
460
+ for (mrb_int i = 0; i < ctx->argc; i++) {
461
+ ary_populate_temp_set(mrb, ctx->set, ctx->argv[i]);
462
+ }
463
+
464
+ for (mrb_int i = 0; i < RARRAY_LEN(ctx->self); i++) {
465
+ mrb_value p = RARRAY_PTR(ctx->self)[i];
466
+ khiter_t k = kh_get(ary_set, mrb, ctx->set, p);
467
+ if (kh_is_end(ctx->set, k)) { /* key doesn't exist in any ary */
468
+ mrb_ary_push(mrb, ctx->result, p);
469
+ }
470
+ }
471
+
472
+ return ctx->result;
473
+ }
474
+
475
+ static mrb_value
476
+ ary_subtract_internal(mrb_state *mrb, mrb_value self, mrb_int argc, const mrb_value *argv)
477
+ {
478
+ if (argc == 0) {
479
+ return mrb_ary_dup(mrb, self);
480
+ }
481
+
482
+ mrb_int total_len = ary_get_array_args(mrb, argc, &argv);
483
+
484
+ mrb_value result = mrb_ary_new(mrb);
485
+
486
+ if (total_len > SET_OP_HASH_THRESHOLD) {
487
+ /* Create shared copies to protect elements during khash operations */
488
+ mrb_value *argv_copies = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
489
+ for (mrb_int i = 0; i < argc; i++) {
490
+ argv_copies[i] = mrb_ary_make_shared_copy(mrb, argv[i]);
491
+ }
492
+
493
+ ary_set_t set_struct;
494
+ ary_set_t *set = &set_struct;
495
+ ary_init_temp_set(mrb, set, total_len);
496
+
497
+ struct ary_subtract_ctx ctx = { set, self, result, argv_copies, argc };
498
+ MRB_ENSURE(mrb, result, ary_subtract_body, &ctx) {
499
+ ary_destroy_temp_set(mrb, set);
500
+ }
501
+ }
502
+ else {
503
+ mrb_int self_len = RARRAY_LEN(self);
504
+ for (mrb_int i = 0; i < self_len; i++) {
505
+ mrb_value p = RARRAY_PTR(self)[i];
506
+ mrb_bool found = FALSE;
507
+ for (mrb_int j = 0; j < argc; j++) {
508
+ mrb_int len = RARRAY_LEN(argv[j]);
509
+ for (mrb_int k = 0; k < len; k++) {
510
+ if (mrb_equal(mrb, p, RARRAY_PTR(argv[j])[k])) {
511
+ found = TRUE;
512
+ break;
513
+ }
514
+ }
515
+ if (found) break;
516
+ }
517
+ if (!found) {
518
+ mrb_ary_push(mrb, result, p);
519
+ }
520
+ }
521
+ }
522
+
523
+ return result;
524
+ }
525
+
526
+ /*
527
+ * call-seq:
528
+ * ary - other_ary -> new_ary
529
+ *
530
+ * Returns a new array that is a copy of the original array, with any items
531
+ * that also appear in `other_ary` removed.
532
+ *
533
+ * [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
534
+ */
535
+
536
+ static mrb_value
537
+ ary_sub(mrb_state *mrb, mrb_value self)
538
+ {
539
+ mrb_value other;
540
+ mrb_get_args(mrb, "A", &other);
541
+ return ary_subtract_internal(mrb, self, 1, &other);
542
+ }
543
+
544
+ /*
545
+ * call-seq:
546
+ * ary.difference(other_ary, ...) -> new_ary
547
+ *
548
+ * Returns a new array that is a copy of the original array, removing all
549
+ * occurrences of any item that also appear in any of the `other_ary`s.
550
+ * The order is preserved from the original array.
551
+ *
552
+ * [1, 2, 3, 4, 5].difference([2, 4], [1, 5]) #=> [3]
553
+ */
554
+ static mrb_value
555
+ ary_difference(mrb_state *mrb, mrb_value self)
556
+ {
557
+ const mrb_value *argv;
558
+ mrb_int argc;
559
+ mrb_get_args(mrb, "*", &argv, &argc);
560
+ return ary_subtract_internal(mrb, self, argc, argv);
561
+ }
562
+
563
+
564
+ static void
565
+ add_uniq(mrb_state *mrb, mrb_value item, mrb_value result)
566
+ {
567
+ const mrb_int len = RARRAY_LEN(result);
568
+ for (mrb_int i = 0; i < len; i++) {
569
+ if (mrb_eql(mrb, item, RARRAY_PTR(result)[i])) {
570
+ return;
571
+ }
572
+ }
573
+ mrb_ary_push(mrb, result, item);
574
+ }
575
+
576
+ struct ary_union_ctx {
577
+ ary_set_t *set;
578
+ mrb_value self_copy;
579
+ mrb_value result;
580
+ const mrb_value *argv;
581
+ mrb_int argc;
582
+ };
583
+
584
+ static mrb_value
585
+ ary_union_body(mrb_state *mrb, void *data)
586
+ {
587
+ struct ary_union_ctx *ctx = (struct ary_union_ctx *)data;
588
+
589
+ /* Add unique elements from self */
590
+ for (mrb_int i = 0; i < RARRAY_LEN(ctx->self_copy); i++) {
591
+ mrb_value elem = RARRAY_PTR(ctx->self_copy)[i];
592
+ khiter_t k = kh_get(ary_set, mrb, ctx->set, elem);
593
+ if (kh_is_end(ctx->set, k)) {
594
+ kh_put(ary_set, mrb, ctx->set, elem);
595
+ mrb_ary_push(mrb, ctx->result, elem);
596
+ }
597
+ }
598
+
599
+ /* Add unique elements from others */
600
+ for (mrb_int i = 0; i < ctx->argc; i++) {
601
+ mrb_value other = ctx->argv[i];
602
+ for (mrb_int j = 0; j < RARRAY_LEN(other); j++) {
603
+ mrb_value elem = RARRAY_PTR(other)[j];
604
+ khiter_t k = kh_get(ary_set, mrb, ctx->set, elem);
605
+ if (kh_is_end(ctx->set, k)) {
606
+ kh_put(ary_set, mrb, ctx->set, elem);
607
+ mrb_ary_push(mrb, ctx->result, elem);
608
+ }
609
+ }
610
+ }
611
+
612
+ return ctx->result;
613
+ }
614
+
615
+ static mrb_value
616
+ ary_union_internal(mrb_state *mrb, mrb_value self, mrb_int argc, const mrb_value *argv)
617
+ {
618
+ mrb_int total_len = ary_get_array_args(mrb, argc, &argv) + RARRAY_LEN(self);
619
+
620
+ mrb_value result = mrb_ary_new(mrb);
621
+
622
+ if (total_len > SET_OP_HASH_THRESHOLD) {
623
+ /* Create shared copies to protect elements during khash operations */
624
+ mrb_value self_copy = mrb_ary_make_shared_copy(mrb, self);
625
+ mrb_value *argv_copies = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
626
+ for (mrb_int i = 0; i < argc; i++) {
627
+ argv_copies[i] = mrb_ary_make_shared_copy(mrb, argv[i]);
628
+ }
629
+
630
+ ary_set_t set_struct;
631
+ ary_set_t *set = &set_struct;
632
+ ary_init_temp_set(mrb, set, total_len);
633
+
634
+ struct ary_union_ctx ctx = { set, self_copy, result, argv_copies, argc };
635
+ MRB_ENSURE(mrb, result, ary_union_body, &ctx) {
636
+ ary_destroy_temp_set(mrb, set);
637
+ }
638
+ }
639
+ else {
640
+ /* Use linear search for small arrays */
641
+ /* Add unique elements from self */
642
+ mrb_int alen = RARRAY_LEN(self);
643
+ for (mrb_int i = 0; i < alen; i++) {
644
+ add_uniq(mrb, RARRAY_PTR(self)[i], result);
645
+ }
646
+
647
+ /* Add unique elements from others */
648
+ for (mrb_int i = 0; i < argc; i++) {
649
+ mrb_value other = argv[i];
650
+ mrb_int olen = RARRAY_LEN(other);
651
+ for (mrb_int j = 0; j < olen; j++) {
652
+ add_uniq(mrb, RARRAY_PTR(other)[j], result);
653
+ }
654
+ }
655
+ }
656
+
657
+ return result;
658
+ }
659
+
660
+ /*
661
+ * call-seq:
662
+ * ary | other_ary -> new_ary
663
+ *
664
+ * Set Union---Returns a new array by joining this array with
665
+ * `other_ary`, removing duplicates.
666
+ *
667
+ * [ "a", "b", "c" ] | [ "c", "d", "a" ]
668
+ * #=> [ "a", "b", "c", "d" ]
669
+ */
670
+
671
+ static mrb_value
672
+ ary_union(mrb_state *mrb, mrb_value self)
673
+ {
674
+ mrb_value other;
675
+ mrb_get_args(mrb, "A", &other);
676
+ return ary_union_internal(mrb, self, 1, &other);
677
+ }
678
+
679
+ /*
680
+ * call-seq:
681
+ * ary.union(other_ary,...) -> new_ary
682
+ *
683
+ * Set Union---Returns a new array by joining this array with
684
+ * `other_ary`s, removing duplicates.
685
+ *
686
+ * ["a", "b", "c"].union(["c", "d", "a"], ["a", "c", "e"])
687
+ * #=> ["a", "b", "c", "d", "e"]
688
+ */
689
+ static mrb_value
690
+ ary_union_multi(mrb_state *mrb, mrb_value self)
691
+ {
692
+ const mrb_value *argv;
693
+ mrb_int argc;
694
+ mrb_get_args(mrb, "*", &argv, &argc);
695
+ return ary_union_internal(mrb, self, argc, argv);
696
+ }
697
+
698
+ struct ary_intersection_ctx {
699
+ ary_set_t *set;
700
+ mrb_value self;
701
+ mrb_value result;
702
+ const mrb_value *argv;
703
+ mrb_int argc;
704
+ };
705
+
706
+ static mrb_value
707
+ ary_intersection_body(mrb_state *mrb, void *data)
708
+ {
709
+ struct ary_intersection_ctx *ctx = (struct ary_intersection_ctx *)data;
710
+
711
+ for (mrb_int i = 0; i < ctx->argc; i++) {
712
+ ary_populate_temp_set(mrb, ctx->set, ctx->argv[i]);
713
+ }
714
+
715
+ for (mrb_int i = 0; i < RARRAY_LEN(ctx->self); i++) {
716
+ mrb_value p = RARRAY_PTR(ctx->self)[i];
717
+ khiter_t k = kh_get(ary_set, mrb, ctx->set, p);
718
+ if (!kh_is_end(ctx->set, k)) {
719
+ mrb_ary_push(mrb, ctx->result, p);
720
+ kh_del(ary_set, mrb, ctx->set, k);
721
+ }
722
+ }
723
+
724
+ return ctx->result;
725
+ }
726
+
727
+ static mrb_value
728
+ ary_intersection_internal(mrb_state *mrb, mrb_value self, mrb_int argc, const mrb_value *argv)
729
+ {
730
+ if (argc == 0) {
731
+ return mrb_ary_new(mrb);
732
+ }
733
+
734
+ mrb_int total_len = ary_get_array_args(mrb, argc, &argv);
735
+
736
+ mrb_value result = mrb_ary_new(mrb);
737
+
738
+ if (total_len > SET_OP_HASH_THRESHOLD) {
739
+ /* Create shared copies to protect elements during khash operations */
740
+ mrb_value *argv_copies = (mrb_value *)mrb_alloca(mrb, sizeof(mrb_value) * argc);
741
+ for (mrb_int i = 0; i < argc; i++) {
742
+ argv_copies[i] = mrb_ary_make_shared_copy(mrb, argv[i]);
743
+ }
744
+
745
+ ary_set_t set_struct;
746
+ ary_set_t *set = &set_struct;
747
+ ary_init_temp_set(mrb, set, total_len);
748
+
749
+ struct ary_intersection_ctx ctx = { set, self, result, argv_copies, argc };
750
+ MRB_ENSURE(mrb, result, ary_intersection_body, &ctx) {
751
+ ary_destroy_temp_set(mrb, set);
752
+ }
753
+ }
754
+ else {
755
+ mrb_int self_len = RARRAY_LEN(self);
756
+ for (mrb_int i = 0; i < self_len; i++) {
757
+ mrb_value p = RARRAY_PTR(self)[i];
758
+ mrb_bool found_in_all = TRUE;
759
+
760
+ for (mrb_int j = 0; j < argc; j++) {
761
+ mrb_bool found_in_current_other = FALSE;
762
+ mrb_int len = RARRAY_LEN(argv[j]);
763
+ for (mrb_int k = 0; k < len; k++) {
764
+ if (mrb_equal(mrb, p, RARRAY_PTR(argv[j])[k])) {
765
+ found_in_current_other = TRUE;
766
+ break;
767
+ }
768
+ }
769
+ if (!found_in_current_other) {
770
+ found_in_all = FALSE;
771
+ break;
772
+ }
773
+ }
774
+
775
+ if (found_in_all) {
776
+ mrb_bool already_added = FALSE;
777
+ mrb_int result_len = RARRAY_LEN(result);
778
+ for (mrb_int j = 0; j < result_len; j++) {
779
+ if (mrb_equal(mrb, p, RARRAY_PTR(result)[j])) {
780
+ already_added = TRUE;
781
+ break;
782
+ }
783
+ }
784
+ if (!already_added) {
785
+ mrb_ary_push(mrb, result, p);
786
+ }
787
+ }
788
+ }
789
+ }
790
+ return result;
791
+ }
792
+
793
+ /*
794
+ * call-seq:
795
+ * ary & other_ary -> new_ary
796
+ *
797
+ * Set Intersection---Returns a new array
798
+ * containing elements common to the two arrays, with no duplicates.
799
+ *
800
+ * [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
801
+ */
802
+
803
+ static mrb_value
804
+ ary_intersection(mrb_state *mrb, mrb_value self)
805
+ {
806
+ mrb_value other;
807
+ mrb_get_args(mrb, "A", &other);
808
+ return ary_intersection_internal(mrb, self, 1, &other);
809
+ }
810
+
811
+ /*
812
+ * call-seq:
813
+ * ary.intersection(other_ary,...) -> new_ary
814
+ *
815
+ * Set Intersection---Returns a new array containing elements common to
816
+ * this array and `other_ary`s, removing duplicates. The order is
817
+ * preserved from the original array.
818
+ *
819
+ * [1, 2, 3].intersection([3, 4, 1], [1, 3, 5]) #=> [1, 3]
820
+ */
821
+ static mrb_value
822
+ ary_intersection_multi(mrb_state *mrb, mrb_value self)
823
+ {
824
+ const mrb_value *argv;
825
+ mrb_int argc;
826
+ mrb_get_args(mrb, "*", &argv, &argc);
827
+ return ary_intersection_internal(mrb, self, argc, argv);
828
+ }
829
+
830
+ /*
831
+ * call-seq:
832
+ * ary.intersect?(other_ary) -> true or false
833
+ *
834
+ * Returns `true` if the array and `other_ary` have at least one element in
835
+ * common, otherwise returns `false`.
836
+ *
837
+ * a = [ 1, 2, 3 ]
838
+ * b = [ 3, 4, 5 ]
839
+ * c = [ 5, 6, 7 ]
840
+ * a.intersect?(b) #=> true
841
+ * a.intersect?(c) #=> false
842
+ */
843
+
844
+ struct ary_intersect_p_ctx {
845
+ ary_set_t *set;
846
+ mrb_value shorter_ary_copy;
847
+ mrb_value longer_ary;
848
+ mrb_bool *found;
849
+ };
850
+
851
+ static mrb_value
852
+ ary_intersect_p_body(mrb_state *mrb, void *data)
853
+ {
854
+ struct ary_intersect_p_ctx *ctx = (struct ary_intersect_p_ctx *)data;
855
+
856
+ ary_populate_temp_set(mrb, ctx->set, ctx->shorter_ary_copy);
857
+
858
+ for (mrb_int i = 0; i < RARRAY_LEN(ctx->longer_ary); i++) {
859
+ khiter_t k = kh_get(ary_set, mrb, ctx->set, RARRAY_PTR(ctx->longer_ary)[i]);
860
+ if (!kh_is_end(ctx->set, k)) {
861
+ *ctx->found = TRUE;
862
+ break;
863
+ }
864
+ }
865
+
866
+ return mrb_nil_value();
867
+ }
868
+
869
+ static mrb_value
870
+ ary_intersect_p(mrb_state *mrb, mrb_value self)
871
+ {
872
+ mrb_value other;
873
+ mrb_get_args(mrb, "A", &other);
874
+
875
+ mrb_value shorter_ary, longer_ary;
876
+ if (RARRAY_LEN(self) > RARRAY_LEN(other)) {
877
+ shorter_ary = other;
878
+ longer_ary = self;
879
+ }
880
+ else {
881
+ shorter_ary = self;
882
+ longer_ary = other;
883
+ }
884
+
885
+ if (RARRAY_LEN(shorter_ary) == 0 || RARRAY_LEN(longer_ary) == 0) {
886
+ return mrb_false_value();
887
+ }
888
+
889
+ if (RARRAY_LEN(shorter_ary) > SET_OP_HASH_THRESHOLD) {
890
+ mrb_value shorter_ary_copy = mrb_ary_make_shared_copy(mrb, shorter_ary);
891
+
892
+ ary_set_t set_struct;
893
+ ary_set_t *set = &set_struct;
894
+ ary_init_temp_set(mrb, set, RARRAY_LEN(shorter_ary_copy));
895
+
896
+ mrb_bool found = FALSE;
897
+
898
+ struct ary_intersect_p_ctx ctx = { set, shorter_ary_copy, longer_ary, &found };
899
+ mrb_value result;
900
+ MRB_ENSURE(mrb, result, ary_intersect_p_body, &ctx) {
901
+ ary_destroy_temp_set(mrb, set);
902
+ }
903
+
904
+ if (found) {
905
+ return mrb_true_value();
906
+ }
907
+ }
908
+ else {
909
+ for (mrb_int i = 0; i < RARRAY_LEN(longer_ary); i++) {
910
+ for (mrb_int j = 0; j < RARRAY_LEN(shorter_ary); j++) {
911
+ if (mrb_equal(mrb, RARRAY_PTR(longer_ary)[i], RARRAY_PTR(shorter_ary)[j])) {
912
+ return mrb_true_value();
913
+ }
914
+ }
915
+ }
916
+ }
917
+
918
+ return mrb_false_value();
919
+ }
920
+
921
+ /*
922
+ * Internal helper for Array#fill that handles all the complex
923
+ * argument parsing logic including ranges, negative indices, etc.
924
+ * Returns normalized [start, length] array for use by ary_fill_exec.
925
+ */
926
+
927
+ static mrb_value
928
+ ary_fill_parse_arg(mrb_state *mrb, mrb_value self)
929
+ {
930
+ mrb_value arg0 = mrb_nil_value(), arg1 = mrb_nil_value(), arg2 = mrb_nil_value();
931
+ mrb_value block = mrb_nil_value();
932
+ mrb_int argc = mrb_get_args(mrb, "|ooo&", &arg0, &arg1, &arg2, &block);
933
+
934
+ struct RArray *ary = mrb_ary_ptr(self);
935
+ mrb_int ary_len = ARY_LEN(ary);
936
+ mrb_int start = 0, length = 0;
937
+
938
+ if (!mrb_nil_p(block)) {
939
+ if (argc == 0 || (argc >= 1 && mrb_nil_p(arg0))) {
940
+ /* fill { |index| block } */
941
+ start = 0;
942
+ length = ary_len;
943
+ }
944
+ else if (argc >= 1 && mrb_range_p(arg0)) {
945
+ /* fill(range) { |index| block } */
946
+ mrb_int range_beg, range_end;
947
+
948
+ if (mrb_range_beg_len(mrb, arg0, &range_beg, &range_end, ary_len, 1)) {
949
+ start = range_beg;
950
+ length = range_end;
951
+ }
952
+ }
953
+ else if (argc >= 1 && !mrb_nil_p(arg0)) {
954
+ /* fill(start [, length]) { |index| block } */
955
+ start = mrb_int(mrb, arg0);
956
+ if (start < 0) start += ary_len;
957
+ if (start < 0) start = 0;
958
+
959
+ if (argc == 1 || mrb_nil_p(arg1)) {
960
+ length = ary_len - start;
961
+ }
962
+ else {
963
+ length = mrb_int(mrb, arg1);
964
+ if (length < 0) length = 0;
965
+ }
966
+ }
967
+ }
968
+ else {
969
+ if (argc >= 1 && !mrb_nil_p(arg0)) {
970
+ if (argc == 1 || (argc >= 2 && mrb_nil_p(arg1) && mrb_nil_p(arg2))) {
971
+ /* fill(obj) */
972
+ start = 0;
973
+ length = ary_len;
974
+ }
975
+ else if (argc >= 2 && mrb_range_p(arg1)) {
976
+ /* fill(obj, range) */
977
+ mrb_int range_beg, range_end;
978
+
979
+ if (mrb_range_beg_len(mrb, arg1, &range_beg, &range_end, ary_len, 1)) {
980
+ start = range_beg;
981
+ length = range_end;
982
+ }
983
+ }
984
+ else if (argc >= 2 && !mrb_nil_p(arg1)) {
985
+ /* fill(obj, start [, length]) */
986
+ start = mrb_int(mrb, arg1);
987
+ if (start < 0) start += ary_len;
988
+ if (start < 0) start = 0;
989
+
990
+ if (argc == 2 || mrb_nil_p(arg2)) {
991
+ length = ary_len - start;
992
+ }
993
+ else {
994
+ length = mrb_int(mrb, arg2);
995
+ if (length < 0) length = 0;
996
+ }
997
+ }
998
+ }
999
+ }
1000
+
1001
+ /* Return [start, length] array */
1002
+ mrb_value result = mrb_ary_new_capa(mrb, 2);
1003
+ mrb_ary_push(mrb, result, mrb_fixnum_value(start));
1004
+ mrb_ary_push(mrb, result, mrb_fixnum_value(length));
1005
+ return result;
1006
+ }
1007
+
1008
+ /*
1009
+ * Internal helper that fills a specific range of the array
1010
+ * with the given object. Handles array extension if necessary.
1011
+ * Used by Ruby-level Array#fill method.
1012
+ */
1013
+
1014
+ static mrb_value
1015
+ ary_fill_exec(mrb_state *mrb, mrb_value self)
1016
+ {
1017
+ mrb_value obj;
1018
+ mrb_int start, length;
1019
+
1020
+ mrb_get_args(mrb, "iio", &start, &length, &obj);
1021
+
1022
+ if (start < 0) {
1023
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "negative start index");
1024
+ }
1025
+ if (length < 0) {
1026
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "negative length");
1027
+ }
1028
+
1029
+ struct RArray *ary = mrb_ary_ptr(self);
1030
+ mrb_int ary_len = ARY_LEN(ary);
1031
+
1032
+ /* Extend array if necessary */
1033
+ if (start + length > ary_len) {
1034
+ mrb_ary_resize(mrb, self, start + length);
1035
+ ary = mrb_ary_ptr(self); /* refresh pointer after resize */
1036
+ }
1037
+
1038
+ /* Ensure we don't go beyond array bounds */
1039
+ if (start >= ARY_LEN(ary) || length <= 0) return self;
1040
+ if (start + length > ARY_LEN(ary)) {
1041
+ length = ARY_LEN(ary) - start;
1042
+ }
1043
+
1044
+ /* Fill the array */
1045
+ mrb_value *ptr = ARY_PTR(ary) + start;
1046
+ for (mrb_int i = 0; i < length; i++) {
1047
+ ptr[i] = obj;
1048
+ }
1049
+
1050
+ return self;
1051
+ }
1052
+
1053
+ /*
1054
+ * Internal helper for Array#uniq! without blocks.
1055
+ * Modifies array in-place, returns nil if no changes.
1056
+ */
1057
+ struct ary_uniq_bang_ctx {
1058
+ ary_set_t *set;
1059
+ mrb_value self_copy;
1060
+ mrb_value self;
1061
+ mrb_int *write_pos;
1062
+ mrb_int len;
1063
+ };
1064
+
1065
+ static mrb_value
1066
+ ary_uniq_bang_body(mrb_state *mrb, void *data)
1067
+ {
1068
+ struct ary_uniq_bang_ctx *ctx = (struct ary_uniq_bang_ctx *)data;
1069
+
1070
+ ary_populate_temp_set(mrb, ctx->set, ctx->self_copy);
1071
+
1072
+ for (mrb_int read_pos = 0; read_pos < ctx->len; read_pos++) {
1073
+ mrb_value elem = RARRAY_PTR(ctx->self)[read_pos];
1074
+ khiter_t k = kh_get(ary_set, mrb, ctx->set, elem);
1075
+ if (!kh_is_end(ctx->set, k)) {
1076
+ if (*ctx->write_pos != read_pos) {
1077
+ RARRAY_PTR(ctx->self)[*ctx->write_pos] = elem;
1078
+ }
1079
+ (*ctx->write_pos)++;
1080
+ kh_del(ary_set, mrb, ctx->set, k);
1081
+ }
1082
+ }
1083
+
1084
+ return mrb_nil_value();
1085
+ }
1086
+
1087
+ static mrb_value
1088
+ ary_uniq_bang(mrb_state *mrb, mrb_value self)
1089
+ {
1090
+ mrb_int len = RARRAY_LEN(self);
1091
+
1092
+ if (len <= 1) {
1093
+ return mrb_nil_value();
1094
+ }
1095
+
1096
+ mrb_ary_modify(mrb, mrb_ary_ptr(self));
1097
+ mrb_int write_pos = 0;
1098
+
1099
+ if (len > SET_OP_HASH_THRESHOLD) {
1100
+ /* Create shared copy to protect elements during khash operations */
1101
+ mrb_value self_copy = mrb_ary_make_shared_copy(mrb, self);
1102
+
1103
+ ary_set_t set_struct;
1104
+ ary_set_t *set = &set_struct;
1105
+ ary_init_temp_set(mrb, set, len);
1106
+
1107
+ struct ary_uniq_bang_ctx ctx = { set, self_copy, self, &write_pos, len };
1108
+ mrb_value result;
1109
+ MRB_ENSURE(mrb, result, ary_uniq_bang_body, &ctx) {
1110
+ ary_destroy_temp_set(mrb, set);
1111
+ }
1112
+ }
1113
+ else {
1114
+ for (mrb_int read_pos = 0; read_pos < len; read_pos++) {
1115
+ mrb_value elem = RARRAY_PTR(self)[read_pos];
1116
+ mrb_bool found = FALSE;
1117
+ for (mrb_int j = 0; j < write_pos; j++) {
1118
+ if (mrb_equal(mrb, elem, RARRAY_PTR(self)[j])) {
1119
+ found = TRUE;
1120
+ break;
1121
+ }
1122
+ }
1123
+ if (!found) {
1124
+ if (write_pos != read_pos) {
1125
+ RARRAY_PTR(self)[write_pos] = elem;
1126
+ }
1127
+ write_pos++;
1128
+ }
1129
+ }
1130
+ }
1131
+
1132
+ if (write_pos == len) {
1133
+ return mrb_nil_value();
1134
+ }
1135
+
1136
+ mrb_ary_resize(mrb, self, write_pos);
1137
+ return self;
1138
+ }
1139
+
1140
+ /*
1141
+ * Internal helper for Array#uniq without blocks.
1142
+ * Uses hash-based deduplication for large arrays,
1143
+ * linear search for small arrays.
1144
+ */
1145
+ static mrb_value
1146
+ ary_uniq(mrb_state *mrb, mrb_value self)
1147
+ {
1148
+ mrb_value ary = mrb_ary_dup(mrb, self);
1149
+ ary_uniq_bang(mrb, ary);
1150
+ return ary;
1151
+ }
1152
+
1153
+ /* Internal helper for flatten operations using iterative stack-based approach */
1154
+ static mrb_value
1155
+ flatten_internal(mrb_state *mrb, mrb_value self, mrb_int level, mrb_bool *modified)
1156
+ {
1157
+ *modified = FALSE;
1158
+ mrb_value result = mrb_ary_new(mrb);
1159
+ mrb_value stack = mrb_ary_new(mrb);
1160
+ mrb_ary_push(mrb, stack, self);
1161
+ mrb_ary_push(mrb, stack, mrb_fixnum_value(0)); // index
1162
+ mrb_ary_push(mrb, stack, mrb_fixnum_value(1)); // depth
1163
+
1164
+ while (RARRAY_LEN(stack) > 0) {
1165
+ mrb_int depth = mrb_fixnum(mrb_ary_pop(mrb, stack));
1166
+ mrb_int idx = mrb_fixnum(mrb_ary_pop(mrb, stack));
1167
+ mrb_value ary = mrb_ary_pop(mrb, stack);
1168
+
1169
+ while (idx < RARRAY_LEN(ary)) {
1170
+ mrb_value e = mrb_ary_entry(ary, idx);
1171
+ idx++;
1172
+
1173
+ if (mrb_array_p(e) && (level < 0 || depth <= level)) {
1174
+ *modified = TRUE;
1175
+ // Push current state back
1176
+ mrb_ary_push(mrb, stack, ary);
1177
+ mrb_ary_push(mrb, stack, mrb_fixnum_value(idx));
1178
+ mrb_ary_push(mrb, stack, mrb_fixnum_value(depth));
1179
+
1180
+ // Push new array to process
1181
+ ary = e;
1182
+ idx = 0;
1183
+ depth++;
1184
+ }
1185
+ else {
1186
+ mrb_ary_push(mrb, result, e);
1187
+ }
1188
+ }
1189
+ }
1190
+ return result;
1191
+ }
1192
+
1193
+ /*
1194
+ * call-seq:
1195
+ * ary.flatten -> new_ary
1196
+ * ary.flatten(level) -> new_ary
1197
+ *
1198
+ * Returns a new array that is a one-dimensional flattening of this
1199
+ * array (recursively). That is, for every element that is an array,
1200
+ * extract its elements into the new array. If the optional
1201
+ * `level` argument determines the level of recursion to flatten.
1202
+ *
1203
+ * s = [ 1, 2, 3 ] #=> [1, 2, 3]
1204
+ * t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]]
1205
+ * a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
1206
+ * a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1207
+ * a = [ 1, 2, [3, [4, 5] ] ]
1208
+ * a.flatten(1) #=> [1, 2, 3, [4, 5]]
1209
+ */
1210
+ static mrb_value
1211
+ ary_flatten(mrb_state *mrb, mrb_value self)
1212
+ {
1213
+ mrb_int level = -1;
1214
+ mrb_get_args(mrb, "|i", &level);
1215
+ mrb_bool modified; // dummy
1216
+ return flatten_internal(mrb, self, level, &modified);
1217
+ }
1218
+
1219
+ /*
1220
+ * Internal helper for index normalization and bounds checking.
1221
+ * Returns normalized index if in bounds, nil if out of bounds.
1222
+ * Used by Ruby-level array methods.
1223
+ */
1224
+
1225
+ static mrb_value
1226
+ ary_normalize_index(mrb_state *mrb, mrb_value self)
1227
+ {
1228
+ mrb_value index_val;
1229
+ mrb_get_args(mrb, "o", &index_val);
1230
+
1231
+ mrb_int index = mrb_as_int(mrb, index_val);
1232
+ struct RArray *ary = mrb_ary_ptr(self);
1233
+ mrb_int len = ARY_LEN(ary);
1234
+
1235
+ // Handle negative indices
1236
+ if (index < 0) {
1237
+ index += len;
1238
+ }
1239
+
1240
+ // Check bounds
1241
+ if (index >= 0 && index < len) {
1242
+ return mrb_fixnum_value(index);
1243
+ }
1244
+ else {
1245
+ return mrb_nil_value();
1246
+ }
1247
+ }
1248
+
1249
+ /*
1250
+ * Internal helper for Array#fetch without blocks.
1251
+ * Returns the element at index, or default if out of bounds.
1252
+ * Raises IndexError if out of bounds and default equals none.
1253
+ */
1254
+
1255
+ static mrb_value
1256
+ ary_fetch(mrb_state *mrb, mrb_value self)
1257
+ {
1258
+ mrb_value index_val, default_val, none;
1259
+ mrb_get_args(mrb, "ooo", &index_val, &default_val, &none);
1260
+
1261
+ // Convert index to integer
1262
+ mrb_int index = mrb_as_int(mrb, index_val);
1263
+ mrb_int original_index = index; // Keep original for error message
1264
+
1265
+ struct RArray *ary = mrb_ary_ptr(self);
1266
+ mrb_int len = ARY_LEN(ary);
1267
+
1268
+ // Handle negative indices
1269
+ if (index < 0) {
1270
+ index += len;
1271
+ }
1272
+
1273
+ // Check bounds
1274
+ if (index < 0 || index >= len) {
1275
+ // Check if default is the NONE sentinel (means no default provided)
1276
+ if (mrb_obj_equal(mrb, default_val, none)) {
1277
+ // No default provided - raise IndexError
1278
+ mrb_raisef(mrb, E_INDEX_ERROR,
1279
+ "index %i outside of array bounds: %i...%i",
1280
+ original_index, -len, len);
1281
+ }
1282
+ return default_val;
1283
+ }
1284
+
1285
+ // Return element at index
1286
+ return ARY_PTR(ary)[index];
1287
+ }
1288
+
1289
+ /*
1290
+ * call-seq:
1291
+ * ary.flatten! -> ary or nil
1292
+ * ary.flatten!(level) -> array or nil
1293
+ *
1294
+ * Flattens `self` in place. Returns `nil` if no modifications were made
1295
+ * (i.e., *ary* contains no subarrays.) If the optional `level` argument
1296
+ * determines the level of recursion to flatten.
1297
+ *
1298
+ * a = [ 1, 2, [3, [4, 5] ] ]
1299
+ * a.flatten! #=> [1, 2, 3, 4, 5]
1300
+ * a.flatten! #=> nil
1301
+ * a #=> [1, 2, 3, 4, 5]
1302
+ * a = [ 1, 2, [3, [4, 5] ] ]
1303
+ * a.flatten!(1) #=> [1, 2, 3, [4, 5]]
1304
+ */
1305
+ static mrb_value
1306
+ ary_flatten_bang(mrb_state *mrb, mrb_value self)
1307
+ {
1308
+ mrb_int level = -1;
1309
+ mrb_get_args(mrb, "|i", &level);
1310
+
1311
+ mrb_ary_modify(mrb, mrb_ary_ptr(self));
1312
+ mrb_bool modified;
1313
+ mrb_value result = flatten_internal(mrb, self, level, &modified);
1314
+
1315
+ if (!modified) {
1316
+ return mrb_nil_value();
1317
+ }
1318
+ mrb_ary_replace(mrb, self, result);
1319
+ return self;
1320
+ }
1321
+
1322
+ /*
1323
+ * call-seq:
1324
+ * ary.insert(index, obj...) -> ary
1325
+ *
1326
+ * Inserts the given values before the element with the given index.
1327
+ *
1328
+ * Negative indices count backwards from the end of the array, where -1
1329
+ * is the last element. If a negative index is used, the elements are
1330
+ * inserted after that element.
1331
+ *
1332
+ * If the index is greater than the length of the array, the array is
1333
+ * extended with nil elements.
1334
+ *
1335
+ * a = %w{ a b c d }
1336
+ * a.insert(2, 99) #=> ["a", "b", 99, "c", "d"]
1337
+ * a.insert(-2, 1, 2, 3) #=> ["a", "b", 99, "c", 1, 2, 3, "d"]
1338
+ */
1339
+ static mrb_value
1340
+ ary_insert(mrb_state *mrb, mrb_value self)
1341
+ {
1342
+ mrb_int idx;
1343
+ const mrb_value *argv;
1344
+ mrb_int argc;
1345
+
1346
+ mrb_get_args(mrb, "i*", &idx, &argv, &argc);
1347
+
1348
+ if (argc == 0) {
1349
+ return self;
1350
+ }
1351
+
1352
+ mrb_int len = RARRAY_LEN(self);
1353
+
1354
+ if (idx < 0) {
1355
+ idx += len + 1;
1356
+ if (idx < 0) {
1357
+ mrb_raisef(mrb, E_INDEX_ERROR, "index %i outside of array bounds", idx - (len + 1));
1358
+ }
1359
+ }
1360
+
1361
+ mrb_ary_modify(mrb, mrb_ary_ptr(self));
1362
+
1363
+ mrb_int new_len = (idx > len ? idx : len) + argc;
1364
+ mrb_ary_resize(mrb, self, new_len);
1365
+
1366
+ if (idx < len) {
1367
+ memmove(RARRAY_PTR(self) + idx + argc, RARRAY_PTR(self) + idx, (len - idx) * sizeof(mrb_value));
1368
+ }
1369
+
1370
+ for (mrb_int i = 0; i < argc; i++) {
1371
+ mrb_ary_set(mrb, self, idx + i, argv[i]);
1372
+ }
1373
+
1374
+ return self;
1375
+ }
1376
+
1377
+ /*
1378
+ * Internal helper for Array#product to construct a group array.
1379
+ * Takes the base array (self), the array of other arrays (arys),
1380
+ * the current iteration index (current_i), and the desired length
1381
+ * of the group array (group_len).
1382
+ */
1383
+ static mrb_value
1384
+ ary_product_group(mrb_state *mrb, mrb_value self_ary)
1385
+ {
1386
+ mrb_value arys_ary;
1387
+ mrb_int current_i, group_len;
1388
+ mrb_get_args(mrb, "Aii", &arys_ary, &current_i, &group_len);
1389
+
1390
+ mrb_value group = mrb_ary_new_capa(mrb, group_len);
1391
+ mrb_int j = RARRAY_LEN(arys_ary); // Corresponds to 'size' in Ruby
1392
+ mrb_int n = current_i;
1393
+
1394
+ while (j > 0) {
1395
+ j -= 1;
1396
+ mrb_value a = RARRAY_PTR(arys_ary)[j]; // arys[j]
1397
+ mrb_check_type(mrb, a, MRB_TT_ARRAY);
1398
+ mrb_int b = RARRAY_LEN(a); // a.size
1399
+ mrb_ary_set(mrb, group, j + 1, RARRAY_PTR(a)[n % b]);
1400
+ n /= b;
1401
+ }
1402
+ mrb_ary_set(mrb, group, 0, RARRAY_PTR(self_ary)[n]);
1403
+
1404
+ return group;
1405
+ }
1406
+
1407
+ /*
1408
+ * call-seq:
1409
+ * ary.deconstruct -> ary
1410
+ *
1411
+ * Returns the array itself for pattern matching.
1412
+ *
1413
+ * This method is used by pattern matching to deconstruct arrays.
1414
+ * It simply returns the array itself, allowing pattern matching
1415
+ * to work with array elements.
1416
+ *
1417
+ * a = [1, 2, 3]
1418
+ * a.deconstruct #=> [1, 2, 3]
1419
+ *
1420
+ * Pattern matching usage:
1421
+ * case [1, 2, 3]
1422
+ * in [x, y, z]
1423
+ * # x=1, y=2, z=3
1424
+ * end
1425
+ */
1426
+ static mrb_value
1427
+ ary_deconstruct(mrb_state *mrb, mrb_value ary)
1428
+ {
1429
+ return ary;
1430
+ }
1431
+
1432
+
1433
+ /*
1434
+ * Internal method to initialize combination state.
1435
+ * Returns opaque state object for use by __combination_next.
1436
+ */
1437
+ static mrb_value
1438
+ ary_combination_init(mrb_state *mrb, mrb_value self)
1439
+ {
1440
+ mrb_int n;
1441
+ mrb_bool permutation;
1442
+
1443
+ mrb_get_args(mrb, "ib", &n, &permutation);
1444
+ #if MRB_INT_MAX > SIZE_MAX
1445
+ if (n > SIZE_MAX) {
1446
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "number too large");
1447
+ }
1448
+ #endif
1449
+
1450
+ struct RData *d;
1451
+ struct mrb_combination_state *state;
1452
+ Data_Make_Struct(mrb, mrb->object_class, struct mrb_combination_state,
1453
+ &mrb_combination_state_type, state, d);
1454
+
1455
+ state->n = n;
1456
+ state->array_size = RARRAY_LEN(self);
1457
+ state->permutation = permutation;
1458
+ state->finished = (n <= 0 && n != 0);
1459
+
1460
+ if (n > 0) {
1461
+ state->indices = (mrb_int*)mrb_calloc(mrb, n, sizeof(mrb_int));
1462
+ }
1463
+
1464
+ return mrb_obj_value(d);
1465
+ }
1466
+
1467
+ /*
1468
+ * Internal method to get next combination as index array.
1469
+ * Returns array of indices or nil when iteration is complete.
1470
+ */
1471
+ static mrb_value
1472
+ ary_combination_next(mrb_state *mrb, mrb_value self)
1473
+ {
1474
+ mrb_value state_obj;
1475
+ mrb_get_args(mrb, "o", &state_obj);
1476
+
1477
+ struct mrb_combination_state *state;
1478
+
1479
+ /* Validate state object type and get data */
1480
+ state = (struct mrb_combination_state*)mrb_data_check_and_get(mrb, state_obj, &mrb_combination_state_type);
1481
+ if (!state) {
1482
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid combination state");
1483
+ }
1484
+
1485
+ /* Check if iteration is complete */
1486
+ if (state->finished) return mrb_nil_value();
1487
+
1488
+ /* Validate array hasn't been modified during iteration */
1489
+ if (RARRAY_LEN(self) != state->array_size) {
1490
+ mrb_raise(mrb, E_RUNTIME_ERROR, "array modified during iteration");
1491
+ }
1492
+
1493
+ /* Edge case: empty array */
1494
+ if (state->array_size == 0) {
1495
+ state->finished = TRUE;
1496
+ return mrb_nil_value();
1497
+ }
1498
+
1499
+ /* Validate current indices are still in bounds */
1500
+ for (mrb_int i = 0; i < state->n; i++) {
1501
+ if (state->indices[i] >= state->array_size) {
1502
+ state->finished = TRUE;
1503
+ return mrb_nil_value();
1504
+ }
1505
+ }
1506
+
1507
+ /* Build current combination indices */
1508
+ mrb_value result = mrb_ary_new_capa(mrb, state->n);
1509
+ for (mrb_int i = 0; i < state->n; i++) {
1510
+ mrb_ary_push(mrb, result, mrb_fixnum_value(state->indices[i]));
1511
+ }
1512
+
1513
+ mrb_int pos = state->n - 1;
1514
+
1515
+ while (pos >= 0) {
1516
+ state->indices[pos]++;
1517
+ if (state->indices[pos] < state->array_size) break;
1518
+ pos--;
1519
+ }
1520
+
1521
+ if (pos < 0) {
1522
+ state->finished = TRUE;
1523
+ }
1524
+ else {
1525
+ /* Reset dependent indices */
1526
+ for (mrb_int i = pos + 1; i < state->n; i++) {
1527
+ if (state->permutation) {
1528
+ state->indices[i] = 0;
1529
+ }
1530
+ else {
1531
+ state->indices[i] = state->indices[i - 1];
1532
+ }
1533
+ }
1534
+ }
1535
+
1536
+ return result;
1537
+ }
1538
+
1539
+ /* ---------------------------*/
1540
+ static const mrb_mt_entry array_ext_rom_entries[] = {
1541
+ MRB_MT_ENTRY(ary_assoc, MRB_SYM(assoc), MRB_ARGS_REQ(1)),
1542
+ MRB_MT_ENTRY(ary_at, MRB_SYM(at), MRB_ARGS_REQ(1)),
1543
+ MRB_MT_ENTRY(ary_rassoc, MRB_SYM(rassoc), MRB_ARGS_REQ(1)),
1544
+ MRB_MT_ENTRY(ary_values_at, MRB_SYM(values_at), MRB_ARGS_ANY()),
1545
+ MRB_MT_ENTRY(ary_slice_bang, MRB_SYM_B(slice), MRB_ARGS_ARG(1,1)),
1546
+ MRB_MT_ENTRY(ary_compact, MRB_SYM(compact), MRB_ARGS_NONE()),
1547
+ MRB_MT_ENTRY(ary_compact_bang, MRB_SYM_B(compact), MRB_ARGS_NONE()),
1548
+ MRB_MT_ENTRY(ary_rotate, MRB_SYM(rotate), MRB_ARGS_OPT(1)),
1549
+ MRB_MT_ENTRY(ary_rotate_bang, MRB_SYM_B(rotate), MRB_ARGS_OPT(1)),
1550
+ MRB_MT_ENTRY(ary_sub, MRB_OPSYM(sub), MRB_ARGS_REQ(1)),
1551
+ MRB_MT_ENTRY(ary_difference, MRB_SYM(difference), MRB_ARGS_ANY()),
1552
+ MRB_MT_ENTRY(ary_union, MRB_OPSYM(or), MRB_ARGS_REQ(1)),
1553
+ MRB_MT_ENTRY(ary_union_multi, MRB_SYM(union), MRB_ARGS_ANY()),
1554
+ MRB_MT_ENTRY(ary_intersection, MRB_OPSYM(and), MRB_ARGS_REQ(1)),
1555
+ MRB_MT_ENTRY(ary_intersection_multi, MRB_SYM(intersection), MRB_ARGS_ANY()),
1556
+ MRB_MT_ENTRY(ary_intersect_p, MRB_SYM_Q(intersect), MRB_ARGS_REQ(1)),
1557
+ MRB_MT_ENTRY(ary_fill_parse_arg, MRB_SYM(__fill_parse_arg), MRB_ARGS_ARG(0,4)),
1558
+ MRB_MT_ENTRY(ary_fill_exec, MRB_SYM(__fill_exec), MRB_ARGS_REQ(3)),
1559
+ MRB_MT_ENTRY(ary_uniq, MRB_SYM(__uniq), MRB_ARGS_NONE()),
1560
+ MRB_MT_ENTRY(ary_uniq_bang, MRB_SYM_B(__uniq), MRB_ARGS_NONE()),
1561
+ MRB_MT_ENTRY(ary_flatten, MRB_SYM(flatten), MRB_ARGS_OPT(1)),
1562
+ MRB_MT_ENTRY(ary_flatten_bang, MRB_SYM_B(flatten), MRB_ARGS_OPT(1)),
1563
+ MRB_MT_ENTRY(ary_normalize_index, MRB_SYM(__normalize_index), MRB_ARGS_REQ(1)),
1564
+ MRB_MT_ENTRY(ary_fetch, MRB_SYM(__fetch), MRB_ARGS_REQ(3)),
1565
+ MRB_MT_ENTRY(ary_insert, MRB_SYM(insert), MRB_ARGS_ARG(1,-1)),
1566
+ MRB_MT_ENTRY(ary_deconstruct, MRB_SYM(deconstruct), MRB_ARGS_NONE()),
1567
+ MRB_MT_ENTRY(ary_product_group, MRB_SYM(__product_group), MRB_ARGS_REQ(3)),
1568
+ MRB_MT_ENTRY(ary_combination_init, MRB_SYM(__combination_init), MRB_ARGS_REQ(2)),
1569
+ MRB_MT_ENTRY(ary_combination_next, MRB_SYM(__combination_next), MRB_ARGS_REQ(1)),
1570
+ };
1571
+
1572
+ void
1573
+ mrb_mruby_array_ext_gem_init(mrb_state* mrb)
1574
+ {
1575
+ struct RClass * a = mrb->array_class;
1576
+
1577
+ MRB_MT_INIT_ROM(mrb, a, array_ext_rom_entries);
1578
+ }
1579
+
1580
+ void
1581
+ mrb_mruby_array_ext_gem_final(mrb_state* mrb)
1582
+ {
1583
+ }