script_core 0.2.7 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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