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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +2 -2
- data/ext/enterprise_script_service/Rakefile +1 -1
- data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +117 -74
- data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +41 -37
- data/ext/enterprise_script_service/mruby/.github/workflows/lint.yml +23 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/oss-fuzz.yml +27 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/spell-checker.yml +17 -0
- data/ext/enterprise_script_service/mruby/.gitlab-ci.yml +3 -3
- data/ext/enterprise_script_service/mruby/.markdownlint.yml +16 -0
- data/ext/enterprise_script_service/mruby/.travis.yml +2 -2
- data/ext/enterprise_script_service/mruby/.yamllint +8 -0
- data/ext/enterprise_script_service/mruby/AUTHORS +3 -0
- data/ext/enterprise_script_service/mruby/CODEOWNERS +1 -0
- data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +6 -13
- data/ext/enterprise_script_service/mruby/Doxyfile +4 -4
- data/ext/enterprise_script_service/mruby/LICENSE +1 -1
- data/ext/enterprise_script_service/mruby/Makefile +1 -1
- data/ext/enterprise_script_service/mruby/README.md +4 -14
- data/ext/enterprise_script_service/mruby/Rakefile +18 -108
- data/ext/enterprise_script_service/mruby/TODO.md +17 -0
- data/ext/enterprise_script_service/mruby/appveyor.yml +31 -25
- data/ext/enterprise_script_service/mruby/benchmark/bm_ao_render.rb +1 -1
- data/ext/enterprise_script_service/mruby/build_config.rb +9 -152
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_ArduinoDue.rb → build_config/ArduinoDue.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +2 -2
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +1 -18
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +2 -19
- data/ext/enterprise_script_service/mruby/build_config/android_arm64-v8a.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/android_armeabi.rb +11 -0
- 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
- data/ext/enterprise_script_service/mruby/build_config/bench.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/boxing.rb +21 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_chipKITMax32.rb → build_config/chipKITMax32.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{travis_config.rb → build_config/ci/gcc-clang.rb} +10 -10
- data/ext/enterprise_script_service/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/default.rb +80 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_dreamcast_shelf.rb → build_config/dreamcast_shelf.rb} +5 -19
- data/ext/enterprise_script_service/mruby/build_config/gameboyadvance.rb +73 -0
- data/ext/enterprise_script_service/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enterprise_script_service/mruby/build_config/host-debug.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/host-m32.rb +15 -0
- data/ext/enterprise_script_service/mruby/build_config/host-shared.rb +36 -0
- data/ext/enterprise_script_service/mruby/build_config/mrbc.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/no-float.rb +17 -0
- data/ext/enterprise_script_service/mruby/doc/guides/compile.md +138 -49
- data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +5 -4
- data/ext/enterprise_script_service/mruby/doc/guides/gc-arena-howto.md +1 -1
- data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +49 -22
- data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +31 -14
- data/ext/enterprise_script_service/mruby/doc/guides/symbol.md +83 -0
- data/ext/enterprise_script_service/mruby/doc/limitations.md +35 -36
- data/ext/enterprise_script_service/mruby/doc/mruby3.md +163 -0
- data/ext/enterprise_script_service/mruby/doc/opcode.md +93 -107
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/include/mrbconf.h +81 -62
- data/ext/enterprise_script_service/mruby/include/mruby.h +137 -96
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +23 -6
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +73 -48
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +79 -48
- data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +4 -1
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +13 -7
- data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +17 -35
- data/ext/enterprise_script_service/mruby/include/mruby/endian.h +44 -0
- data/ext/enterprise_script_service/mruby/include/mruby/error.h +39 -5
- data/ext/enterprise_script_service/mruby/include/mruby/gc.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/hash.h +33 -13
- data/ext/enterprise_script_service/mruby/include/mruby/irep.h +64 -14
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +6 -14
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +36 -63
- data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +27 -23
- data/ext/enterprise_script_service/mruby/include/mruby/presym.h +40 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/disable.h +70 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/enable.h +37 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/scanning.h +73 -0
- data/ext/enterprise_script_service/mruby/include/mruby/proc.h +80 -13
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +10 -15
- data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +29 -19
- data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +26 -7
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -44
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +55 -37
- data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +12 -10
- data/ext/enterprise_script_service/mruby/lib/{mruby-core-ext.rb → mruby/core_ext.rb} +10 -3
- data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +75 -32
- data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +1 -1
- data/ext/enterprise_script_service/mruby/lib/mruby/presym.rb +132 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +9 -88
- data/ext/enterprise_script_service/mruby/mrbgems/full-core.gembox +1 -4
- data/ext/enterprise_script_service/mruby/mrbgems/math.gembox +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/metaprog.gembox +15 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +28 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mruby-config +18 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +3 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +10 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +14 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +2 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +23 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +11 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +41 -34
- data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb +0 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +3 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +19 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +25 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +22 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrblib/catch.rb +27 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +2 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +430 -399
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +49 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +559 -217
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +4774 -4193
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +18 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +8 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +1 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/mrbgem.rake +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +17 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +18 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +30 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +7 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-inline-struct/test/inline.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +18 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +55 -52
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +99 -87
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +2 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +2 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +7 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +13 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/test/math.rb +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +43 -58
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/README.md +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +77 -74
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +14 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/src/memsize.c +231 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/README.md +15 -18
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +38 -88
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +1 -30
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +62 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +32 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +98 -43
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +39 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +20 -40
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +27 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +11 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +216 -38
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +6 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/README.md +6 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +102 -71
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +23 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +13 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +18 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +6 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/README.md +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +5 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +16 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +27 -27
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-ext.gembox +18 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-io.gembox +12 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib.gembox +54 -0
- data/ext/enterprise_script_service/mruby/mrblib/10error.rb +4 -0
- data/ext/enterprise_script_service/mruby/mrblib/array.rb +17 -9
- data/ext/enterprise_script_service/mruby/mrblib/enum.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrblib/hash.rb +0 -20
- data/ext/enterprise_script_service/mruby/mrblib/init_mrblib.c +0 -11
- data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +36 -11
- data/ext/enterprise_script_service/mruby/mrblib/range.rb +25 -3
- data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +2 -2
- data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +1 -1
- data/ext/enterprise_script_service/mruby/src/array.c +43 -80
- data/ext/enterprise_script_service/mruby/src/backtrace.c +16 -17
- data/ext/enterprise_script_service/mruby/src/class.c +774 -182
- data/ext/enterprise_script_service/mruby/src/codedump.c +223 -198
- data/ext/enterprise_script_service/mruby/src/debug.c +6 -6
- data/ext/enterprise_script_service/mruby/src/dump.c +466 -141
- data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
- data/ext/enterprise_script_service/mruby/src/error.c +36 -13
- data/ext/enterprise_script_service/mruby/src/etc.c +43 -34
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +5 -6
- data/ext/enterprise_script_service/mruby/src/gc.c +73 -71
- data/ext/enterprise_script_service/mruby/src/hash.c +1050 -707
- data/ext/enterprise_script_service/mruby/src/kernel.c +75 -220
- data/ext/enterprise_script_service/mruby/src/load.c +196 -166
- data/ext/enterprise_script_service/mruby/src/numeric.c +352 -314
- data/ext/enterprise_script_service/mruby/src/object.c +97 -90
- data/ext/enterprise_script_service/mruby/src/print.c +4 -3
- data/ext/enterprise_script_service/mruby/src/proc.c +48 -56
- data/ext/enterprise_script_service/mruby/src/range.c +45 -21
- data/ext/enterprise_script_service/mruby/src/state.c +25 -32
- data/ext/enterprise_script_service/mruby/src/string.c +59 -101
- data/ext/enterprise_script_service/mruby/src/symbol.c +121 -56
- data/ext/enterprise_script_service/mruby/src/value_array.h +1 -0
- data/ext/enterprise_script_service/mruby/src/variable.c +158 -158
- data/ext/enterprise_script_service/mruby/src/vm.c +617 -602
- data/ext/enterprise_script_service/mruby/tasks/benchmark.rake +6 -6
- data/ext/enterprise_script_service/mruby/tasks/bin.rake +23 -0
- data/ext/enterprise_script_service/mruby/tasks/core.rake +12 -0
- data/ext/enterprise_script_service/mruby/tasks/doc.rake +50 -38
- data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +83 -77
- data/ext/enterprise_script_service/mruby/tasks/libmruby.rake +10 -1
- data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +13 -1
- data/ext/enterprise_script_service/mruby/tasks/mrblib.rake +40 -0
- data/ext/enterprise_script_service/mruby/tasks/presym.rake +44 -0
- data/ext/enterprise_script_service/mruby/tasks/test.rake +68 -0
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +6 -5
- data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +10 -14
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +17 -21
- data/ext/enterprise_script_service/mruby/test/bintest.rb +5 -5
- data/ext/enterprise_script_service/mruby/test/t/argumenterror.rb +16 -0
- data/ext/enterprise_script_service/mruby/test/t/array.rb +7 -3
- data/ext/enterprise_script_service/mruby/test/t/bs_literal.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/float.rb +18 -8
- data/ext/enterprise_script_service/mruby/test/t/hash.rb +903 -281
- data/ext/enterprise_script_service/mruby/test/t/integer.rb +10 -38
- data/ext/enterprise_script_service/mruby/test/t/kernel.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/literals.rb +50 -0
- data/ext/enterprise_script_service/mruby/test/t/module.rb +2 -2
- data/ext/enterprise_script_service/mruby/test/t/numeric.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/range.rb +83 -1
- data/ext/enterprise_script_service/mruby/test/t/string.rb +4 -0
- data/ext/enterprise_script_service/mruby/test/t/superclass.rb +10 -10
- data/ext/enterprise_script_service/mruby/test/t/syntax.rb +24 -0
- data/ext/enterprise_script_service/mruby/test/t/vformat.rb +3 -3
- data/ext/enterprise_script_service/mruby_config.rb +2 -5
- data/ext/enterprise_script_service/mruby_engine.cpp +1 -1
- data/lib/script_core/version.rb +1 -1
- data/spec/script_core_spec.rb +13 -0
- metadata +61 -23
- data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +0 -24
- data/ext/enterprise_script_service/mruby/TODO +0 -8
- data/ext/enterprise_script_service/mruby/appveyor_config.rb +0 -46
- data/ext/enterprise_script_service/mruby/benchmark/build_config_boxing.rb +0 -28
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_arm64-v8a.rb +0 -26
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_armeabi.rb +0 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +0 -30
- data/ext/enterprise_script_service/mruby/mrblib/mrblib.rake +0 -18
- data/ext/enterprise_script_service/mruby/src/crc.c +0 -39
- data/ext/enterprise_script_service/mruby/src/mruby_core.rake +0 -19
@@ -1,10 +1,10 @@
|
|
1
1
|
/*
|
2
|
-
** numeric.c - Numeric, Integer, Float
|
2
|
+
** numeric.c - Numeric, Integer, Float class
|
3
3
|
**
|
4
4
|
** See Copyright Notice in mruby.h
|
5
5
|
*/
|
6
6
|
|
7
|
-
#ifndef
|
7
|
+
#ifndef MRB_NO_FLOAT
|
8
8
|
#include <float.h>
|
9
9
|
#include <math.h>
|
10
10
|
#endif
|
@@ -17,9 +17,10 @@
|
|
17
17
|
#include <mruby/numeric.h>
|
18
18
|
#include <mruby/string.h>
|
19
19
|
#include <mruby/class.h>
|
20
|
+
#include <mruby/presym.h>
|
20
21
|
|
21
|
-
#ifndef
|
22
|
-
#ifdef
|
22
|
+
#ifndef MRB_NO_FLOAT
|
23
|
+
#ifdef MRB_USE_FLOAT32
|
23
24
|
#define trunc(f) truncf(f)
|
24
25
|
#define floor(f) floorf(f)
|
25
26
|
#define ceil(f) ceilf(f)
|
@@ -30,30 +31,38 @@
|
|
30
31
|
#endif
|
31
32
|
#endif
|
32
33
|
|
33
|
-
#ifndef
|
34
|
+
#ifndef MRB_NO_FLOAT
|
34
35
|
MRB_API mrb_float
|
35
36
|
mrb_to_flo(mrb_state *mrb, mrb_value val)
|
36
37
|
{
|
37
38
|
switch (mrb_type(val)) {
|
38
|
-
case
|
39
|
-
return (mrb_float)
|
39
|
+
case MRB_TT_INTEGER:
|
40
|
+
return (mrb_float)mrb_integer(val);
|
40
41
|
case MRB_TT_FLOAT:
|
41
42
|
break;
|
42
|
-
|
43
|
+
case MRB_TT_STRING:
|
44
|
+
case MRB_TT_FALSE:
|
45
|
+
case MRB_TT_TRUE:
|
43
46
|
mrb_raise(mrb, E_TYPE_ERROR, "non float value");
|
47
|
+
default:
|
48
|
+
val = mrb_type_convert(mrb, val, MRB_TT_FLOAT, MRB_SYM(to_f));
|
49
|
+
break;
|
44
50
|
}
|
45
51
|
return mrb_float(val);
|
46
52
|
}
|
53
|
+
#endif
|
47
54
|
|
48
|
-
|
49
|
-
|
55
|
+
static void
|
56
|
+
int_overflow(mrb_state *mrb, const char *reason)
|
50
57
|
{
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
58
|
+
mrb_raisef(mrb, E_RANGE_ERROR, "integer overflow in %s", reason);
|
59
|
+
}
|
60
|
+
|
61
|
+
static void
|
62
|
+
int_zerodiv(mrb_state *mrb)
|
63
|
+
{
|
64
|
+
mrb_raise(mrb, E_ZERODIV_ERROR, "divided by 0");
|
55
65
|
}
|
56
|
-
#endif
|
57
66
|
|
58
67
|
/*
|
59
68
|
* call-seq:
|
@@ -65,80 +74,91 @@ mrb_int_value(mrb_state *mrb, mrb_float f)
|
|
65
74
|
* 2.0**3 #=> 8.0
|
66
75
|
*/
|
67
76
|
static mrb_value
|
68
|
-
|
77
|
+
int_pow(mrb_state *mrb, mrb_value x)
|
69
78
|
{
|
79
|
+
mrb_int base = mrb_int(mrb, x);
|
80
|
+
mrb_int exp;
|
81
|
+
#ifndef MRB_NO_FLOAT
|
70
82
|
mrb_value y = mrb_get_arg1(mrb);
|
71
|
-
|
72
|
-
mrb_float d;
|
73
|
-
#endif
|
83
|
+
mrb_float z;
|
74
84
|
|
75
|
-
if (
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
85
|
+
if (!mrb_integer_p(y)) {
|
86
|
+
mrb_get_args(mrb, "f", &z);
|
87
|
+
z = pow((mrb_float)base, z);
|
88
|
+
return mrb_float_value(mrb, z);
|
89
|
+
}
|
90
|
+
else {
|
91
|
+
mrb_get_args(mrb, "i", &exp);
|
92
|
+
z = pow((double)base, (double)exp);
|
93
|
+
if (exp < 0 || z < (mrb_float)MRB_INT_MIN || (mrb_float)MRB_INT_MAX < z) {
|
94
|
+
return mrb_float_value(mrb, z);
|
95
|
+
}
|
96
|
+
}
|
97
|
+
return mrb_int_value(mrb, (mrb_int)z);
|
84
98
|
#else
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
exp >>= 1;
|
96
|
-
if (exp == 0) break;
|
97
|
-
if (mrb_int_mul_overflow(base, base, &base)) {
|
98
|
-
#ifndef MRB_WITHOUT_FLOAT
|
99
|
-
goto float_pow;
|
100
|
-
#endif
|
99
|
+
mrb_int result = 1;
|
100
|
+
|
101
|
+
mrb_get_args(mrb, "i", &exp);
|
102
|
+
if (exp < 0) {
|
103
|
+
return mrb_fixnum_value(0);
|
104
|
+
}
|
105
|
+
for (;;) {
|
106
|
+
if (exp & 1) {
|
107
|
+
if (mrb_int_mul_overflow(result, base, &result)) {
|
108
|
+
int_overflow(mrb, "multiplication");
|
101
109
|
}
|
102
110
|
}
|
103
|
-
|
111
|
+
exp >>= 1;
|
112
|
+
if (exp == 0) break;
|
113
|
+
if (mrb_int_mul_overflow(base, base, &base)) {
|
114
|
+
int_overflow(mrb, "multiplication");
|
115
|
+
}
|
104
116
|
}
|
105
|
-
|
106
|
-
mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
|
107
|
-
#else
|
108
|
-
float_pow:
|
109
|
-
d = pow(mrb_to_flo(mrb, x), mrb_to_flo(mrb, y));
|
110
|
-
return mrb_float_value(mrb, d);
|
117
|
+
return mrb_int_value(mrb, result);
|
111
118
|
#endif
|
112
119
|
}
|
113
120
|
|
114
|
-
static mrb_value
|
115
|
-
integral_idiv(mrb_state *mrb, mrb_value x)
|
116
|
-
{
|
117
|
-
#ifdef MRB_WITHOUT_FLOAT
|
118
|
-
mrb_value y = mrb_get_arg1(mrb);
|
119
121
|
|
120
|
-
|
121
|
-
|
122
|
+
mrb_int
|
123
|
+
mrb_num_div_int(mrb_state *mrb, mrb_int x, mrb_int y)
|
124
|
+
{
|
125
|
+
if (y == 0) {
|
126
|
+
int_zerodiv(mrb);
|
122
127
|
}
|
123
|
-
|
124
|
-
|
125
|
-
|
128
|
+
else if(x == MRB_INT_MIN && y == -1) {
|
129
|
+
int_overflow(mrb, "division");
|
130
|
+
}
|
131
|
+
else {
|
132
|
+
mrb_int div = x / y;
|
126
133
|
|
127
|
-
|
128
|
-
|
129
|
-
|
134
|
+
if ((x ^ y) < 0 && x != div * y) {
|
135
|
+
div -= 1;
|
136
|
+
}
|
137
|
+
return div;
|
138
|
+
}
|
139
|
+
/* not reached */
|
140
|
+
return 0;
|
130
141
|
}
|
131
142
|
|
132
143
|
/* 15.2.8.3.4 */
|
133
144
|
/* 15.2.9.3.4 */
|
134
145
|
/*
|
135
146
|
* call-seq:
|
136
|
-
*
|
147
|
+
* int / other -> int
|
137
148
|
*
|
138
149
|
* Performs division: the class of the resulting object depends on
|
139
150
|
* the class of <code>num</code> and on the magnitude of the
|
140
151
|
* result.
|
141
152
|
*/
|
153
|
+
static mrb_value
|
154
|
+
int_div(mrb_state *mrb, mrb_value xv)
|
155
|
+
{
|
156
|
+
mrb_int y, div;
|
157
|
+
|
158
|
+
mrb_get_args(mrb, "i", &y);
|
159
|
+
div = mrb_num_div_int(mrb, mrb_integer(xv), y);
|
160
|
+
return mrb_int_value(mrb, div);
|
161
|
+
}
|
142
162
|
|
143
163
|
/* 15.2.9.3.19(x) */
|
144
164
|
/*
|
@@ -149,31 +169,35 @@ integral_idiv(mrb_state *mrb, mrb_value x)
|
|
149
169
|
*/
|
150
170
|
|
151
171
|
static mrb_value
|
152
|
-
|
172
|
+
int_quo(mrb_state *mrb, mrb_value xv)
|
153
173
|
{
|
154
|
-
#ifdef
|
155
|
-
|
174
|
+
#ifdef MRB_NO_FLOAT
|
175
|
+
mrb_int y;
|
156
176
|
|
157
|
-
|
158
|
-
|
177
|
+
mrb_get_args(mrb, "i", &y);
|
178
|
+
if (y == 0) {
|
179
|
+
int_zerodiv(mrb);
|
159
180
|
}
|
160
|
-
return mrb_fixnum_value(
|
181
|
+
return mrb_fixnum_value(mrb_integer(xv) / y);
|
161
182
|
#else
|
162
183
|
mrb_float y;
|
163
184
|
|
164
185
|
mrb_get_args(mrb, "f", &y);
|
165
|
-
|
186
|
+
if (y == 0) {
|
187
|
+
int_zerodiv(mrb);
|
188
|
+
}
|
189
|
+
return mrb_float_value(mrb, mrb_integer(xv) / y);
|
166
190
|
#endif
|
167
191
|
}
|
168
192
|
|
169
193
|
static mrb_value
|
170
|
-
|
194
|
+
coerce_step_counter(mrb_state *mrb, mrb_value self)
|
171
195
|
{
|
172
196
|
mrb_value num, step;
|
173
197
|
|
174
198
|
mrb_get_args(mrb, "oo", &num, &step);
|
175
199
|
|
176
|
-
#ifndef
|
200
|
+
#ifndef MRB_NO_FLOAT
|
177
201
|
if (mrb_float_p(self) || mrb_float_p(num) || mrb_float_p(step)) {
|
178
202
|
return mrb_Float(mrb, self);
|
179
203
|
}
|
@@ -182,7 +206,7 @@ integral_coerce_step_counter(mrb_state *mrb, mrb_value self)
|
|
182
206
|
return self;
|
183
207
|
}
|
184
208
|
|
185
|
-
#ifndef
|
209
|
+
#ifndef MRB_NO_FLOAT
|
186
210
|
/********************************************************************
|
187
211
|
*
|
188
212
|
* Document-class: Float
|
@@ -192,15 +216,64 @@ integral_coerce_step_counter(mrb_state *mrb, mrb_value self)
|
|
192
216
|
* representation.
|
193
217
|
*/
|
194
218
|
|
219
|
+
static mrb_value
|
220
|
+
flo_pow(mrb_state *mrb, mrb_value x)
|
221
|
+
{
|
222
|
+
mrb_value y = mrb_get_arg1(mrb);
|
223
|
+
mrb_float d = pow(mrb_to_flo(mrb, x), mrb_to_flo(mrb, y));
|
224
|
+
return mrb_float_value(mrb, d);
|
225
|
+
}
|
226
|
+
|
227
|
+
static mrb_value
|
228
|
+
flo_idiv(mrb_state *mrb, mrb_value xv)
|
229
|
+
{
|
230
|
+
mrb_int y, div;
|
231
|
+
|
232
|
+
mrb_get_args(mrb, "i", &y);
|
233
|
+
div = mrb_num_div_int(mrb, (mrb_int)mrb_float(xv), y);
|
234
|
+
return mrb_int_value(mrb, (mrb_int)div);
|
235
|
+
}
|
236
|
+
|
237
|
+
mrb_float
|
238
|
+
mrb_num_div_flo(mrb_state *mrb, mrb_float x, mrb_float y)
|
239
|
+
{
|
240
|
+
mrb_float f;
|
241
|
+
|
242
|
+
if (y == 0) {
|
243
|
+
if (x > 0) f = INFINITY;
|
244
|
+
else if (x < 0) f = -INFINITY;
|
245
|
+
else /* if (x == 0) */ f = NAN;
|
246
|
+
}
|
247
|
+
else {
|
248
|
+
f = x / y;
|
249
|
+
}
|
250
|
+
return f;
|
251
|
+
}
|
252
|
+
|
253
|
+
static mrb_value
|
254
|
+
flo_div(mrb_state *mrb, mrb_value xv)
|
255
|
+
{
|
256
|
+
mrb_float x, y;
|
257
|
+
|
258
|
+
x = mrb_float(xv);
|
259
|
+
mrb_get_args(mrb, "f", &y);
|
260
|
+
x = mrb_num_div_flo(mrb, x, y);
|
261
|
+
return mrb_float_value(mrb, x);
|
262
|
+
}
|
263
|
+
|
195
264
|
/* 15.2.9.3.16(x) */
|
196
265
|
/*
|
197
266
|
* call-seq:
|
198
267
|
* flt.to_s -> string
|
268
|
+
* flt.inspect -> string
|
199
269
|
*
|
200
270
|
* Returns a string containing a representation of self. As well as a
|
201
271
|
* fixed or exponential form of the number, the call may return
|
202
272
|
* "<code>NaN</code>", "<code>Infinity</code>", and
|
203
273
|
* "<code>-Infinity</code>".
|
274
|
+
*
|
275
|
+
* 3.0.to_s #=> 3.0
|
276
|
+
* 3.25.to_s #=> 3.25
|
204
277
|
*/
|
205
278
|
|
206
279
|
static mrb_value
|
@@ -247,6 +320,9 @@ flo_to_s(mrb_state *mrb, mrb_value flt)
|
|
247
320
|
str = mrb_float_to_str(mrb, flt, fmt);
|
248
321
|
goto insert_dot_zero;
|
249
322
|
}
|
323
|
+
else {
|
324
|
+
mrb_str_cat(mrb, str, ".0", 2);
|
325
|
+
}
|
250
326
|
|
251
327
|
goto exit;
|
252
328
|
}
|
@@ -367,15 +443,15 @@ flo_mod(mrb_state *mrb, mrb_value x)
|
|
367
443
|
* (1.0).eql?(1.0) #=> true
|
368
444
|
*/
|
369
445
|
static mrb_value
|
370
|
-
|
446
|
+
int_eql(mrb_state *mrb, mrb_value x)
|
371
447
|
{
|
372
448
|
mrb_value y = mrb_get_arg1(mrb);
|
373
449
|
|
374
|
-
if (!
|
375
|
-
return mrb_bool_value(
|
450
|
+
if (!mrb_integer_p(y)) return mrb_false_value();
|
451
|
+
return mrb_bool_value(mrb_integer(x) == mrb_integer(y));
|
376
452
|
}
|
377
453
|
|
378
|
-
#ifndef
|
454
|
+
#ifndef MRB_NO_FLOAT
|
379
455
|
static mrb_value
|
380
456
|
flo_eql(mrb_state *mrb, mrb_value x)
|
381
457
|
{
|
@@ -404,8 +480,8 @@ flo_eq(mrb_state *mrb, mrb_value x)
|
|
404
480
|
mrb_value y = mrb_get_arg1(mrb);
|
405
481
|
|
406
482
|
switch (mrb_type(y)) {
|
407
|
-
case
|
408
|
-
return mrb_bool_value(mrb_float(x) == (mrb_float)
|
483
|
+
case MRB_TT_INTEGER:
|
484
|
+
return mrb_bool_value(mrb_float(x) == (mrb_float)mrb_integer(y));
|
409
485
|
case MRB_TT_FLOAT:
|
410
486
|
return mrb_bool_value(mrb_float(x) == mrb_float(y));
|
411
487
|
default:
|
@@ -417,10 +493,15 @@ static int64_t
|
|
417
493
|
value_int64(mrb_state *mrb, mrb_value x)
|
418
494
|
{
|
419
495
|
switch (mrb_type(x)) {
|
420
|
-
case
|
421
|
-
return (int64_t)
|
496
|
+
case MRB_TT_INTEGER:
|
497
|
+
return (int64_t)mrb_integer(x);
|
422
498
|
case MRB_TT_FLOAT:
|
423
|
-
|
499
|
+
{
|
500
|
+
double f = mrb_float(x);
|
501
|
+
|
502
|
+
if ((mrb_float)INT64_MAX >= f && f >= (mrb_float)INT64_MIN)
|
503
|
+
return (int64_t)f;
|
504
|
+
}
|
424
505
|
default:
|
425
506
|
mrb_raise(mrb, E_TYPE_ERROR, "cannot convert to Integer");
|
426
507
|
break;
|
@@ -432,17 +513,16 @@ value_int64(mrb_state *mrb, mrb_value x)
|
|
432
513
|
static mrb_value
|
433
514
|
int64_value(mrb_state *mrb, int64_t v)
|
434
515
|
{
|
435
|
-
if (TYPED_FIXABLE(v,int64_t)) {
|
436
|
-
|
516
|
+
if (!TYPED_FIXABLE(v,int64_t)) {
|
517
|
+
int_overflow(mrb, "bit operation");
|
437
518
|
}
|
438
|
-
return
|
519
|
+
return mrb_fixnum_value((mrb_int)v);
|
439
520
|
}
|
440
521
|
|
441
522
|
static mrb_value
|
442
523
|
flo_rev(mrb_state *mrb, mrb_value x)
|
443
524
|
{
|
444
|
-
int64_t v1;
|
445
|
-
v1 = (int64_t)mrb_float(x);
|
525
|
+
int64_t v1 = value_int64(mrb, x);
|
446
526
|
return int64_value(mrb, ~v1);
|
447
527
|
}
|
448
528
|
|
@@ -452,7 +532,7 @@ flo_and(mrb_state *mrb, mrb_value x)
|
|
452
532
|
mrb_value y = mrb_get_arg1(mrb);
|
453
533
|
int64_t v1, v2;
|
454
534
|
|
455
|
-
v1 = (
|
535
|
+
v1 = value_int64(mrb, x);
|
456
536
|
v2 = value_int64(mrb, y);
|
457
537
|
return int64_value(mrb, v1 & v2);
|
458
538
|
}
|
@@ -463,7 +543,7 @@ flo_or(mrb_state *mrb, mrb_value x)
|
|
463
543
|
mrb_value y = mrb_get_arg1(mrb);
|
464
544
|
int64_t v1, v2;
|
465
545
|
|
466
|
-
v1 = (
|
546
|
+
v1 = value_int64(mrb, x);
|
467
547
|
v2 = value_int64(mrb, y);
|
468
548
|
return int64_value(mrb, v1 | v2);
|
469
549
|
}
|
@@ -474,7 +554,7 @@ flo_xor(mrb_state *mrb, mrb_value x)
|
|
474
554
|
mrb_value y = mrb_get_arg1(mrb);
|
475
555
|
int64_t v1, v2;
|
476
556
|
|
477
|
-
v1 = (
|
557
|
+
v1 = value_int64(mrb, x);
|
478
558
|
v2 = value_int64(mrb, y);
|
479
559
|
return int64_value(mrb, v1 ^ v2);
|
480
560
|
}
|
@@ -488,6 +568,10 @@ flo_shift(mrb_state *mrb, mrb_value x, mrb_int width)
|
|
488
568
|
return x;
|
489
569
|
}
|
490
570
|
val = mrb_float(x);
|
571
|
+
if (width < -MRB_INT_BIT/2) {
|
572
|
+
if (val < 0) return mrb_fixnum_value(-1);
|
573
|
+
return mrb_fixnum_value(0);
|
574
|
+
}
|
491
575
|
if (width < 0) {
|
492
576
|
while (width++) {
|
493
577
|
val /= 2;
|
@@ -514,7 +598,9 @@ flo_shift(mrb_state *mrb, mrb_value x, mrb_int width)
|
|
514
598
|
val *= 2;
|
515
599
|
}
|
516
600
|
}
|
517
|
-
|
601
|
+
if (FIXABLE_FLOAT(val))
|
602
|
+
return mrb_int_value(mrb, (mrb_int)val);
|
603
|
+
return mrb_float_value(mrb, val);
|
518
604
|
}
|
519
605
|
|
520
606
|
static mrb_value
|
@@ -523,6 +609,7 @@ flo_rshift(mrb_state *mrb, mrb_value x)
|
|
523
609
|
mrb_int width;
|
524
610
|
|
525
611
|
mrb_get_args(mrb, "i", &width);
|
612
|
+
if (width == MRB_INT_MIN) return flo_shift(mrb, x, -MRB_INT_BIT);
|
526
613
|
return flo_shift(mrb, x, -width);
|
527
614
|
}
|
528
615
|
|
@@ -620,7 +707,7 @@ flo_floor(mrb_state *mrb, mrb_value num)
|
|
620
707
|
mrb_float f = floor(mrb_float(num));
|
621
708
|
|
622
709
|
mrb_check_num_exact(mrb, f);
|
623
|
-
return mrb_int_value(mrb, f);
|
710
|
+
return mrb_int_value(mrb, (mrb_int)f);
|
624
711
|
}
|
625
712
|
|
626
713
|
/* 15.2.9.3.8 */
|
@@ -643,7 +730,7 @@ flo_ceil(mrb_state *mrb, mrb_value num)
|
|
643
730
|
mrb_float f = ceil(mrb_float(num));
|
644
731
|
|
645
732
|
mrb_check_num_exact(mrb, f);
|
646
|
-
return mrb_int_value(mrb, f);
|
733
|
+
return mrb_int_value(mrb, (mrb_int)f);
|
647
734
|
}
|
648
735
|
|
649
736
|
/* 15.2.9.3.12 */
|
@@ -725,7 +812,9 @@ flo_round(mrb_state *mrb, mrb_value num)
|
|
725
812
|
if (!isfinite(number)) return num;
|
726
813
|
return mrb_float_value(mrb, number);
|
727
814
|
}
|
728
|
-
|
815
|
+
if (!FIXABLE_FLOAT(number))
|
816
|
+
return mrb_float_value(mrb, number);
|
817
|
+
return mrb_int_value(mrb, (mrb_int)number);
|
729
818
|
}
|
730
819
|
|
731
820
|
/* 15.2.9.3.14 */
|
@@ -747,7 +836,7 @@ flo_truncate(mrb_state *mrb, mrb_value num)
|
|
747
836
|
if (f < 0.0) f = ceil(f);
|
748
837
|
|
749
838
|
mrb_check_num_exact(mrb, f);
|
750
|
-
return mrb_int_value(mrb, f);
|
839
|
+
return mrb_int_value(mrb, (mrb_int)f);
|
751
840
|
}
|
752
841
|
|
753
842
|
static mrb_value
|
@@ -760,8 +849,7 @@ flo_nan_p(mrb_state *mrb, mrb_value num)
|
|
760
849
|
/*
|
761
850
|
* Document-class: Integer
|
762
851
|
*
|
763
|
-
* <code>Integer</code> is
|
764
|
-
* hold whole numbers, <code>Bignum</code> and <code>Fixnum</code>.
|
852
|
+
* <code>Integer</code> is hold whole numbers.
|
765
853
|
*
|
766
854
|
*/
|
767
855
|
|
@@ -785,20 +873,18 @@ fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
785
873
|
{
|
786
874
|
mrb_int a;
|
787
875
|
|
788
|
-
a =
|
789
|
-
if (
|
876
|
+
a = mrb_integer(x);
|
877
|
+
if (mrb_integer_p(y)) {
|
790
878
|
mrb_int b, c;
|
791
879
|
|
792
880
|
if (a == 0) return x;
|
793
|
-
b =
|
881
|
+
b = mrb_integer(y);
|
794
882
|
if (mrb_int_mul_overflow(a, b, &c)) {
|
795
|
-
|
796
|
-
return mrb_float_value(mrb, (mrb_float)a * (mrb_float)b);
|
797
|
-
#endif
|
883
|
+
int_overflow(mrb, "multiplication");
|
798
884
|
}
|
799
885
|
return mrb_fixnum_value(c);
|
800
886
|
}
|
801
|
-
#ifdef
|
887
|
+
#ifdef MRB_NO_FLOAT
|
802
888
|
mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
|
803
889
|
#else
|
804
890
|
return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y));
|
@@ -808,10 +894,10 @@ fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
808
894
|
MRB_API mrb_value
|
809
895
|
mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y)
|
810
896
|
{
|
811
|
-
if (
|
897
|
+
if (mrb_integer_p(x)) {
|
812
898
|
return fixnum_mul(mrb, x, y);
|
813
899
|
}
|
814
|
-
#ifndef
|
900
|
+
#ifndef MRB_NO_FLOAT
|
815
901
|
if (mrb_float_p(x)) {
|
816
902
|
return mrb_float_value(mrb, mrb_float(x) * mrb_to_flo(mrb, y));
|
817
903
|
}
|
@@ -831,7 +917,7 @@ mrb_num_mul(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
831
917
|
*/
|
832
918
|
|
833
919
|
static mrb_value
|
834
|
-
|
920
|
+
int_mul(mrb_state *mrb, mrb_value x)
|
835
921
|
{
|
836
922
|
mrb_value y = mrb_get_arg1(mrb);
|
837
923
|
|
@@ -841,29 +927,23 @@ fix_mul(mrb_state *mrb, mrb_value x)
|
|
841
927
|
static void
|
842
928
|
fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
|
843
929
|
{
|
844
|
-
|
845
|
-
|
846
|
-
/* TODO: add mrb_assert(y != 0) to make sure */
|
847
|
-
|
848
|
-
if (y < 0) {
|
849
|
-
if (x < 0)
|
850
|
-
div = -x / -y;
|
851
|
-
else
|
852
|
-
div = - (x / -y);
|
930
|
+
if (y == 0) {
|
931
|
+
int_zerodiv(mrb);
|
853
932
|
}
|
854
|
-
else {
|
855
|
-
|
856
|
-
div = - (-x / y);
|
857
|
-
else
|
858
|
-
div = x / y;
|
933
|
+
else if(x == MRB_INT_MIN && y == -1) {
|
934
|
+
int_overflow(mrb, "division");
|
859
935
|
}
|
860
|
-
|
861
|
-
|
862
|
-
mod
|
863
|
-
|
936
|
+
else {
|
937
|
+
mrb_int div = x / y;
|
938
|
+
mrb_int mod = x - div * y;
|
939
|
+
|
940
|
+
if ((x ^ y) < 0 && x != div * y) {
|
941
|
+
mod += y;
|
942
|
+
div -= 1;
|
943
|
+
}
|
944
|
+
if (divp) *divp = div;
|
945
|
+
if (modp) *modp = mod;
|
864
946
|
}
|
865
|
-
if (divp) *divp = div;
|
866
|
-
if (modp) *modp = mod;
|
867
947
|
}
|
868
948
|
|
869
949
|
/* 15.2.8.3.5 */
|
@@ -877,29 +957,19 @@ fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
|
|
877
957
|
*/
|
878
958
|
|
879
959
|
static mrb_value
|
880
|
-
|
960
|
+
int_mod(mrb_state *mrb, mrb_value x)
|
881
961
|
{
|
882
962
|
mrb_value y = mrb_get_arg1(mrb);
|
883
963
|
mrb_int a, b;
|
884
964
|
|
885
|
-
a =
|
886
|
-
|
965
|
+
a = mrb_integer(x);
|
966
|
+
if (mrb_integer_p(y) && a != MRB_INT_MIN && (b=mrb_integer(y)) != MRB_INT_MIN) {
|
887
967
|
mrb_int mod;
|
888
968
|
|
889
|
-
if (b == 0) {
|
890
|
-
#ifdef MRB_WITHOUT_FLOAT
|
891
|
-
/* ZeroDivisionError */
|
892
|
-
return mrb_fixnum_value(0);
|
893
|
-
#else
|
894
|
-
if (a > 0) return mrb_float_value(mrb, INFINITY);
|
895
|
-
if (a < 0) return mrb_float_value(mrb, INFINITY);
|
896
|
-
return mrb_float_value(mrb, NAN);
|
897
|
-
#endif
|
898
|
-
}
|
899
969
|
fixdivmod(mrb, a, b, NULL, &mod);
|
900
970
|
return mrb_fixnum_value(mod);
|
901
971
|
}
|
902
|
-
#ifdef
|
972
|
+
#ifdef MRB_NO_FLOAT
|
903
973
|
mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
|
904
974
|
#else
|
905
975
|
else {
|
@@ -918,42 +988,32 @@ fix_mod(mrb_state *mrb, mrb_value x)
|
|
918
988
|
* See <code>Numeric#divmod</code>.
|
919
989
|
*/
|
920
990
|
static mrb_value
|
921
|
-
|
991
|
+
int_divmod(mrb_state *mrb, mrb_value x)
|
922
992
|
{
|
923
993
|
mrb_value y = mrb_get_arg1(mrb);
|
924
994
|
|
925
|
-
if (
|
995
|
+
if (mrb_integer_p(y)) {
|
926
996
|
mrb_int div, mod;
|
927
997
|
|
928
|
-
|
929
|
-
|
930
|
-
return mrb_assoc_new(mrb, mrb_fixnum_value(0), mrb_fixnum_value(0));
|
931
|
-
#else
|
932
|
-
return mrb_assoc_new(mrb, ((mrb_fixnum(x) == 0) ?
|
933
|
-
mrb_float_value(mrb, NAN):
|
934
|
-
mrb_float_value(mrb, INFINITY)),
|
935
|
-
mrb_float_value(mrb, NAN));
|
936
|
-
#endif
|
937
|
-
}
|
938
|
-
fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod);
|
939
|
-
return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod));
|
998
|
+
fixdivmod(mrb, mrb_integer(x), mrb_integer(y), &div, &mod);
|
999
|
+
return mrb_assoc_new(mrb, mrb_int_value(mrb, div), mrb_int_value(mrb, mod));
|
940
1000
|
}
|
941
|
-
#ifdef
|
1001
|
+
#ifdef MRB_NO_FLOAT
|
942
1002
|
mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
|
943
1003
|
#else
|
944
1004
|
else {
|
945
1005
|
mrb_float div, mod;
|
946
1006
|
mrb_value a, b;
|
947
1007
|
|
948
|
-
flodivmod(mrb, (mrb_float)
|
949
|
-
a = mrb_int_value(mrb, div);
|
1008
|
+
flodivmod(mrb, (mrb_float)mrb_integer(x), mrb_to_flo(mrb, y), &div, &mod);
|
1009
|
+
a = mrb_int_value(mrb, (mrb_int)div);
|
950
1010
|
b = mrb_float_value(mrb, mod);
|
951
1011
|
return mrb_assoc_new(mrb, a, b);
|
952
1012
|
}
|
953
1013
|
#endif
|
954
1014
|
}
|
955
1015
|
|
956
|
-
#ifndef
|
1016
|
+
#ifndef MRB_NO_FLOAT
|
957
1017
|
static mrb_value
|
958
1018
|
flo_divmod(mrb_state *mrb, mrb_value x)
|
959
1019
|
{
|
@@ -962,7 +1022,7 @@ flo_divmod(mrb_state *mrb, mrb_value x)
|
|
962
1022
|
mrb_value a, b;
|
963
1023
|
|
964
1024
|
flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod);
|
965
|
-
a = mrb_int_value(mrb, div);
|
1025
|
+
a = mrb_int_value(mrb, (mrb_int)div);
|
966
1026
|
b = mrb_float_value(mrb, mod);
|
967
1027
|
return mrb_assoc_new(mrb, a, b);
|
968
1028
|
}
|
@@ -981,16 +1041,16 @@ flo_divmod(mrb_state *mrb, mrb_value x)
|
|
981
1041
|
*/
|
982
1042
|
|
983
1043
|
static mrb_value
|
984
|
-
|
1044
|
+
int_equal(mrb_state *mrb, mrb_value x)
|
985
1045
|
{
|
986
1046
|
mrb_value y = mrb_get_arg1(mrb);
|
987
1047
|
|
988
1048
|
switch (mrb_type(y)) {
|
989
|
-
case
|
990
|
-
return mrb_bool_value(
|
991
|
-
#ifndef
|
1049
|
+
case MRB_TT_INTEGER:
|
1050
|
+
return mrb_bool_value(mrb_integer(x) == mrb_integer(y));
|
1051
|
+
#ifndef MRB_NO_FLOAT
|
992
1052
|
case MRB_TT_FLOAT:
|
993
|
-
return mrb_bool_value((mrb_float)
|
1053
|
+
return mrb_bool_value((mrb_float)mrb_integer(x) == mrb_float(y));
|
994
1054
|
#endif
|
995
1055
|
default:
|
996
1056
|
return mrb_false_value();
|
@@ -1009,24 +1069,24 @@ fix_equal(mrb_state *mrb, mrb_value x)
|
|
1009
1069
|
*/
|
1010
1070
|
|
1011
1071
|
static mrb_value
|
1012
|
-
|
1072
|
+
int_rev(mrb_state *mrb, mrb_value num)
|
1013
1073
|
{
|
1014
|
-
mrb_int val =
|
1074
|
+
mrb_int val = mrb_integer(num);
|
1015
1075
|
|
1016
|
-
return
|
1076
|
+
return mrb_int_value(mrb, ~val);
|
1017
1077
|
}
|
1018
1078
|
|
1019
|
-
#ifdef
|
1079
|
+
#ifdef MRB_NO_FLOAT
|
1020
1080
|
#define bit_op(x,y,op1,op2) do {\
|
1021
|
-
return
|
1081
|
+
return mrb_int_value(mrb, (mrb_integer(x) op2 mrb_integer(y)));\
|
1022
1082
|
} while(0)
|
1023
1083
|
#else
|
1024
1084
|
static mrb_value flo_and(mrb_state *mrb, mrb_value x);
|
1025
1085
|
static mrb_value flo_or(mrb_state *mrb, mrb_value x);
|
1026
1086
|
static mrb_value flo_xor(mrb_state *mrb, mrb_value x);
|
1027
1087
|
#define bit_op(x,y,op1,op2) do {\
|
1028
|
-
if (
|
1029
|
-
return flo_ ## op1(mrb, mrb_float_value(mrb, (mrb_float)
|
1088
|
+
if (mrb_integer_p(y)) return mrb_int_value(mrb, (mrb_integer(x) op2 mrb_integer(y))); \
|
1089
|
+
return flo_ ## op1(mrb, mrb_float_value(mrb, (mrb_float)mrb_integer(x)));\
|
1030
1090
|
} while(0)
|
1031
1091
|
#endif
|
1032
1092
|
|
@@ -1039,7 +1099,7 @@ static mrb_value flo_xor(mrb_state *mrb, mrb_value x);
|
|
1039
1099
|
*/
|
1040
1100
|
|
1041
1101
|
static mrb_value
|
1042
|
-
|
1102
|
+
int_and(mrb_state *mrb, mrb_value x)
|
1043
1103
|
{
|
1044
1104
|
mrb_value y = mrb_get_arg1(mrb);
|
1045
1105
|
|
@@ -1055,7 +1115,7 @@ fix_and(mrb_state *mrb, mrb_value x)
|
|
1055
1115
|
*/
|
1056
1116
|
|
1057
1117
|
static mrb_value
|
1058
|
-
|
1118
|
+
int_or(mrb_state *mrb, mrb_value x)
|
1059
1119
|
{
|
1060
1120
|
mrb_value y = mrb_get_arg1(mrb);
|
1061
1121
|
|
@@ -1071,7 +1131,7 @@ fix_or(mrb_state *mrb, mrb_value x)
|
|
1071
1131
|
*/
|
1072
1132
|
|
1073
1133
|
static mrb_value
|
1074
|
-
|
1134
|
+
int_xor(mrb_state *mrb, mrb_value x)
|
1075
1135
|
{
|
1076
1136
|
mrb_value y = mrb_get_arg1(mrb);
|
1077
1137
|
|
@@ -1083,61 +1143,34 @@ fix_xor(mrb_state *mrb, mrb_value x)
|
|
1083
1143
|
static mrb_value
|
1084
1144
|
lshift(mrb_state *mrb, mrb_int val, mrb_int width)
|
1085
1145
|
{
|
1086
|
-
|
1087
|
-
#ifdef MRB_WITHOUT_FLOAT
|
1088
|
-
return mrb_fixnum_value(0);
|
1089
|
-
#else
|
1090
|
-
return mrb_float_value(mrb, INFINITY);
|
1091
|
-
#endif
|
1092
|
-
}
|
1146
|
+
mrb_assert(width >= 0);
|
1093
1147
|
if (val > 0) {
|
1094
1148
|
if ((width > NUMERIC_SHIFT_WIDTH_MAX) ||
|
1095
1149
|
(val > (MRB_INT_MAX >> width))) {
|
1096
|
-
|
1097
|
-
return mrb_fixnum_value(-1);
|
1098
|
-
#else
|
1099
|
-
goto bit_overflow;
|
1100
|
-
#endif
|
1150
|
+
int_overflow(mrb, "bit shift");
|
1101
1151
|
}
|
1102
|
-
return
|
1152
|
+
return mrb_int_value(mrb, val << width);
|
1103
1153
|
}
|
1104
1154
|
else {
|
1105
1155
|
if ((width > NUMERIC_SHIFT_WIDTH_MAX) ||
|
1106
1156
|
(val <= (MRB_INT_MIN >> width))) {
|
1107
|
-
|
1108
|
-
return mrb_fixnum_value(0);
|
1109
|
-
#else
|
1110
|
-
goto bit_overflow;
|
1111
|
-
#endif
|
1157
|
+
int_overflow(mrb, "bit shift");
|
1112
1158
|
}
|
1113
|
-
return
|
1159
|
+
return mrb_int_value(mrb, (val * ((mrb_int)1 << width)));
|
1114
1160
|
}
|
1115
|
-
|
1116
|
-
#ifndef MRB_WITHOUT_FLOAT
|
1117
|
-
bit_overflow:
|
1118
|
-
{
|
1119
|
-
mrb_float f = (mrb_float)val;
|
1120
|
-
while (width--) {
|
1121
|
-
f *= 2;
|
1122
|
-
}
|
1123
|
-
return mrb_float_value(mrb, f);
|
1124
|
-
}
|
1125
|
-
#endif
|
1126
1161
|
}
|
1127
1162
|
|
1128
1163
|
static mrb_value
|
1129
|
-
rshift(mrb_int val, mrb_int width)
|
1164
|
+
rshift(mrb_state *mrb, mrb_int val, mrb_int width)
|
1130
1165
|
{
|
1131
|
-
|
1132
|
-
return mrb_fixnum_value(0);
|
1133
|
-
}
|
1166
|
+
mrb_assert(width >= 0);
|
1134
1167
|
if (width >= NUMERIC_SHIFT_WIDTH_MAX) {
|
1135
1168
|
if (val < 0) {
|
1136
1169
|
return mrb_fixnum_value(-1);
|
1137
1170
|
}
|
1138
1171
|
return mrb_fixnum_value(0);
|
1139
1172
|
}
|
1140
|
-
return
|
1173
|
+
return mrb_int_value(mrb, val >> width);
|
1141
1174
|
}
|
1142
1175
|
|
1143
1176
|
/* 15.2.8.3.12 */
|
@@ -1149,7 +1182,7 @@ rshift(mrb_int val, mrb_int width)
|
|
1149
1182
|
*/
|
1150
1183
|
|
1151
1184
|
static mrb_value
|
1152
|
-
|
1185
|
+
int_lshift(mrb_state *mrb, mrb_value x)
|
1153
1186
|
{
|
1154
1187
|
mrb_int width, val;
|
1155
1188
|
|
@@ -1157,10 +1190,11 @@ fix_lshift(mrb_state *mrb, mrb_value x)
|
|
1157
1190
|
if (width == 0) {
|
1158
1191
|
return x;
|
1159
1192
|
}
|
1160
|
-
val =
|
1193
|
+
val = mrb_integer(x);
|
1161
1194
|
if (val == 0) return x;
|
1162
1195
|
if (width < 0) {
|
1163
|
-
return rshift(val,
|
1196
|
+
if (width == MRB_INT_MIN) return rshift(mrb, val, MRB_INT_BIT);
|
1197
|
+
return rshift(mrb, val, -width);
|
1164
1198
|
}
|
1165
1199
|
return lshift(mrb, val, width);
|
1166
1200
|
}
|
@@ -1174,7 +1208,7 @@ fix_lshift(mrb_state *mrb, mrb_value x)
|
|
1174
1208
|
*/
|
1175
1209
|
|
1176
1210
|
static mrb_value
|
1177
|
-
|
1211
|
+
int_rshift(mrb_state *mrb, mrb_value x)
|
1178
1212
|
{
|
1179
1213
|
mrb_int width, val;
|
1180
1214
|
|
@@ -1182,12 +1216,13 @@ fix_rshift(mrb_state *mrb, mrb_value x)
|
|
1182
1216
|
if (width == 0) {
|
1183
1217
|
return x;
|
1184
1218
|
}
|
1185
|
-
val =
|
1219
|
+
val = mrb_integer(x);
|
1186
1220
|
if (val == 0) return x;
|
1187
1221
|
if (width < 0) {
|
1222
|
+
if (width == MRB_INT_MIN) int_overflow(mrb, "bit shift");
|
1188
1223
|
return lshift(mrb, val, -width);
|
1189
1224
|
}
|
1190
|
-
return rshift(val, width);
|
1225
|
+
return rshift(mrb, val, width);
|
1191
1226
|
}
|
1192
1227
|
|
1193
1228
|
/* 15.2.8.3.23 */
|
@@ -1199,11 +1234,11 @@ fix_rshift(mrb_state *mrb, mrb_value x)
|
|
1199
1234
|
*
|
1200
1235
|
*/
|
1201
1236
|
|
1202
|
-
#ifndef
|
1237
|
+
#ifndef MRB_NO_FLOAT
|
1203
1238
|
static mrb_value
|
1204
|
-
|
1239
|
+
int_to_f(mrb_state *mrb, mrb_value num)
|
1205
1240
|
{
|
1206
|
-
return mrb_float_value(mrb, (mrb_float)
|
1241
|
+
return mrb_float_value(mrb, (mrb_float)mrb_integer(num));
|
1207
1242
|
}
|
1208
1243
|
|
1209
1244
|
/*
|
@@ -1240,7 +1275,7 @@ mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x)
|
|
1240
1275
|
mrb_raisef(mrb, E_RANGE_ERROR, "number (%v) too big for integer", x);
|
1241
1276
|
}
|
1242
1277
|
}
|
1243
|
-
return
|
1278
|
+
return mrb_int_value(mrb, z);
|
1244
1279
|
}
|
1245
1280
|
#endif
|
1246
1281
|
|
@@ -1249,20 +1284,18 @@ fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
1249
1284
|
{
|
1250
1285
|
mrb_int a;
|
1251
1286
|
|
1252
|
-
a =
|
1253
|
-
if (
|
1287
|
+
a = mrb_integer(x);
|
1288
|
+
if (mrb_integer_p(y)) {
|
1254
1289
|
mrb_int b, c;
|
1255
1290
|
|
1256
1291
|
if (a == 0) return y;
|
1257
|
-
b =
|
1292
|
+
b = mrb_integer(y);
|
1258
1293
|
if (mrb_int_add_overflow(a, b, &c)) {
|
1259
|
-
|
1260
|
-
return mrb_float_value(mrb, (mrb_float)a + (mrb_float)b);
|
1261
|
-
#endif
|
1294
|
+
int_overflow(mrb, "addition");
|
1262
1295
|
}
|
1263
|
-
return
|
1296
|
+
return mrb_int_value(mrb, c);
|
1264
1297
|
}
|
1265
|
-
#ifdef
|
1298
|
+
#ifdef MRB_NO_FLOAT
|
1266
1299
|
mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
|
1267
1300
|
#else
|
1268
1301
|
return mrb_float_value(mrb, (mrb_float)a + mrb_to_flo(mrb, y));
|
@@ -1272,10 +1305,10 @@ fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
1272
1305
|
MRB_API mrb_value
|
1273
1306
|
mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y)
|
1274
1307
|
{
|
1275
|
-
if (
|
1308
|
+
if (mrb_integer_p(x)) {
|
1276
1309
|
return fixnum_plus(mrb, x, y);
|
1277
1310
|
}
|
1278
|
-
#ifndef
|
1311
|
+
#ifndef MRB_NO_FLOAT
|
1279
1312
|
if (mrb_float_p(x)) {
|
1280
1313
|
return mrb_float_value(mrb, mrb_float(x) + mrb_to_flo(mrb, y));
|
1281
1314
|
}
|
@@ -1294,7 +1327,7 @@ mrb_num_plus(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
1294
1327
|
* result.
|
1295
1328
|
*/
|
1296
1329
|
static mrb_value
|
1297
|
-
|
1330
|
+
int_plus(mrb_state *mrb, mrb_value self)
|
1298
1331
|
{
|
1299
1332
|
mrb_value other = mrb_get_arg1(mrb);
|
1300
1333
|
|
@@ -1306,19 +1339,17 @@ fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
1306
1339
|
{
|
1307
1340
|
mrb_int a;
|
1308
1341
|
|
1309
|
-
a =
|
1310
|
-
if (
|
1342
|
+
a = mrb_integer(x);
|
1343
|
+
if (mrb_integer_p(y)) {
|
1311
1344
|
mrb_int b, c;
|
1312
1345
|
|
1313
|
-
b =
|
1346
|
+
b = mrb_integer(y);
|
1314
1347
|
if (mrb_int_sub_overflow(a, b, &c)) {
|
1315
|
-
|
1316
|
-
return mrb_float_value(mrb, (mrb_float)a - (mrb_float)b);
|
1317
|
-
#endif
|
1348
|
+
int_overflow(mrb, "subtraction");
|
1318
1349
|
}
|
1319
|
-
return
|
1350
|
+
return mrb_int_value(mrb, c);
|
1320
1351
|
}
|
1321
|
-
#ifdef
|
1352
|
+
#ifdef MRB_NO_FLOAT
|
1322
1353
|
mrb_raise(mrb, E_TYPE_ERROR, "non fixnum value");
|
1323
1354
|
#else
|
1324
1355
|
return mrb_float_value(mrb, (mrb_float)a - mrb_to_flo(mrb, y));
|
@@ -1328,10 +1359,10 @@ fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
1328
1359
|
MRB_API mrb_value
|
1329
1360
|
mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y)
|
1330
1361
|
{
|
1331
|
-
if (
|
1362
|
+
if (mrb_integer_p(x)) {
|
1332
1363
|
return fixnum_minus(mrb, x, y);
|
1333
1364
|
}
|
1334
|
-
#ifndef
|
1365
|
+
#ifndef MRB_NO_FLOAT
|
1335
1366
|
if (mrb_float_p(x)) {
|
1336
1367
|
return mrb_float_value(mrb, mrb_float(x) - mrb_to_flo(mrb, y));
|
1337
1368
|
}
|
@@ -1351,7 +1382,7 @@ mrb_num_minus(mrb_state *mrb, mrb_value x, mrb_value y)
|
|
1351
1382
|
* result.
|
1352
1383
|
*/
|
1353
1384
|
static mrb_value
|
1354
|
-
|
1385
|
+
int_minus(mrb_state *mrb, mrb_value self)
|
1355
1386
|
{
|
1356
1387
|
mrb_value other = mrb_get_arg1(mrb);
|
1357
1388
|
|
@@ -1364,7 +1395,7 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base)
|
|
1364
1395
|
{
|
1365
1396
|
char buf[MRB_INT_BIT+1];
|
1366
1397
|
char *b = buf + sizeof buf;
|
1367
|
-
mrb_int val =
|
1398
|
+
mrb_int val = mrb_integer(x);
|
1368
1399
|
mrb_value str;
|
1369
1400
|
|
1370
1401
|
if (base < 2 || 36 < base) {
|
@@ -1408,7 +1439,7 @@ mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base)
|
|
1408
1439
|
*
|
1409
1440
|
*/
|
1410
1441
|
static mrb_value
|
1411
|
-
|
1442
|
+
int_to_s(mrb_state *mrb, mrb_value self)
|
1412
1443
|
{
|
1413
1444
|
mrb_int base = 10;
|
1414
1445
|
|
@@ -1420,26 +1451,26 @@ fix_to_s(mrb_state *mrb, mrb_value self)
|
|
1420
1451
|
static mrb_int
|
1421
1452
|
cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2)
|
1422
1453
|
{
|
1423
|
-
#ifdef
|
1454
|
+
#ifdef MRB_NO_FLOAT
|
1424
1455
|
mrb_int x, y;
|
1425
1456
|
#else
|
1426
1457
|
mrb_float x, y;
|
1427
1458
|
#endif
|
1428
1459
|
|
1429
|
-
#ifdef
|
1430
|
-
x =
|
1460
|
+
#ifdef MRB_NO_FLOAT
|
1461
|
+
x = mrb_integer(v1);
|
1431
1462
|
#else
|
1432
1463
|
x = mrb_to_flo(mrb, v1);
|
1433
1464
|
#endif
|
1434
1465
|
switch (mrb_type(v2)) {
|
1435
|
-
case
|
1436
|
-
#ifdef
|
1437
|
-
y =
|
1466
|
+
case MRB_TT_INTEGER:
|
1467
|
+
#ifdef MRB_NO_FLOAT
|
1468
|
+
y = mrb_integer(v2);
|
1438
1469
|
#else
|
1439
|
-
y = (mrb_float)
|
1470
|
+
y = (mrb_float)mrb_integer(v2);
|
1440
1471
|
#endif
|
1441
1472
|
break;
|
1442
|
-
#ifndef
|
1473
|
+
#ifndef MRB_NO_FLOAT
|
1443
1474
|
case MRB_TT_FLOAT:
|
1444
1475
|
y = mrb_float(v2);
|
1445
1476
|
break;
|
@@ -1469,7 +1500,7 @@ cmpnum(mrb_state *mrb, mrb_value v1, mrb_value v2)
|
|
1469
1500
|
* not comparable, it returns nil instead of raising an exception.
|
1470
1501
|
*/
|
1471
1502
|
static mrb_value
|
1472
|
-
|
1503
|
+
num_cmp(mrb_state *mrb, mrb_value self)
|
1473
1504
|
{
|
1474
1505
|
mrb_value other = mrb_get_arg1(mrb);
|
1475
1506
|
mrb_int n;
|
@@ -1486,7 +1517,7 @@ cmperr(mrb_state *mrb, mrb_value v1, mrb_value v2)
|
|
1486
1517
|
}
|
1487
1518
|
|
1488
1519
|
static mrb_value
|
1489
|
-
|
1520
|
+
num_lt(mrb_state *mrb, mrb_value self)
|
1490
1521
|
{
|
1491
1522
|
mrb_value other = mrb_get_arg1(mrb);
|
1492
1523
|
mrb_int n;
|
@@ -1498,7 +1529,7 @@ integral_lt(mrb_state *mrb, mrb_value self)
|
|
1498
1529
|
}
|
1499
1530
|
|
1500
1531
|
static mrb_value
|
1501
|
-
|
1532
|
+
num_le(mrb_state *mrb, mrb_value self)
|
1502
1533
|
{
|
1503
1534
|
mrb_value other = mrb_get_arg1(mrb);
|
1504
1535
|
mrb_int n;
|
@@ -1510,7 +1541,7 @@ integral_le(mrb_state *mrb, mrb_value self)
|
|
1510
1541
|
}
|
1511
1542
|
|
1512
1543
|
static mrb_value
|
1513
|
-
|
1544
|
+
num_gt(mrb_state *mrb, mrb_value self)
|
1514
1545
|
{
|
1515
1546
|
mrb_value other = mrb_get_arg1(mrb);
|
1516
1547
|
mrb_int n;
|
@@ -1522,7 +1553,7 @@ integral_gt(mrb_state *mrb, mrb_value self)
|
|
1522
1553
|
}
|
1523
1554
|
|
1524
1555
|
static mrb_value
|
1525
|
-
|
1556
|
+
num_ge(mrb_state *mrb, mrb_value self)
|
1526
1557
|
{
|
1527
1558
|
mrb_value other = mrb_get_arg1(mrb);
|
1528
1559
|
mrb_int n;
|
@@ -1539,7 +1570,7 @@ mrb_cmp(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
|
|
1539
1570
|
mrb_value v;
|
1540
1571
|
|
1541
1572
|
switch (mrb_type(obj1)) {
|
1542
|
-
case
|
1573
|
+
case MRB_TT_INTEGER:
|
1543
1574
|
case MRB_TT_FLOAT:
|
1544
1575
|
return cmpnum(mrb, obj1, obj2);
|
1545
1576
|
case MRB_TT_STRING:
|
@@ -1547,10 +1578,10 @@ mrb_cmp(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
|
|
1547
1578
|
return -2;
|
1548
1579
|
return mrb_str_cmp(mrb, obj1, obj2);
|
1549
1580
|
default:
|
1550
|
-
v =
|
1551
|
-
if (mrb_nil_p(v) || !
|
1581
|
+
v = mrb_funcall_id(mrb, obj1, MRB_SYM(cmp), 1, obj2);
|
1582
|
+
if (mrb_nil_p(v) || !mrb_integer_p(v))
|
1552
1583
|
return -2;
|
1553
|
-
return
|
1584
|
+
return mrb_integer(v);
|
1554
1585
|
}
|
1555
1586
|
}
|
1556
1587
|
|
@@ -1574,7 +1605,7 @@ num_infinite_p(mrb_state *mrb, mrb_value self)
|
|
1574
1605
|
* Returns a new float which is the sum of <code>float</code>
|
1575
1606
|
* and <code>other</code>.
|
1576
1607
|
*/
|
1577
|
-
#ifndef
|
1608
|
+
#ifndef MRB_NO_FLOAT
|
1578
1609
|
static mrb_value
|
1579
1610
|
flo_plus(mrb_state *mrb, mrb_value x)
|
1580
1611
|
{
|
@@ -1588,72 +1619,81 @@ flo_plus(mrb_state *mrb, mrb_value x)
|
|
1588
1619
|
void
|
1589
1620
|
mrb_init_numeric(mrb_state *mrb)
|
1590
1621
|
{
|
1591
|
-
struct RClass *numeric, *integer
|
1592
|
-
#ifndef
|
1622
|
+
struct RClass *numeric, *integer;
|
1623
|
+
#ifndef MRB_NO_FLOAT
|
1593
1624
|
struct RClass *fl;
|
1594
1625
|
#endif
|
1595
1626
|
|
1596
|
-
integral = mrb_define_module(mrb, "Integral");
|
1597
|
-
mrb_define_method(mrb, integral,"**", integral_pow, MRB_ARGS_REQ(1));
|
1598
|
-
mrb_define_method(mrb, integral,"/", integral_div, MRB_ARGS_REQ(1)); /* 15.2.{8,9}.3.6 */
|
1599
|
-
mrb_define_method(mrb, integral,"quo", integral_div, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
|
1600
|
-
mrb_define_method(mrb, integral,"div", integral_idiv, MRB_ARGS_REQ(1));
|
1601
|
-
mrb_define_method(mrb, integral,"<=>", integral_cmp, MRB_ARGS_REQ(1)); /* 15.2.{8,9}.3.1 */
|
1602
|
-
mrb_define_method(mrb, integral,"<", integral_lt, MRB_ARGS_REQ(1));
|
1603
|
-
mrb_define_method(mrb, integral,"<=", integral_le, MRB_ARGS_REQ(1));
|
1604
|
-
mrb_define_method(mrb, integral,">", integral_gt, MRB_ARGS_REQ(1));
|
1605
|
-
mrb_define_method(mrb, integral,">=", integral_ge, MRB_ARGS_REQ(1));
|
1606
|
-
mrb_define_method(mrb, integral,"__coerce_step_counter", integral_coerce_step_counter, MRB_ARGS_REQ(2));
|
1607
|
-
|
1608
1627
|
/* Numeric Class */
|
1609
1628
|
numeric = mrb_define_class(mrb, "Numeric", mrb->object_class); /* 15.2.7 */
|
1610
1629
|
mrb_define_method(mrb, numeric, "finite?", num_finite_p, MRB_ARGS_NONE());
|
1611
1630
|
mrb_define_method(mrb, numeric, "infinite?",num_infinite_p, MRB_ARGS_NONE());
|
1612
1631
|
|
1613
1632
|
/* Integer Class */
|
1614
|
-
integer = mrb_define_class(mrb, "Integer", numeric);
|
1615
|
-
MRB_SET_INSTANCE_TT(integer,
|
1633
|
+
mrb->integer_class = integer = mrb_define_class(mrb, "Integer", numeric); /* 15.2.8 */
|
1634
|
+
MRB_SET_INSTANCE_TT(integer, MRB_TT_INTEGER);
|
1616
1635
|
mrb_undef_class_method(mrb, integer, "new");
|
1636
|
+
mrb_define_method(mrb, integer, "**", int_pow, MRB_ARGS_REQ(1));
|
1637
|
+
mrb_define_method(mrb, integer, "/", int_div, MRB_ARGS_REQ(1)); /* 15.2.8.3.6 */
|
1638
|
+
mrb_define_method(mrb, integer, "quo", int_quo, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
|
1639
|
+
mrb_define_method(mrb, integer, "div", int_div, MRB_ARGS_REQ(1));
|
1640
|
+
mrb_define_method(mrb, integer, "<=>", num_cmp, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */
|
1641
|
+
mrb_define_method(mrb, integer, "<", num_lt, MRB_ARGS_REQ(1));
|
1642
|
+
mrb_define_method(mrb, integer, "<=", num_le, MRB_ARGS_REQ(1));
|
1643
|
+
mrb_define_method(mrb, integer, ">", num_gt, MRB_ARGS_REQ(1));
|
1644
|
+
mrb_define_method(mrb, integer, ">=", num_ge, MRB_ARGS_REQ(1));
|
1645
|
+
|
1617
1646
|
mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.24 */
|
1618
1647
|
mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE());
|
1619
|
-
#ifndef
|
1620
|
-
mrb_define_method(mrb, integer, "ceil", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.
|
1621
|
-
mrb_define_method(mrb, integer, "floor", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.
|
1622
|
-
mrb_define_method(mrb, integer, "round", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.
|
1623
|
-
mrb_define_method(mrb, integer, "truncate", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.
|
1648
|
+
#ifndef MRB_NO_FLOAT
|
1649
|
+
mrb_define_method(mrb, integer, "ceil", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.14 */
|
1650
|
+
mrb_define_method(mrb, integer, "floor", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.17 */
|
1651
|
+
mrb_define_method(mrb, integer, "round", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.20 */
|
1652
|
+
mrb_define_method(mrb, integer, "truncate", int_to_i, MRB_ARGS_NONE()); /* 15.2.8.3.26 */
|
1624
1653
|
#endif
|
1625
1654
|
|
1626
|
-
/*
|
1627
|
-
|
1628
|
-
mrb_define_method(mrb,
|
1629
|
-
mrb_define_method(mrb,
|
1630
|
-
mrb_define_method(mrb,
|
1631
|
-
mrb_define_method(mrb,
|
1632
|
-
mrb_define_method(mrb,
|
1633
|
-
mrb_define_method(mrb,
|
1634
|
-
mrb_define_method(mrb,
|
1635
|
-
mrb_define_method(mrb,
|
1636
|
-
mrb_define_method(mrb,
|
1637
|
-
mrb_define_method(mrb,
|
1638
|
-
|
1639
|
-
mrb_define_method(mrb,
|
1640
|
-
#ifndef MRB_WITHOUT_FLOAT
|
1641
|
-
mrb_define_method(mrb, fixnum, "to_f", fix_to_f, MRB_ARGS_NONE()); /* 15.2.8.3.23 */
|
1655
|
+
mrb_define_method(mrb, integer, "+", int_plus, MRB_ARGS_REQ(1)); /* 15.2.8.3.1 */
|
1656
|
+
mrb_define_method(mrb, integer, "-", int_minus, MRB_ARGS_REQ(1)); /* 15.2.8.3.2 */
|
1657
|
+
mrb_define_method(mrb, integer, "*", int_mul, MRB_ARGS_REQ(1)); /* 15.2.8.3.3 */
|
1658
|
+
mrb_define_method(mrb, integer, "%", int_mod, MRB_ARGS_REQ(1)); /* 15.2.8.3.5 */
|
1659
|
+
mrb_define_method(mrb, integer, "==", int_equal, MRB_ARGS_REQ(1)); /* 15.2.8.3.7 */
|
1660
|
+
mrb_define_method(mrb, integer, "~", int_rev, MRB_ARGS_NONE()); /* 15.2.8.3.8 */
|
1661
|
+
mrb_define_method(mrb, integer, "&", int_and, MRB_ARGS_REQ(1)); /* 15.2.8.3.9 */
|
1662
|
+
mrb_define_method(mrb, integer, "|", int_or, MRB_ARGS_REQ(1)); /* 15.2.8.3.10 */
|
1663
|
+
mrb_define_method(mrb, integer, "^", int_xor, MRB_ARGS_REQ(1)); /* 15.2.8.3.11 */
|
1664
|
+
mrb_define_method(mrb, integer, "<<", int_lshift, MRB_ARGS_REQ(1)); /* 15.2.8.3.12 */
|
1665
|
+
mrb_define_method(mrb, integer, ">>", int_rshift, MRB_ARGS_REQ(1)); /* 15.2.8.3.13 */
|
1666
|
+
mrb_define_method(mrb, integer, "eql?", int_eql, MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
|
1667
|
+
#ifndef MRB_NO_FLOAT
|
1668
|
+
mrb_define_method(mrb, integer, "to_f", int_to_f, MRB_ARGS_NONE()); /* 15.2.8.3.23 */
|
1642
1669
|
#endif
|
1643
|
-
mrb_define_method(mrb,
|
1644
|
-
mrb_define_method(mrb,
|
1645
|
-
mrb_define_method(mrb,
|
1670
|
+
mrb_define_method(mrb, integer, "to_s", int_to_s, MRB_ARGS_OPT(1)); /* 15.2.8.3.25 */
|
1671
|
+
mrb_define_method(mrb, integer, "inspect", int_to_s, MRB_ARGS_OPT(1));
|
1672
|
+
mrb_define_method(mrb, integer, "divmod", int_divmod, MRB_ARGS_REQ(1)); /* 15.2.8.3.30 (x) */
|
1673
|
+
mrb_define_method(mrb, integer, "__coerce_step_counter", coerce_step_counter, MRB_ARGS_REQ(2));
|
1674
|
+
|
1675
|
+
/* Fixnum Class for compatibility */
|
1676
|
+
mrb_define_const(mrb, mrb->object_class, "Fixnum", mrb_obj_value(integer));
|
1646
1677
|
|
1647
|
-
#ifndef
|
1678
|
+
#ifndef MRB_NO_FLOAT
|
1648
1679
|
/* Float Class */
|
1649
1680
|
mrb->float_class = fl = mrb_define_class(mrb, "Float", numeric); /* 15.2.9 */
|
1650
1681
|
MRB_SET_INSTANCE_TT(fl, MRB_TT_FLOAT);
|
1651
1682
|
mrb_undef_class_method(mrb, fl, "new");
|
1652
|
-
mrb_define_method(mrb, fl, "
|
1653
|
-
mrb_define_method(mrb, fl, "
|
1654
|
-
mrb_define_method(mrb, fl, "
|
1655
|
-
mrb_define_method(mrb, fl, "
|
1656
|
-
mrb_define_method(mrb, fl, "
|
1683
|
+
mrb_define_method(mrb, fl, "**", flo_pow, MRB_ARGS_REQ(1));
|
1684
|
+
mrb_define_method(mrb, fl, "/", flo_div, MRB_ARGS_REQ(1)); /* 15.2.9.3.6 */
|
1685
|
+
mrb_define_method(mrb, fl, "quo", flo_div, MRB_ARGS_REQ(1)); /* 15.2.7.4.5 (x) */
|
1686
|
+
mrb_define_method(mrb, fl, "div", flo_idiv, MRB_ARGS_REQ(1));
|
1687
|
+
mrb_define_method(mrb, fl, "+", flo_plus, MRB_ARGS_REQ(1)); /* 15.2.9.3.3 */
|
1688
|
+
mrb_define_method(mrb, fl, "-", flo_minus, MRB_ARGS_REQ(1)); /* 15.2.9.3.4 */
|
1689
|
+
mrb_define_method(mrb, fl, "*", flo_mul, MRB_ARGS_REQ(1)); /* 15.2.9.3.5 */
|
1690
|
+
mrb_define_method(mrb, fl, "%", flo_mod, MRB_ARGS_REQ(1)); /* 15.2.9.3.7 */
|
1691
|
+
mrb_define_method(mrb, fl, "<=>", num_cmp, MRB_ARGS_REQ(1)); /* 15.2.9.3.1 */
|
1692
|
+
mrb_define_method(mrb, fl, "<", num_lt, MRB_ARGS_REQ(1));
|
1693
|
+
mrb_define_method(mrb, fl, "<=", num_le, MRB_ARGS_REQ(1));
|
1694
|
+
mrb_define_method(mrb, fl, ">", num_gt, MRB_ARGS_REQ(1));
|
1695
|
+
mrb_define_method(mrb, fl, ">=", num_ge, MRB_ARGS_REQ(1));
|
1696
|
+
mrb_define_method(mrb, fl, "==", flo_eq, MRB_ARGS_REQ(1)); /* 15.2.9.3.2 */
|
1657
1697
|
mrb_define_method(mrb, fl, "~", flo_rev, MRB_ARGS_NONE());
|
1658
1698
|
mrb_define_method(mrb, fl, "&", flo_and, MRB_ARGS_REQ(1));
|
1659
1699
|
mrb_define_method(mrb, fl, "|", flo_or, MRB_ARGS_REQ(1));
|
@@ -1677,12 +1717,10 @@ mrb_init_numeric(mrb_state *mrb)
|
|
1677
1717
|
mrb_define_method(mrb, fl, "nan?", flo_nan_p, MRB_ARGS_NONE());
|
1678
1718
|
|
1679
1719
|
#ifdef INFINITY
|
1680
|
-
|
1720
|
+
mrb_define_const_id(mrb, fl, MRB_SYM(INFINITY), mrb_float_value(mrb, INFINITY));
|
1681
1721
|
#endif
|
1682
1722
|
#ifdef NAN
|
1683
|
-
|
1723
|
+
mrb_define_const_id(mrb, fl, MRB_SYM(NAN), mrb_float_value(mrb, NAN));
|
1684
1724
|
#endif
|
1685
|
-
|
1686
|
-
mrb_include_module(mrb, fl, integral);
|
1687
1725
|
#endif
|
1688
1726
|
}
|