script_core 0.2.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Gemfile +2 -2
  4. data/ext/enterprise_script_service/Rakefile +1 -1
  5. data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +117 -74
  6. data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +41 -37
  7. data/ext/enterprise_script_service/mruby/.github/workflows/lint.yml +23 -0
  8. data/ext/enterprise_script_service/mruby/.github/workflows/oss-fuzz.yml +27 -0
  9. data/ext/enterprise_script_service/mruby/.github/workflows/spell-checker.yml +17 -0
  10. data/ext/enterprise_script_service/mruby/.gitlab-ci.yml +3 -3
  11. data/ext/enterprise_script_service/mruby/.markdownlint.yml +16 -0
  12. data/ext/enterprise_script_service/mruby/.travis.yml +2 -2
  13. data/ext/enterprise_script_service/mruby/.yamllint +8 -0
  14. data/ext/enterprise_script_service/mruby/AUTHORS +3 -0
  15. data/ext/enterprise_script_service/mruby/CODEOWNERS +1 -0
  16. data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +6 -13
  17. data/ext/enterprise_script_service/mruby/Doxyfile +4 -4
  18. data/ext/enterprise_script_service/mruby/LICENSE +1 -1
  19. data/ext/enterprise_script_service/mruby/Makefile +1 -1
  20. data/ext/enterprise_script_service/mruby/README.md +4 -14
  21. data/ext/enterprise_script_service/mruby/Rakefile +18 -108
  22. data/ext/enterprise_script_service/mruby/TODO.md +17 -0
  23. data/ext/enterprise_script_service/mruby/appveyor.yml +31 -25
  24. data/ext/enterprise_script_service/mruby/benchmark/bm_ao_render.rb +1 -1
  25. data/ext/enterprise_script_service/mruby/build_config.rb +9 -152
  26. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_ArduinoDue.rb → build_config/ArduinoDue.rb} +2 -19
  27. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +2 -2
  28. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +1 -18
  29. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +2 -19
  30. data/ext/enterprise_script_service/mruby/build_config/android_arm64-v8a.rb +11 -0
  31. data/ext/enterprise_script_service/mruby/build_config/android_armeabi.rb +11 -0
  32. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_android_armeabi_v7a_neon_hard.rb → build_config/android_armeabi_v7a_neon_hard.rb} +0 -15
  33. data/ext/enterprise_script_service/mruby/build_config/bench.rb +11 -0
  34. data/ext/enterprise_script_service/mruby/build_config/boxing.rb +21 -0
  35. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_chipKITMax32.rb → build_config/chipKITMax32.rb} +2 -19
  36. data/ext/enterprise_script_service/mruby/{travis_config.rb → build_config/ci/gcc-clang.rb} +10 -10
  37. data/ext/enterprise_script_service/mruby/build_config/ci/msvc.rb +20 -0
  38. data/ext/enterprise_script_service/mruby/build_config/clang-asan.rb +11 -0
  39. data/ext/enterprise_script_service/mruby/build_config/cross-32bit.rb +14 -0
  40. data/ext/enterprise_script_service/mruby/build_config/default.rb +80 -0
  41. data/ext/enterprise_script_service/mruby/{examples/targets/build_config_dreamcast_shelf.rb → build_config/dreamcast_shelf.rb} +5 -19
  42. data/ext/enterprise_script_service/mruby/build_config/gameboyadvance.rb +73 -0
  43. data/ext/enterprise_script_service/mruby/build_config/host-cxx.rb +12 -0
  44. data/ext/enterprise_script_service/mruby/build_config/host-debug.rb +20 -0
  45. data/ext/enterprise_script_service/mruby/build_config/host-gprof.rb +14 -0
  46. data/ext/enterprise_script_service/mruby/build_config/host-m32.rb +15 -0
  47. data/ext/enterprise_script_service/mruby/build_config/host-shared.rb +36 -0
  48. data/ext/enterprise_script_service/mruby/build_config/mrbc.rb +11 -0
  49. data/ext/enterprise_script_service/mruby/build_config/no-float.rb +17 -0
  50. data/ext/enterprise_script_service/mruby/doc/guides/compile.md +138 -49
  51. data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +5 -4
  52. data/ext/enterprise_script_service/mruby/doc/guides/gc-arena-howto.md +1 -1
  53. data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +49 -22
  54. data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +31 -14
  55. data/ext/enterprise_script_service/mruby/doc/guides/symbol.md +83 -0
  56. data/ext/enterprise_script_service/mruby/doc/limitations.md +35 -36
  57. data/ext/enterprise_script_service/mruby/doc/mruby3.md +163 -0
  58. data/ext/enterprise_script_service/mruby/doc/opcode.md +93 -107
  59. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +1 -1
  60. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +5 -1
  61. data/ext/enterprise_script_service/mruby/examples/mrbgems/c_extension_example/src/example.c +5 -1
  62. data/ext/enterprise_script_service/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +1 -1
  63. data/ext/enterprise_script_service/mruby/include/mrbconf.h +81 -62
  64. data/ext/enterprise_script_service/mruby/include/mruby.h +137 -96
  65. data/ext/enterprise_script_service/mruby/include/mruby/array.h +23 -6
  66. data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +73 -48
  67. data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
  68. data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +79 -48
  69. data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
  70. data/ext/enterprise_script_service/mruby/include/mruby/common.h +4 -1
  71. data/ext/enterprise_script_service/mruby/include/mruby/compile.h +13 -7
  72. data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
  73. data/ext/enterprise_script_service/mruby/include/mruby/dump.h +17 -35
  74. data/ext/enterprise_script_service/mruby/include/mruby/endian.h +44 -0
  75. data/ext/enterprise_script_service/mruby/include/mruby/error.h +39 -5
  76. data/ext/enterprise_script_service/mruby/include/mruby/gc.h +1 -0
  77. data/ext/enterprise_script_service/mruby/include/mruby/hash.h +33 -13
  78. data/ext/enterprise_script_service/mruby/include/mruby/irep.h +64 -14
  79. data/ext/enterprise_script_service/mruby/include/mruby/khash.h +6 -14
  80. data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +36 -63
  81. data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
  82. data/ext/enterprise_script_service/mruby/include/mruby/ops.h +27 -23
  83. data/ext/enterprise_script_service/mruby/include/mruby/presym.h +40 -0
  84. data/ext/enterprise_script_service/mruby/include/mruby/presym/disable.h +70 -0
  85. data/ext/enterprise_script_service/mruby/include/mruby/presym/enable.h +37 -0
  86. data/ext/enterprise_script_service/mruby/include/mruby/presym/scanning.h +73 -0
  87. data/ext/enterprise_script_service/mruby/include/mruby/proc.h +80 -13
  88. data/ext/enterprise_script_service/mruby/include/mruby/string.h +10 -15
  89. data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
  90. data/ext/enterprise_script_service/mruby/include/mruby/value.h +29 -19
  91. data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
  92. data/ext/enterprise_script_service/mruby/include/mruby/version.h +26 -7
  93. data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -44
  94. data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +55 -37
  95. data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +12 -10
  96. data/ext/enterprise_script_service/mruby/lib/{mruby-core-ext.rb → mruby/core_ext.rb} +10 -3
  97. data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +75 -32
  98. data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +1 -1
  99. data/ext/enterprise_script_service/mruby/lib/mruby/presym.rb +132 -0
  100. data/ext/enterprise_script_service/mruby/mrbgems/default-no-fpu.gembox +3 -0
  101. data/ext/enterprise_script_service/mruby/mrbgems/default-no-stdio.gembox +4 -0
  102. data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +9 -88
  103. data/ext/enterprise_script_service/mruby/mrbgems/full-core.gembox +1 -4
  104. data/ext/enterprise_script_service/mruby/mrbgems/math.gembox +10 -0
  105. data/ext/enterprise_script_service/mruby/mrbgems/metaprog.gembox +15 -0
  106. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +1 -1
  107. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +5 -4
  108. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +28 -19
  109. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mruby-config +18 -8
  110. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +3 -6
  111. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +10 -10
  112. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +14 -9
  113. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +3 -2
  114. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +4 -3
  115. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +2 -6
  116. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +4 -4
  117. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +23 -5
  118. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +11 -2
  119. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +41 -34
  120. data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb +0 -0
  121. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +3 -4
  122. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +19 -9
  123. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +25 -4
  124. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
  125. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +22 -6
  126. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +1 -1
  127. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +2 -2
  128. data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
  129. data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrblib/catch.rb +27 -0
  130. data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +2 -1
  131. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +430 -399
  132. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +5 -0
  133. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +49 -44
  134. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +559 -217
  135. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +4774 -4193
  136. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +18 -19
  137. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +1 -1
  138. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +8 -7
  139. data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +4 -4
  140. data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +1 -0
  141. data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +2 -2
  142. data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/mrbgem.rake +2 -2
  143. data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +17 -25
  144. data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +18 -13
  145. data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +30 -2
  146. data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +7 -0
  147. data/ext/enterprise_script_service/mruby/mrbgems/mruby-inline-struct/test/inline.c +2 -2
  148. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +18 -16
  149. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +2 -2
  150. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
  151. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +2 -2
  152. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +55 -52
  153. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +4 -2
  154. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +99 -87
  155. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +2 -0
  156. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +2 -3
  157. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +1 -1
  158. data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +7 -6
  159. data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +13 -12
  160. data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/test/math.rb +5 -4
  161. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +43 -58
  162. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +4 -4
  163. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/README.md +4 -3
  164. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +77 -74
  165. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +4 -4
  166. data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +14 -13
  167. data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +5 -4
  168. data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -12
  169. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
  170. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/src/memsize.c +231 -0
  171. data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
  172. data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/README.md +15 -18
  173. data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +38 -88
  174. data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +1 -30
  175. data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +62 -26
  176. data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +32 -19
  177. data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.c +1 -1
  178. data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +98 -43
  179. data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +2 -2
  180. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +39 -6
  181. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +20 -40
  182. data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +27 -3
  183. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +11 -17
  184. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +216 -38
  185. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +6 -6
  186. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/README.md +6 -4
  187. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +4 -4
  188. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
  189. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
  190. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +102 -71
  191. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +4 -2
  192. data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +23 -1
  193. data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +13 -9
  194. data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +1 -1
  195. data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +18 -25
  196. data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +6 -5
  197. data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
  198. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/README.md +0 -1
  199. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +5 -5
  200. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +16 -44
  201. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +4 -4
  202. data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +27 -27
  203. data/ext/enterprise_script_service/mruby/mrbgems/stdlib-ext.gembox +18 -0
  204. data/ext/enterprise_script_service/mruby/mrbgems/stdlib-io.gembox +12 -0
  205. data/ext/enterprise_script_service/mruby/mrbgems/stdlib.gembox +54 -0
  206. data/ext/enterprise_script_service/mruby/mrblib/10error.rb +4 -0
  207. data/ext/enterprise_script_service/mruby/mrblib/array.rb +17 -9
  208. data/ext/enterprise_script_service/mruby/mrblib/enum.rb +1 -1
  209. data/ext/enterprise_script_service/mruby/mrblib/hash.rb +0 -20
  210. data/ext/enterprise_script_service/mruby/mrblib/init_mrblib.c +0 -11
  211. data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +36 -11
  212. data/ext/enterprise_script_service/mruby/mrblib/range.rb +25 -3
  213. data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +2 -2
  214. data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +1 -1
  215. data/ext/enterprise_script_service/mruby/src/array.c +43 -80
  216. data/ext/enterprise_script_service/mruby/src/backtrace.c +16 -17
  217. data/ext/enterprise_script_service/mruby/src/class.c +774 -182
  218. data/ext/enterprise_script_service/mruby/src/codedump.c +223 -198
  219. data/ext/enterprise_script_service/mruby/src/debug.c +6 -6
  220. data/ext/enterprise_script_service/mruby/src/dump.c +466 -141
  221. data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
  222. data/ext/enterprise_script_service/mruby/src/error.c +36 -13
  223. data/ext/enterprise_script_service/mruby/src/etc.c +43 -34
  224. data/ext/enterprise_script_service/mruby/src/fmt_fp.c +5 -6
  225. data/ext/enterprise_script_service/mruby/src/gc.c +73 -71
  226. data/ext/enterprise_script_service/mruby/src/hash.c +1050 -707
  227. data/ext/enterprise_script_service/mruby/src/kernel.c +75 -220
  228. data/ext/enterprise_script_service/mruby/src/load.c +196 -166
  229. data/ext/enterprise_script_service/mruby/src/numeric.c +352 -314
  230. data/ext/enterprise_script_service/mruby/src/object.c +97 -90
  231. data/ext/enterprise_script_service/mruby/src/print.c +4 -3
  232. data/ext/enterprise_script_service/mruby/src/proc.c +48 -56
  233. data/ext/enterprise_script_service/mruby/src/range.c +45 -21
  234. data/ext/enterprise_script_service/mruby/src/state.c +25 -32
  235. data/ext/enterprise_script_service/mruby/src/string.c +59 -101
  236. data/ext/enterprise_script_service/mruby/src/symbol.c +121 -56
  237. data/ext/enterprise_script_service/mruby/src/value_array.h +1 -0
  238. data/ext/enterprise_script_service/mruby/src/variable.c +158 -158
  239. data/ext/enterprise_script_service/mruby/src/vm.c +617 -602
  240. data/ext/enterprise_script_service/mruby/tasks/benchmark.rake +6 -6
  241. data/ext/enterprise_script_service/mruby/tasks/bin.rake +23 -0
  242. data/ext/enterprise_script_service/mruby/tasks/core.rake +12 -0
  243. data/ext/enterprise_script_service/mruby/tasks/doc.rake +50 -38
  244. data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +83 -77
  245. data/ext/enterprise_script_service/mruby/tasks/libmruby.rake +10 -1
  246. data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +13 -1
  247. data/ext/enterprise_script_service/mruby/tasks/mrblib.rake +40 -0
  248. data/ext/enterprise_script_service/mruby/tasks/presym.rake +44 -0
  249. data/ext/enterprise_script_service/mruby/tasks/test.rake +68 -0
  250. data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +6 -5
  251. data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +10 -14
  252. data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +17 -21
  253. data/ext/enterprise_script_service/mruby/test/bintest.rb +5 -5
  254. data/ext/enterprise_script_service/mruby/test/t/argumenterror.rb +16 -0
  255. data/ext/enterprise_script_service/mruby/test/t/array.rb +7 -3
  256. data/ext/enterprise_script_service/mruby/test/t/bs_literal.rb +1 -1
  257. data/ext/enterprise_script_service/mruby/test/t/float.rb +18 -8
  258. data/ext/enterprise_script_service/mruby/test/t/hash.rb +903 -281
  259. data/ext/enterprise_script_service/mruby/test/t/integer.rb +10 -38
  260. data/ext/enterprise_script_service/mruby/test/t/kernel.rb +1 -1
  261. data/ext/enterprise_script_service/mruby/test/t/literals.rb +50 -0
  262. data/ext/enterprise_script_service/mruby/test/t/module.rb +2 -2
  263. data/ext/enterprise_script_service/mruby/test/t/numeric.rb +1 -1
  264. data/ext/enterprise_script_service/mruby/test/t/range.rb +83 -1
  265. data/ext/enterprise_script_service/mruby/test/t/string.rb +4 -0
  266. data/ext/enterprise_script_service/mruby/test/t/superclass.rb +10 -10
  267. data/ext/enterprise_script_service/mruby/test/t/syntax.rb +24 -0
  268. data/ext/enterprise_script_service/mruby/test/t/vformat.rb +3 -3
  269. data/ext/enterprise_script_service/mruby_config.rb +2 -5
  270. data/ext/enterprise_script_service/mruby_engine.cpp +1 -1
  271. data/lib/script_core/version.rb +1 -1
  272. data/spec/script_core_spec.rb +13 -0
  273. metadata +61 -23
  274. data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +0 -24
  275. data/ext/enterprise_script_service/mruby/TODO +0 -8
  276. data/ext/enterprise_script_service/mruby/appveyor_config.rb +0 -46
  277. data/ext/enterprise_script_service/mruby/benchmark/build_config_boxing.rb +0 -28
  278. data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_arm64-v8a.rb +0 -26
  279. data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_armeabi.rb +0 -26
  280. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +0 -30
  281. data/ext/enterprise_script_service/mruby/mrblib/mrblib.rake +0 -18
  282. data/ext/enterprise_script_service/mruby/src/crc.c +0 -39
  283. data/ext/enterprise_script_service/mruby/src/mruby_core.rake +0 -19
@@ -42,6 +42,9 @@ range_cover(mrb_state *mrb, mrb_value range)
42
42
  end = RANGE_END(r);
43
43
 
44
44
  if (r_le(mrb, beg, val)) {
45
+ if (mrb_nil_p(end)) {
46
+ return mrb_true_value();
47
+ }
45
48
  if (RANGE_EXCL(r)) {
46
49
  if (r_lt(mrb, val, end))
47
50
  return mrb_true_value();
@@ -55,36 +58,6 @@ range_cover(mrb_state *mrb, mrb_value range)
55
58
  return mrb_false_value();
56
59
  }
57
60
 
58
- /*
59
- * call-seq:
60
- * rng.last -> obj
61
- * rng.last(n) -> an_array
62
- *
63
- * Returns the last object in the range,
64
- * or an array of the last +n+ elements.
65
- *
66
- * Note that with no arguments +last+ will return the object that defines
67
- * the end of the range even if #exclude_end? is +true+.
68
- *
69
- * (10..20).last #=> 20
70
- * (10...20).last #=> 20
71
- * (10..20).last(3) #=> [18, 19, 20]
72
- * (10...20).last(3) #=> [17, 18, 19]
73
- */
74
- static mrb_value
75
- range_last(mrb_state *mrb, mrb_value range)
76
- {
77
- mrb_value num;
78
- mrb_value array;
79
-
80
- if (mrb_get_args(mrb, "|o", &num) == 0) {
81
- return mrb_range_end(mrb, range);
82
- }
83
-
84
- array = mrb_funcall(mrb, range, "to_a", 0);
85
- return mrb_funcall(mrb, array, "last", 1, mrb_to_int(mrb, num));
86
- }
87
-
88
61
  /*
89
62
  * call-seq:
90
63
  * rng.size -> num
@@ -96,7 +69,7 @@ range_last(mrb_state *mrb, mrb_value range)
96
69
  * ('a'..'z').size #=> nil
97
70
  */
98
71
 
99
- #ifndef MRB_WITHOUT_FLOAT
72
+ #ifndef MRB_NO_FLOAT
100
73
  static mrb_value
101
74
  range_size(mrb_state *mrb, mrb_value range)
102
75
  {
@@ -108,9 +81,13 @@ range_size(mrb_state *mrb, mrb_value range)
108
81
 
109
82
  beg = RANGE_BEG(r);
110
83
  end = RANGE_END(r);
84
+ if ((mrb_fixnum_p(beg) || mrb_float_p(beg)) && mrb_nil_p(end)) {
85
+ return mrb_float_value(mrb, INFINITY);
86
+ }
87
+
111
88
  excl = RANGE_EXCL(r);
112
- if (mrb_fixnum_p(beg)) {
113
- beg_f = (mrb_float)mrb_fixnum(beg);
89
+ if (mrb_integer_p(beg)) {
90
+ beg_f = (mrb_float)mrb_integer(beg);
114
91
  }
115
92
  else if (mrb_float_p(beg)) {
116
93
  beg_f = mrb_float(beg);
@@ -118,8 +95,8 @@ range_size(mrb_state *mrb, mrb_value range)
118
95
  else {
119
96
  num_p = FALSE;
120
97
  }
121
- if (mrb_fixnum_p(end)) {
122
- end_f = (mrb_float)mrb_fixnum(end);
98
+ if (mrb_integer_p(end)) {
99
+ end_f = (mrb_float)mrb_integer(end);
123
100
  }
124
101
  else if (mrb_float_p(end)) {
125
102
  end_f = mrb_float(end);
@@ -159,18 +136,22 @@ range_size(mrb_state *mrb, mrb_value range)
159
136
 
160
137
  beg = RANGE_BEG(r);
161
138
  end = RANGE_END(r);
139
+ if (mrb_fixnum_p(beg) && mrb_nil_p(end)) {
140
+ return mrb_nil_value();
141
+ }
142
+
162
143
  excl = RANGE_EXCL(r) ? 0 : 1;
163
144
 
164
- if (mrb_fixnum_p(beg) && mrb_fixnum_p(end)) {
165
- mrb_int a = mrb_fixnum(beg);
166
- mrb_int b = mrb_fixnum(end);
145
+ if (mrb_integer_p(beg) && mrb_integer_p(end)) {
146
+ mrb_int a = mrb_integer(beg);
147
+ mrb_int b = mrb_integer(end);
167
148
  mrb_int c = b - a + excl;
168
149
 
169
150
  return mrb_fixnum_value(c);
170
151
  }
171
152
  return mrb_nil_value();
172
153
  }
173
- #endif /* MRB_WITHOUT_FLOAT */
154
+ #endif /* MRB_NO_FLOAT */
174
155
 
175
156
  void
176
157
  mrb_mruby_range_ext_gem_init(mrb_state* mrb)
@@ -178,7 +159,6 @@ mrb_mruby_range_ext_gem_init(mrb_state* mrb)
178
159
  struct RClass * s = mrb_class_get(mrb, "Range");
179
160
 
180
161
  mrb_define_method(mrb, s, "cover?", range_cover, MRB_ARGS_REQ(1));
181
- mrb_define_method(mrb, s, "last", range_last, MRB_ARGS_OPT(1));
182
162
  mrb_define_method(mrb, s, "size", range_size, MRB_ARGS_NONE());
183
163
  }
184
164
 
@@ -5,11 +5,17 @@
5
5
  assert_true ("a".."z").cover?("c")
6
6
  assert_true !("a".."z").cover?("5")
7
7
  assert_true ("a".."z").cover?("cc")
8
+ assert_true ("a"..).cover?("c")
9
+ assert_false ("a"..).cover?("5")
10
+ assert_true ("a"..).cover?("cc")
8
11
  end
9
12
 
10
13
  assert('Range#first') do
11
14
  assert_equal 10, (10..20).first
12
15
  assert_equal [10, 11, 12], (10..20).first(3)
16
+ assert_equal 10, (10..).first
17
+ assert_equal [10, 11, 12], (10..).first(3)
18
+ assert_raise(RangeError) { (..1).first }
13
19
 
14
20
  skip unless Object.const_defined?(:Float)
15
21
  assert_equal [0, 1, 2], (0..Float::INFINITY).first(3)
@@ -18,6 +24,8 @@
18
24
  assert('Range#last') do
19
25
  assert_equal 20, (10..20).last
20
26
  assert_equal 20, (10...20).last
27
+ assert_raise(RangeError) { (10..).last }
28
+ assert_raise(RangeError) { (10...).last }
21
29
  assert_equal [18, 19, 20], (10..20).last(3)
22
30
  assert_equal [17, 18, 19], (10...20).last(3)
23
31
  end
@@ -26,6 +34,9 @@
26
34
  assert_equal 42, (1..42).size
27
35
  assert_equal 41, (1...42).size
28
36
  assert_nil ('a'..'z').size
37
+ assert_nil ('a'..).size
38
+
39
+ assert_nil (1..).size unless Object.const_defined?(:Float)
29
40
 
30
41
  skip unless Object.const_defined?(:Float)
31
42
  assert_equal 6, (1...6.3).size
@@ -33,6 +44,10 @@
33
44
  assert_equal 5, (1.1...6).size
34
45
  assert_equal 15, (1.0..15.9).size
35
46
  assert_equal Float::INFINITY, (0..Float::INFINITY).size
47
+
48
+ assert_equal Float::INFINITY, (1..).size
49
+ assert_equal Float::INFINITY, (1...).size
50
+ assert_equal Float::INFINITY, (1.0..).size
36
51
  end
37
52
 
38
53
  assert('Range#max') do
@@ -50,6 +65,10 @@
50
65
  # returns the endpoint when the endpoint equals the start point and the range is inclusive
51
66
  assert_equal 5, (5..5).max
52
67
 
68
+ # raises RangeError when called on an endless range
69
+ assert_raise(RangeError) { (10..).max }
70
+ assert_raise(RangeError) { (10...).max }
71
+
53
72
  skip unless Object.const_defined?(:Float)
54
73
 
55
74
  # returns the maximum value in the Float range when called with no arguments
@@ -94,26 +113,31 @@
94
113
  # returns the minimum value in the range when called with no arguments
95
114
  assert_equal 1, (1..10).min
96
115
  assert_equal 1, (1...10).min
116
+ assert_equal 1, (1..).min
97
117
 
98
118
  # returns nil when the start point is greater than the endpoint
99
119
  assert_equal nil, (100..10).min
100
120
 
101
121
  # returns nil when the endpoint equals the start point and the range is exclusive
102
- assert_equal nil, (5...5).max
122
+ assert_equal nil, (5...5).min
103
123
 
104
124
  # returns the endpoint when the endpoint equals the start point and the range is inclusive
105
- assert_equal 5, (5..5).max
125
+ assert_equal 5, (5..5).min
106
126
 
107
127
  skip unless Object.const_defined?(:Float)
108
128
 
109
129
  # returns the minimum value in the Float range when called with no arguments
110
130
  assert_equal 303.20, (303.20..908.1111).min
131
+ assert_equal 1, (1.0..).min
111
132
 
112
133
  # returns nil when the start point is greater than the endpoint in a Float range
113
- assert_equal nil, (3003.20..908.1111).max
134
+ assert_equal nil, (3003.20..908.1111).min
114
135
  end
115
136
 
116
137
  assert('Range#min given a block') do
138
+ # raise when called with a block in endless range
139
+ assert_raise(RangeError) { (1..).min{} }
140
+
117
141
  # passes each pair of values in the range to the block
118
142
  acc = []
119
143
  (1..10).min do |a, b|
@@ -47,12 +47,14 @@ def /(rhs)
47
47
  end
48
48
  end
49
49
 
50
+ alias quo /
51
+
50
52
  def <=>(rhs)
51
- if rhs.is_a?(Integral)
53
+ case rhs
54
+ when Integer, Float
52
55
  return numerator <=> rhs if denominator == 1
53
56
  rhs = Rational(rhs)
54
57
  end
55
-
56
58
  case rhs
57
59
  when Rational
58
60
  (numerator * rhs.denominator - denominator * rhs.numerator) <=> 0
@@ -65,14 +67,13 @@ def <=>(rhs)
65
67
 
66
68
  def ==(rhs)
67
69
  return true if self.equal?(rhs)
68
- if rhs.is_a?(Integral) && denominator == 1
69
- return numerator == rhs
70
- end
71
- if rhs.is_a?(Rational)
72
- numerator * rhs.denominator == denominator * rhs.numerator
73
- else
74
- rhs == self
70
+ case rhs
71
+ when Integer, Float
72
+ return numerator == rhs if denominator == 1
73
+ when Rational
74
+ return numerator * rhs.denominator == denominator * rhs.numerator
75
75
  end
76
+ rhs == self
76
77
  end
77
78
  end
78
79
 
@@ -83,16 +84,9 @@ def to_r
83
84
  end
84
85
 
85
86
  module Kernel
86
- def Rational(numerator, denominator = 1)
87
- a = numerator
88
- b = denominator
89
- a, b = b, a % b until b == 0
90
- Rational._new(numerator.div(a), denominator.div(a))
91
- end
92
-
93
87
  [:+, :-, :*, :/, :<=>, :==, :<, :<=, :>, :>=].each do |op|
94
88
  original_operator_name = :"__original_operator_#{op}_rational"
95
- Fixnum.instance_eval do
89
+ Integer.instance_eval do
96
90
  alias_method original_operator_name, op
97
91
  define_method op do |rhs|
98
92
  if rhs.is_a? Rational
@@ -2,6 +2,7 @@
2
2
  #include <mruby/class.h>
3
3
  #include <mruby/string.h>
4
4
  #include <mruby/numeric.h>
5
+ #include <mruby/presym.h>
5
6
 
6
7
  struct mrb_rational {
7
8
  mrb_int numerator;
@@ -60,88 +61,243 @@ static mrb_value
60
61
  rational_numerator(mrb_state *mrb, mrb_value self)
61
62
  {
62
63
  struct mrb_rational *p = rational_ptr(mrb, self);
63
- return mrb_fixnum_value(p->numerator);
64
+ return mrb_int_value(mrb, p->numerator);
64
65
  }
65
66
 
66
67
  static mrb_value
67
68
  rational_denominator(mrb_state *mrb, mrb_value self)
68
69
  {
69
70
  struct mrb_rational *p = rational_ptr(mrb, self);
70
- return mrb_fixnum_value(p->denominator);
71
+ return mrb_int_value(mrb, p->denominator);
72
+ }
73
+
74
+ static void
75
+ rat_overflow(mrb_state *mrb)
76
+ {
77
+ mrb_raise(mrb, E_RANGE_ERROR, "integer overflow in rational");
78
+ }
79
+
80
+ static void
81
+ rat_zerodiv(mrb_state *mrb)
82
+ {
83
+ mrb_raise(mrb, E_ZERODIV_ERROR, "divided by 0 in rational");
71
84
  }
72
85
 
73
86
  static mrb_value
74
87
  rational_new(mrb_state *mrb, mrb_int numerator, mrb_int denominator)
75
88
  {
76
- struct RClass *c = mrb_class_get(mrb, "Rational");
89
+ struct RClass *c = mrb_class_get_id(mrb, MRB_SYM(Rational));
77
90
  struct mrb_rational *p;
78
- struct RBasic *rat = rational_alloc(mrb, c, &p);
91
+ struct RBasic *rat;
92
+
93
+ if (denominator == 0) {
94
+ rat_zerodiv(mrb);
95
+ }
96
+ if (denominator < 0) {
97
+ if (numerator == MRB_INT_MIN || denominator == MRB_INT_MIN) {
98
+ rat_overflow(mrb);
99
+ }
100
+ numerator *= -1;
101
+ denominator *= -1;
102
+ }
103
+ rat = rational_alloc(mrb, c, &p);
79
104
  p->numerator = numerator;
80
105
  p->denominator = denominator;
81
106
  MRB_SET_FROZEN_FLAG(rat);
82
107
  return mrb_obj_value(rat);
83
108
  }
84
109
 
110
+ inline static mrb_int
111
+ i_gcd(mrb_int x, mrb_int y)
112
+ {
113
+ mrb_uint u, v, t;
114
+ int shift;
115
+
116
+ if (x < 0)
117
+ x = -x;
118
+ if (y < 0)
119
+ y = -y;
120
+
121
+ if (x == 0)
122
+ return y;
123
+ if (y == 0)
124
+ return x;
125
+
126
+ u = (mrb_uint)x;
127
+ v = (mrb_uint)y;
128
+ for (shift = 0; ((u | v) & 1) == 0; ++shift) {
129
+ u >>= 1;
130
+ v >>= 1;
131
+ }
132
+
133
+ while ((u & 1) == 0)
134
+ u >>= 1;
135
+
136
+ do {
137
+ while ((v & 1) == 0)
138
+ v >>= 1;
139
+
140
+ if (u > v) {
141
+ t = v;
142
+ v = u;
143
+ u = t;
144
+ }
145
+ v = v - u;
146
+ } while (v != 0);
147
+
148
+ return (mrb_int)(u << shift);
149
+ }
150
+
151
+ static mrb_value
152
+ rational_new_i(mrb_state *mrb, mrb_int n, mrb_int d)
153
+ {
154
+ mrb_int a;
155
+
156
+ if (d == 0) {
157
+ rat_zerodiv(mrb);
158
+ }
159
+ a = i_gcd(n, d);
160
+ if ((n == MRB_INT_MIN || d == MRB_INT_MIN) && a == -1) {
161
+ rat_overflow(mrb);
162
+ }
163
+ return rational_new(mrb, n/a, d/a);
164
+ }
165
+
166
+ #ifndef MRB_NO_FLOAT
167
+ #include <math.h>
168
+
169
+ #if defined(MRB_INT32) || defined(MRB_USE_FLOAT32)
170
+ #define frexp_rat(x,exp) frexpf((float)x, exp)
171
+ #define ldexp_rat(x,exp) ldexpf((float)x, exp)
172
+ #define RAT_MANT_DIG FLT_MANT_DIG
173
+ #define RAT_INT_LIMIT 30
174
+ #define RAT_HUGE_VAL HUGE_VALF
175
+ #else
176
+ #define frexp_rat frexp
177
+ #define ldexp_rat ldexp
178
+ #define RAT_MANT_DIG DBL_MANT_DIG
179
+ #define RAT_INT_LIMIT 62
180
+ #define RAT_HUGE_VAL HUGE_VAL
181
+ #endif
182
+
183
+ static void
184
+ float_decode_internal(mrb_state *mrb, mrb_float f, mrb_float *rf, int *n)
185
+ {
186
+ f = (mrb_float)frexp_rat(f, n);
187
+ if (isinf(f)) rat_overflow(mrb);
188
+ f = (mrb_float)ldexp_rat(f, RAT_MANT_DIG);
189
+ *n -= RAT_MANT_DIG;
190
+ *rf = f;
191
+ }
192
+
193
+ void mrb_check_num_exact(mrb_state *mrb, mrb_float num);
194
+
195
+ static mrb_value
196
+ rational_new_f(mrb_state *mrb, mrb_float f0)
197
+ {
198
+ mrb_float f;
199
+ int n;
200
+
201
+ mrb_check_num_exact(mrb, f0);
202
+ float_decode_internal(mrb, f0, &f, &n);
203
+ #if FLT_RADIX == 2
204
+ if (n == 0)
205
+ return rational_new(mrb, (mrb_int)f, 1);
206
+ if (n > 0) {
207
+ f = ldexp_rat(f, n);
208
+ if (f == RAT_HUGE_VAL || f > (mrb_float)MRB_INT_MAX) {
209
+ rat_overflow(mrb);
210
+ }
211
+ return rational_new(mrb, (mrb_uint)f, 1);
212
+ }
213
+ if (n < -RAT_INT_LIMIT) {
214
+ f = ldexp_rat(f, n+RAT_INT_LIMIT);
215
+ n = RAT_INT_LIMIT;
216
+ }
217
+ else {
218
+ n = -n;
219
+ }
220
+ return rational_new_i(mrb, (mrb_int)f, ((mrb_int)1)<<n);
221
+ #else
222
+ mrb_int pow = 1;
223
+ if (n < 0) {
224
+ n = -n;
225
+ while (n > RAT_INT_LIMIT) {
226
+ f /= 2;
227
+ n--;
228
+ }
229
+ while (n--) {
230
+ pow *= FLT_RADIX;
231
+ }
232
+ return rational_new_i(mrb, f, pow);
233
+ }
234
+ else {
235
+ while (n--) {
236
+ if (MRB_INT_MAX/FLT_RADIX < pow) {
237
+ rat_overflow(mrb);
238
+ }
239
+ pow *= FLT_RADIX;
240
+ }
241
+ return rational_new(mrb, (mrb_int)f*pow, 1);
242
+ }
243
+ #endif
244
+ }
245
+ #endif
246
+
85
247
  static mrb_value
86
248
  rational_s_new(mrb_state *mrb, mrb_value self)
87
249
  {
88
250
  mrb_int numerator, denominator;
89
251
 
90
- #ifdef MRB_WITHOUT_FLOAT
252
+ #ifdef MRB_NO_FLOAT
91
253
  mrb_get_args(mrb, "ii", &numerator, &denominator);
92
254
  #else
93
255
 
94
- #define DROP_PRECISION(f, num, denom) \
95
- do { \
96
- while (f < (mrb_float)MRB_INT_MIN || f > (mrb_float)MRB_INT_MAX) { \
97
- num /= 2; \
98
- denom /= 2; \
99
- } \
100
- } while (0)
101
-
102
- mrb_value numv, denomv;
256
+ mrb_value numv, denomv;
103
257
 
104
258
  mrb_get_args(mrb, "oo", &numv, &denomv);
105
- if (mrb_fixnum_p(numv)) {
106
- numerator = mrb_fixnum(numv);
259
+ if (mrb_integer_p(numv)) {
260
+ numerator = mrb_integer(numv);
107
261
 
108
- if (mrb_fixnum_p(denomv)) {
109
- denominator = mrb_fixnum(denomv);
262
+ if (mrb_integer_p(denomv)) {
263
+ denominator = mrb_integer(denomv);
110
264
  }
111
265
  else {
266
+ mrb_float numf = (mrb_float)numerator;
112
267
  mrb_float denomf = mrb_to_flo(mrb, denomv);
113
268
 
114
- DROP_PRECISION(denomf, numerator, denomf);
115
- denominator = (mrb_int)denomf;
269
+ return rational_new_f(mrb, numf/denomf);
116
270
  }
117
271
  }
118
272
  else {
119
273
  mrb_float numf = mrb_to_flo(mrb, numv);
274
+ mrb_float denomf;
120
275
 
121
- if (mrb_fixnum_p(denomv)) {
122
- denominator = mrb_fixnum(denomv);
276
+ if (mrb_integer_p(denomv)) {
277
+ denomf = (mrb_float)mrb_integer(denomv);
123
278
  }
124
279
  else {
125
- mrb_float denomf = mrb_to_flo(mrb, denomv);
126
-
127
- DROP_PRECISION(denomf, numf, denomf);
128
- denominator = (mrb_int)denomf;
280
+ denomf = mrb_to_flo(mrb, denomv);
129
281
  }
130
-
131
- DROP_PRECISION(numf, numf, denominator);
132
- numerator = (mrb_int)numf;
282
+ return rational_new_f(mrb, numf/denomf);
133
283
  }
134
284
  #endif
135
-
136
285
  return rational_new(mrb, numerator, denominator);
137
286
  }
138
287
 
139
- #ifndef MRB_WITHOUT_FLOAT
288
+ #ifndef MRB_NO_FLOAT
140
289
  static mrb_value
141
290
  rational_to_f(mrb_state *mrb, mrb_value self)
142
291
  {
143
292
  struct mrb_rational *p = rational_ptr(mrb, self);
144
- mrb_float f = (mrb_float)p->numerator / (mrb_float)p->denominator;
293
+ mrb_float f;
294
+
295
+ if (p->denominator == 0.0) {
296
+ f = INFINITY;
297
+ }
298
+ else {
299
+ f = (mrb_float)p->numerator / (mrb_float)p->denominator;
300
+ }
145
301
 
146
302
  return mrb_float_value(mrb, f);
147
303
  }
@@ -152,9 +308,9 @@ rational_to_i(mrb_state *mrb, mrb_value self)
152
308
  {
153
309
  struct mrb_rational *p = rational_ptr(mrb, self);
154
310
  if (p->denominator == 0) {
155
- mrb_raise(mrb, mrb->eStandardError_class, "divided by 0");
311
+ rat_zerodiv(mrb);
156
312
  }
157
- return mrb_fixnum_value(p->numerator / p->denominator);
313
+ return mrb_int_value(mrb, p->numerator / p->denominator);
158
314
  }
159
315
 
160
316
  static mrb_value
@@ -176,14 +332,35 @@ rational_negative_p(mrb_state *mrb, mrb_value self)
176
332
  static mrb_value
177
333
  fix_to_r(mrb_state *mrb, mrb_value self)
178
334
  {
179
- return rational_new(mrb, mrb_fixnum(self), 1);
335
+ return rational_new(mrb, mrb_integer(self), 1);
336
+ }
337
+
338
+ static mrb_value
339
+ rational_m(mrb_state *mrb, mrb_value self)
340
+ {
341
+ #ifdef MRB_NO_FLOAT
342
+ mrb_int n, d = 1;
343
+ mrb_get_args(mrb, "i|i", &n, &d);
344
+ return rational_new_i(mrb, n, d);
345
+ #else
346
+ mrb_value a, b = mrb_fixnum_value(1);
347
+ mrb_get_args(mrb, "o|o", &a, &b);
348
+ if (mrb_integer_p(a) && mrb_integer_p(b)) {
349
+ return rational_new_i(mrb, mrb_integer(a), mrb_integer(b));
350
+ }
351
+ else {
352
+ mrb_float x = mrb_to_flo(mrb, a);
353
+ mrb_float y = mrb_to_flo(mrb, b);
354
+ return rational_new_f(mrb, x/y);
355
+ }
356
+ #endif
180
357
  }
181
358
 
182
359
  void mrb_mruby_rational_gem_init(mrb_state *mrb)
183
360
  {
184
361
  struct RClass *rat;
185
362
 
186
- rat = mrb_define_class(mrb, "Rational", mrb_class_get(mrb, "Numeric"));
363
+ rat = mrb_define_class_id(mrb, MRB_SYM(Rational), mrb_class_get_id(mrb, MRB_SYM(Numeric)));
187
364
  #ifdef RATIONAL_USE_ISTRUCT
188
365
  MRB_SET_INSTANCE_TT(rat, MRB_TT_ISTRUCT);
189
366
  mrb_assert(sizeof(struct mrb_rational) < ISTRUCT_DATA_SIZE);
@@ -194,13 +371,14 @@ void mrb_mruby_rational_gem_init(mrb_state *mrb)
194
371
  mrb_define_class_method(mrb, rat, "_new", rational_s_new, MRB_ARGS_REQ(2));
195
372
  mrb_define_method(mrb, rat, "numerator", rational_numerator, MRB_ARGS_NONE());
196
373
  mrb_define_method(mrb, rat, "denominator", rational_denominator, MRB_ARGS_NONE());
197
- #ifndef MRB_WITHOUT_FLOAT
374
+ #ifndef MRB_NO_FLOAT
198
375
  mrb_define_method(mrb, rat, "to_f", rational_to_f, MRB_ARGS_NONE());
199
376
  #endif
200
377
  mrb_define_method(mrb, rat, "to_i", rational_to_i, MRB_ARGS_NONE());
201
378
  mrb_define_method(mrb, rat, "to_r", rational_to_r, MRB_ARGS_NONE());
202
379
  mrb_define_method(mrb, rat, "negative?", rational_negative_p, MRB_ARGS_NONE());
203
- mrb_define_method(mrb, mrb->fixnum_class, "to_r", fix_to_r, MRB_ARGS_NONE());
380
+ mrb_define_method(mrb, mrb->integer_class, "to_r", fix_to_r, MRB_ARGS_NONE());
381
+ mrb_define_method(mrb, mrb->kernel_module, "Rational", rational_m, MRB_ARGS_ARG(1,1));
204
382
  }
205
383
 
206
384
  void