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,1269 @@
1
+ #include <mruby.h>
2
+ #include <mruby/class.h>
3
+ #include <mruby/numeric.h>
4
+ #include <mruby/internal.h>
5
+ #include <mruby/presym.h>
6
+
7
+ #ifndef MRB_NO_FLOAT
8
+ #include <math.h>
9
+ mrb_value mrb_complex_new(mrb_state *, mrb_float, mrb_float);
10
+ #endif
11
+ mrb_bool mrb_complex_eq(mrb_state *mrb, mrb_value, mrb_value);
12
+ mrb_value mrb_complex_add(mrb_state *mrb, mrb_value, mrb_value);
13
+ mrb_value mrb_complex_sub(mrb_state *mrb, mrb_value, mrb_value);
14
+ mrb_value mrb_complex_mul(mrb_state *mrb, mrb_value, mrb_value);
15
+ mrb_value mrb_complex_div(mrb_state *mrb, mrb_value, mrb_value);
16
+ mrb_value mrb_bint_mul_n(mrb_state *mrb, mrb_value x, mrb_value y);
17
+ void mrb_bint_reduce(mrb_state *mrb, mrb_value *x, mrb_value *y);
18
+
19
+ #ifdef MRB_USE_BIGINT
20
+ struct mrb_rational {
21
+ union {
22
+ struct {
23
+ mrb_int num;
24
+ mrb_int den;
25
+ } i;
26
+ struct {
27
+ struct RBasic *num;
28
+ struct RBasic *den;
29
+ } b;
30
+ };
31
+ };
32
+ #define numerator i.num
33
+ #define denominator i.den
34
+ #define RAT_BIGINT 1
35
+ #define RAT_BIGINT_P(obj) (mrb_obj_ptr(obj)->flags & RAT_BIGINT)
36
+ #else
37
+ struct mrb_rational {
38
+ mrb_int numerator;
39
+ mrb_int denominator;
40
+ };
41
+ #endif
42
+
43
+ #define ONE mrb_fixnum_value(1)
44
+ #define ZERO mrb_fixnum_value(0)
45
+
46
+ #if defined(MRB_INT64) && defined(MRB_32BIT)
47
+ struct RRational {
48
+ MRB_OBJECT_HEADER;
49
+ struct mrb_rational *p;
50
+ };
51
+
52
+ static struct mrb_rational*
53
+ rat_ptr(mrb_state *mrb, mrb_value v)
54
+ {
55
+ struct RRational *r = (struct RRational*)mrb_obj_ptr(v);
56
+
57
+ if (!r->p) {
58
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized rational");
59
+ }
60
+ return r->p;
61
+ }
62
+ #else
63
+ #define RATIONAL_INLINE
64
+ struct RRational {
65
+ MRB_OBJECT_HEADER;
66
+ struct mrb_rational r;
67
+ };
68
+ #define rat_ptr(mrb, v) (&((struct RRational*)mrb_obj_ptr(v))->r)
69
+ #endif
70
+
71
+ mrb_static_assert_object_size(struct RRational);
72
+
73
+ static struct mrb_rational*
74
+ rat_alloc(mrb_state *mrb, struct RClass *c, struct RBasic **obj)
75
+ {
76
+ struct RRational *s = MRB_OBJ_ALLOC(mrb, MRB_TT_RATIONAL, c);
77
+ struct mrb_rational *p;
78
+ #ifdef RATIONAL_INLINE
79
+ p = &s->r;
80
+ #else
81
+ p = s->p = (struct mrb_rational*)mrb_malloc(mrb, sizeof(struct mrb_rational));
82
+ #endif
83
+ *obj = (struct RBasic*)s;
84
+ return p;
85
+ }
86
+
87
+ #ifdef RAT_BIGINT
88
+ int
89
+ mrb_rational_mark(mrb_state *mrb, struct RBasic *rat)
90
+ {
91
+ if (!(rat->flags & RAT_BIGINT)) return 0;
92
+
93
+ mrb_value self = mrb_obj_value(rat);
94
+ struct mrb_rational *p = rat_ptr(mrb, self);
95
+ mrb_gc_mark(mrb, p->b.num);
96
+ mrb_gc_mark(mrb, p->b.den);
97
+ return 2;
98
+ }
99
+ #endif
100
+
101
+ static mrb_value
102
+ rat_numerator(mrb_state *mrb, mrb_value self)
103
+ {
104
+ struct mrb_rational *p = rat_ptr(mrb, self);
105
+ #ifdef RAT_BIGINT
106
+ if (RAT_BIGINT_P(self)) {
107
+ return mrb_obj_value(p->b.num);
108
+ }
109
+ #endif
110
+ return mrb_int_value(mrb, p->numerator);
111
+ }
112
+
113
+ /*
114
+ * call-seq:
115
+ * rational.numerator -> integer
116
+ *
117
+ * Returns the numerator of the rational number.
118
+ *
119
+ * Rational(3, 4).numerator #=> 3
120
+ * Rational(-2, 5).numerator #=> -2
121
+ * Rational(6, 8).numerator #=> 3 (reduced form)
122
+ */
123
+ /* normalized version of rat_numerator() */
124
+ static mrb_value
125
+ rational_numerator(mrb_state *mrb, mrb_value self)
126
+ {
127
+ mrb_value n = rat_numerator(mrb, self);
128
+ if (mrb_bigint_p(n)) {
129
+ /* normalize bigint */
130
+ return mrb_bint_mul(mrb, n, ONE);
131
+ }
132
+ return n;
133
+ }
134
+
135
+ static mrb_value
136
+ rat_denominator(mrb_state *mrb, mrb_value self)
137
+ {
138
+ struct mrb_rational *p = rat_ptr(mrb, self);
139
+ #ifdef RAT_BIGINT
140
+ if (RAT_BIGINT_P(self)) {
141
+ return mrb_obj_value(p->b.den);
142
+ }
143
+ #endif
144
+ return mrb_int_value(mrb, p->denominator);
145
+ }
146
+
147
+ /*
148
+ * call-seq:
149
+ * rational.denominator -> integer
150
+ *
151
+ * Returns the denominator of the rational number.
152
+ * The denominator is always positive.
153
+ *
154
+ * Rational(3, 4).denominator #=> 4
155
+ * Rational(-2, 5).denominator #=> 5
156
+ * Rational(6, 8).denominator #=> 4 (reduced form)
157
+ */
158
+ /* normalized version of rat_denominator() */
159
+ static mrb_value
160
+ rational_denominator(mrb_state *mrb, mrb_value self)
161
+ {
162
+ mrb_value n = rat_denominator(mrb, self);
163
+ if (mrb_bigint_p(n)) {
164
+ /* normalize bigint */
165
+ return mrb_bint_mul(mrb, n, ONE);
166
+ }
167
+ return n;
168
+ }
169
+
170
+ static mrb_noreturn void
171
+ rat_overflow(mrb_state *mrb)
172
+ {
173
+ mrb_raise(mrb, E_RANGE_ERROR, "integer overflow in rational");
174
+ }
175
+
176
+ static mrb_noreturn void
177
+ rat_zerodiv(mrb_state *mrb)
178
+ {
179
+ mrb_raise(mrb, E_ZERODIV_ERROR, "divided by 0 in rational");
180
+ }
181
+
182
+ static mrb_noreturn void
183
+ rat_type_error(mrb_state *mrb, mrb_value x)
184
+ {
185
+ mrb_raisef(mrb, E_TYPE_ERROR, "%T cannot be converted to Rational", x);
186
+ }
187
+
188
+ void
189
+ mrb_rational_copy(mrb_state *mrb, mrb_value x, mrb_value y)
190
+ {
191
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
192
+ struct mrb_rational *p2 = rat_ptr(mrb, y);
193
+ #ifdef RAT_BIGINT
194
+ struct RRational *r = (struct RRational*)mrb_obj_ptr(x);
195
+ if (RAT_BIGINT_P(y)) {
196
+ p1->b.num = p2->b.num;
197
+ p1->b.den = p2->b.den;
198
+ r->flags |= RAT_BIGINT;
199
+ return;
200
+ }
201
+ r->flags &= ~RAT_BIGINT;
202
+ #endif
203
+ p1->numerator = p2->numerator;
204
+ p1->denominator = p2->denominator;
205
+ }
206
+
207
+ inline static mrb_int
208
+ i_gcd(mrb_int x, mrb_int y)
209
+ {
210
+ mrb_uint u, v, t;
211
+ int shift;
212
+
213
+ if (x < 0)
214
+ x = -x;
215
+ if (y < 0)
216
+ y = -y;
217
+
218
+ if (x == 0)
219
+ return y;
220
+ if (y == 0)
221
+ return x;
222
+
223
+ u = (mrb_uint)x;
224
+ v = (mrb_uint)y;
225
+ for (shift = 0; ((u | v) & 1) == 0; shift++) {
226
+ u >>= 1;
227
+ v >>= 1;
228
+ }
229
+
230
+ while ((u & 1) == 0)
231
+ u >>= 1;
232
+
233
+ do {
234
+ while ((v & 1) == 0)
235
+ v >>= 1;
236
+
237
+ if (u > v) {
238
+ t = v;
239
+ v = u;
240
+ u = t;
241
+ }
242
+ v = v - u;
243
+ } while (v != 0);
244
+
245
+ return (mrb_int)(u << shift);
246
+ }
247
+
248
+ #ifdef RAT_BIGINT
249
+ static mrb_value
250
+ rational_new_b(mrb_state *mrb, mrb_value n, mrb_value d)
251
+ {
252
+ /* bigint check */
253
+ mrb_assert(mrb_bigint_p(n));
254
+ d = mrb_as_bint(mrb, d);
255
+ mrb_int cmp = mrb_bint_cmp(mrb, d, ZERO);
256
+ if (cmp == 0) {
257
+ rat_zerodiv(mrb);
258
+ }
259
+ /* negative */
260
+ if (cmp < 0) {
261
+ n = mrb_bint_neg(mrb, n);
262
+ d = mrb_bint_neg(mrb, d);
263
+ }
264
+ /* normalize (n/gcd, d/gcd) */
265
+ mrb_bint_reduce(mrb, &n, &d);
266
+ struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Rational));
267
+ struct RBasic *rat;
268
+ struct mrb_rational *p = rat_alloc(mrb, c, &rat);
269
+ rat->flags |= RAT_BIGINT;
270
+ p->b.num = (struct RBasic*)mrb_obj_ptr(n);
271
+ p->b.den = (struct RBasic*)mrb_obj_ptr(d);
272
+ rat->frozen = 1;
273
+ return mrb_obj_value(rat);
274
+ }
275
+ #endif
276
+
277
+ mrb_value
278
+ mrb_rational_new(mrb_state *mrb, mrb_int nume, mrb_int deno)
279
+ {
280
+ if (deno == 0) {
281
+ rat_zerodiv(mrb);
282
+ }
283
+ if (nume == MRB_INT_MIN || deno == MRB_INT_MIN) {
284
+ #ifdef RAT_BIGINT
285
+ mrb_value num = mrb_as_bint(mrb, mrb_int_value(mrb, nume));
286
+ mrb_value den = mrb_as_bint(mrb, mrb_int_value(mrb, deno));
287
+ return rational_new_b(mrb, num, den);
288
+ #else
289
+ rat_overflow(mrb);
290
+ #endif
291
+ }
292
+ if (deno < 0) {
293
+ nume *= -1;
294
+ deno *= -1;
295
+ }
296
+
297
+ mrb_int a = i_gcd(nume, deno);
298
+ nume /= a;
299
+ deno /= a;
300
+
301
+ struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Rational));
302
+ struct RBasic *rat;
303
+ struct mrb_rational *p = rat_alloc(mrb, c, &rat);
304
+ p->numerator = nume;
305
+ p->denominator = deno;
306
+ rat->frozen = 1;
307
+ return mrb_obj_value(rat);
308
+ }
309
+
310
+ #define rational_new_i(mrb,n,d) mrb_rational_new(mrb, n, d)
311
+
312
+ #ifndef MRB_NO_FLOAT
313
+
314
+ #if defined(MRB_INT32) || defined(MRB_USE_FLOAT32)
315
+ #define frexp_rat(x,exp) frexpf((float)x, exp)
316
+ #define ldexp_rat(x,exp) ldexpf((float)x, exp)
317
+ #define RAT_MANT_DIG FLT_MANT_DIG
318
+ #define RAT_INT_LIMIT 30
319
+ #define RAT_HUGE_VAL HUGE_VALF
320
+ #else
321
+ #define frexp_rat frexp
322
+ #define ldexp_rat ldexp
323
+ #define RAT_MANT_DIG DBL_MANT_DIG
324
+ #define RAT_INT_LIMIT 62
325
+ #define RAT_HUGE_VAL HUGE_VAL
326
+ #endif
327
+
328
+ static mrb_value
329
+ rational_new_f(mrb_state *mrb, mrb_float f)
330
+ {
331
+ mrb_check_num_exact(mrb, f);
332
+ if (f == 0.0) {
333
+ return rational_new_i(mrb, 0, 1);
334
+ }
335
+ int exp;
336
+ // Extract mantissa and exponent
337
+ double mantissa = frexp_rat(f, &exp);
338
+ const mrb_int precision = ((mrb_int)1) << RAT_MANT_DIG;
339
+
340
+ mrb_int nume = (mrb_int)(mantissa * precision);
341
+ mrb_int deno = precision;
342
+
343
+ if (exp > 0) {
344
+ mrb_int temp;
345
+ /* Check exp < MRB_INT_BIT-1 to avoid undefined behavior from shifting into sign bit */
346
+ if (exp >= MRB_INT_BIT - 1 || mrb_int_mul_overflow(nume, ((mrb_int)1)<<exp, &temp)) {
347
+ #ifndef RAT_BIGINT
348
+ rat_overflow(mrb);
349
+ #else
350
+ mrb_value n = mrb_bint_lshift(mrb, mrb_bint_new_int(mrb, nume), exp);
351
+ return rational_new_b(mrb, n, mrb_int_value(mrb, deno));
352
+ #endif
353
+ }
354
+ nume = temp;
355
+ }
356
+ else if (exp < 0) {
357
+ /* exp is negative, so we need to multiply denominator by 2^(-exp) */
358
+ int neg_exp = -exp;
359
+ if (neg_exp >= MRB_INT_BIT - 1 || mrb_int_mul_overflow(deno, ((mrb_int)1)<<neg_exp, &deno)) {
360
+ #ifndef RAT_BIGINT
361
+ rat_overflow(mrb);
362
+ #else
363
+ mrb_value d = mrb_bint_lshift(mrb, mrb_bint_new_int(mrb, deno), neg_exp);
364
+ return rational_new_b(mrb, mrb_bint_new_int(mrb, nume), d);
365
+ #endif
366
+ }
367
+ }
368
+ return rational_new_i(mrb, nume, deno);
369
+ }
370
+
371
+ static mrb_float
372
+ rat_float(mrb_state *mrb, mrb_value x)
373
+ {
374
+ struct mrb_rational *p = rat_ptr(mrb, x);
375
+
376
+ #ifdef RAT_BIGINT
377
+ if (RAT_BIGINT_P(x)) {
378
+ return mrb_bint_as_float(mrb, mrb_obj_value(p->b.num)) / mrb_bint_as_float(mrb, mrb_obj_value(p->b.den));
379
+ }
380
+ #endif
381
+ return (mrb_float)p->numerator / (mrb_float)p->denominator;
382
+ }
383
+
384
+ mrb_value
385
+ mrb_rational_to_f(mrb_state *mrb, mrb_value self)
386
+ {
387
+ mrb_float f = rat_float(mrb, self);
388
+ return mrb_float_value(mrb, f);
389
+ }
390
+ #endif
391
+
392
+ /*
393
+ * call-seq:
394
+ * rational.to_i -> integer
395
+ *
396
+ * Returns the rational number truncated to an integer.
397
+ *
398
+ * Rational(3, 4).to_i #=> 0
399
+ * Rational(7, 3).to_i #=> 2
400
+ * Rational(-5, 2).to_i #=> -2
401
+ */
402
+ mrb_value
403
+ mrb_rational_to_i(mrb_state *mrb, mrb_value self)
404
+ {
405
+ struct mrb_rational *p = rat_ptr(mrb, self);
406
+ #ifdef RAT_BIGINT
407
+ if (RAT_BIGINT_P(self)) {
408
+ return mrb_bint_div(mrb, mrb_obj_value(p->b.num), mrb_obj_value(p->b.den));
409
+ }
410
+ #endif
411
+ return mrb_int_value(mrb, p->numerator / p->denominator);
412
+ }
413
+
414
+ mrb_value
415
+ mrb_as_rational(mrb_state *mrb, mrb_value x)
416
+ {
417
+ switch(mrb_type(x)) {
418
+ case MRB_TT_INTEGER:
419
+ return rational_new_i(mrb, mrb_integer(x), 1);
420
+ #ifdef RAT_BIGINT
421
+ case MRB_TT_BIGINT:
422
+ return rational_new_b(mrb, x, ONE);
423
+ #endif
424
+ case MRB_TT_RATIONAL:
425
+ return x;
426
+ #ifndef MRB_NO_FLOAT
427
+ #ifdef MRB_USE_COMPLEX
428
+ case MRB_TT_COMPLEX:
429
+ #endif
430
+ case MRB_TT_FLOAT:
431
+ return rational_new_f(mrb, mrb_as_float(mrb, x));
432
+ #endif
433
+ default:
434
+ rat_type_error(mrb, x);
435
+ }
436
+ }
437
+
438
+ /*
439
+ * call-seq:
440
+ * rational.negative? -> true or false
441
+ *
442
+ * Returns true if the rational number is negative, false otherwise.
443
+ *
444
+ * Rational(-1, 2).negative? #=> true
445
+ * Rational(1, 2).negative? #=> false
446
+ * Rational(0, 1).negative? #=> false
447
+ */
448
+ static mrb_value
449
+ rational_negative_p(mrb_state *mrb, mrb_value self)
450
+ {
451
+ struct mrb_rational *p = rat_ptr(mrb, self);
452
+ #ifdef RAT_BIGINT
453
+ if (RAT_BIGINT_P(self)) {
454
+ mrb_int cmp = mrb_bint_cmp(mrb, mrb_obj_value(p->b.num), ZERO);
455
+ return mrb_bool_value(cmp < 0);
456
+ }
457
+ #endif
458
+ return mrb_bool_value(p->numerator < 0);
459
+ }
460
+
461
+ #ifndef MRB_NO_FLOAT
462
+ /*
463
+ * call-seq:
464
+ * float.to_r -> rational
465
+ *
466
+ * Converts the float to a rational number. The conversion preserves
467
+ * the exact value of the float as a fraction.
468
+ *
469
+ * 0.5.to_r #=> Rational(1, 2)
470
+ * 0.25.to_r #=> Rational(1, 4)
471
+ * 1.5.to_r #=> Rational(3, 2)
472
+ */
473
+ static mrb_value
474
+ float_to_r(mrb_state *mrb, mrb_value self)
475
+ {
476
+ return rational_new_f(mrb, mrb_float(self));
477
+ }
478
+ #endif
479
+
480
+ /*
481
+ * call-seq:
482
+ * integer.to_r -> rational
483
+ *
484
+ * Converts the integer to a rational number with denominator 1.
485
+ *
486
+ * 5.to_r #=> Rational(5, 1)
487
+ * (-3).to_r #=> Rational(-3, 1)
488
+ * 0.to_r #=> Rational(0, 1)
489
+ */
490
+ static mrb_value
491
+ int_to_r(mrb_state *mrb, mrb_value self)
492
+ {
493
+ #ifdef RAT_BIGINT
494
+ if (mrb_bigint_p(self)) {
495
+ return rational_new_b(mrb, self, ONE);
496
+ }
497
+ #endif
498
+ return rational_new_i(mrb, mrb_integer(self), 1);
499
+ }
500
+
501
+ /*
502
+ * call-seq:
503
+ * nil.to_r -> rational
504
+ *
505
+ * Converts nil to Rational(0, 1).
506
+ *
507
+ * nil.to_r #=> Rational(0, 1)
508
+ */
509
+ static mrb_value
510
+ nil_to_r(mrb_state *mrb, mrb_value self)
511
+ {
512
+ return rational_new_i(mrb, 0, 1);
513
+ }
514
+
515
+ #if !defined(MRB_NO_FLOAT) || defined(RAT_BIGINT)
516
+ static mrb_value
517
+ rational_new(mrb_state *mrb, mrb_value a, mrb_value b)
518
+ {
519
+ #ifdef MRB_NO_FLOAT
520
+ a = mrb_as_int(mrb, a);
521
+ b = mrb_as_int(mrb, b);
522
+ return rational_new_i(mrb, mrb_integer(a), mrb_integer(b));
523
+ #else
524
+ if (mrb_integer_p(a) && mrb_integer_p(b)) {
525
+ return rational_new_i(mrb, mrb_integer(a), mrb_integer(b));
526
+ }
527
+ #ifdef RAT_BIGINT
528
+ else if (mrb_bigint_p(a) || mrb_bigint_p(b)) {
529
+ return rational_new_b(mrb, mrb_as_bint(mrb, a), b);
530
+ }
531
+ #endif
532
+ else {
533
+ mrb_float x = mrb_as_float(mrb, a);
534
+ mrb_float y = mrb_as_float(mrb, b);
535
+ return rational_new_f(mrb, x/y);
536
+ }
537
+ #endif
538
+ }
539
+
540
+ /*
541
+ * call-seq:
542
+ * Rational(numerator, denominator = 1) -> rational
543
+ *
544
+ * Creates a rational number from numerator and denominator.
545
+ * The rational is automatically reduced to lowest terms.
546
+ *
547
+ * Rational(1, 2) #=> Rational(1, 2)
548
+ * Rational(6, 8) #=> Rational(3, 4)
549
+ * Rational(5) #=> Rational(5, 1)
550
+ * Rational(-2, 4) #=> Rational(-1, 2)
551
+ */
552
+ static mrb_value
553
+ rational_m(mrb_state *mrb, mrb_value self)
554
+ {
555
+ mrb_value a, b = ONE;
556
+ mrb_get_args(mrb, "o|o", &a, &b);
557
+ return rational_new(mrb, a, b);
558
+ }
559
+
560
+ #else
561
+
562
+ /*
563
+ * call-seq:
564
+ * Rational(numerator, denominator = 1) -> rational
565
+ *
566
+ * Creates a rational number from numerator and denominator.
567
+ * The rational is automatically reduced to lowest terms.
568
+ *
569
+ * Rational(1, 2) #=> Rational(1, 2)
570
+ * Rational(6, 8) #=> Rational(3, 4)
571
+ * Rational(5) #=> Rational(5, 1)
572
+ * Rational(-2, 4) #=> Rational(-1, 2)
573
+ */
574
+ static mrb_value
575
+ rational_m(mrb_state *mrb, mrb_value self)
576
+ {
577
+ mrb_int n, d = 1;
578
+ mrb_get_args(mrb, "i|i", &n, &d);
579
+ return rational_new_i(mrb, n, d);
580
+ }
581
+ #endif
582
+
583
+ static mrb_value
584
+ rational_eq_b(mrb_state *mrb, mrb_value x, mrb_value y)
585
+ {
586
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
587
+ mrb_bool result;
588
+
589
+ switch (mrb_type(y)) {
590
+ case MRB_TT_INTEGER:
591
+ {
592
+ /* For bigint-backed rationals, check if denominator is 1 */
593
+ mrb_value den = mrb_obj_value(p1->b.den);
594
+ mrb_int den_cmp = mrb_bint_cmp(mrb, den, mrb_int_value(mrb, 1));
595
+ if (den_cmp != 0) return mrb_false_value();
596
+ mrb_value num = mrb_obj_value(p1->b.num);
597
+ result = mrb_bint_cmp(mrb, num, y) == 0;
598
+ break;
599
+ }
600
+ #ifdef MRB_USE_BIGINT
601
+ case MRB_TT_BIGINT:
602
+ {
603
+ /* For bigint-backed rationals comparing with bigint */
604
+ mrb_value den = mrb_obj_value(p1->b.den);
605
+ mrb_int den_cmp = mrb_bint_cmp(mrb, den, mrb_int_value(mrb, 1));
606
+ if (den_cmp != 0) return mrb_false_value();
607
+ mrb_value num = mrb_obj_value(p1->b.num);
608
+ result = mrb_bint_cmp(mrb, num, y) == 0;
609
+ break;
610
+ }
611
+ #endif
612
+ #ifndef MRB_NO_FLOAT
613
+ case MRB_TT_FLOAT:
614
+ {
615
+ /* For bigint-backed rationals, convert to float and compare */
616
+ mrb_float num_f = mrb_bint_as_float(mrb, mrb_obj_value(p1->b.num));
617
+ mrb_float den_f = mrb_bint_as_float(mrb, mrb_obj_value(p1->b.den));
618
+ result = (num_f / den_f) == mrb_float(y);
619
+ break;
620
+ }
621
+ #endif
622
+ case MRB_TT_RATIONAL:
623
+ {
624
+ /* Compare by converting to float - less precise but safe */
625
+ mrb_float v1 = mrb_bint_as_float(mrb, mrb_obj_value(p1->b.num)) /
626
+ mrb_bint_as_float(mrb, mrb_obj_value(p1->b.den));
627
+ mrb_float v2 = rat_float(mrb, y);
628
+ result = v1 == v2;
629
+ break;
630
+ }
631
+
632
+ #ifdef MRB_USE_COMPLEX
633
+ case MRB_TT_COMPLEX:
634
+ {
635
+ result = mrb_complex_eq(mrb, y, mrb_rational_to_f(mrb, x));
636
+ break;
637
+ }
638
+ #endif
639
+ default:
640
+ result = mrb_equal(mrb, y, x);
641
+ break;
642
+ }
643
+ return mrb_bool_value(result);
644
+ }
645
+
646
+ /*
647
+ * call-seq:
648
+ * rational == other -> true or false
649
+ *
650
+ * Returns true if rational equals other. Comparison is done by cross-multiplication
651
+ * to avoid floating point precision issues.
652
+ *
653
+ * Rational(1, 2) == Rational(2, 4) #=> true
654
+ * Rational(1, 2) == 0.5 #=> true
655
+ * Rational(1, 2) == Rational(1, 3) #=> false
656
+ */
657
+ static mrb_value
658
+ rational_eq(mrb_state *mrb, mrb_value x)
659
+ {
660
+ mrb_value y = mrb_get_arg1(mrb);
661
+ #ifdef RAT_BIGINT
662
+ if (RAT_BIGINT_P(x)) return rational_eq_b(mrb, x, y);
663
+ #endif
664
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
665
+ mrb_bool result;
666
+
667
+ switch (mrb_type(y)) {
668
+ case MRB_TT_INTEGER:
669
+ if (p1->denominator != 1) return mrb_false_value();
670
+ result = p1->numerator == mrb_integer(y);
671
+ break;
672
+ #ifdef MRB_USE_BIGINT
673
+ case MRB_TT_BIGINT:
674
+ /* Non-bigint rational comparing with bigint */
675
+ if (p1->denominator != 1) return mrb_false_value();
676
+ result = mrb_bint_cmp(mrb, y, mrb_int_value(mrb, p1->numerator)) == 0;
677
+ break;
678
+ #endif
679
+ #ifndef MRB_NO_FLOAT
680
+ case MRB_TT_FLOAT:
681
+ result = ((double)p1->numerator/p1->denominator) == mrb_float(y);
682
+ break;
683
+ #endif
684
+ case MRB_TT_RATIONAL:
685
+ {
686
+ struct mrb_rational *p2 = rat_ptr(mrb, y);
687
+ mrb_int a, b;
688
+
689
+ if (p1->numerator == p2->numerator && p1->denominator == p2->denominator) {
690
+ return mrb_true_value();
691
+ }
692
+ if (mrb_int_mul_overflow(p1->numerator, p2->denominator, &a) ||
693
+ mrb_int_mul_overflow(p2->numerator, p1->denominator, &b)) {
694
+ #ifdef MRB_NO_FLOAT
695
+ rat_overflow(mrb);
696
+ #else
697
+ result = (double)p1->numerator*p2->denominator == (double)p2->numerator*p2->denominator;
698
+ break;
699
+ #endif
700
+ }
701
+ result = a == b;
702
+ break;
703
+ }
704
+
705
+ #ifdef MRB_USE_COMPLEX
706
+ case MRB_TT_COMPLEX:
707
+ {
708
+ result = mrb_complex_eq(mrb, y, mrb_rational_to_f(mrb, x));
709
+ break;
710
+ }
711
+ #endif
712
+ default:
713
+ result = mrb_equal(mrb, y, x);
714
+ break;
715
+ }
716
+ return mrb_bool_value(result);
717
+ }
718
+
719
+ /*
720
+ * call-seq:
721
+ * -rational -> rational
722
+ *
723
+ * Returns the negation of the rational number.
724
+ *
725
+ * -Rational(1, 2) #=> Rational(-1, 2)
726
+ * -Rational(-3, 4) #=> Rational(3, 4)
727
+ */
728
+ static mrb_value
729
+ rational_minus(mrb_state *mrb, mrb_value x)
730
+ {
731
+ struct mrb_rational *p = rat_ptr(mrb, x);
732
+ #ifdef RAT_BIGINT
733
+ mrb_value num;
734
+ if (RAT_BIGINT_P(x)) {
735
+ num = mrb_obj_value(p->b.num);
736
+ bint:
737
+ return rational_new_b(mrb, mrb_bint_neg(mrb, num), mrb_obj_value(p->b.den));
738
+ }
739
+ #endif
740
+ mrb_int n = p->numerator;
741
+ if (n == MRB_INT_MIN) {
742
+ #ifdef RAT_BIGINT
743
+ num = mrb_as_bint(mrb, mrb_int_value(mrb, p->numerator));
744
+ goto bint;
745
+ #else
746
+ rat_overflow(mrb);
747
+ #endif
748
+ }
749
+ return rational_new_i(mrb, -n, p->denominator);
750
+ }
751
+
752
+ #ifdef RAT_BIGINT
753
+ static mrb_value
754
+ rat_add_b(mrb_state *mrb, mrb_value x, mrb_value y)
755
+ {
756
+ mrb_value num1 = rat_numerator(mrb, x);
757
+ mrb_value den1 = rat_denominator(mrb, x);
758
+ mrb_value num2, den2;
759
+
760
+ switch(mrb_type(y)) {
761
+ case MRB_TT_RATIONAL:
762
+ num2 = rat_numerator(mrb, y);
763
+ den2 = rat_denominator(mrb, y);
764
+ break;
765
+ case MRB_TT_INTEGER:
766
+ case MRB_TT_BIGINT:
767
+ num2 = y;
768
+ den2 = ONE;
769
+ break;
770
+ default:
771
+ /* should not happen */
772
+ rat_type_error(mrb, y);
773
+ }
774
+
775
+ mrb_value a = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, num1), den2);
776
+ mrb_value b = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, num2), den1);
777
+ a = mrb_bint_add_n(mrb, a, b);
778
+ b = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, den1), den2);
779
+ return rational_new_b(mrb, a, b);
780
+ }
781
+ #endif
782
+
783
+ mrb_value
784
+ mrb_rational_add(mrb_state *mrb, mrb_value x, mrb_value y)
785
+ {
786
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
787
+
788
+ switch (mrb_type(y)) {
789
+ case MRB_TT_INTEGER:
790
+ #ifdef RAT_BIGINT
791
+ if (RAT_BIGINT_P(x)) return rat_add_b(mrb, x, y);
792
+ #endif
793
+ {
794
+ mrb_int z = mrb_integer(y);
795
+ if (mrb_int_mul_overflow(z, p1->denominator, &z)) rat_overflow(mrb);
796
+ if (mrb_int_add_overflow(p1->numerator, z, &z)) rat_overflow(mrb);
797
+ return rational_new_i(mrb, z, p1->denominator);
798
+ }
799
+ case MRB_TT_RATIONAL:
800
+ #ifdef RAT_BIGINT
801
+ if (RAT_BIGINT_P(x) || RAT_BIGINT_P(y))
802
+ return rat_add_b(mrb, x, y);
803
+ #endif
804
+ {
805
+ struct mrb_rational *p2 = rat_ptr(mrb, y);
806
+ mrb_int a, b;
807
+
808
+ if (mrb_int_mul_overflow(p1->numerator, p2->denominator, &a)) rat_overflow(mrb);
809
+ if (mrb_int_mul_overflow(p2->numerator, p1->denominator, &b)) rat_overflow(mrb);
810
+ if (mrb_int_add_overflow(a, b, &a)) rat_overflow(mrb);
811
+ if (mrb_int_mul_overflow(p1->denominator, p2->denominator, &b)) rat_overflow(mrb);
812
+ return rational_new_i(mrb, a, b);
813
+ }
814
+
815
+ #ifndef MRB_NO_FLOAT
816
+ case MRB_TT_FLOAT:
817
+ {
818
+ mrb_float z = p1->numerator + mrb_float(y) * p1->denominator;
819
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
820
+ }
821
+ #endif
822
+
823
+ #ifdef RAT_BIGINT
824
+ case MRB_TT_BIGINT:
825
+ return rat_add_b(mrb, x, y);
826
+ #endif
827
+
828
+ #if defined(MRB_USE_COMPLEX)
829
+ case MRB_TT_COMPLEX:
830
+ return mrb_complex_add(mrb, mrb_complex_new(mrb, rat_float(mrb, x), 0), y);
831
+ #endif
832
+
833
+ default:
834
+ return mrb_funcall_argv(mrb, y, MRB_OPSYM(add), 1, &x);
835
+ }
836
+ }
837
+
838
+ /*
839
+ * call-seq:
840
+ * rational + numeric -> rational or numeric
841
+ *
842
+ * Returns the sum of rational and numeric. If numeric is a rational,
843
+ * returns a rational. If numeric is a float, returns a float.
844
+ *
845
+ * Rational(1, 2) + Rational(1, 3) #=> Rational(5, 6)
846
+ * Rational(1, 2) + 1 #=> Rational(3, 2)
847
+ * Rational(1, 2) + 0.5 #=> 1.0
848
+ */
849
+ static mrb_value
850
+ rational_add(mrb_state *mrb, mrb_value x)
851
+ {
852
+ mrb_value y = mrb_get_arg1(mrb);
853
+ return mrb_rational_add(mrb, x, y);
854
+ }
855
+
856
+ #ifdef RAT_BIGINT
857
+ static mrb_value
858
+ rat_sub_b(mrb_state *mrb, mrb_value x, mrb_value y)
859
+ {
860
+ mrb_value num1 = rat_numerator(mrb, x);
861
+ mrb_value den1 = rat_denominator(mrb, x);
862
+ mrb_value num2, den2;
863
+
864
+ switch(mrb_type(y)) {
865
+ case MRB_TT_RATIONAL:
866
+ num2 = rat_numerator(mrb, y);
867
+ den2 = rat_denominator(mrb, y);
868
+ break;
869
+ case MRB_TT_INTEGER:
870
+ case MRB_TT_BIGINT:
871
+ num2 = y;
872
+ den2 = ONE;
873
+ break;
874
+ default:
875
+ /* should not happen */
876
+ rat_type_error(mrb, y);
877
+ }
878
+
879
+ mrb_value a = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, num1), den2);
880
+ mrb_value b = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, num2), den1);
881
+ a = mrb_bint_sub_n(mrb, a, b);
882
+ b = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, den1), den2);
883
+ return rational_new_b(mrb, a, b);
884
+ }
885
+ #endif
886
+
887
+ mrb_value
888
+ mrb_rational_sub(mrb_state *mrb, mrb_value x, mrb_value y)
889
+ {
890
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
891
+
892
+ switch (mrb_type(y)) {
893
+ case MRB_TT_INTEGER:
894
+ #ifdef RAT_BIGINT
895
+ if (RAT_BIGINT_P(x)) return rat_sub_b(mrb, x, y);
896
+ #endif
897
+ {
898
+ mrb_int z = mrb_integer(y);
899
+ if (mrb_int_mul_overflow(z, p1->denominator, &z)) rat_overflow(mrb);
900
+ if (mrb_int_sub_overflow(p1->numerator, z, &z)) rat_overflow(mrb);
901
+ return rational_new_i(mrb, z, p1->denominator);
902
+ }
903
+ case MRB_TT_RATIONAL:
904
+ #ifdef RAT_BIGINT
905
+ if (RAT_BIGINT_P(x) || RAT_BIGINT_P(y))
906
+ return rat_sub_b(mrb, x, y);
907
+ #endif
908
+ {
909
+ struct mrb_rational *p2 = rat_ptr(mrb, y);
910
+ mrb_int a, b;
911
+
912
+ if (mrb_int_mul_overflow(p1->numerator, p2->denominator, &a)) rat_overflow(mrb);
913
+ if (mrb_int_mul_overflow(p2->numerator, p1->denominator, &b)) rat_overflow(mrb);
914
+ if (mrb_int_sub_overflow(a, b, &a)) rat_overflow(mrb);
915
+ if (mrb_int_mul_overflow(p1->denominator, p2->denominator, &b)) rat_overflow(mrb);
916
+ return rational_new_i(mrb, a, b);
917
+ }
918
+
919
+ #ifdef RAT_BIGINT
920
+ case MRB_TT_BIGINT:
921
+ return rat_sub_b(mrb, x, y);
922
+ #endif
923
+
924
+ #if defined(MRB_USE_COMPLEX)
925
+ case MRB_TT_COMPLEX:
926
+ return mrb_complex_sub(mrb, mrb_complex_new(mrb, rat_float(mrb, x), 0), y);
927
+ #endif
928
+
929
+ #ifndef MRB_NO_FLOAT
930
+ case MRB_TT_FLOAT:
931
+ default:
932
+ {
933
+ mrb_float z = p1->numerator - mrb_as_float(mrb, y) * p1->denominator;
934
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
935
+ }
936
+ #else
937
+ default:
938
+ rat_type_error(mrb, y);
939
+ #endif
940
+ }
941
+ }
942
+
943
+ /*
944
+ * call-seq:
945
+ * rational - numeric -> rational or numeric
946
+ *
947
+ * Returns the difference of rational and numeric. If numeric is a rational,
948
+ * returns a rational. If numeric is a float, returns a float.
949
+ *
950
+ * Rational(1, 2) - Rational(1, 3) #=> Rational(1, 6)
951
+ * Rational(3, 2) - 1 #=> Rational(1, 2)
952
+ * Rational(1, 2) - 0.25 #=> 0.25
953
+ */
954
+ static mrb_value
955
+ rational_sub(mrb_state *mrb, mrb_value x)
956
+ {
957
+ mrb_value y = mrb_get_arg1(mrb);
958
+ return mrb_rational_sub(mrb, x, y);
959
+ }
960
+
961
+ #ifdef RAT_BIGINT
962
+ static mrb_value
963
+ rat_mul_b(mrb_state *mrb, mrb_value x, mrb_value y)
964
+ {
965
+ mrb_value num, den;
966
+
967
+ switch(mrb_type(y)) {
968
+ case MRB_TT_RATIONAL:
969
+ num = rat_numerator(mrb, y);
970
+ den = rat_denominator(mrb, y);
971
+ break;
972
+ case MRB_TT_INTEGER:
973
+ case MRB_TT_BIGINT:
974
+ num = y;
975
+ den = ONE;
976
+ break;
977
+ default:
978
+ /* should not happen */
979
+ rat_type_error(mrb, y);
980
+ }
981
+
982
+ mrb_value a = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, rat_numerator(mrb, x)), num);
983
+ mrb_value b = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, rat_denominator(mrb, x)), den);
984
+ return rational_new_b(mrb, a, b);
985
+ }
986
+ #endif
987
+
988
+ mrb_value
989
+ mrb_rational_mul(mrb_state *mrb, mrb_value x, mrb_value y)
990
+ {
991
+ switch (mrb_type(y)) {
992
+ case MRB_TT_INTEGER:
993
+ #ifdef RAT_BIGINT
994
+ if (RAT_BIGINT_P(x)) return rat_mul_b(mrb, x, y);
995
+ #endif
996
+ {
997
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
998
+ mrb_int z = mrb_integer(y);
999
+ if (mrb_int_mul_overflow(p1->numerator, z, &z)) rat_overflow(mrb);
1000
+ return rational_new_i(mrb, z, p1->denominator);
1001
+ }
1002
+ case MRB_TT_RATIONAL:
1003
+ #ifdef RAT_BIGINT
1004
+ if (RAT_BIGINT_P(x) || RAT_BIGINT_P(y))
1005
+ return rat_mul_b(mrb, x, y);
1006
+ #endif
1007
+ {
1008
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
1009
+ struct mrb_rational *p2 = rat_ptr(mrb, y);
1010
+ mrb_int a, b;
1011
+
1012
+ if (mrb_int_mul_overflow(p1->numerator, p2->numerator, &a)) rat_overflow(mrb);
1013
+ if (mrb_int_mul_overflow(p1->denominator, p2->denominator, &b)) rat_overflow(mrb);
1014
+ return rational_new_i(mrb, a, b);
1015
+ }
1016
+
1017
+ #ifdef RAT_BIGINT
1018
+ case MRB_TT_BIGINT:
1019
+ return rat_mul_b(mrb, x, y);
1020
+ #endif
1021
+
1022
+ #ifndef MRB_NO_FLOAT
1023
+ case MRB_TT_FLOAT:
1024
+ {
1025
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
1026
+ mrb_float z = p1->numerator * mrb_float(y);
1027
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
1028
+ }
1029
+ #endif
1030
+
1031
+ #if defined(MRB_USE_COMPLEX)
1032
+ case MRB_TT_COMPLEX:
1033
+ return mrb_complex_mul(mrb, mrb_complex_new(mrb, rat_float(mrb, x), 0), y);
1034
+ #endif
1035
+
1036
+ default:
1037
+ return mrb_funcall_argv(mrb, y, MRB_OPSYM(mul), 1, &x);
1038
+ }
1039
+ }
1040
+
1041
+ /*
1042
+ * call-seq:
1043
+ * rational * numeric -> rational or numeric
1044
+ *
1045
+ * Returns the product of rational and numeric. Uses standard rational
1046
+ * multiplication: (a/b) * (c/d) = (a*c)/(b*d).
1047
+ *
1048
+ * Rational(1, 2) * Rational(2, 3) #=> Rational(1, 3)
1049
+ * Rational(1, 2) * 3 #=> Rational(3, 2)
1050
+ * Rational(1, 2) * 2.0 #=> 1.0
1051
+ */
1052
+ static mrb_value
1053
+ rational_mul(mrb_state *mrb, mrb_value x)
1054
+ {
1055
+ mrb_value y = mrb_get_arg1(mrb);
1056
+ return mrb_rational_mul(mrb, x, y);
1057
+ }
1058
+
1059
+ #ifdef RAT_BIGINT
1060
+ static mrb_value
1061
+ rat_div_b(mrb_state *mrb, mrb_value x, mrb_value y)
1062
+ {
1063
+ mrb_value num, den;
1064
+
1065
+ switch(mrb_type(y)) {
1066
+ case MRB_TT_RATIONAL:
1067
+ num = rat_numerator(mrb, y);
1068
+ den = rat_denominator(mrb, y);
1069
+ break;
1070
+ case MRB_TT_INTEGER:
1071
+ #ifdef MRB_USE_BIGINT
1072
+ case MRB_TT_BIGINT:
1073
+ #endif
1074
+ num = y;
1075
+ den = ONE;
1076
+ break;
1077
+ default:
1078
+ /* should not happen */
1079
+ rat_type_error(mrb, y);
1080
+ }
1081
+
1082
+ mrb_value a = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, rat_numerator(mrb, x)), den);
1083
+ mrb_value b = mrb_bint_mul_n(mrb, mrb_as_bint(mrb, rat_denominator(mrb, x)), num);
1084
+ return rational_new_b(mrb, a, b);
1085
+ }
1086
+ #endif
1087
+
1088
+ mrb_value
1089
+ mrb_rational_div(mrb_state *mrb, mrb_value x, mrb_value y)
1090
+ {
1091
+ switch (mrb_type(y)) {
1092
+ case MRB_TT_INTEGER:
1093
+ #ifdef RAT_BIGINT
1094
+ if (RAT_BIGINT_P(x)) return rat_div_b(mrb, x, y);
1095
+ #endif
1096
+ {
1097
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
1098
+ mrb_int z = mrb_integer(y);
1099
+ if (z == 0) mrb_int_zerodiv(mrb);
1100
+ if (mrb_int_mul_overflow(p1->denominator, z, &z)) rat_overflow(mrb);
1101
+ return rational_new_i(mrb, p1->numerator, z);
1102
+ }
1103
+ case MRB_TT_RATIONAL:
1104
+ #ifdef RAT_BIGINT
1105
+ if (RAT_BIGINT_P(x) || RAT_BIGINT_P(y)) return rat_div_b(mrb, x, y);
1106
+ #endif
1107
+ {
1108
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
1109
+ struct mrb_rational *p2 = rat_ptr(mrb, y);
1110
+ mrb_int a, b;
1111
+
1112
+ if (mrb_int_mul_overflow(p1->numerator, p2->denominator, &a)) rat_overflow(mrb);
1113
+ if (mrb_int_mul_overflow(p2->numerator, p1->denominator, &b)) rat_overflow(mrb);
1114
+ return rational_new_i(mrb, a, b);
1115
+ }
1116
+
1117
+ #ifdef RAT_BIGINT
1118
+ case MRB_TT_BIGINT:
1119
+ return rat_div_b(mrb, x, y);
1120
+ #endif
1121
+
1122
+ #ifdef MRB_USE_COMPLEX
1123
+ case MRB_TT_COMPLEX:
1124
+ return mrb_complex_div(mrb, mrb_complex_new(mrb, rat_float(mrb, x), 0), y);
1125
+ #endif
1126
+
1127
+ #ifndef MRB_NO_FLOAT
1128
+ case MRB_TT_FLOAT:
1129
+ {
1130
+ struct mrb_rational *p1 = rat_ptr(mrb, x);
1131
+ mrb_float z = mrb_div_float((mrb_float)p1->numerator, mrb_as_float(mrb, y));
1132
+ return mrb_float_value(mrb, mrb_div_float(z, (mrb_float)p1->denominator));
1133
+ }
1134
+ #endif
1135
+
1136
+ default:
1137
+ rat_type_error(mrb, y);
1138
+ /* not reached */
1139
+ return mrb_nil_value();
1140
+ }
1141
+ }
1142
+
1143
+ /*
1144
+ * call-seq:
1145
+ * rational / numeric -> rational or numeric
1146
+ * rational.quo(numeric) -> rational or numeric
1147
+ *
1148
+ * Returns the quotient of rational divided by numeric. Uses standard rational
1149
+ * division: (a/b) / (c/d) = (a/b) * (d/c) = (a*d)/(b*c).
1150
+ *
1151
+ * Rational(1, 2) / Rational(1, 3) #=> Rational(3, 2)
1152
+ * Rational(3, 4) / 2 #=> Rational(3, 8)
1153
+ * Rational(1, 2) / 0.5 #=> 1.0
1154
+ */
1155
+ static mrb_value
1156
+ rational_div(mrb_state *mrb, mrb_value x)
1157
+ {
1158
+ mrb_value y = mrb_get_arg1(mrb);
1159
+ return mrb_rational_div(mrb, x, y);
1160
+ }
1161
+
1162
+ mrb_value mrb_int_pow(mrb_state *mrb, mrb_value x, mrb_value y);
1163
+
1164
+ /*
1165
+ * call-seq:
1166
+ * rational ** numeric -> numeric
1167
+ *
1168
+ * Returns rational raised to the power of numeric. The result is typically
1169
+ * a float unless the result can be exactly represented as a rational.
1170
+ *
1171
+ * Rational(1, 2) ** 2 #=> Rational(1, 4)
1172
+ * Rational(4, 1) ** 0.5 #=> 2.0
1173
+ * Rational(2, 1) ** 3 #=> Rational(8, 1)
1174
+ */
1175
+ static mrb_value
1176
+ rational_pow(mrb_state *mrb, mrb_value x)
1177
+ {
1178
+ #ifndef MRB_NO_FLOAT
1179
+ mrb_value y = mrb_get_arg1(mrb);
1180
+ double d1 = rat_float(mrb, x);
1181
+ double d2 = mrb_as_float(mrb, y);
1182
+
1183
+ d1 = pow(d1, d2);
1184
+ switch (mrb_type(y)) {
1185
+ case MRB_TT_FLOAT:
1186
+ return mrb_float_value(mrb, d1);
1187
+ case MRB_TT_INTEGER:
1188
+ case MRB_TT_RATIONAL:
1189
+ return rational_new_f(mrb, d1);
1190
+ case MRB_TT_BIGINT:
1191
+ default:
1192
+ return mrb_float_value(mrb, d1);
1193
+ }
1194
+ #else
1195
+ mrb_raisef(mrb, E_NOTIMP_ERROR, "Rational#** not implemented with MRB_NO_FLOAT");
1196
+ /* not reached */
1197
+ return mrb_nil_value();
1198
+ #endif
1199
+ }
1200
+
1201
+ /*
1202
+ * call-seq:
1203
+ * rational.hash -> integer
1204
+ *
1205
+ * Returns a hash value for the rational number. Two rationals with
1206
+ * the same value will have the same hash value.
1207
+ *
1208
+ * Rational(1, 2).hash == Rational(2, 4).hash #=> true
1209
+ */
1210
+ static mrb_value
1211
+ rational_hash(mrb_state *mrb, mrb_value rat)
1212
+ {
1213
+ struct mrb_rational *r = rat_ptr(mrb, rat);
1214
+ uint32_t hash;
1215
+
1216
+ #ifdef RAT_BIGINT
1217
+ if (RAT_BIGINT_P(rat)) {
1218
+ mrb_value tmp = mrb_bint_hash(mrb, mrb_obj_value(r->b.num));
1219
+ hash = (uint32_t)mrb_integer(tmp);
1220
+ tmp = mrb_bint_hash(mrb, mrb_obj_value(r->b.den));
1221
+ hash ^= (uint32_t)mrb_integer(tmp);
1222
+ return mrb_int_value(mrb, hash);
1223
+ }
1224
+ #endif
1225
+ hash = mrb_byte_hash((uint8_t*)&r->numerator, sizeof(mrb_int));
1226
+ hash = mrb_byte_hash_step((uint8_t*)&r->denominator, sizeof(mrb_int), hash);
1227
+ return mrb_int_value(mrb, hash);
1228
+ }
1229
+
1230
+ /* ---------------------------*/
1231
+ static const mrb_mt_entry rational_rom_entries[] = {
1232
+ MRB_MT_ENTRY(rational_numerator, MRB_SYM(numerator), MRB_ARGS_NONE()),
1233
+ MRB_MT_ENTRY(rational_denominator, MRB_SYM(denominator), MRB_ARGS_NONE()),
1234
+ MRB_MT_ENTRY(mrb_rational_to_i, MRB_SYM(to_i), MRB_ARGS_NONE()),
1235
+ MRB_MT_ENTRY(mrb_obj_itself, MRB_SYM(to_r), MRB_ARGS_NONE()), /* Returns self - already a rational */
1236
+ MRB_MT_ENTRY(rational_negative_p, MRB_SYM_Q(negative), MRB_ARGS_NONE()),
1237
+ MRB_MT_ENTRY(rational_eq, MRB_OPSYM(eq), MRB_ARGS_REQ(1)),
1238
+ MRB_MT_ENTRY(rational_minus, MRB_OPSYM(minus), MRB_ARGS_NONE()),
1239
+ MRB_MT_ENTRY(rational_add, MRB_OPSYM(add), MRB_ARGS_REQ(1)),
1240
+ MRB_MT_ENTRY(rational_sub, MRB_OPSYM(sub), MRB_ARGS_REQ(1)),
1241
+ MRB_MT_ENTRY(rational_mul, MRB_OPSYM(mul), MRB_ARGS_REQ(1)),
1242
+ MRB_MT_ENTRY(rational_div, MRB_OPSYM(div), MRB_ARGS_REQ(1)),
1243
+ MRB_MT_ENTRY(rational_div, MRB_SYM(quo), MRB_ARGS_REQ(1)),
1244
+ MRB_MT_ENTRY(rational_pow, MRB_OPSYM(pow), MRB_ARGS_REQ(1)),
1245
+ MRB_MT_ENTRY(rational_hash, MRB_SYM(hash), MRB_ARGS_NONE()),
1246
+ #ifndef MRB_NO_FLOAT
1247
+ MRB_MT_ENTRY(mrb_rational_to_f, MRB_SYM(to_f), MRB_ARGS_NONE()),
1248
+ #endif
1249
+ };
1250
+
1251
+ void mrb_mruby_rational_gem_init(mrb_state *mrb)
1252
+ {
1253
+ struct RClass *rat = mrb_define_class_id(mrb, MRB_SYM(Rational), mrb_class_get_id(mrb, MRB_SYM(Numeric)));
1254
+ MRB_SET_INSTANCE_TT(rat, MRB_TT_RATIONAL);
1255
+ MRB_UNDEF_ALLOCATOR(rat);
1256
+ mrb_undef_class_method_id(mrb, rat, MRB_SYM(new));
1257
+ MRB_MT_INIT_ROM(mrb, rat, rational_rom_entries);
1258
+ mrb_define_method_id(mrb, mrb->integer_class, MRB_SYM(to_r), int_to_r, MRB_ARGS_NONE());
1259
+ mrb_define_method_id(mrb, mrb->nil_class, MRB_SYM(to_r), nil_to_r, MRB_ARGS_NONE());
1260
+ mrb_define_private_method_id(mrb, mrb->kernel_module, MRB_SYM(Rational), rational_m, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
1261
+ #ifndef MRB_NO_FLOAT
1262
+ mrb_define_method_id(mrb, mrb->float_class, MRB_SYM(to_r), float_to_r, MRB_ARGS_NONE());
1263
+ #endif
1264
+ }
1265
+
1266
+ void
1267
+ mrb_mruby_rational_gem_final(mrb_state* mrb)
1268
+ {
1269
+ }