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