script_core 0.2.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +2 -2
- data/ext/enterprise_script_service/Rakefile +1 -1
- data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +117 -74
- data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +41 -37
- data/ext/enterprise_script_service/mruby/.github/workflows/lint.yml +23 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/oss-fuzz.yml +27 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/spell-checker.yml +17 -0
- data/ext/enterprise_script_service/mruby/.gitlab-ci.yml +3 -3
- data/ext/enterprise_script_service/mruby/.markdownlint.yml +16 -0
- data/ext/enterprise_script_service/mruby/.travis.yml +2 -2
- data/ext/enterprise_script_service/mruby/.yamllint +8 -0
- data/ext/enterprise_script_service/mruby/AUTHORS +3 -0
- data/ext/enterprise_script_service/mruby/CODEOWNERS +1 -0
- data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +6 -13
- data/ext/enterprise_script_service/mruby/Doxyfile +4 -4
- data/ext/enterprise_script_service/mruby/LICENSE +1 -1
- data/ext/enterprise_script_service/mruby/Makefile +1 -1
- data/ext/enterprise_script_service/mruby/README.md +4 -14
- data/ext/enterprise_script_service/mruby/Rakefile +18 -108
- data/ext/enterprise_script_service/mruby/TODO.md +17 -0
- data/ext/enterprise_script_service/mruby/appveyor.yml +31 -25
- data/ext/enterprise_script_service/mruby/benchmark/bm_ao_render.rb +1 -1
- data/ext/enterprise_script_service/mruby/build_config.rb +9 -152
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_ArduinoDue.rb → build_config/ArduinoDue.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +2 -2
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +1 -18
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +2 -19
- data/ext/enterprise_script_service/mruby/build_config/android_arm64-v8a.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/android_armeabi.rb +11 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_android_armeabi_v7a_neon_hard.rb → build_config/android_armeabi_v7a_neon_hard.rb} +0 -15
- data/ext/enterprise_script_service/mruby/build_config/bench.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/boxing.rb +21 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_chipKITMax32.rb → build_config/chipKITMax32.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{travis_config.rb → build_config/ci/gcc-clang.rb} +10 -10
- data/ext/enterprise_script_service/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/default.rb +80 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_dreamcast_shelf.rb → build_config/dreamcast_shelf.rb} +5 -19
- data/ext/enterprise_script_service/mruby/build_config/gameboyadvance.rb +73 -0
- data/ext/enterprise_script_service/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enterprise_script_service/mruby/build_config/host-debug.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/host-m32.rb +15 -0
- data/ext/enterprise_script_service/mruby/build_config/host-shared.rb +36 -0
- data/ext/enterprise_script_service/mruby/build_config/mrbc.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/no-float.rb +17 -0
- data/ext/enterprise_script_service/mruby/doc/guides/compile.md +138 -49
- data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +5 -4
- data/ext/enterprise_script_service/mruby/doc/guides/gc-arena-howto.md +1 -1
- data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +49 -22
- data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +31 -14
- data/ext/enterprise_script_service/mruby/doc/guides/symbol.md +83 -0
- data/ext/enterprise_script_service/mruby/doc/limitations.md +35 -36
- data/ext/enterprise_script_service/mruby/doc/mruby3.md +163 -0
- data/ext/enterprise_script_service/mruby/doc/opcode.md +93 -107
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/include/mrbconf.h +81 -62
- data/ext/enterprise_script_service/mruby/include/mruby.h +137 -96
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +23 -6
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +73 -48
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +79 -48
- data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +4 -1
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +13 -7
- data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +17 -35
- data/ext/enterprise_script_service/mruby/include/mruby/endian.h +44 -0
- data/ext/enterprise_script_service/mruby/include/mruby/error.h +39 -5
- data/ext/enterprise_script_service/mruby/include/mruby/gc.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/hash.h +33 -13
- data/ext/enterprise_script_service/mruby/include/mruby/irep.h +64 -14
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +6 -14
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +36 -63
- data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +27 -23
- data/ext/enterprise_script_service/mruby/include/mruby/presym.h +40 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/disable.h +70 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/enable.h +37 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/scanning.h +73 -0
- data/ext/enterprise_script_service/mruby/include/mruby/proc.h +80 -13
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +10 -15
- data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +29 -19
- data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +26 -7
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -44
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +55 -37
- data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +12 -10
- data/ext/enterprise_script_service/mruby/lib/{mruby-core-ext.rb → mruby/core_ext.rb} +10 -3
- data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +75 -32
- data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +1 -1
- data/ext/enterprise_script_service/mruby/lib/mruby/presym.rb +132 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +9 -88
- data/ext/enterprise_script_service/mruby/mrbgems/full-core.gembox +1 -4
- data/ext/enterprise_script_service/mruby/mrbgems/math.gembox +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/metaprog.gembox +15 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +28 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mruby-config +18 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +3 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +10 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +14 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +2 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +23 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +11 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +41 -34
- data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb +0 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +3 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +19 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +25 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +22 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrblib/catch.rb +27 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +2 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +430 -399
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +49 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +559 -217
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +4774 -4193
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +18 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +8 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +1 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/mrbgem.rake +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +17 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +18 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +30 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +7 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-inline-struct/test/inline.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +18 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +55 -52
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +99 -87
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +2 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +2 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +7 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +13 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/test/math.rb +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +43 -58
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/README.md +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +77 -74
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +14 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/src/memsize.c +231 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/README.md +15 -18
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +38 -88
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +1 -30
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +62 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +32 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +98 -43
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +39 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +20 -40
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +27 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +11 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +216 -38
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +6 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/README.md +6 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +102 -71
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +23 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +13 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +18 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +6 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/README.md +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +5 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +16 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +27 -27
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-ext.gembox +18 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-io.gembox +12 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib.gembox +54 -0
- data/ext/enterprise_script_service/mruby/mrblib/10error.rb +4 -0
- data/ext/enterprise_script_service/mruby/mrblib/array.rb +17 -9
- data/ext/enterprise_script_service/mruby/mrblib/enum.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrblib/hash.rb +0 -20
- data/ext/enterprise_script_service/mruby/mrblib/init_mrblib.c +0 -11
- data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +36 -11
- data/ext/enterprise_script_service/mruby/mrblib/range.rb +25 -3
- data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +2 -2
- data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +1 -1
- data/ext/enterprise_script_service/mruby/src/array.c +43 -80
- data/ext/enterprise_script_service/mruby/src/backtrace.c +16 -17
- data/ext/enterprise_script_service/mruby/src/class.c +774 -182
- data/ext/enterprise_script_service/mruby/src/codedump.c +223 -198
- data/ext/enterprise_script_service/mruby/src/debug.c +6 -6
- data/ext/enterprise_script_service/mruby/src/dump.c +466 -141
- data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
- data/ext/enterprise_script_service/mruby/src/error.c +36 -13
- data/ext/enterprise_script_service/mruby/src/etc.c +43 -34
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +5 -6
- data/ext/enterprise_script_service/mruby/src/gc.c +73 -71
- data/ext/enterprise_script_service/mruby/src/hash.c +1050 -707
- data/ext/enterprise_script_service/mruby/src/kernel.c +75 -220
- data/ext/enterprise_script_service/mruby/src/load.c +196 -166
- data/ext/enterprise_script_service/mruby/src/numeric.c +352 -314
- data/ext/enterprise_script_service/mruby/src/object.c +97 -90
- data/ext/enterprise_script_service/mruby/src/print.c +4 -3
- data/ext/enterprise_script_service/mruby/src/proc.c +48 -56
- data/ext/enterprise_script_service/mruby/src/range.c +45 -21
- data/ext/enterprise_script_service/mruby/src/state.c +25 -32
- data/ext/enterprise_script_service/mruby/src/string.c +59 -101
- data/ext/enterprise_script_service/mruby/src/symbol.c +121 -56
- data/ext/enterprise_script_service/mruby/src/value_array.h +1 -0
- data/ext/enterprise_script_service/mruby/src/variable.c +158 -158
- data/ext/enterprise_script_service/mruby/src/vm.c +617 -602
- data/ext/enterprise_script_service/mruby/tasks/benchmark.rake +6 -6
- data/ext/enterprise_script_service/mruby/tasks/bin.rake +23 -0
- data/ext/enterprise_script_service/mruby/tasks/core.rake +12 -0
- data/ext/enterprise_script_service/mruby/tasks/doc.rake +50 -38
- data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +83 -77
- data/ext/enterprise_script_service/mruby/tasks/libmruby.rake +10 -1
- data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +13 -1
- data/ext/enterprise_script_service/mruby/tasks/mrblib.rake +40 -0
- data/ext/enterprise_script_service/mruby/tasks/presym.rake +44 -0
- data/ext/enterprise_script_service/mruby/tasks/test.rake +68 -0
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +6 -5
- data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +10 -14
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +17 -21
- data/ext/enterprise_script_service/mruby/test/bintest.rb +5 -5
- data/ext/enterprise_script_service/mruby/test/t/argumenterror.rb +16 -0
- data/ext/enterprise_script_service/mruby/test/t/array.rb +7 -3
- data/ext/enterprise_script_service/mruby/test/t/bs_literal.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/float.rb +18 -8
- data/ext/enterprise_script_service/mruby/test/t/hash.rb +903 -281
- data/ext/enterprise_script_service/mruby/test/t/integer.rb +10 -38
- data/ext/enterprise_script_service/mruby/test/t/kernel.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/literals.rb +50 -0
- data/ext/enterprise_script_service/mruby/test/t/module.rb +2 -2
- data/ext/enterprise_script_service/mruby/test/t/numeric.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/range.rb +83 -1
- data/ext/enterprise_script_service/mruby/test/t/string.rb +4 -0
- data/ext/enterprise_script_service/mruby/test/t/superclass.rb +10 -10
- data/ext/enterprise_script_service/mruby/test/t/syntax.rb +24 -0
- data/ext/enterprise_script_service/mruby/test/t/vformat.rb +3 -3
- data/ext/enterprise_script_service/mruby_config.rb +2 -5
- data/ext/enterprise_script_service/mruby_engine.cpp +1 -1
- data/lib/script_core/version.rb +1 -1
- data/spec/script_core_spec.rb +13 -0
- metadata +61 -23
- data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +0 -24
- data/ext/enterprise_script_service/mruby/TODO +0 -8
- data/ext/enterprise_script_service/mruby/appveyor_config.rb +0 -46
- data/ext/enterprise_script_service/mruby/benchmark/build_config_boxing.rb +0 -28
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_arm64-v8a.rb +0 -26
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_armeabi.rb +0 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +0 -30
- data/ext/enterprise_script_service/mruby/mrblib/mrblib.rake +0 -18
- data/ext/enterprise_script_service/mruby/src/crc.c +0 -39
- data/ext/enterprise_script_service/mruby/src/mruby_core.rake +0 -19
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
#include <stddef.h>
|
|
8
8
|
#include <stdarg.h>
|
|
9
|
-
#ifndef
|
|
9
|
+
#ifndef MRB_NO_FLOAT
|
|
10
10
|
#include <math.h>
|
|
11
11
|
#endif
|
|
12
12
|
#include <mruby.h>
|
|
@@ -23,8 +23,10 @@
|
|
|
23
23
|
#include <mruby/opcode.h>
|
|
24
24
|
#include "value_array.h"
|
|
25
25
|
#include <mruby/throw.h>
|
|
26
|
+
#include <mruby/dump.h>
|
|
27
|
+
#include <mruby/presym.h>
|
|
26
28
|
|
|
27
|
-
#ifdef
|
|
29
|
+
#ifdef MRB_NO_STDIO
|
|
28
30
|
#if defined(__cplusplus)
|
|
29
31
|
extern "C" {
|
|
30
32
|
#endif
|
|
@@ -37,14 +39,6 @@ void abort(void);
|
|
|
37
39
|
#define STACK_INIT_SIZE 128
|
|
38
40
|
#define CALLINFO_INIT_SIZE 32
|
|
39
41
|
|
|
40
|
-
#ifndef ENSURE_STACK_INIT_SIZE
|
|
41
|
-
#define ENSURE_STACK_INIT_SIZE 16
|
|
42
|
-
#endif
|
|
43
|
-
|
|
44
|
-
#ifndef RESCUE_STACK_INIT_SIZE
|
|
45
|
-
#define RESCUE_STACK_INIT_SIZE 16
|
|
46
|
-
#endif
|
|
47
|
-
|
|
48
42
|
/* Define amount of linear stack growth. */
|
|
49
43
|
#ifndef MRB_STACK_GROWTH
|
|
50
44
|
#define MRB_STACK_GROWTH 128
|
|
@@ -55,11 +49,6 @@ void abort(void);
|
|
|
55
49
|
#define MRB_FUNCALL_DEPTH_MAX 512
|
|
56
50
|
#endif
|
|
57
51
|
|
|
58
|
-
/* Maximum depth of ecall() recursion. */
|
|
59
|
-
#ifndef MRB_ECALL_DEPTH_MAX
|
|
60
|
-
#define MRB_ECALL_DEPTH_MAX 512
|
|
61
|
-
#endif
|
|
62
|
-
|
|
63
52
|
/* Maximum stack depth. Should be set lower on memory constrained systems.
|
|
64
53
|
The value below allows about 60000 recursive calls in the simplest case. */
|
|
65
54
|
#ifndef MRB_STACK_MAX
|
|
@@ -102,26 +91,20 @@ void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value
|
|
|
102
91
|
static inline void
|
|
103
92
|
stack_clear(mrb_value *from, size_t count)
|
|
104
93
|
{
|
|
105
|
-
#
|
|
106
|
-
const mrb_value mrb_value_zero = { { 0 } };
|
|
107
|
-
|
|
108
|
-
while (count-- > 0) {
|
|
109
|
-
*from++ = mrb_value_zero;
|
|
110
|
-
}
|
|
111
|
-
#else
|
|
94
|
+
#ifdef MRB_NAN_BOXING
|
|
112
95
|
while (count-- > 0) {
|
|
113
96
|
SET_NIL_VALUE(*from);
|
|
114
97
|
from++;
|
|
115
98
|
}
|
|
99
|
+
#else
|
|
100
|
+
memset(from, 0, sizeof(mrb_value)*count);
|
|
116
101
|
#endif
|
|
117
102
|
}
|
|
118
103
|
|
|
119
104
|
static inline void
|
|
120
105
|
stack_copy(mrb_value *dst, const mrb_value *src, size_t size)
|
|
121
106
|
{
|
|
122
|
-
|
|
123
|
-
*dst++ = *src++;
|
|
124
|
-
}
|
|
107
|
+
memcpy(dst, src, sizeof(mrb_value)*size);
|
|
125
108
|
}
|
|
126
109
|
|
|
127
110
|
static void
|
|
@@ -132,14 +115,13 @@ stack_init(mrb_state *mrb)
|
|
|
132
115
|
/* mrb_assert(mrb->stack == NULL); */
|
|
133
116
|
c->stbase = (mrb_value *)mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value));
|
|
134
117
|
c->stend = c->stbase + STACK_INIT_SIZE;
|
|
135
|
-
c->stack = c->stbase;
|
|
136
118
|
|
|
137
119
|
/* mrb_assert(ci == NULL); */
|
|
138
120
|
c->cibase = (mrb_callinfo *)mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo));
|
|
139
121
|
c->ciend = c->cibase + CALLINFO_INIT_SIZE;
|
|
140
122
|
c->ci = c->cibase;
|
|
141
|
-
c->ci->target_class = mrb->object_class;
|
|
142
|
-
c->ci->
|
|
123
|
+
c->ci->u.target_class = mrb->object_class;
|
|
124
|
+
c->ci->stack = c->stbase;
|
|
143
125
|
}
|
|
144
126
|
|
|
145
127
|
static inline void
|
|
@@ -149,7 +131,7 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize
|
|
|
149
131
|
|
|
150
132
|
if (newbase == oldbase) return;
|
|
151
133
|
while (ci <= mrb->c->ci) {
|
|
152
|
-
struct REnv *e = ci
|
|
134
|
+
struct REnv *e = mrb_vm_ci_env(ci);
|
|
153
135
|
mrb_value *st;
|
|
154
136
|
|
|
155
137
|
if (e && MRB_ENV_ONSTACK_P(e) &&
|
|
@@ -159,7 +141,7 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize
|
|
|
159
141
|
e->stack = newbase + off;
|
|
160
142
|
}
|
|
161
143
|
|
|
162
|
-
if (ci->proc && MRB_PROC_ENV_P(ci->proc) &&
|
|
144
|
+
if (ci->proc && MRB_PROC_ENV_P(ci->proc) && e != MRB_PROC_ENV(ci->proc)) {
|
|
163
145
|
e = MRB_PROC_ENV(ci->proc);
|
|
164
146
|
|
|
165
147
|
if (e && MRB_ENV_ONSTACK_P(e) &&
|
|
@@ -170,7 +152,7 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t oldsize
|
|
|
170
152
|
}
|
|
171
153
|
}
|
|
172
154
|
|
|
173
|
-
ci->
|
|
155
|
+
ci->stack = newbase + (ci->stack - oldbase);
|
|
174
156
|
ci++;
|
|
175
157
|
}
|
|
176
158
|
}
|
|
@@ -184,7 +166,7 @@ stack_extend_alloc(mrb_state *mrb, mrb_int room)
|
|
|
184
166
|
mrb_value *newstack;
|
|
185
167
|
size_t oldsize = mrb->c->stend - mrb->c->stbase;
|
|
186
168
|
size_t size = oldsize;
|
|
187
|
-
size_t off = mrb->c->stack - mrb->c->
|
|
169
|
+
size_t off = mrb->c->ci->stack ? mrb->c->stend - mrb->c->ci->stack : 0;
|
|
188
170
|
|
|
189
171
|
if (off > size) size = off;
|
|
190
172
|
#ifdef MRB_STACK_EXTEND_DOUBLING
|
|
@@ -202,14 +184,13 @@ stack_extend_alloc(mrb_state *mrb, mrb_int room)
|
|
|
202
184
|
size += room;
|
|
203
185
|
#endif
|
|
204
186
|
|
|
205
|
-
newstack = (mrb_value *)
|
|
187
|
+
newstack = (mrb_value *)mrb_realloc_simple(mrb, mrb->c->stbase, sizeof(mrb_value) * size);
|
|
206
188
|
if (newstack == NULL) {
|
|
207
189
|
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
|
|
208
190
|
}
|
|
209
191
|
stack_clear(&(newstack[oldsize]), size - oldsize);
|
|
210
192
|
envadjust(mrb, oldbase, newstack, oldsize);
|
|
211
193
|
mrb->c->stbase = newstack;
|
|
212
|
-
mrb->c->stack = mrb->c->stbase + off;
|
|
213
194
|
mrb->c->stend = mrb->c->stbase + size;
|
|
214
195
|
|
|
215
196
|
/* Raise an exception if the new stack size will be too large,
|
|
@@ -222,15 +203,15 @@ stack_extend_alloc(mrb_state *mrb, mrb_int room)
|
|
|
222
203
|
MRB_API void
|
|
223
204
|
mrb_stack_extend(mrb_state *mrb, mrb_int room)
|
|
224
205
|
{
|
|
225
|
-
if (mrb->c->stack + room >= mrb->c->stend) {
|
|
206
|
+
if (!mrb->c->ci->stack || mrb->c->ci->stack + room >= mrb->c->stend) {
|
|
226
207
|
stack_extend_alloc(mrb, room);
|
|
227
208
|
}
|
|
228
209
|
}
|
|
229
210
|
|
|
230
211
|
static inline struct REnv*
|
|
231
|
-
uvenv(mrb_state *mrb,
|
|
212
|
+
uvenv(mrb_state *mrb, mrb_int up)
|
|
232
213
|
{
|
|
233
|
-
struct RProc *proc = mrb->c->ci->proc;
|
|
214
|
+
const struct RProc *proc = mrb->c->ci->proc;
|
|
234
215
|
struct REnv *e;
|
|
235
216
|
|
|
236
217
|
while (up--) {
|
|
@@ -245,7 +226,7 @@ uvenv(mrb_state *mrb, int up)
|
|
|
245
226
|
|
|
246
227
|
while (cb <= ci) {
|
|
247
228
|
if (ci->proc == proc) {
|
|
248
|
-
return ci
|
|
229
|
+
return mrb_vm_ci_env(ci);
|
|
249
230
|
}
|
|
250
231
|
ci--;
|
|
251
232
|
}
|
|
@@ -253,8 +234,8 @@ uvenv(mrb_state *mrb, int up)
|
|
|
253
234
|
return NULL;
|
|
254
235
|
}
|
|
255
236
|
|
|
256
|
-
static inline struct RProc*
|
|
257
|
-
top_proc(mrb_state *mrb, struct RProc *proc)
|
|
237
|
+
static inline const struct RProc*
|
|
238
|
+
top_proc(mrb_state *mrb, const struct RProc *proc)
|
|
258
239
|
{
|
|
259
240
|
while (proc->upper) {
|
|
260
241
|
if (MRB_PROC_SCOPE_P(proc) || MRB_PROC_STRICT_P(proc))
|
|
@@ -269,14 +250,12 @@ top_proc(mrb_state *mrb, struct RProc *proc)
|
|
|
269
250
|
#define CI_ACC_RESUMED -3
|
|
270
251
|
|
|
271
252
|
static inline mrb_callinfo*
|
|
272
|
-
cipush(mrb_state *mrb
|
|
253
|
+
cipush(mrb_state *mrb, mrb_int push_stacks, mrb_int acc,
|
|
254
|
+
struct RClass *target_class, const struct RProc *proc, mrb_sym mid, mrb_int argc)
|
|
273
255
|
{
|
|
274
256
|
struct mrb_context *c = mrb->c;
|
|
275
|
-
static const mrb_callinfo ci_zero = { 0 };
|
|
276
257
|
mrb_callinfo *ci = c->ci;
|
|
277
258
|
|
|
278
|
-
int ridx = ci->ridx;
|
|
279
|
-
|
|
280
259
|
if (ci + 1 == c->ciend) {
|
|
281
260
|
ptrdiff_t size = ci - c->cibase;
|
|
282
261
|
|
|
@@ -285,9 +264,12 @@ cipush(mrb_state *mrb)
|
|
|
285
264
|
c->ciend = c->cibase + size * 2;
|
|
286
265
|
}
|
|
287
266
|
ci = ++c->ci;
|
|
288
|
-
|
|
289
|
-
ci
|
|
290
|
-
ci->
|
|
267
|
+
ci->mid = mid;
|
|
268
|
+
mrb_vm_ci_proc_set(ci, proc);
|
|
269
|
+
ci->stack = ci[-1].stack + push_stacks;
|
|
270
|
+
ci->argc = (int16_t)argc;
|
|
271
|
+
ci->acc = (int16_t)acc;
|
|
272
|
+
ci->u.target_class = target_class;
|
|
291
273
|
|
|
292
274
|
return ci;
|
|
293
275
|
}
|
|
@@ -302,7 +284,7 @@ mrb_env_unshare(mrb_state *mrb, struct REnv *e)
|
|
|
302
284
|
|
|
303
285
|
if (!MRB_ENV_ONSTACK_P(e)) return;
|
|
304
286
|
if (e->cxt != mrb->c) return;
|
|
305
|
-
if (e == mrb->c->cibase
|
|
287
|
+
if (e == mrb_vm_ci_env(mrb->c->cibase)) return; /* for mirb */
|
|
306
288
|
p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
|
|
307
289
|
if (len > 0) {
|
|
308
290
|
stack_copy(p, e->stack, len);
|
|
@@ -313,73 +295,19 @@ mrb_env_unshare(mrb_state *mrb, struct REnv *e)
|
|
|
313
295
|
}
|
|
314
296
|
}
|
|
315
297
|
|
|
316
|
-
static inline
|
|
298
|
+
static inline mrb_callinfo*
|
|
317
299
|
cipop(mrb_state *mrb)
|
|
318
300
|
{
|
|
319
301
|
struct mrb_context *c = mrb->c;
|
|
320
|
-
struct REnv *env = c->ci
|
|
302
|
+
struct REnv *env = mrb_vm_ci_env(c->ci);
|
|
321
303
|
|
|
322
304
|
c->ci--;
|
|
323
305
|
if (env) mrb_env_unshare(mrb, env);
|
|
306
|
+
return c->ci;
|
|
324
307
|
}
|
|
325
308
|
|
|
326
309
|
void mrb_exc_set(mrb_state *mrb, mrb_value exc);
|
|
327
|
-
static mrb_value mrb_run(mrb_state *mrb, struct RProc* proc, mrb_value self);
|
|
328
|
-
|
|
329
|
-
static void
|
|
330
|
-
ecall(mrb_state *mrb)
|
|
331
|
-
{
|
|
332
|
-
struct RProc *p;
|
|
333
|
-
struct mrb_context *c = mrb->c;
|
|
334
|
-
mrb_callinfo *ci = c->ci;
|
|
335
|
-
struct RObject *exc;
|
|
336
|
-
struct REnv *env;
|
|
337
|
-
ptrdiff_t cioff;
|
|
338
|
-
int ai = mrb_gc_arena_save(mrb);
|
|
339
|
-
uint16_t i;
|
|
340
|
-
int nregs;
|
|
341
|
-
|
|
342
|
-
if (c->eidx == 0) return;
|
|
343
|
-
i = --c->eidx;
|
|
344
|
-
|
|
345
|
-
/* restrict total call depth of ecall() */
|
|
346
|
-
if (++mrb->ecall_nest > MRB_ECALL_DEPTH_MAX) {
|
|
347
|
-
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
|
|
348
|
-
}
|
|
349
|
-
p = c->ensure[i];
|
|
350
|
-
if (!p) return;
|
|
351
|
-
mrb_assert(!MRB_PROC_CFUNC_P(p));
|
|
352
|
-
c->ensure[i] = NULL;
|
|
353
|
-
nregs = p->upper->body.irep->nregs;
|
|
354
|
-
if (ci->proc && !MRB_PROC_CFUNC_P(ci->proc) &&
|
|
355
|
-
ci->proc->body.irep->nregs > nregs) {
|
|
356
|
-
nregs = ci->proc->body.irep->nregs;
|
|
357
|
-
}
|
|
358
|
-
cioff = ci - c->cibase;
|
|
359
|
-
ci = cipush(mrb);
|
|
360
|
-
ci->stackent = mrb->c->stack;
|
|
361
|
-
ci->mid = ci[-1].mid;
|
|
362
|
-
ci->acc = CI_ACC_SKIP;
|
|
363
|
-
ci->argc = 0;
|
|
364
|
-
ci->proc = p;
|
|
365
|
-
ci->target_class = MRB_PROC_TARGET_CLASS(p);
|
|
366
|
-
env = MRB_PROC_ENV(p);
|
|
367
|
-
mrb_assert(env);
|
|
368
|
-
c->stack += nregs;
|
|
369
|
-
exc = mrb->exc; mrb->exc = 0;
|
|
370
|
-
if (exc) {
|
|
371
|
-
mrb_gc_protect(mrb, mrb_obj_value(exc));
|
|
372
|
-
}
|
|
373
|
-
if (mrb->c->fib) {
|
|
374
|
-
mrb_gc_protect(mrb, mrb_obj_value(mrb->c->fib));
|
|
375
|
-
}
|
|
376
|
-
mrb_run(mrb, p, env->stack[0]);
|
|
377
|
-
mrb->c = c;
|
|
378
|
-
c->ci = c->cibase + cioff;
|
|
379
|
-
if (!mrb->exc) mrb->exc = exc;
|
|
380
|
-
mrb_gc_arena_restore(mrb, ai);
|
|
381
|
-
mrb->ecall_nest--;
|
|
382
|
-
}
|
|
310
|
+
static mrb_value mrb_run(mrb_state *mrb, const struct RProc* proc, mrb_value self);
|
|
383
311
|
|
|
384
312
|
#ifndef MRB_FUNCALL_ARGC_MAX
|
|
385
313
|
#define MRB_FUNCALL_ARGC_MAX 16
|
|
@@ -405,11 +333,30 @@ mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, mrb_int argc, ...)
|
|
|
405
333
|
return mrb_funcall_argv(mrb, self, mid, argc, argv);
|
|
406
334
|
}
|
|
407
335
|
|
|
408
|
-
|
|
336
|
+
MRB_API mrb_value
|
|
337
|
+
mrb_funcall_id(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, ...)
|
|
338
|
+
{
|
|
339
|
+
mrb_value argv[MRB_FUNCALL_ARGC_MAX];
|
|
340
|
+
va_list ap;
|
|
341
|
+
mrb_int i;
|
|
342
|
+
|
|
343
|
+
if (argc > MRB_FUNCALL_ARGC_MAX) {
|
|
344
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=" MRB_STRINGIZE(MRB_FUNCALL_ARGC_MAX) ")");
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
va_start(ap, argc);
|
|
348
|
+
for (i = 0; i < argc; i++) {
|
|
349
|
+
argv[i] = va_arg(ap, mrb_value);
|
|
350
|
+
}
|
|
351
|
+
va_end(ap);
|
|
352
|
+
return mrb_funcall_argv(mrb, self, mid, argc, argv);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
static mrb_int
|
|
409
356
|
ci_nregs(mrb_callinfo *ci)
|
|
410
357
|
{
|
|
411
|
-
struct RProc *p;
|
|
412
|
-
|
|
358
|
+
const struct RProc *p;
|
|
359
|
+
mrb_int n = 0;
|
|
413
360
|
|
|
414
361
|
if (!ci) return 3;
|
|
415
362
|
p = ci->proc;
|
|
@@ -447,7 +394,6 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
|
|
|
447
394
|
}
|
|
448
395
|
MRB_CATCH(&c_jmp) { /* error */
|
|
449
396
|
while (nth_ci < (mrb->c->ci - mrb->c->cibase)) {
|
|
450
|
-
mrb->c->stack = mrb->c->ci->stackent;
|
|
451
397
|
cipop(mrb);
|
|
452
398
|
}
|
|
453
399
|
mrb->jmp = 0;
|
|
@@ -460,10 +406,10 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
|
|
|
460
406
|
mrb_method_t m;
|
|
461
407
|
struct RClass *c;
|
|
462
408
|
mrb_callinfo *ci;
|
|
463
|
-
|
|
409
|
+
mrb_int n = ci_nregs(mrb->c->ci);
|
|
464
410
|
ptrdiff_t voff = -1;
|
|
465
411
|
|
|
466
|
-
if (!mrb->c->
|
|
412
|
+
if (!mrb->c->stbase) {
|
|
467
413
|
stack_init(mrb);
|
|
468
414
|
}
|
|
469
415
|
if (argc < 0) {
|
|
@@ -472,7 +418,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
|
|
|
472
418
|
c = mrb_class(mrb, self);
|
|
473
419
|
m = mrb_method_search_vm(mrb, &c, mid);
|
|
474
420
|
if (MRB_METHOD_UNDEF_P(m)) {
|
|
475
|
-
mrb_sym missing =
|
|
421
|
+
mrb_sym missing = MRB_SYM(method_missing);
|
|
476
422
|
mrb_value args = mrb_ary_new_from_values(mrb, argc, argv);
|
|
477
423
|
m = mrb_method_search_vm(mrb, &c, missing);
|
|
478
424
|
if (MRB_METHOD_UNDEF_P(m)) {
|
|
@@ -480,18 +426,13 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
|
|
|
480
426
|
}
|
|
481
427
|
mrb_ary_unshift(mrb, args, mrb_symbol_value(mid));
|
|
482
428
|
mrb_stack_extend(mrb, n+2);
|
|
483
|
-
mrb->c->stack[n+1] = args;
|
|
429
|
+
mrb->c->ci->stack[n+1] = args;
|
|
484
430
|
argc = -1;
|
|
485
431
|
}
|
|
486
432
|
if (mrb->c->ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) {
|
|
487
433
|
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
|
|
488
434
|
}
|
|
489
|
-
ci = cipush(mrb);
|
|
490
|
-
ci->mid = mid;
|
|
491
|
-
ci->stackent = mrb->c->stack;
|
|
492
|
-
ci->argc = (int)argc;
|
|
493
|
-
ci->target_class = c;
|
|
494
|
-
mrb->c->stack = mrb->c->stack + n;
|
|
435
|
+
ci = cipush(mrb, n, 0, c, NULL, mid, argc);
|
|
495
436
|
if (argc < 0) argc = 1;
|
|
496
437
|
if (mrb->c->stbase <= argv && argv < mrb->c->stend) {
|
|
497
438
|
voff = argv - mrb->c->stbase;
|
|
@@ -499,7 +440,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
|
|
|
499
440
|
if (argc >= CALL_MAXARGS) {
|
|
500
441
|
mrb_value args = mrb_ary_new_from_values(mrb, argc, argv);
|
|
501
442
|
|
|
502
|
-
mrb->c->stack[1] = args;
|
|
443
|
+
mrb->c->ci->stack[1] = args;
|
|
503
444
|
ci->argc = -1;
|
|
504
445
|
argc = 1;
|
|
505
446
|
}
|
|
@@ -507,7 +448,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
|
|
|
507
448
|
if (MRB_METHOD_PROC_P(m)) {
|
|
508
449
|
struct RProc *p = MRB_METHOD_PROC(m);
|
|
509
450
|
|
|
510
|
-
ci
|
|
451
|
+
mrb_vm_ci_proc_set(ci, p);
|
|
511
452
|
if (!MRB_PROC_CFUNC_P(p)) {
|
|
512
453
|
mrb_stack_extend(mrb, p->body.irep->nregs + argc);
|
|
513
454
|
}
|
|
@@ -515,16 +456,15 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
|
|
|
515
456
|
if (voff >= 0) {
|
|
516
457
|
argv = mrb->c->stbase + voff;
|
|
517
458
|
}
|
|
518
|
-
mrb->c->stack[0] = self;
|
|
459
|
+
mrb->c->ci->stack[0] = self;
|
|
519
460
|
if (ci->argc > 0) {
|
|
520
|
-
stack_copy(mrb->c->stack+1, argv, argc);
|
|
461
|
+
stack_copy(mrb->c->ci->stack+1, argv, argc);
|
|
521
462
|
}
|
|
522
|
-
mrb->c->stack[argc+1] = blk;
|
|
463
|
+
mrb->c->ci->stack[argc+1] = blk;
|
|
523
464
|
|
|
524
465
|
if (MRB_METHOD_CFUNC_P(m)) {
|
|
525
466
|
ci->acc = CI_ACC_DIRECT;
|
|
526
467
|
val = MRB_METHOD_CFUNC(m)(mrb, self);
|
|
527
|
-
mrb->c->stack = mrb->c->ci->stackent;
|
|
528
468
|
cipop(mrb);
|
|
529
469
|
}
|
|
530
470
|
else {
|
|
@@ -547,10 +487,10 @@ mrb_value
|
|
|
547
487
|
mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
|
|
548
488
|
{
|
|
549
489
|
mrb_callinfo *ci = mrb->c->ci;
|
|
550
|
-
|
|
490
|
+
mrb_int keep, nregs;
|
|
551
491
|
|
|
552
|
-
mrb->c->stack[0] = self;
|
|
553
|
-
ci
|
|
492
|
+
mrb->c->ci->stack[0] = self;
|
|
493
|
+
mrb_vm_ci_proc_set(ci, p);
|
|
554
494
|
if (MRB_PROC_CFUNC_P(p)) {
|
|
555
495
|
return MRB_PROC_CFUNC(p)(mrb, self);
|
|
556
496
|
}
|
|
@@ -562,14 +502,10 @@ mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p)
|
|
|
562
502
|
}
|
|
563
503
|
else {
|
|
564
504
|
mrb_stack_extend(mrb, nregs);
|
|
565
|
-
stack_clear(mrb->c->stack+keep, nregs-keep);
|
|
505
|
+
stack_clear(mrb->c->ci->stack+keep, nregs-keep);
|
|
566
506
|
}
|
|
567
507
|
|
|
568
|
-
|
|
569
|
-
ci->target_class = 0;
|
|
570
|
-
ci->pc = p->body.irep->iseq;
|
|
571
|
-
ci->stackent = mrb->c->stack;
|
|
572
|
-
ci->acc = 0;
|
|
508
|
+
cipush(mrb, 0, 0, NULL, NULL, 0, 0);
|
|
573
509
|
|
|
574
510
|
return self;
|
|
575
511
|
}
|
|
@@ -597,7 +533,8 @@ mrb_value
|
|
|
597
533
|
mrb_f_send(mrb_state *mrb, mrb_value self)
|
|
598
534
|
{
|
|
599
535
|
mrb_sym name;
|
|
600
|
-
mrb_value block, *
|
|
536
|
+
mrb_value block, *regs;
|
|
537
|
+
const mrb_value *argv;
|
|
601
538
|
mrb_int argc, i, len;
|
|
602
539
|
mrb_method_t m;
|
|
603
540
|
struct RClass *c;
|
|
@@ -617,8 +554,8 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
|
|
|
617
554
|
}
|
|
618
555
|
|
|
619
556
|
ci->mid = name;
|
|
620
|
-
ci->target_class = c;
|
|
621
|
-
regs = mrb->c->stack+1;
|
|
557
|
+
ci->u.target_class = c;
|
|
558
|
+
regs = mrb->c->ci->stack+1;
|
|
622
559
|
/* remove first symbol from arguments */
|
|
623
560
|
if (ci->argc >= 0) {
|
|
624
561
|
for (i=0,len=ci->argc; i<len; i++) {
|
|
@@ -632,7 +569,7 @@ mrb_f_send(mrb_state *mrb, mrb_value self)
|
|
|
632
569
|
|
|
633
570
|
if (MRB_METHOD_CFUNC_P(m)) {
|
|
634
571
|
if (MRB_METHOD_PROC_P(m)) {
|
|
635
|
-
ci
|
|
572
|
+
mrb_vm_ci_proc_set(ci, MRB_METHOD_PROC(m));
|
|
636
573
|
}
|
|
637
574
|
return MRB_METHOD_CFUNC(m)(mrb, self);
|
|
638
575
|
}
|
|
@@ -653,29 +590,25 @@ eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
|
|
|
653
590
|
if (ci->acc == CI_ACC_DIRECT) {
|
|
654
591
|
return mrb_yield_with_class(mrb, blk, 1, &self, self, c);
|
|
655
592
|
}
|
|
656
|
-
ci->target_class = c;
|
|
593
|
+
ci->u.target_class = c;
|
|
657
594
|
p = mrb_proc_ptr(blk);
|
|
658
|
-
ci
|
|
595
|
+
mrb_vm_ci_proc_set(ci, p);
|
|
659
596
|
ci->argc = 1;
|
|
660
597
|
ci->mid = ci[-1].mid;
|
|
661
598
|
if (MRB_PROC_CFUNC_P(p)) {
|
|
662
599
|
mrb_stack_extend(mrb, 3);
|
|
663
|
-
mrb->c->stack[0] = self;
|
|
664
|
-
mrb->c->stack[1] = self;
|
|
665
|
-
mrb->c->stack[2] = mrb_nil_value();
|
|
600
|
+
mrb->c->ci->stack[0] = self;
|
|
601
|
+
mrb->c->ci->stack[1] = self;
|
|
602
|
+
mrb->c->ci->stack[2] = mrb_nil_value();
|
|
666
603
|
return MRB_PROC_CFUNC(p)(mrb, self);
|
|
667
604
|
}
|
|
668
605
|
nregs = p->body.irep->nregs;
|
|
669
606
|
if (nregs < 3) nregs = 3;
|
|
670
607
|
mrb_stack_extend(mrb, nregs);
|
|
671
|
-
mrb->c->stack[0] = self;
|
|
672
|
-
mrb->c->stack[1] = self;
|
|
673
|
-
stack_clear(mrb->c->stack+2, nregs-2);
|
|
674
|
-
ci = cipush(mrb);
|
|
675
|
-
ci->target_class = 0;
|
|
676
|
-
ci->pc = p->body.irep->iseq;
|
|
677
|
-
ci->stackent = mrb->c->stack;
|
|
678
|
-
ci->acc = 0;
|
|
608
|
+
mrb->c->ci->stack[0] = self;
|
|
609
|
+
mrb->c->ci->stack[1] = self;
|
|
610
|
+
stack_clear(mrb->c->ci->stack+2, nregs-2);
|
|
611
|
+
ci = cipush(mrb, 0, 0, NULL, NULL, 0, 0);
|
|
679
612
|
|
|
680
613
|
return self;
|
|
681
614
|
}
|
|
@@ -740,7 +673,7 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
|
|
|
740
673
|
mrb_sym mid = mrb->c->ci->mid;
|
|
741
674
|
mrb_callinfo *ci;
|
|
742
675
|
mrb_value val;
|
|
743
|
-
|
|
676
|
+
mrb_int n;
|
|
744
677
|
|
|
745
678
|
if (mrb_nil_p(b)) {
|
|
746
679
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
|
|
@@ -751,13 +684,7 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
|
|
|
751
684
|
mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err));
|
|
752
685
|
}
|
|
753
686
|
p = mrb_proc_ptr(b);
|
|
754
|
-
ci = cipush(mrb);
|
|
755
|
-
ci->mid = mid;
|
|
756
|
-
ci->proc = p;
|
|
757
|
-
ci->target_class = c;
|
|
758
|
-
ci->acc = CI_ACC_SKIP;
|
|
759
|
-
ci->stackent = mrb->c->stack;
|
|
760
|
-
mrb->c->stack += n;
|
|
687
|
+
ci = cipush(mrb, n, CI_ACC_SKIP, c, p, mid, 0 /* dummy */);
|
|
761
688
|
if (argc >= CALL_MAXARGS) {
|
|
762
689
|
ci->argc = -1;
|
|
763
690
|
n = 3;
|
|
@@ -767,19 +694,18 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
|
|
|
767
694
|
n = argc + 2;
|
|
768
695
|
}
|
|
769
696
|
mrb_stack_extend(mrb, n);
|
|
770
|
-
mrb->c->stack[0] = self;
|
|
697
|
+
mrb->c->ci->stack[0] = self;
|
|
771
698
|
if (ci->argc < 0) {
|
|
772
|
-
mrb->c->stack[1] = mrb_ary_new_from_values(mrb, argc, argv);
|
|
699
|
+
mrb->c->ci->stack[1] = mrb_ary_new_from_values(mrb, argc, argv);
|
|
773
700
|
argc = 1;
|
|
774
701
|
}
|
|
775
702
|
else if (argc > 0) {
|
|
776
|
-
stack_copy(mrb->c->stack+1, argv, argc);
|
|
703
|
+
stack_copy(mrb->c->ci->stack+1, argv, argc);
|
|
777
704
|
}
|
|
778
|
-
mrb->c->stack[argc+1] = mrb_nil_value();
|
|
705
|
+
mrb->c->ci->stack[argc+1] = mrb_nil_value();
|
|
779
706
|
|
|
780
707
|
if (MRB_PROC_CFUNC_P(p)) {
|
|
781
708
|
val = MRB_PROC_CFUNC(p)(mrb, self);
|
|
782
|
-
mrb->c->stack = mrb->c->ci->stackent;
|
|
783
709
|
cipop(mrb);
|
|
784
710
|
}
|
|
785
711
|
else {
|
|
@@ -821,24 +747,63 @@ mrb_yield_cont(mrb_state *mrb, mrb_value b, mrb_value self, mrb_int argc, const
|
|
|
821
747
|
ci = mrb->c->ci;
|
|
822
748
|
|
|
823
749
|
mrb_stack_extend(mrb, 3);
|
|
824
|
-
mrb->c->stack[1] = mrb_ary_new_from_values(mrb, argc, argv);
|
|
825
|
-
mrb->c->stack[2] = mrb_nil_value();
|
|
750
|
+
mrb->c->ci->stack[1] = mrb_ary_new_from_values(mrb, argc, argv);
|
|
751
|
+
mrb->c->ci->stack[2] = mrb_nil_value();
|
|
826
752
|
ci->argc = -1;
|
|
827
753
|
return mrb_exec_irep(mrb, self, p);
|
|
828
754
|
}
|
|
829
755
|
|
|
830
756
|
static struct RBreak*
|
|
831
|
-
break_new(mrb_state *mrb, struct RProc *p, mrb_value val)
|
|
757
|
+
break_new(mrb_state *mrb, uint32_t tag, const struct RProc *p, mrb_value val)
|
|
832
758
|
{
|
|
833
759
|
struct RBreak *brk;
|
|
834
760
|
|
|
835
761
|
brk = (struct RBreak*)mrb_obj_alloc(mrb, MRB_TT_BREAK, NULL);
|
|
836
762
|
mrb_break_proc_set(brk, p);
|
|
837
763
|
mrb_break_value_set(brk, val);
|
|
764
|
+
mrb_break_tag_set(brk, tag);
|
|
838
765
|
|
|
839
766
|
return brk;
|
|
840
767
|
}
|
|
841
768
|
|
|
769
|
+
#define MRB_CATCH_FILTER_RESCUE (UINT32_C(1) << MRB_CATCH_RESCUE)
|
|
770
|
+
#define MRB_CATCH_FILTER_ENSURE (UINT32_C(1) << MRB_CATCH_ENSURE)
|
|
771
|
+
#define MRB_CATCH_FILTER_ALL (MRB_CATCH_FILTER_RESCUE | MRB_CATCH_FILTER_ENSURE)
|
|
772
|
+
|
|
773
|
+
static const struct mrb_irep_catch_handler *
|
|
774
|
+
catch_handler_find(mrb_state *mrb, mrb_callinfo *ci, const mrb_code *pc, uint32_t filter)
|
|
775
|
+
{
|
|
776
|
+
const mrb_irep *irep;
|
|
777
|
+
ptrdiff_t xpc;
|
|
778
|
+
size_t cnt;
|
|
779
|
+
const struct mrb_irep_catch_handler *e;
|
|
780
|
+
|
|
781
|
+
/* The comparison operators use `>` and `<=` because pc already points to the next instruction */
|
|
782
|
+
#define catch_cover_p(pc, beg, end) ((pc) > (ptrdiff_t)(beg) && (pc) <= (ptrdiff_t)(end))
|
|
783
|
+
|
|
784
|
+
if (ci->proc == NULL || MRB_PROC_CFUNC_P(ci->proc)) return NULL;
|
|
785
|
+
irep = ci->proc->body.irep;
|
|
786
|
+
if (irep->clen < 1) return NULL;
|
|
787
|
+
xpc = pc - irep->iseq;
|
|
788
|
+
/* If it retry at the top level, pc will be 0, so check with -1 as the start position */
|
|
789
|
+
mrb_assert(catch_cover_p(xpc, -1, irep->ilen));
|
|
790
|
+
if (!catch_cover_p(xpc, -1, irep->ilen)) return NULL;
|
|
791
|
+
|
|
792
|
+
/* Currently uses a simple linear search to avoid processing complexity. */
|
|
793
|
+
cnt = irep->clen;
|
|
794
|
+
e = mrb_irep_catch_handler_table(irep) + cnt - 1;
|
|
795
|
+
for (; cnt > 0; cnt --, e --) {
|
|
796
|
+
if (((UINT32_C(1) << e->type) & filter) &&
|
|
797
|
+
catch_cover_p(xpc, mrb_irep_catch_handler_unpack(e->begin), mrb_irep_catch_handler_unpack(e->end))) {
|
|
798
|
+
return e;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
#undef catch_cover_p
|
|
803
|
+
|
|
804
|
+
return NULL;
|
|
805
|
+
}
|
|
806
|
+
|
|
842
807
|
typedef enum {
|
|
843
808
|
LOCALJUMP_ERROR_RETURN = 0,
|
|
844
809
|
LOCALJUMP_ERROR_BREAK = 1,
|
|
@@ -869,7 +834,7 @@ argnum_error(mrb_state *mrb, mrb_int num)
|
|
|
869
834
|
mrb_int argc = mrb->c->ci->argc;
|
|
870
835
|
|
|
871
836
|
if (argc < 0) {
|
|
872
|
-
mrb_value args = mrb->c->stack[1];
|
|
837
|
+
mrb_value args = mrb->c->ci->stack[1];
|
|
873
838
|
if (mrb_array_p(args)) {
|
|
874
839
|
argc = RARRAY_LEN(args);
|
|
875
840
|
}
|
|
@@ -885,9 +850,71 @@ argnum_error(mrb_state *mrb, mrb_int num)
|
|
|
885
850
|
mrb_exc_set(mrb, exc);
|
|
886
851
|
}
|
|
887
852
|
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
853
|
+
static mrb_bool
|
|
854
|
+
break_tag_p(struct RBreak *brk, uint32_t tag)
|
|
855
|
+
{
|
|
856
|
+
return (brk != NULL && brk->tt == MRB_TT_BREAK) ? TRUE : FALSE;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
static void
|
|
860
|
+
prepare_tagged_break(mrb_state *mrb, uint32_t tag, const struct RProc *proc, mrb_value val)
|
|
861
|
+
{
|
|
862
|
+
if (break_tag_p((struct RBreak*)mrb->exc, tag)) {
|
|
863
|
+
mrb_break_tag_set((struct RBreak*)mrb->exc, tag);
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
866
|
+
mrb->exc = (struct RObject*)break_new(mrb, tag, proc, val);
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
#define THROW_TAGGED_BREAK(mrb, tag, proc, val) \
|
|
871
|
+
do { \
|
|
872
|
+
prepare_tagged_break(mrb, tag, proc, val); \
|
|
873
|
+
goto L_CATCH_TAGGED_BREAK; \
|
|
874
|
+
} while (0)
|
|
875
|
+
|
|
876
|
+
#define UNWIND_ENSURE(mrb, ci, pc, tag, proc, val) \
|
|
877
|
+
do { \
|
|
878
|
+
ch = catch_handler_find(mrb, ci, pc, MRB_CATCH_FILTER_ENSURE); \
|
|
879
|
+
if (ch) { \
|
|
880
|
+
THROW_TAGGED_BREAK(mrb, tag, proc, val); \
|
|
881
|
+
} \
|
|
882
|
+
} while (0)
|
|
883
|
+
|
|
884
|
+
/*
|
|
885
|
+
* CHECKPOINT_RESTORE(tag) {
|
|
886
|
+
* This part is executed when jumping by the same "tag" of RBreak (it is not executed the first time).
|
|
887
|
+
* Write the code required (initialization of variables, etc.) for the subsequent processing.
|
|
888
|
+
* }
|
|
889
|
+
* CHECKPOINT_MAIN(tag) {
|
|
890
|
+
* This part is always executed.
|
|
891
|
+
* }
|
|
892
|
+
* CHECKPOINT_END(tag);
|
|
893
|
+
*
|
|
894
|
+
* ...
|
|
895
|
+
*
|
|
896
|
+
* // Jump to CHECKPOINT_RESTORE with the same "tag".
|
|
897
|
+
* goto CHECKPOINT_LABEL_MAKE(tag);
|
|
898
|
+
*/
|
|
899
|
+
|
|
900
|
+
#define CHECKPOINT_LABEL_MAKE(tag) L_CHECKPOINT_ ## tag
|
|
901
|
+
|
|
902
|
+
#define CHECKPOINT_RESTORE(tag) \
|
|
903
|
+
do { \
|
|
904
|
+
if (FALSE) { \
|
|
905
|
+
CHECKPOINT_LABEL_MAKE(tag): \
|
|
906
|
+
do {
|
|
907
|
+
|
|
908
|
+
#define CHECKPOINT_MAIN(tag) \
|
|
909
|
+
} while (0); \
|
|
910
|
+
} \
|
|
911
|
+
do {
|
|
912
|
+
|
|
913
|
+
#define CHECKPOINT_END(tag) \
|
|
914
|
+
} while (0); \
|
|
915
|
+
} while (0)
|
|
916
|
+
|
|
917
|
+
#ifdef MRB_USE_DEBUG_HOOK
|
|
891
918
|
#define CODE_FETCH_HOOK(mrb, irep, pc, regs) if ((mrb)->code_fetch_hook) (mrb)->code_fetch_hook((mrb), (irep), (pc), (regs));
|
|
892
919
|
#else
|
|
893
920
|
#define CODE_FETCH_HOOK(mrb, irep, pc, regs)
|
|
@@ -899,24 +926,24 @@ argnum_error(mrb_state *mrb, mrb_int num)
|
|
|
899
926
|
#define BYTECODE_DECODER(x) (x)
|
|
900
927
|
#endif
|
|
901
928
|
|
|
902
|
-
#ifndef
|
|
929
|
+
#ifndef MRB_NO_DIRECT_THREADING
|
|
903
930
|
#if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER
|
|
904
931
|
#define DIRECT_THREADED
|
|
905
932
|
#endif
|
|
906
|
-
#endif /* ifndef
|
|
933
|
+
#endif /* ifndef MRB_NO_DIRECT_THREADING */
|
|
907
934
|
|
|
908
935
|
#ifndef DIRECT_THREADED
|
|
909
936
|
|
|
910
937
|
#define INIT_DISPATCH for (;;) { insn = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (insn) {
|
|
911
|
-
#define CASE(insn,ops) case insn:
|
|
912
|
-
#define NEXT
|
|
938
|
+
#define CASE(insn,ops) case insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc;
|
|
939
|
+
#define NEXT goto L_END_DISPATCH
|
|
913
940
|
#define JUMP NEXT
|
|
914
|
-
#define END_DISPATCH }}
|
|
941
|
+
#define END_DISPATCH L_END_DISPATCH:;}}
|
|
915
942
|
|
|
916
943
|
#else
|
|
917
944
|
|
|
918
945
|
#define INIT_DISPATCH JUMP; return mrb_nil_value();
|
|
919
|
-
#define CASE(insn,ops) L_ ## insn:
|
|
946
|
+
#define CASE(insn,ops) L_ ## insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc;
|
|
920
947
|
#define NEXT insn=BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[insn]
|
|
921
948
|
#define JUMP NEXT
|
|
922
949
|
|
|
@@ -925,22 +952,22 @@ argnum_error(mrb_state *mrb, mrb_int num)
|
|
|
925
952
|
#endif
|
|
926
953
|
|
|
927
954
|
MRB_API mrb_value
|
|
928
|
-
mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self,
|
|
955
|
+
mrb_vm_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, mrb_int stack_keep)
|
|
929
956
|
{
|
|
930
|
-
mrb_irep *irep = proc->body.irep;
|
|
957
|
+
const mrb_irep *irep = proc->body.irep;
|
|
931
958
|
mrb_value result;
|
|
932
959
|
struct mrb_context *c = mrb->c;
|
|
933
960
|
ptrdiff_t cioff = c->ci - c->cibase;
|
|
934
|
-
|
|
961
|
+
mrb_int nregs = irep->nregs;
|
|
935
962
|
|
|
936
|
-
if (!c->
|
|
963
|
+
if (!c->stbase) {
|
|
937
964
|
stack_init(mrb);
|
|
938
965
|
}
|
|
939
966
|
if (stack_keep > nregs)
|
|
940
967
|
nregs = stack_keep;
|
|
941
968
|
mrb_stack_extend(mrb, nregs);
|
|
942
|
-
stack_clear(c->stack + stack_keep, nregs - stack_keep);
|
|
943
|
-
c->stack[0] = self;
|
|
969
|
+
stack_clear(c->ci->stack + stack_keep, nregs - stack_keep);
|
|
970
|
+
c->ci->stack[0] = self;
|
|
944
971
|
result = mrb_vm_exec(mrb, proc, irep->iseq);
|
|
945
972
|
if (mrb->c != c) {
|
|
946
973
|
if (mrb->c->fib) {
|
|
@@ -957,8 +984,8 @@ mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stac
|
|
|
957
984
|
static mrb_bool
|
|
958
985
|
check_target_class(mrb_state *mrb)
|
|
959
986
|
{
|
|
960
|
-
if (!mrb->c->ci
|
|
961
|
-
mrb_value exc =
|
|
987
|
+
if (!mrb_vm_ci_target_class(mrb->c->ci)) {
|
|
988
|
+
mrb_value exc = mrb_exc_new_lit(mrb, E_TYPE_ERROR, "no target class or module");
|
|
962
989
|
mrb_exc_set(mrb, exc);
|
|
963
990
|
return FALSE;
|
|
964
991
|
}
|
|
@@ -968,21 +995,21 @@ check_target_class(mrb_state *mrb)
|
|
|
968
995
|
void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
|
|
969
996
|
|
|
970
997
|
MRB_API mrb_value
|
|
971
|
-
mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *pc)
|
|
998
|
+
mrb_vm_exec(mrb_state *mrb, const struct RProc *proc, const mrb_code *pc)
|
|
972
999
|
{
|
|
973
1000
|
/* mrb_assert(MRB_PROC_CFUNC_P(proc)) */
|
|
974
|
-
const
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
mrb_sym *syms = irep->syms;
|
|
1001
|
+
const mrb_irep *irep = proc->body.irep;
|
|
1002
|
+
const mrb_pool_value *pool = irep->pool;
|
|
1003
|
+
const mrb_sym *syms = irep->syms;
|
|
978
1004
|
mrb_code insn;
|
|
979
1005
|
int ai = mrb_gc_arena_save(mrb);
|
|
980
1006
|
struct mrb_jmpbuf *prev_jmp = mrb->jmp;
|
|
981
1007
|
struct mrb_jmpbuf c_jmp;
|
|
982
1008
|
uint32_t a;
|
|
983
1009
|
uint16_t b;
|
|
984
|
-
|
|
1010
|
+
uint16_t c;
|
|
985
1011
|
mrb_sym mid;
|
|
1012
|
+
const struct mrb_irep_catch_handler *ch;
|
|
986
1013
|
|
|
987
1014
|
#ifdef DIRECT_THREADED
|
|
988
1015
|
static void *optable[] = {
|
|
@@ -1005,9 +1032,9 @@ RETRY_TRY_BLOCK:
|
|
|
1005
1032
|
goto L_RAISE;
|
|
1006
1033
|
}
|
|
1007
1034
|
mrb->jmp = &c_jmp;
|
|
1008
|
-
mrb->c->ci
|
|
1035
|
+
mrb_vm_ci_proc_set(mrb->c->ci, proc);
|
|
1009
1036
|
|
|
1010
|
-
#define regs (mrb->c->stack)
|
|
1037
|
+
#define regs (mrb->c->ci->stack)
|
|
1011
1038
|
INIT_DISPATCH {
|
|
1012
1039
|
CASE(OP_NOP, Z) {
|
|
1013
1040
|
/* do nothing */
|
|
@@ -1019,28 +1046,48 @@ RETRY_TRY_BLOCK:
|
|
|
1019
1046
|
NEXT;
|
|
1020
1047
|
}
|
|
1021
1048
|
|
|
1049
|
+
CASE(OP_LOADL16, BS) {
|
|
1050
|
+
goto op_loadl;
|
|
1051
|
+
}
|
|
1022
1052
|
CASE(OP_LOADL, BB) {
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
#
|
|
1030
|
-
|
|
1053
|
+
op_loadl:
|
|
1054
|
+
switch (pool[b].tt) { /* number */
|
|
1055
|
+
case IREP_TT_INT32:
|
|
1056
|
+
regs[a] = mrb_int_value(mrb, (mrb_int)pool[b].u.i32);
|
|
1057
|
+
break;
|
|
1058
|
+
case IREP_TT_INT64:
|
|
1059
|
+
#if defined(MRB_INT64)
|
|
1060
|
+
regs[a] = mrb_int_value(mrb, (mrb_int)pool[b].u.i64);
|
|
1061
|
+
break;
|
|
1031
1062
|
#else
|
|
1032
|
-
|
|
1063
|
+
#if defined(MRB_64BIT)
|
|
1064
|
+
if (INT32_MIN <= pool[b].u.i64 && pool[b].u.i64 <= INT32_MAX) {
|
|
1065
|
+
regs[a] = mrb_int_value(mrb, (mrb_int)pool[b].u.i64);
|
|
1066
|
+
break;
|
|
1067
|
+
}
|
|
1068
|
+
#endif
|
|
1069
|
+
goto L_INT_OVERFLOW;
|
|
1070
|
+
#endif
|
|
1071
|
+
#ifndef MRB_NO_FLOAT
|
|
1072
|
+
case IREP_TT_FLOAT:
|
|
1073
|
+
regs[a] = mrb_float_value(mrb, pool[b].u.f);
|
|
1074
|
+
break;
|
|
1033
1075
|
#endif
|
|
1076
|
+
default:
|
|
1077
|
+
/* should not happen (tt:string) */
|
|
1078
|
+
regs[a] = mrb_nil_value();
|
|
1079
|
+
break;
|
|
1080
|
+
}
|
|
1034
1081
|
NEXT;
|
|
1035
1082
|
}
|
|
1036
1083
|
|
|
1037
1084
|
CASE(OP_LOADI, BB) {
|
|
1038
|
-
|
|
1085
|
+
SET_FIXNUM_VALUE(regs[a], b);
|
|
1039
1086
|
NEXT;
|
|
1040
1087
|
}
|
|
1041
1088
|
|
|
1042
1089
|
CASE(OP_LOADINEG, BB) {
|
|
1043
|
-
|
|
1090
|
+
SET_FIXNUM_VALUE(regs[a], -b);
|
|
1044
1091
|
NEXT;
|
|
1045
1092
|
}
|
|
1046
1093
|
|
|
@@ -1054,12 +1101,17 @@ RETRY_TRY_BLOCK:
|
|
|
1054
1101
|
CASE(OP_LOADI_6,B) goto L_LOADI;
|
|
1055
1102
|
CASE(OP_LOADI_7, B) {
|
|
1056
1103
|
L_LOADI:
|
|
1057
|
-
|
|
1104
|
+
SET_FIXNUM_VALUE(regs[a], (mrb_int)insn - (mrb_int)OP_LOADI_0);
|
|
1058
1105
|
NEXT;
|
|
1059
1106
|
}
|
|
1060
1107
|
|
|
1061
1108
|
CASE(OP_LOADI16, BS) {
|
|
1062
|
-
|
|
1109
|
+
SET_FIXNUM_VALUE(regs[a], (mrb_int)(int16_t)b);
|
|
1110
|
+
NEXT;
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
CASE(OP_LOADI32, BSS) {
|
|
1114
|
+
SET_INT_VALUE(mrb, regs[a], (int32_t)(((uint32_t)b<<16)+c));
|
|
1063
1115
|
NEXT;
|
|
1064
1116
|
}
|
|
1065
1117
|
|
|
@@ -1068,6 +1120,11 @@ RETRY_TRY_BLOCK:
|
|
|
1068
1120
|
NEXT;
|
|
1069
1121
|
}
|
|
1070
1122
|
|
|
1123
|
+
CASE(OP_LOADSYM16, BS) {
|
|
1124
|
+
SET_SYM_VALUE(regs[a], syms[b]);
|
|
1125
|
+
NEXT;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1071
1128
|
CASE(OP_LOADNIL, B) {
|
|
1072
1129
|
SET_NIL_VALUE(regs[a]);
|
|
1073
1130
|
NEXT;
|
|
@@ -1122,9 +1179,7 @@ RETRY_TRY_BLOCK:
|
|
|
1122
1179
|
|
|
1123
1180
|
CASE(OP_GETCV, BB) {
|
|
1124
1181
|
mrb_value val;
|
|
1125
|
-
ERR_PC_SET(mrb);
|
|
1126
1182
|
val = mrb_vm_cv_get(mrb, syms[b]);
|
|
1127
|
-
ERR_PC_CLR(mrb);
|
|
1128
1183
|
regs[a] = val;
|
|
1129
1184
|
NEXT;
|
|
1130
1185
|
}
|
|
@@ -1138,9 +1193,7 @@ RETRY_TRY_BLOCK:
|
|
|
1138
1193
|
mrb_value val;
|
|
1139
1194
|
mrb_sym sym = syms[b];
|
|
1140
1195
|
|
|
1141
|
-
ERR_PC_SET(mrb);
|
|
1142
1196
|
val = mrb_vm_const_get(mrb, sym);
|
|
1143
|
-
ERR_PC_CLR(mrb);
|
|
1144
1197
|
regs[a] = val;
|
|
1145
1198
|
NEXT;
|
|
1146
1199
|
}
|
|
@@ -1153,9 +1206,7 @@ RETRY_TRY_BLOCK:
|
|
|
1153
1206
|
CASE(OP_GETMCNST, BB) {
|
|
1154
1207
|
mrb_value val;
|
|
1155
1208
|
|
|
1156
|
-
ERR_PC_SET(mrb);
|
|
1157
1209
|
val = mrb_const_get(mrb, regs[a], syms[b]);
|
|
1158
|
-
ERR_PC_CLR(mrb);
|
|
1159
1210
|
regs[a] = val;
|
|
1160
1211
|
NEXT;
|
|
1161
1212
|
}
|
|
@@ -1193,57 +1244,75 @@ RETRY_TRY_BLOCK:
|
|
|
1193
1244
|
}
|
|
1194
1245
|
|
|
1195
1246
|
CASE(OP_JMP, S) {
|
|
1196
|
-
pc
|
|
1247
|
+
pc += (int16_t)a;
|
|
1197
1248
|
JUMP;
|
|
1198
1249
|
}
|
|
1199
1250
|
CASE(OP_JMPIF, BS) {
|
|
1200
1251
|
if (mrb_test(regs[a])) {
|
|
1201
|
-
pc
|
|
1252
|
+
pc += (int16_t)b;
|
|
1202
1253
|
JUMP;
|
|
1203
1254
|
}
|
|
1204
1255
|
NEXT;
|
|
1205
1256
|
}
|
|
1206
1257
|
CASE(OP_JMPNOT, BS) {
|
|
1207
1258
|
if (!mrb_test(regs[a])) {
|
|
1208
|
-
pc
|
|
1259
|
+
pc += (int16_t)b;
|
|
1209
1260
|
JUMP;
|
|
1210
1261
|
}
|
|
1211
1262
|
NEXT;
|
|
1212
1263
|
}
|
|
1213
1264
|
CASE(OP_JMPNIL, BS) {
|
|
1214
1265
|
if (mrb_nil_p(regs[a])) {
|
|
1215
|
-
pc
|
|
1266
|
+
pc += (int16_t)b;
|
|
1216
1267
|
JUMP;
|
|
1217
1268
|
}
|
|
1218
1269
|
NEXT;
|
|
1219
1270
|
}
|
|
1220
1271
|
|
|
1221
|
-
CASE(
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1272
|
+
CASE(OP_JMPUW, S) {
|
|
1273
|
+
a = (uint32_t)((pc - irep->iseq) + (int16_t)a);
|
|
1274
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_JUMP) {
|
|
1275
|
+
struct RBreak *brk = (struct RBreak*)mrb->exc;
|
|
1276
|
+
mrb_value target = mrb_break_value_get(brk);
|
|
1277
|
+
mrb_assert(mrb_integer_p(target));
|
|
1278
|
+
a = (uint32_t)mrb_integer(target);
|
|
1279
|
+
mrb_assert(a >= 0 && a < irep->ilen);
|
|
1227
1280
|
}
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
if (
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
mrb->c->rsize = UINT16_MAX;
|
|
1281
|
+
CHECKPOINT_MAIN(RBREAK_TAG_JUMP) {
|
|
1282
|
+
ch = catch_handler_find(mrb, mrb->c->ci, pc, MRB_CATCH_FILTER_ENSURE);
|
|
1283
|
+
if (ch) {
|
|
1284
|
+
/* avoiding a jump from a catch handler into the same handler */
|
|
1285
|
+
if (a < mrb_irep_catch_handler_unpack(ch->begin) || a >= mrb_irep_catch_handler_unpack(ch->end)) {
|
|
1286
|
+
THROW_TAGGED_BREAK(mrb, RBREAK_TAG_JUMP, proc, mrb_fixnum_value(a));
|
|
1235
1287
|
}
|
|
1236
1288
|
}
|
|
1237
|
-
mrb->c->rescue = (uint16_t*)mrb_realloc(mrb, mrb->c->rescue, sizeof(uint16_t)*mrb->c->rsize);
|
|
1238
1289
|
}
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1290
|
+
CHECKPOINT_END(RBREAK_TAG_JUMP);
|
|
1291
|
+
|
|
1292
|
+
mrb->exc = NULL; /* clear break object */
|
|
1293
|
+
pc = irep->iseq + a;
|
|
1294
|
+
JUMP;
|
|
1242
1295
|
}
|
|
1243
1296
|
|
|
1244
1297
|
CASE(OP_EXCEPT, B) {
|
|
1245
|
-
mrb_value exc
|
|
1246
|
-
|
|
1298
|
+
mrb_value exc;
|
|
1299
|
+
|
|
1300
|
+
if (mrb->exc == NULL) {
|
|
1301
|
+
exc = mrb_nil_value();
|
|
1302
|
+
}
|
|
1303
|
+
else {
|
|
1304
|
+
switch (mrb->exc->tt) {
|
|
1305
|
+
case MRB_TT_BREAK:
|
|
1306
|
+
case MRB_TT_EXCEPTION:
|
|
1307
|
+
exc = mrb_obj_value(mrb->exc);
|
|
1308
|
+
break;
|
|
1309
|
+
default:
|
|
1310
|
+
mrb_assert(!"bad mrb_type");
|
|
1311
|
+
exc = mrb_nil_value();
|
|
1312
|
+
break;
|
|
1313
|
+
}
|
|
1314
|
+
mrb->exc = NULL;
|
|
1315
|
+
}
|
|
1247
1316
|
regs[a] = exc;
|
|
1248
1317
|
NEXT;
|
|
1249
1318
|
}
|
|
@@ -1260,7 +1329,7 @@ RETRY_TRY_BLOCK:
|
|
|
1260
1329
|
{
|
|
1261
1330
|
mrb_value exc;
|
|
1262
1331
|
|
|
1263
|
-
exc =
|
|
1332
|
+
exc = mrb_exc_new_lit(mrb, E_TYPE_ERROR,
|
|
1264
1333
|
"class or module required for rescue clause");
|
|
1265
1334
|
mrb_exc_set(mrb, exc);
|
|
1266
1335
|
goto L_RAISE;
|
|
@@ -1271,82 +1340,19 @@ RETRY_TRY_BLOCK:
|
|
|
1271
1340
|
NEXT;
|
|
1272
1341
|
}
|
|
1273
1342
|
|
|
1274
|
-
CASE(
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
CASE(OP_RAISE, B) {
|
|
1280
|
-
mrb_exc_set(mrb, regs[a]);
|
|
1281
|
-
goto L_RAISE;
|
|
1282
|
-
}
|
|
1283
|
-
|
|
1284
|
-
CASE(OP_EPUSH, B) {
|
|
1285
|
-
struct RProc *p;
|
|
1286
|
-
|
|
1287
|
-
p = mrb_closure_new(mrb, irep->reps[a]);
|
|
1288
|
-
/* check ensure stack */
|
|
1289
|
-
if (mrb->c->eidx == UINT16_MAX-1) {
|
|
1290
|
-
mrb_value exc = mrb_exc_new_str_lit(mrb, E_RUNTIME_ERROR, "too many nested ensures");
|
|
1291
|
-
mrb_exc_set(mrb, exc);
|
|
1292
|
-
goto L_RAISE;
|
|
1343
|
+
CASE(OP_RAISEIF, B) {
|
|
1344
|
+
mrb_value exc = regs[a];
|
|
1345
|
+
if (mrb_break_p(exc)) {
|
|
1346
|
+
mrb->exc = mrb_obj_ptr(exc);
|
|
1347
|
+
goto L_BREAK;
|
|
1293
1348
|
}
|
|
1294
|
-
|
|
1295
|
-
if (mrb->
|
|
1296
|
-
|
|
1297
|
-
else {
|
|
1298
|
-
mrb->c->esize *= 2;
|
|
1299
|
-
if (mrb->c->esize <= mrb->c->eidx) {
|
|
1300
|
-
mrb->c->esize = UINT16_MAX;
|
|
1301
|
-
}
|
|
1302
|
-
}
|
|
1303
|
-
mrb->c->ensure = (struct RProc**)mrb_realloc(mrb, mrb->c->ensure, sizeof(struct RProc*)*mrb->c->esize);
|
|
1349
|
+
mrb_exc_set(mrb, exc);
|
|
1350
|
+
if (mrb->exc) {
|
|
1351
|
+
goto L_RAISE;
|
|
1304
1352
|
}
|
|
1305
|
-
/* push ensure stack */
|
|
1306
|
-
mrb->c->ensure[mrb->c->eidx++] = p;
|
|
1307
|
-
mrb->c->ensure[mrb->c->eidx] = NULL;
|
|
1308
|
-
mrb_gc_arena_restore(mrb, ai);
|
|
1309
1353
|
NEXT;
|
|
1310
1354
|
}
|
|
1311
1355
|
|
|
1312
|
-
CASE(OP_EPOP, B) {
|
|
1313
|
-
mrb_callinfo *ci = mrb->c->ci;
|
|
1314
|
-
unsigned int n, epos = ci->epos;
|
|
1315
|
-
mrb_value self = regs[0];
|
|
1316
|
-
struct RClass *target_class = ci->target_class;
|
|
1317
|
-
|
|
1318
|
-
if (mrb->c->eidx <= epos) {
|
|
1319
|
-
NEXT;
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
|
-
if (a > (int)mrb->c->eidx - epos)
|
|
1323
|
-
a = mrb->c->eidx - epos;
|
|
1324
|
-
for (n=0; n<a; n++) {
|
|
1325
|
-
int nregs = irep->nregs;
|
|
1326
|
-
|
|
1327
|
-
proc = mrb->c->ensure[epos+n];
|
|
1328
|
-
mrb->c->ensure[epos+n] = NULL;
|
|
1329
|
-
if (proc == NULL) continue;
|
|
1330
|
-
irep = proc->body.irep;
|
|
1331
|
-
ci = cipush(mrb);
|
|
1332
|
-
ci->mid = ci[-1].mid;
|
|
1333
|
-
ci->argc = 0;
|
|
1334
|
-
ci->proc = proc;
|
|
1335
|
-
ci->stackent = mrb->c->stack;
|
|
1336
|
-
ci->target_class = target_class;
|
|
1337
|
-
ci->pc = pc;
|
|
1338
|
-
ci->acc = nregs;
|
|
1339
|
-
mrb->c->stack += ci->acc;
|
|
1340
|
-
mrb_stack_extend(mrb, irep->nregs);
|
|
1341
|
-
regs[0] = self;
|
|
1342
|
-
pc = irep->iseq;
|
|
1343
|
-
}
|
|
1344
|
-
pool = irep->pool;
|
|
1345
|
-
syms = irep->syms;
|
|
1346
|
-
mrb->c->eidx = epos;
|
|
1347
|
-
JUMP;
|
|
1348
|
-
}
|
|
1349
|
-
|
|
1350
1356
|
CASE(OP_SENDV, BB) {
|
|
1351
1357
|
c = CALL_MAXARGS;
|
|
1352
1358
|
goto L_SEND;
|
|
@@ -1378,8 +1384,8 @@ RETRY_TRY_BLOCK:
|
|
|
1378
1384
|
mid = syms[b];
|
|
1379
1385
|
L_SENDB_SYM:
|
|
1380
1386
|
{
|
|
1381
|
-
|
|
1382
|
-
|
|
1387
|
+
mrb_int argc = (c == CALL_MAXARGS) ? -1 : c;
|
|
1388
|
+
mrb_int bidx = (argc < 0) ? a+2 : a+c+1;
|
|
1383
1389
|
mrb_method_t m;
|
|
1384
1390
|
struct RClass *cls;
|
|
1385
1391
|
mrb_callinfo *ci = mrb->c->ci;
|
|
@@ -1390,19 +1396,18 @@ RETRY_TRY_BLOCK:
|
|
|
1390
1396
|
recv = regs[a];
|
|
1391
1397
|
blk = regs[bidx];
|
|
1392
1398
|
if (!mrb_nil_p(blk) && !mrb_proc_p(blk)) {
|
|
1393
|
-
blk =
|
|
1394
|
-
/* The stack might have been reallocated during
|
|
1399
|
+
blk = mrb_type_convert(mrb, blk, MRB_TT_PROC, MRB_SYM(to_proc));
|
|
1400
|
+
/* The stack might have been reallocated during mrb_type_convert(),
|
|
1395
1401
|
see #3622 */
|
|
1396
1402
|
regs[bidx] = blk;
|
|
1397
1403
|
}
|
|
1398
1404
|
cls = mrb_class(mrb, recv);
|
|
1399
1405
|
m = mrb_method_search_vm(mrb, &cls, mid);
|
|
1400
1406
|
if (MRB_METHOD_UNDEF_P(m)) {
|
|
1401
|
-
mrb_sym missing =
|
|
1407
|
+
mrb_sym missing = MRB_SYM(method_missing);
|
|
1402
1408
|
m = mrb_method_search_vm(mrb, &cls, missing);
|
|
1403
1409
|
if (MRB_METHOD_UNDEF_P(m) || (missing == mrb->c->ci->mid && mrb_obj_eq(mrb, regs[0], recv))) {
|
|
1404
1410
|
mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, c, regs+a+1);
|
|
1405
|
-
ERR_PC_SET(mrb);
|
|
1406
1411
|
mrb_method_missing(mrb, mid, recv, args);
|
|
1407
1412
|
}
|
|
1408
1413
|
if (argc >= 0) {
|
|
@@ -1418,23 +1423,13 @@ RETRY_TRY_BLOCK:
|
|
|
1418
1423
|
}
|
|
1419
1424
|
|
|
1420
1425
|
/* push callinfo */
|
|
1421
|
-
ci = cipush(mrb);
|
|
1422
|
-
ci->mid = mid;
|
|
1423
|
-
ci->stackent = mrb->c->stack;
|
|
1424
|
-
ci->target_class = cls;
|
|
1425
|
-
ci->argc = argc;
|
|
1426
|
-
|
|
1427
|
-
ci->pc = pc;
|
|
1428
|
-
ci->acc = a;
|
|
1429
|
-
|
|
1430
|
-
/* prepare stack */
|
|
1431
|
-
mrb->c->stack += a;
|
|
1426
|
+
ci = cipush(mrb, a, a, cls, NULL, mid, argc);
|
|
1432
1427
|
|
|
1433
1428
|
if (MRB_METHOD_CFUNC_P(m)) {
|
|
1434
1429
|
if (MRB_METHOD_PROC_P(m)) {
|
|
1435
1430
|
struct RProc *p = MRB_METHOD_PROC(m);
|
|
1436
1431
|
|
|
1437
|
-
ci
|
|
1432
|
+
mrb_vm_ci_proc_set(ci, p);
|
|
1438
1433
|
recv = p->body.func(mrb, recv);
|
|
1439
1434
|
}
|
|
1440
1435
|
else if (MRB_METHOD_NOARG_P(m) &&
|
|
@@ -1451,11 +1446,11 @@ RETRY_TRY_BLOCK:
|
|
|
1451
1446
|
ci = mrb->c->ci;
|
|
1452
1447
|
if (mrb_proc_p(blk)) {
|
|
1453
1448
|
struct RProc *p = mrb_proc_ptr(blk);
|
|
1454
|
-
if (p && !MRB_PROC_STRICT_P(p) && MRB_PROC_ENV(p) == ci[-1]
|
|
1449
|
+
if (p && !MRB_PROC_STRICT_P(p) && MRB_PROC_ENV(p) == mrb_vm_ci_env(&ci[-1])) {
|
|
1455
1450
|
p->flags |= MRB_PROC_ORPHAN;
|
|
1456
1451
|
}
|
|
1457
1452
|
}
|
|
1458
|
-
if (!ci->target_class) { /* return from context modifying method (resume/yield) */
|
|
1453
|
+
if (!ci->u.target_class) { /* return from context modifying method (resume/yield) */
|
|
1459
1454
|
if (ci->acc == CI_ACC_RESUMED) {
|
|
1460
1455
|
mrb->jmp = prev_jmp;
|
|
1461
1456
|
return recv;
|
|
@@ -1468,16 +1463,15 @@ RETRY_TRY_BLOCK:
|
|
|
1468
1463
|
syms = irep->syms;
|
|
1469
1464
|
}
|
|
1470
1465
|
}
|
|
1471
|
-
mrb->c->stack[0] = recv;
|
|
1466
|
+
mrb->c->ci->stack[0] = recv;
|
|
1472
1467
|
/* pop stackpos */
|
|
1473
|
-
|
|
1468
|
+
ci = cipop(mrb);
|
|
1474
1469
|
pc = ci->pc;
|
|
1475
|
-
cipop(mrb);
|
|
1476
1470
|
JUMP;
|
|
1477
1471
|
}
|
|
1478
1472
|
else {
|
|
1479
1473
|
/* setup environment for calling method */
|
|
1480
|
-
|
|
1474
|
+
mrb_vm_ci_proc_set(ci, (proc = MRB_METHOD_PROC(m)));
|
|
1481
1475
|
irep = proc->body.irep;
|
|
1482
1476
|
pool = irep->pool;
|
|
1483
1477
|
syms = irep->syms;
|
|
@@ -1489,13 +1483,13 @@ RETRY_TRY_BLOCK:
|
|
|
1489
1483
|
|
|
1490
1484
|
CASE(OP_CALL, Z) {
|
|
1491
1485
|
mrb_callinfo *ci;
|
|
1492
|
-
mrb_value recv = mrb->c->stack[0];
|
|
1486
|
+
mrb_value recv = mrb->c->ci->stack[0];
|
|
1493
1487
|
struct RProc *m = mrb_proc_ptr(recv);
|
|
1494
1488
|
|
|
1495
1489
|
/* replace callinfo */
|
|
1496
1490
|
ci = mrb->c->ci;
|
|
1497
|
-
ci->target_class = MRB_PROC_TARGET_CLASS(m);
|
|
1498
|
-
ci
|
|
1491
|
+
ci->u.target_class = MRB_PROC_TARGET_CLASS(m);
|
|
1492
|
+
mrb_vm_ci_proc_set(ci, m);
|
|
1499
1493
|
if (MRB_PROC_ENV_P(m)) {
|
|
1500
1494
|
ci->mid = MRB_PROC_ENV(m)->mid;
|
|
1501
1495
|
}
|
|
@@ -1507,11 +1501,9 @@ RETRY_TRY_BLOCK:
|
|
|
1507
1501
|
mrb_gc_arena_shrink(mrb, ai);
|
|
1508
1502
|
if (mrb->exc) goto L_RAISE;
|
|
1509
1503
|
/* pop stackpos */
|
|
1510
|
-
ci = mrb
|
|
1511
|
-
mrb->c->stack = ci->stackent;
|
|
1512
|
-
regs[ci->acc] = recv;
|
|
1504
|
+
ci = cipop(mrb);
|
|
1513
1505
|
pc = ci->pc;
|
|
1514
|
-
|
|
1506
|
+
regs[ci[1].acc] = recv;
|
|
1515
1507
|
irep = mrb->c->ci->proc->body.irep;
|
|
1516
1508
|
pool = irep->pool;
|
|
1517
1509
|
syms = irep->syms;
|
|
@@ -1522,10 +1514,10 @@ RETRY_TRY_BLOCK:
|
|
|
1522
1514
|
proc = m;
|
|
1523
1515
|
irep = m->body.irep;
|
|
1524
1516
|
if (!irep) {
|
|
1525
|
-
mrb->c->stack[0] = mrb_nil_value();
|
|
1517
|
+
mrb->c->ci->stack[0] = mrb_nil_value();
|
|
1526
1518
|
a = 0;
|
|
1527
1519
|
c = OP_R_NORMAL;
|
|
1528
|
-
goto
|
|
1520
|
+
goto L_RETURN;
|
|
1529
1521
|
}
|
|
1530
1522
|
pool = irep->pool;
|
|
1531
1523
|
syms = irep->syms;
|
|
@@ -1547,13 +1539,13 @@ RETRY_TRY_BLOCK:
|
|
|
1547
1539
|
}
|
|
1548
1540
|
|
|
1549
1541
|
CASE(OP_SUPER, BB) {
|
|
1550
|
-
|
|
1542
|
+
mrb_int argc = (b == CALL_MAXARGS) ? -1 : b;
|
|
1551
1543
|
int bidx = (argc < 0) ? a+2 : a+b+1;
|
|
1552
1544
|
mrb_method_t m;
|
|
1553
1545
|
struct RClass *cls;
|
|
1554
1546
|
mrb_callinfo *ci = mrb->c->ci;
|
|
1555
1547
|
mrb_value recv, blk;
|
|
1556
|
-
struct RProc *p = ci->proc;
|
|
1548
|
+
const struct RProc *p = ci->proc;
|
|
1557
1549
|
mrb_sym mid = ci->mid;
|
|
1558
1550
|
struct RClass* target_class = MRB_PROC_TARGET_CLASS(p);
|
|
1559
1551
|
|
|
@@ -1563,37 +1555,40 @@ RETRY_TRY_BLOCK:
|
|
|
1563
1555
|
mrb_assert(bidx < irep->nregs);
|
|
1564
1556
|
|
|
1565
1557
|
if (mid == 0 || !target_class) {
|
|
1566
|
-
mrb_value exc =
|
|
1558
|
+
mrb_value exc = mrb_exc_new_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
|
|
1567
1559
|
mrb_exc_set(mrb, exc);
|
|
1568
1560
|
goto L_RAISE;
|
|
1569
1561
|
}
|
|
1570
|
-
if (target_class->
|
|
1571
|
-
target_class = ci
|
|
1562
|
+
if (target_class->flags & MRB_FL_CLASS_IS_PREPENDED) {
|
|
1563
|
+
target_class = mrb_vm_ci_target_class(ci);
|
|
1564
|
+
}
|
|
1565
|
+
else if (target_class->tt == MRB_TT_MODULE) {
|
|
1566
|
+
target_class = mrb_vm_ci_target_class(ci);
|
|
1572
1567
|
if (target_class->tt != MRB_TT_ICLASS) {
|
|
1573
|
-
mrb_value exc =
|
|
1568
|
+
mrb_value exc = mrb_exc_new_lit(mrb, E_RUNTIME_ERROR, "superclass info lost [mruby limitations]");
|
|
1574
1569
|
mrb_exc_set(mrb, exc);
|
|
1575
1570
|
goto L_RAISE;
|
|
1576
1571
|
}
|
|
1577
1572
|
}
|
|
1578
1573
|
recv = regs[0];
|
|
1579
1574
|
if (!mrb_obj_is_kind_of(mrb, recv, target_class)) {
|
|
1580
|
-
mrb_value exc =
|
|
1575
|
+
mrb_value exc = mrb_exc_new_lit(mrb, E_TYPE_ERROR,
|
|
1581
1576
|
"self has wrong type to call super in this context");
|
|
1582
1577
|
mrb_exc_set(mrb, exc);
|
|
1583
1578
|
goto L_RAISE;
|
|
1584
1579
|
}
|
|
1585
1580
|
blk = regs[bidx];
|
|
1586
1581
|
if (!mrb_nil_p(blk) && !mrb_proc_p(blk)) {
|
|
1587
|
-
blk =
|
|
1582
|
+
blk = mrb_type_convert(mrb, blk, MRB_TT_PROC, MRB_SYM(to_proc));
|
|
1588
1583
|
/* The stack or ci stack might have been reallocated during
|
|
1589
|
-
|
|
1584
|
+
mrb_type_convert(), see #3622 and #3784 */
|
|
1590
1585
|
regs[bidx] = blk;
|
|
1591
1586
|
ci = mrb->c->ci;
|
|
1592
1587
|
}
|
|
1593
1588
|
cls = target_class->super;
|
|
1594
1589
|
m = mrb_method_search_vm(mrb, &cls, mid);
|
|
1595
1590
|
if (MRB_METHOD_UNDEF_P(m)) {
|
|
1596
|
-
mrb_sym missing =
|
|
1591
|
+
mrb_sym missing = MRB_SYM(method_missing);
|
|
1597
1592
|
|
|
1598
1593
|
if (mid != missing) {
|
|
1599
1594
|
cls = mrb_class(mrb, recv);
|
|
@@ -1601,7 +1596,6 @@ RETRY_TRY_BLOCK:
|
|
|
1601
1596
|
m = mrb_method_search_vm(mrb, &cls, missing);
|
|
1602
1597
|
if (MRB_METHOD_UNDEF_P(m)) {
|
|
1603
1598
|
mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, b, regs+a+1);
|
|
1604
|
-
ERR_PC_SET(mrb);
|
|
1605
1599
|
mrb_method_missing(mrb, mid, recv, args);
|
|
1606
1600
|
}
|
|
1607
1601
|
mid = missing;
|
|
@@ -1617,28 +1611,23 @@ RETRY_TRY_BLOCK:
|
|
|
1617
1611
|
}
|
|
1618
1612
|
|
|
1619
1613
|
/* push callinfo */
|
|
1620
|
-
ci = cipush(mrb);
|
|
1621
|
-
ci->mid = mid;
|
|
1622
|
-
ci->stackent = mrb->c->stack;
|
|
1623
|
-
ci->target_class = cls;
|
|
1624
|
-
ci->pc = pc;
|
|
1625
|
-
ci->argc = argc;
|
|
1614
|
+
ci = cipush(mrb, a, 0, cls, NULL, mid, argc);
|
|
1626
1615
|
|
|
1627
1616
|
/* prepare stack */
|
|
1628
|
-
mrb->c->stack
|
|
1629
|
-
mrb->c->stack[0] = recv;
|
|
1617
|
+
mrb->c->ci->stack[0] = recv;
|
|
1630
1618
|
|
|
1631
1619
|
if (MRB_METHOD_CFUNC_P(m)) {
|
|
1632
1620
|
mrb_value v;
|
|
1633
1621
|
|
|
1634
1622
|
if (MRB_METHOD_PROC_P(m)) {
|
|
1635
|
-
ci
|
|
1623
|
+
mrb_vm_ci_proc_set(ci, MRB_METHOD_PROC(m));
|
|
1636
1624
|
}
|
|
1637
1625
|
v = MRB_METHOD_CFUNC(m)(mrb, recv);
|
|
1638
1626
|
mrb_gc_arena_restore(mrb, ai);
|
|
1639
1627
|
if (mrb->exc) goto L_RAISE;
|
|
1640
1628
|
ci = mrb->c->ci;
|
|
1641
|
-
|
|
1629
|
+
mrb_assert(!mrb_break_p(v));
|
|
1630
|
+
if (!mrb_vm_ci_target_class(ci)) { /* return from context modifying method (resume/yield) */
|
|
1642
1631
|
if (ci->acc == CI_ACC_RESUMED) {
|
|
1643
1632
|
mrb->jmp = prev_jmp;
|
|
1644
1633
|
return v;
|
|
@@ -1651,11 +1640,9 @@ RETRY_TRY_BLOCK:
|
|
|
1651
1640
|
syms = irep->syms;
|
|
1652
1641
|
}
|
|
1653
1642
|
}
|
|
1654
|
-
mrb->c->stack[0] = v;
|
|
1655
|
-
|
|
1656
|
-
mrb->c->stack = ci->stackent;
|
|
1643
|
+
mrb->c->ci->stack[0] = v;
|
|
1644
|
+
ci = cipop(mrb);
|
|
1657
1645
|
pc = ci->pc;
|
|
1658
|
-
cipop(mrb);
|
|
1659
1646
|
JUMP;
|
|
1660
1647
|
}
|
|
1661
1648
|
else {
|
|
@@ -1663,7 +1650,7 @@ RETRY_TRY_BLOCK:
|
|
|
1663
1650
|
ci->acc = a;
|
|
1664
1651
|
|
|
1665
1652
|
/* setup environment for calling method */
|
|
1666
|
-
|
|
1653
|
+
mrb_vm_ci_proc_set(ci, (proc = MRB_METHOD_PROC(m)));
|
|
1667
1654
|
irep = proc->body.irep;
|
|
1668
1655
|
pool = irep->pool;
|
|
1669
1656
|
syms = irep->syms;
|
|
@@ -1674,18 +1661,18 @@ RETRY_TRY_BLOCK:
|
|
|
1674
1661
|
}
|
|
1675
1662
|
|
|
1676
1663
|
CASE(OP_ARGARY, BS) {
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1664
|
+
mrb_int m1 = (b>>11)&0x3f;
|
|
1665
|
+
mrb_int r = (b>>10)&0x1;
|
|
1666
|
+
mrb_int m2 = (b>>5)&0x1f;
|
|
1667
|
+
mrb_int kd = (b>>4)&0x1;
|
|
1668
|
+
mrb_int lv = (b>>0)&0xf;
|
|
1682
1669
|
mrb_value *stack;
|
|
1683
1670
|
|
|
1684
|
-
if (mrb->c->ci->mid == 0 || mrb->c->ci
|
|
1671
|
+
if (mrb->c->ci->mid == 0 || mrb_vm_ci_target_class(mrb->c->ci) == NULL) {
|
|
1685
1672
|
mrb_value exc;
|
|
1686
1673
|
|
|
1687
1674
|
L_NOSUPER:
|
|
1688
|
-
exc =
|
|
1675
|
+
exc = mrb_exc_new_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
|
|
1689
1676
|
mrb_exc_set(mrb, exc);
|
|
1690
1677
|
goto L_RAISE;
|
|
1691
1678
|
}
|
|
@@ -1703,13 +1690,13 @@ RETRY_TRY_BLOCK:
|
|
|
1703
1690
|
else {
|
|
1704
1691
|
mrb_value *pp = NULL;
|
|
1705
1692
|
struct RArray *rest;
|
|
1706
|
-
|
|
1693
|
+
mrb_int len = 0;
|
|
1707
1694
|
|
|
1708
1695
|
if (mrb_array_p(stack[m1])) {
|
|
1709
1696
|
struct RArray *ary = mrb_ary_ptr(stack[m1]);
|
|
1710
1697
|
|
|
1711
1698
|
pp = ARY_PTR(ary);
|
|
1712
|
-
len =
|
|
1699
|
+
len = ARY_LEN(ary);
|
|
1713
1700
|
}
|
|
1714
1701
|
regs[a] = mrb_ary_new_capa(mrb, m1+len+m2+kd);
|
|
1715
1702
|
rest = mrb_ary_ptr(regs[a]);
|
|
@@ -1733,22 +1720,22 @@ RETRY_TRY_BLOCK:
|
|
|
1733
1720
|
}
|
|
1734
1721
|
|
|
1735
1722
|
CASE(OP_ENTER, W) {
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1723
|
+
mrb_int m1 = MRB_ASPEC_REQ(a);
|
|
1724
|
+
mrb_int o = MRB_ASPEC_OPT(a);
|
|
1725
|
+
mrb_int r = MRB_ASPEC_REST(a);
|
|
1726
|
+
mrb_int m2 = MRB_ASPEC_POST(a);
|
|
1727
|
+
mrb_int kd = (MRB_ASPEC_KEY(a) > 0 || MRB_ASPEC_KDICT(a))? 1 : 0;
|
|
1741
1728
|
/* unused
|
|
1742
1729
|
int b = MRB_ASPEC_BLOCK(a);
|
|
1743
1730
|
*/
|
|
1744
|
-
|
|
1731
|
+
mrb_int argc = mrb->c->ci->argc;
|
|
1745
1732
|
mrb_value *argv = regs+1;
|
|
1746
1733
|
mrb_value * const argv0 = argv;
|
|
1747
|
-
|
|
1748
|
-
|
|
1734
|
+
mrb_int const len = m1 + o + r + m2;
|
|
1735
|
+
mrb_int const blk_pos = len + kd + 1;
|
|
1749
1736
|
mrb_value *blk = &argv[argc < 0 ? 1 : argc];
|
|
1750
|
-
mrb_value kdict;
|
|
1751
|
-
|
|
1737
|
+
mrb_value kdict = mrb_nil_value();
|
|
1738
|
+
mrb_int kargs = kd;
|
|
1752
1739
|
|
|
1753
1740
|
/* arguments is passed with Array */
|
|
1754
1741
|
if (argc < 0) {
|
|
@@ -1800,7 +1787,7 @@ RETRY_TRY_BLOCK:
|
|
|
1800
1787
|
|
|
1801
1788
|
/* no rest arguments */
|
|
1802
1789
|
if (argc-kargs < len) {
|
|
1803
|
-
|
|
1790
|
+
mrb_int mlen = m2;
|
|
1804
1791
|
if (argc < m1+m2) {
|
|
1805
1792
|
mlen = m1 < argc ? argc - m1 : 0;
|
|
1806
1793
|
}
|
|
@@ -1808,7 +1795,7 @@ RETRY_TRY_BLOCK:
|
|
|
1808
1795
|
if (kd) regs[len + 1] = kdict;
|
|
1809
1796
|
|
|
1810
1797
|
/* copy mandatory and optional arguments */
|
|
1811
|
-
if (argv0 != argv) {
|
|
1798
|
+
if (argv0 != argv && argv) {
|
|
1812
1799
|
value_move(®s[1], argv, argc-mlen); /* m1 + o */
|
|
1813
1800
|
}
|
|
1814
1801
|
if (argc < m1) {
|
|
@@ -1821,16 +1808,16 @@ RETRY_TRY_BLOCK:
|
|
|
1821
1808
|
if (mlen < m2) {
|
|
1822
1809
|
stack_clear(®s[len-m2+mlen+1], m2-mlen);
|
|
1823
1810
|
}
|
|
1824
|
-
/*
|
|
1811
|
+
/* initialize rest arguments with empty Array */
|
|
1825
1812
|
if (r) {
|
|
1826
1813
|
regs[m1+o+1] = mrb_ary_new_capa(mrb, 0);
|
|
1827
1814
|
}
|
|
1828
|
-
/* skip
|
|
1815
|
+
/* skip initializer of passed arguments */
|
|
1829
1816
|
if (o > 0 && argc-kargs > m1+m2)
|
|
1830
1817
|
pc += (argc - kargs - m1 - m2)*3;
|
|
1831
1818
|
}
|
|
1832
1819
|
else {
|
|
1833
|
-
|
|
1820
|
+
mrb_int rnum = 0;
|
|
1834
1821
|
if (argv0 != argv) {
|
|
1835
1822
|
regs[blk_pos] = *blk; /* move block */
|
|
1836
1823
|
if (kd) regs[len + 1] = kdict;
|
|
@@ -1856,7 +1843,7 @@ RETRY_TRY_BLOCK:
|
|
|
1856
1843
|
}
|
|
1857
1844
|
|
|
1858
1845
|
/* format arguments for generated code */
|
|
1859
|
-
mrb->c->ci->argc = len + kd;
|
|
1846
|
+
mrb->c->ci->argc = (int16_t)(len + kd);
|
|
1860
1847
|
|
|
1861
1848
|
/* clear local (but non-argument) variables */
|
|
1862
1849
|
if (irep->nlocals-blk_pos-1 > 0) {
|
|
@@ -1916,13 +1903,7 @@ RETRY_TRY_BLOCK:
|
|
|
1916
1903
|
c = OP_R_NORMAL;
|
|
1917
1904
|
L_RETURN:
|
|
1918
1905
|
{
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
#define ecall_adjust() do {\
|
|
1922
|
-
ptrdiff_t cioff = ci - mrb->c->cibase;\
|
|
1923
|
-
ecall(mrb);\
|
|
1924
|
-
ci = mrb->c->cibase + cioff;\
|
|
1925
|
-
} while (0)
|
|
1906
|
+
mrb_callinfo *ci;
|
|
1926
1907
|
|
|
1927
1908
|
ci = mrb->c->ci;
|
|
1928
1909
|
if (ci->mid) {
|
|
@@ -1938,42 +1919,38 @@ RETRY_TRY_BLOCK:
|
|
|
1938
1919
|
struct RProc *p = mrb_proc_ptr(blk);
|
|
1939
1920
|
|
|
1940
1921
|
if (!MRB_PROC_STRICT_P(p) &&
|
|
1941
|
-
ci > mrb->c->cibase && MRB_PROC_ENV(p) == ci[-1]
|
|
1922
|
+
ci > mrb->c->cibase && MRB_PROC_ENV(p) == mrb_vm_ci_env(&ci[-1])) {
|
|
1942
1923
|
p->flags |= MRB_PROC_ORPHAN;
|
|
1943
1924
|
}
|
|
1944
1925
|
}
|
|
1945
1926
|
}
|
|
1946
1927
|
|
|
1947
1928
|
if (mrb->exc) {
|
|
1948
|
-
mrb_callinfo *ci0;
|
|
1949
|
-
|
|
1950
1929
|
L_RAISE:
|
|
1951
|
-
|
|
1930
|
+
ci = mrb->c->ci;
|
|
1952
1931
|
if (ci == mrb->c->cibase) {
|
|
1953
|
-
|
|
1954
|
-
goto
|
|
1932
|
+
ch = catch_handler_find(mrb, ci, pc, MRB_CATCH_FILTER_ALL);
|
|
1933
|
+
if (ch == NULL) goto L_FTOP;
|
|
1934
|
+
goto L_CATCH;
|
|
1955
1935
|
}
|
|
1956
|
-
while (ci
|
|
1957
|
-
cipop(mrb);
|
|
1958
|
-
|
|
1959
|
-
if (ci->acc == CI_ACC_SKIP && prev_jmp) {
|
|
1936
|
+
while ((ch = catch_handler_find(mrb, ci, pc, MRB_CATCH_FILTER_ALL)) == NULL) {
|
|
1937
|
+
ci = cipop(mrb);
|
|
1938
|
+
if (ci[1].acc == CI_ACC_SKIP && prev_jmp) {
|
|
1960
1939
|
mrb->jmp = prev_jmp;
|
|
1961
1940
|
MRB_THROW(prev_jmp);
|
|
1962
1941
|
}
|
|
1963
|
-
|
|
1942
|
+
pc = ci[0].pc;
|
|
1964
1943
|
if (ci == mrb->c->cibase) {
|
|
1965
|
-
|
|
1944
|
+
ch = catch_handler_find(mrb, ci, pc, MRB_CATCH_FILTER_ALL);
|
|
1945
|
+
if (ch == NULL) {
|
|
1966
1946
|
L_FTOP: /* fiber top */
|
|
1967
1947
|
if (mrb->c == mrb->root_c) {
|
|
1968
|
-
mrb->c->stack = mrb->c->stbase;
|
|
1948
|
+
mrb->c->ci->stack = mrb->c->stbase;
|
|
1969
1949
|
goto L_STOP;
|
|
1970
1950
|
}
|
|
1971
1951
|
else {
|
|
1972
1952
|
struct mrb_context *c = mrb->c;
|
|
1973
1953
|
|
|
1974
|
-
while (c->eidx > ci->epos) {
|
|
1975
|
-
ecall_adjust();
|
|
1976
|
-
}
|
|
1977
1954
|
c->status = MRB_FIBER_TERMINATED;
|
|
1978
1955
|
mrb->c = c->prev;
|
|
1979
1956
|
c->prev = NULL;
|
|
@@ -1982,29 +1959,23 @@ RETRY_TRY_BLOCK:
|
|
|
1982
1959
|
}
|
|
1983
1960
|
break;
|
|
1984
1961
|
}
|
|
1985
|
-
/* call ensure only when we skip this callinfo */
|
|
1986
|
-
if (ci[0].ridx == ci[-1].ridx) {
|
|
1987
|
-
while (mrb->c->eidx > ci->epos) {
|
|
1988
|
-
ecall_adjust();
|
|
1989
|
-
}
|
|
1990
|
-
}
|
|
1991
1962
|
}
|
|
1992
|
-
|
|
1993
|
-
if (
|
|
1963
|
+
L_CATCH:
|
|
1964
|
+
if (ch == NULL) goto L_STOP;
|
|
1965
|
+
if (FALSE) {
|
|
1966
|
+
L_CATCH_TAGGED_BREAK: /* from THROW_TAGGED_BREAK() or UNWIND_ENSURE() */
|
|
1967
|
+
ci = mrb->c->ci;
|
|
1968
|
+
}
|
|
1994
1969
|
proc = ci->proc;
|
|
1995
1970
|
irep = proc->body.irep;
|
|
1996
1971
|
pool = irep->pool;
|
|
1997
1972
|
syms = irep->syms;
|
|
1998
|
-
if (ci < ci0) {
|
|
1999
|
-
mrb->c->stack = ci[1].stackent;
|
|
2000
|
-
}
|
|
2001
1973
|
mrb_stack_extend(mrb, irep->nregs);
|
|
2002
|
-
pc = irep->iseq+
|
|
1974
|
+
pc = irep->iseq + mrb_irep_catch_handler_unpack(ch->target);
|
|
2003
1975
|
}
|
|
2004
1976
|
else {
|
|
2005
|
-
|
|
1977
|
+
mrb_int acc;
|
|
2006
1978
|
mrb_value v;
|
|
2007
|
-
struct RProc *dst;
|
|
2008
1979
|
|
|
2009
1980
|
ci = mrb->c->ci;
|
|
2010
1981
|
v = regs[a];
|
|
@@ -2013,7 +1984,9 @@ RETRY_TRY_BLOCK:
|
|
|
2013
1984
|
case OP_R_RETURN:
|
|
2014
1985
|
/* Fall through to OP_R_NORMAL otherwise */
|
|
2015
1986
|
if (ci->acc >=0 && MRB_PROC_ENV_P(proc) && !MRB_PROC_STRICT_P(proc)) {
|
|
2016
|
-
|
|
1987
|
+
const struct RProc *dst;
|
|
1988
|
+
mrb_callinfo *cibase;
|
|
1989
|
+
cibase = mrb->c->cibase;
|
|
2017
1990
|
dst = top_proc(mrb, proc);
|
|
2018
1991
|
|
|
2019
1992
|
if (MRB_PROC_ENV_P(dst)) {
|
|
@@ -2024,44 +1997,79 @@ RETRY_TRY_BLOCK:
|
|
|
2024
1997
|
goto L_RAISE;
|
|
2025
1998
|
}
|
|
2026
1999
|
}
|
|
2000
|
+
/* check jump destination */
|
|
2027
2001
|
while (cibase <= ci && ci->proc != dst) {
|
|
2028
|
-
if (ci->acc < 0) {
|
|
2002
|
+
if (ci->acc < 0) { /* jump cross C boudary */
|
|
2029
2003
|
localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
|
|
2030
2004
|
goto L_RAISE;
|
|
2031
2005
|
}
|
|
2032
2006
|
ci--;
|
|
2033
2007
|
}
|
|
2034
|
-
if (ci <= cibase) {
|
|
2008
|
+
if (ci <= cibase) { /* no jump destination */
|
|
2035
2009
|
localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
|
|
2036
2010
|
goto L_RAISE;
|
|
2037
2011
|
}
|
|
2012
|
+
ci = mrb->c->ci;
|
|
2013
|
+
while (cibase <= ci && ci->proc != dst) {
|
|
2014
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_RETURN_BLOCK) {
|
|
2015
|
+
cibase = mrb->c->cibase;
|
|
2016
|
+
dst = top_proc(mrb, proc);
|
|
2017
|
+
}
|
|
2018
|
+
CHECKPOINT_MAIN(RBREAK_TAG_RETURN_BLOCK) {
|
|
2019
|
+
UNWIND_ENSURE(mrb, ci, pc, RBREAK_TAG_RETURN_BLOCK, proc, v);
|
|
2020
|
+
}
|
|
2021
|
+
CHECKPOINT_END(RBREAK_TAG_RETURN_BLOCK);
|
|
2022
|
+
ci = cipop(mrb);
|
|
2023
|
+
pc = ci->pc;
|
|
2024
|
+
}
|
|
2025
|
+
proc = ci->proc;
|
|
2026
|
+
mrb->exc = NULL; /* clear break object */
|
|
2038
2027
|
break;
|
|
2039
2028
|
}
|
|
2040
2029
|
/* fallthrough */
|
|
2041
2030
|
case OP_R_NORMAL:
|
|
2042
2031
|
NORMAL_RETURN:
|
|
2043
2032
|
if (ci == mrb->c->cibase) {
|
|
2044
|
-
struct mrb_context *c
|
|
2033
|
+
struct mrb_context *c;
|
|
2034
|
+
c = mrb->c;
|
|
2045
2035
|
|
|
2046
2036
|
if (!c->prev) { /* toplevel return */
|
|
2047
2037
|
regs[irep->nlocals] = v;
|
|
2048
|
-
goto
|
|
2038
|
+
goto CHECKPOINT_LABEL_MAKE(RBREAK_TAG_STOP);
|
|
2049
2039
|
}
|
|
2050
|
-
if (c->prev->ci == c->prev->cibase) {
|
|
2051
|
-
mrb_value exc =
|
|
2040
|
+
if (!c->vmexec && c->prev->ci == c->prev->cibase) {
|
|
2041
|
+
mrb_value exc = mrb_exc_new_lit(mrb, E_FIBER_ERROR, "double resume");
|
|
2052
2042
|
mrb_exc_set(mrb, exc);
|
|
2053
2043
|
goto L_RAISE;
|
|
2054
2044
|
}
|
|
2055
|
-
|
|
2056
|
-
|
|
2045
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_RETURN_TOPLEVEL) {
|
|
2046
|
+
c = mrb->c;
|
|
2047
|
+
}
|
|
2048
|
+
CHECKPOINT_MAIN(RBREAK_TAG_RETURN_TOPLEVEL) {
|
|
2049
|
+
UNWIND_ENSURE(mrb, ci, pc, RBREAK_TAG_RETURN_TOPLEVEL, proc, v);
|
|
2057
2050
|
}
|
|
2051
|
+
CHECKPOINT_END(RBREAK_TAG_RETURN_TOPLEVEL);
|
|
2058
2052
|
/* automatic yield at the end */
|
|
2059
2053
|
c->status = MRB_FIBER_TERMINATED;
|
|
2060
2054
|
mrb->c = c->prev;
|
|
2061
|
-
c->prev = NULL;
|
|
2062
2055
|
mrb->c->status = MRB_FIBER_RUNNING;
|
|
2056
|
+
c->prev = NULL;
|
|
2057
|
+
if (c->vmexec) {
|
|
2058
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
2059
|
+
c->vmexec = FALSE;
|
|
2060
|
+
mrb->jmp = prev_jmp;
|
|
2061
|
+
return v;
|
|
2062
|
+
}
|
|
2063
2063
|
ci = mrb->c->ci;
|
|
2064
2064
|
}
|
|
2065
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_RETURN) {
|
|
2066
|
+
/* do nothing */
|
|
2067
|
+
}
|
|
2068
|
+
CHECKPOINT_MAIN(RBREAK_TAG_RETURN) {
|
|
2069
|
+
UNWIND_ENSURE(mrb, ci, pc, RBREAK_TAG_RETURN, proc, v);
|
|
2070
|
+
}
|
|
2071
|
+
CHECKPOINT_END(RBREAK_TAG_RETURN);
|
|
2072
|
+
mrb->exc = NULL; /* clear break object */
|
|
2065
2073
|
break;
|
|
2066
2074
|
case OP_R_BREAK:
|
|
2067
2075
|
if (MRB_PROC_STRICT_P(proc)) goto NORMAL_RETURN;
|
|
@@ -2069,7 +2077,7 @@ RETRY_TRY_BLOCK:
|
|
|
2069
2077
|
mrb_value exc;
|
|
2070
2078
|
|
|
2071
2079
|
L_BREAK_ERROR:
|
|
2072
|
-
exc =
|
|
2080
|
+
exc = mrb_exc_new_lit(mrb, E_LOCALJUMP_ERROR,
|
|
2073
2081
|
"break from proc-closure");
|
|
2074
2082
|
mrb_exc_set(mrb, exc);
|
|
2075
2083
|
goto L_RAISE;
|
|
@@ -2084,9 +2092,13 @@ RETRY_TRY_BLOCK:
|
|
|
2084
2092
|
goto L_BREAK_ERROR;
|
|
2085
2093
|
}
|
|
2086
2094
|
}
|
|
2087
|
-
|
|
2088
|
-
|
|
2095
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_BREAK) {
|
|
2096
|
+
/* do nothing */
|
|
2097
|
+
}
|
|
2098
|
+
CHECKPOINT_MAIN(RBREAK_TAG_BREAK) {
|
|
2099
|
+
UNWIND_ENSURE(mrb, ci, pc, RBREAK_TAG_BREAK, proc, v);
|
|
2089
2100
|
}
|
|
2101
|
+
CHECKPOINT_END(RBREAK_TAG_BREAK);
|
|
2090
2102
|
/* break from fiber block */
|
|
2091
2103
|
if (ci == mrb->c->cibase && ci->pc) {
|
|
2092
2104
|
struct mrb_context *c = mrb->c;
|
|
@@ -2096,61 +2108,77 @@ RETRY_TRY_BLOCK:
|
|
|
2096
2108
|
ci = mrb->c->ci;
|
|
2097
2109
|
}
|
|
2098
2110
|
if (ci->acc < 0) {
|
|
2111
|
+
ci = cipop(mrb);
|
|
2099
2112
|
mrb_gc_arena_restore(mrb, ai);
|
|
2100
2113
|
mrb->c->vmexec = FALSE;
|
|
2101
|
-
mrb->exc = (struct RObject*)break_new(mrb, proc, v);
|
|
2114
|
+
mrb->exc = (struct RObject*)break_new(mrb, RBREAK_TAG_BREAK, proc, v);
|
|
2102
2115
|
mrb->jmp = prev_jmp;
|
|
2103
2116
|
MRB_THROW(prev_jmp);
|
|
2104
2117
|
}
|
|
2105
2118
|
if (FALSE) {
|
|
2119
|
+
struct RBreak *brk;
|
|
2120
|
+
|
|
2106
2121
|
L_BREAK:
|
|
2107
|
-
|
|
2108
|
-
proc = mrb_break_proc_get(
|
|
2109
|
-
|
|
2122
|
+
brk = (struct RBreak*)mrb->exc;
|
|
2123
|
+
proc = mrb_break_proc_get(brk);
|
|
2124
|
+
v = mrb_break_value_get(brk);
|
|
2110
2125
|
ci = mrb->c->ci;
|
|
2126
|
+
|
|
2127
|
+
switch (mrb_break_tag_get(brk)) {
|
|
2128
|
+
#define DISPATCH_CHECKPOINTS(n, i) case n: goto CHECKPOINT_LABEL_MAKE(n);
|
|
2129
|
+
RBREAK_TAG_FOREACH(DISPATCH_CHECKPOINTS)
|
|
2130
|
+
#undef DISPATCH_CHECKPOINTS
|
|
2131
|
+
default:
|
|
2132
|
+
mrb_assert(!"wrong break tag");
|
|
2133
|
+
}
|
|
2111
2134
|
}
|
|
2112
|
-
mrb->c->
|
|
2113
|
-
proc = proc->upper;
|
|
2114
|
-
while (mrb->c->cibase < ci && ci[-1].proc != proc) {
|
|
2135
|
+
while (mrb->c->cibase < ci && ci[-1].proc != proc->upper) {
|
|
2115
2136
|
if (ci[-1].acc == CI_ACC_SKIP) {
|
|
2116
|
-
while (ci < mrb->c->ci) {
|
|
2117
|
-
cipop(mrb);
|
|
2118
|
-
}
|
|
2119
2137
|
goto L_BREAK_ERROR;
|
|
2120
2138
|
}
|
|
2121
|
-
|
|
2139
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_BREAK_UPPER) {
|
|
2140
|
+
/* do nothing */
|
|
2141
|
+
}
|
|
2142
|
+
CHECKPOINT_MAIN(RBREAK_TAG_BREAK_UPPER) {
|
|
2143
|
+
UNWIND_ENSURE(mrb, ci, pc, RBREAK_TAG_BREAK_UPPER, proc, v);
|
|
2144
|
+
}
|
|
2145
|
+
CHECKPOINT_END(RBREAK_TAG_BREAK_UPPER);
|
|
2146
|
+
ci = cipop(mrb);
|
|
2147
|
+
pc = ci->pc;
|
|
2148
|
+
}
|
|
2149
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_BREAK_INTARGET) {
|
|
2150
|
+
/* do nothing */
|
|
2151
|
+
}
|
|
2152
|
+
CHECKPOINT_MAIN(RBREAK_TAG_BREAK_INTARGET) {
|
|
2153
|
+
UNWIND_ENSURE(mrb, ci, pc, RBREAK_TAG_BREAK_INTARGET, proc, v);
|
|
2122
2154
|
}
|
|
2155
|
+
CHECKPOINT_END(RBREAK_TAG_BREAK_INTARGET);
|
|
2123
2156
|
if (ci == mrb->c->cibase) {
|
|
2124
2157
|
goto L_BREAK_ERROR;
|
|
2125
2158
|
}
|
|
2159
|
+
mrb->exc = NULL; /* clear break object */
|
|
2126
2160
|
break;
|
|
2127
2161
|
default:
|
|
2128
2162
|
/* cannot happen */
|
|
2129
2163
|
break;
|
|
2130
2164
|
}
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
while (mrb->c->eidx > ci->epos) {
|
|
2136
|
-
ecall_adjust();
|
|
2137
|
-
}
|
|
2138
|
-
if (mrb->c->vmexec && !ci->target_class) {
|
|
2165
|
+
mrb_assert(ci == mrb->c->ci);
|
|
2166
|
+
mrb_assert(mrb->exc == NULL);
|
|
2167
|
+
|
|
2168
|
+
if (mrb->c->vmexec && !mrb_vm_ci_target_class(ci)) {
|
|
2139
2169
|
mrb_gc_arena_restore(mrb, ai);
|
|
2140
2170
|
mrb->c->vmexec = FALSE;
|
|
2141
2171
|
mrb->jmp = prev_jmp;
|
|
2142
2172
|
return v;
|
|
2143
2173
|
}
|
|
2144
2174
|
acc = ci->acc;
|
|
2145
|
-
|
|
2146
|
-
cipop(mrb);
|
|
2175
|
+
ci = cipop(mrb);
|
|
2147
2176
|
if (acc == CI_ACC_SKIP || acc == CI_ACC_DIRECT) {
|
|
2148
2177
|
mrb_gc_arena_restore(mrb, ai);
|
|
2149
2178
|
mrb->jmp = prev_jmp;
|
|
2150
2179
|
return v;
|
|
2151
2180
|
}
|
|
2152
|
-
pc = ci
|
|
2153
|
-
ci = mrb->c->ci;
|
|
2181
|
+
pc = ci[0].pc;
|
|
2154
2182
|
DEBUG(fprintf(stderr, "from :%s\n", mrb_sym_name(mrb, ci->mid)));
|
|
2155
2183
|
proc = mrb->c->ci->proc;
|
|
2156
2184
|
irep = proc->body.irep;
|
|
@@ -2189,34 +2217,40 @@ RETRY_TRY_BLOCK:
|
|
|
2189
2217
|
NEXT;
|
|
2190
2218
|
}
|
|
2191
2219
|
|
|
2220
|
+
L_INT_OVERFLOW:
|
|
2221
|
+
{
|
|
2222
|
+
mrb_value exc = mrb_exc_new_lit(mrb, E_RANGE_ERROR, "integer overflow");
|
|
2223
|
+
mrb_exc_set(mrb, exc);
|
|
2224
|
+
}
|
|
2225
|
+
goto L_RAISE;
|
|
2226
|
+
|
|
2192
2227
|
#define TYPES2(a,b) ((((uint16_t)(a))<<8)|(((uint16_t)(b))&0xff))
|
|
2193
2228
|
#define OP_MATH(op_name) \
|
|
2194
2229
|
/* need to check if op is overridden */ \
|
|
2195
2230
|
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) { \
|
|
2196
|
-
|
|
2197
|
-
OP_MATH_CASE_FLOAT(op_name,
|
|
2198
|
-
OP_MATH_CASE_FLOAT(op_name, float,
|
|
2231
|
+
OP_MATH_CASE_INTEGER(op_name); \
|
|
2232
|
+
OP_MATH_CASE_FLOAT(op_name, integer, float); \
|
|
2233
|
+
OP_MATH_CASE_FLOAT(op_name, float, integer); \
|
|
2199
2234
|
OP_MATH_CASE_FLOAT(op_name, float, float); \
|
|
2200
2235
|
OP_MATH_CASE_STRING_##op_name(); \
|
|
2201
2236
|
default: \
|
|
2202
2237
|
c = 1; \
|
|
2203
|
-
mid =
|
|
2238
|
+
mid = MRB_OPSYM(op_name); \
|
|
2204
2239
|
goto L_SEND_SYM; \
|
|
2205
2240
|
} \
|
|
2206
2241
|
NEXT;
|
|
2207
|
-
#define
|
|
2208
|
-
case TYPES2(
|
|
2242
|
+
#define OP_MATH_CASE_INTEGER(op_name) \
|
|
2243
|
+
case TYPES2(MRB_TT_INTEGER, MRB_TT_INTEGER): \
|
|
2209
2244
|
{ \
|
|
2210
|
-
mrb_int x =
|
|
2245
|
+
mrb_int x = mrb_integer(regs[a]), y = mrb_integer(regs[a+1]), z; \
|
|
2211
2246
|
if (mrb_int_##op_name##_overflow(x, y, &z)) \
|
|
2212
|
-
OP_MATH_OVERFLOW_INT(
|
|
2247
|
+
OP_MATH_OVERFLOW_INT(); \
|
|
2213
2248
|
else \
|
|
2214
|
-
SET_INT_VALUE(regs[a], z);
|
|
2249
|
+
SET_INT_VALUE(mrb,regs[a], z); \
|
|
2215
2250
|
} \
|
|
2216
2251
|
break
|
|
2217
|
-
#ifdef
|
|
2252
|
+
#ifdef MRB_NO_FLOAT
|
|
2218
2253
|
#define OP_MATH_CASE_FLOAT(op_name, t1, t2) (void)0
|
|
2219
|
-
#define OP_MATH_OVERFLOW_INT(op_name, x, y, z) SET_INT_VALUE(regs[a], z)
|
|
2220
2254
|
#else
|
|
2221
2255
|
#define OP_MATH_CASE_FLOAT(op_name, t1, t2) \
|
|
2222
2256
|
case TYPES2(OP_MATH_TT_##t1, OP_MATH_TT_##t2): \
|
|
@@ -2225,9 +2259,8 @@ RETRY_TRY_BLOCK:
|
|
|
2225
2259
|
SET_FLOAT_VALUE(mrb, regs[a], z); \
|
|
2226
2260
|
} \
|
|
2227
2261
|
break
|
|
2228
|
-
#define OP_MATH_OVERFLOW_INT(op_name, x, y, z) \
|
|
2229
|
-
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x OP_MATH_OP_##op_name (mrb_float)y)
|
|
2230
2262
|
#endif
|
|
2263
|
+
#define OP_MATH_OVERFLOW_INT() goto L_INT_OVERFLOW
|
|
2231
2264
|
#define OP_MATH_CASE_STRING_add() \
|
|
2232
2265
|
case TYPES2(MRB_TT_STRING, MRB_TT_STRING): \
|
|
2233
2266
|
regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]); \
|
|
@@ -2238,8 +2271,8 @@ RETRY_TRY_BLOCK:
|
|
|
2238
2271
|
#define OP_MATH_OP_add +
|
|
2239
2272
|
#define OP_MATH_OP_sub -
|
|
2240
2273
|
#define OP_MATH_OP_mul *
|
|
2241
|
-
#define
|
|
2242
|
-
#define OP_MATH_TT_float
|
|
2274
|
+
#define OP_MATH_TT_integer MRB_TT_INTEGER
|
|
2275
|
+
#define OP_MATH_TT_float MRB_TT_FLOAT
|
|
2243
2276
|
|
|
2244
2277
|
CASE(OP_ADD, B) {
|
|
2245
2278
|
OP_MATH(add);
|
|
@@ -2254,31 +2287,30 @@ RETRY_TRY_BLOCK:
|
|
|
2254
2287
|
}
|
|
2255
2288
|
|
|
2256
2289
|
CASE(OP_DIV, B) {
|
|
2257
|
-
|
|
2258
|
-
|
|
2290
|
+
mrb_int mrb_num_div_int(mrb_state *mrb, mrb_int x, mrb_int y);
|
|
2291
|
+
#ifndef MRB_NO_FLOAT
|
|
2292
|
+
mrb_float mrb_num_div_flo(mrb_state *mrb, mrb_float x, mrb_float y);
|
|
2293
|
+
mrb_float x, y, f;
|
|
2259
2294
|
#endif
|
|
2260
2295
|
|
|
2261
2296
|
/* need to check if op is overridden */
|
|
2262
2297
|
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
|
|
2263
|
-
case TYPES2(
|
|
2264
|
-
#ifdef MRB_WITHOUT_FLOAT
|
|
2298
|
+
case TYPES2(MRB_TT_INTEGER,MRB_TT_INTEGER):
|
|
2265
2299
|
{
|
|
2266
|
-
mrb_int x =
|
|
2267
|
-
mrb_int y =
|
|
2268
|
-
|
|
2300
|
+
mrb_int x = mrb_integer(regs[a]);
|
|
2301
|
+
mrb_int y = mrb_integer(regs[a+1]);
|
|
2302
|
+
mrb_int div = mrb_num_div_int(mrb, x, y);
|
|
2303
|
+
SET_INT_VALUE(mrb, regs[a], div);
|
|
2269
2304
|
}
|
|
2270
|
-
|
|
2271
|
-
#
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
break;
|
|
2275
|
-
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
|
|
2276
|
-
x = (mrb_float)mrb_fixnum(regs[a]);
|
|
2305
|
+
NEXT;
|
|
2306
|
+
#ifndef MRB_NO_FLOAT
|
|
2307
|
+
case TYPES2(MRB_TT_INTEGER,MRB_TT_FLOAT):
|
|
2308
|
+
x = (mrb_float)mrb_integer(regs[a]);
|
|
2277
2309
|
y = mrb_float(regs[a+1]);
|
|
2278
2310
|
break;
|
|
2279
|
-
case TYPES2(MRB_TT_FLOAT,
|
|
2311
|
+
case TYPES2(MRB_TT_FLOAT,MRB_TT_INTEGER):
|
|
2280
2312
|
x = mrb_float(regs[a]);
|
|
2281
|
-
y = (mrb_float)
|
|
2313
|
+
y = (mrb_float)mrb_integer(regs[a+1]);
|
|
2282
2314
|
break;
|
|
2283
2315
|
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
|
|
2284
2316
|
x = mrb_float(regs[a]);
|
|
@@ -2287,19 +2319,12 @@ RETRY_TRY_BLOCK:
|
|
|
2287
2319
|
#endif
|
|
2288
2320
|
default:
|
|
2289
2321
|
c = 1;
|
|
2290
|
-
mid =
|
|
2322
|
+
mid = MRB_OPSYM(div);
|
|
2291
2323
|
goto L_SEND_SYM;
|
|
2292
2324
|
}
|
|
2293
2325
|
|
|
2294
|
-
#ifndef
|
|
2295
|
-
|
|
2296
|
-
if (x > 0) f = INFINITY;
|
|
2297
|
-
else if (x < 0) f = -INFINITY;
|
|
2298
|
-
else /* if (x == 0) */ f = NAN;
|
|
2299
|
-
}
|
|
2300
|
-
else {
|
|
2301
|
-
f = x / y;
|
|
2302
|
-
}
|
|
2326
|
+
#ifndef MRB_NO_FLOAT
|
|
2327
|
+
f = mrb_num_div_flo(mrb, x, y);
|
|
2303
2328
|
SET_FLOAT_VALUE(mrb, regs[a], f);
|
|
2304
2329
|
#endif
|
|
2305
2330
|
NEXT;
|
|
@@ -2308,26 +2333,26 @@ RETRY_TRY_BLOCK:
|
|
|
2308
2333
|
#define OP_MATHI(op_name) \
|
|
2309
2334
|
/* need to check if op is overridden */ \
|
|
2310
2335
|
switch (mrb_type(regs[a])) { \
|
|
2311
|
-
|
|
2336
|
+
OP_MATHI_CASE_INTEGER(op_name); \
|
|
2312
2337
|
OP_MATHI_CASE_FLOAT(op_name); \
|
|
2313
2338
|
default: \
|
|
2314
|
-
SET_INT_VALUE(regs[a+1], b);
|
|
2339
|
+
SET_INT_VALUE(mrb,regs[a+1], b); \
|
|
2315
2340
|
c = 1; \
|
|
2316
|
-
mid =
|
|
2341
|
+
mid = MRB_OPSYM(op_name); \
|
|
2317
2342
|
goto L_SEND_SYM; \
|
|
2318
2343
|
} \
|
|
2319
2344
|
NEXT;
|
|
2320
|
-
#define
|
|
2321
|
-
case
|
|
2345
|
+
#define OP_MATHI_CASE_INTEGER(op_name) \
|
|
2346
|
+
case MRB_TT_INTEGER: \
|
|
2322
2347
|
{ \
|
|
2323
|
-
mrb_int x =
|
|
2348
|
+
mrb_int x = mrb_integer(regs[a]), y = (mrb_int)b, z; \
|
|
2324
2349
|
if (mrb_int_##op_name##_overflow(x, y, &z)) \
|
|
2325
|
-
OP_MATH_OVERFLOW_INT(
|
|
2350
|
+
OP_MATH_OVERFLOW_INT(); \
|
|
2326
2351
|
else \
|
|
2327
|
-
SET_INT_VALUE(regs[a], z);
|
|
2352
|
+
SET_INT_VALUE(mrb,regs[a], z); \
|
|
2328
2353
|
} \
|
|
2329
2354
|
break
|
|
2330
|
-
#ifdef
|
|
2355
|
+
#ifdef MRB_NO_FLOAT
|
|
2331
2356
|
#define OP_MATHI_CASE_FLOAT(op_name) (void)0
|
|
2332
2357
|
#else
|
|
2333
2358
|
#define OP_MATHI_CASE_FLOAT(op_name) \
|
|
@@ -2349,17 +2374,17 @@ RETRY_TRY_BLOCK:
|
|
|
2349
2374
|
|
|
2350
2375
|
#define OP_CMP_BODY(op,v1,v2) (v1(regs[a]) op v2(regs[a+1]))
|
|
2351
2376
|
|
|
2352
|
-
#ifdef
|
|
2353
|
-
#define OP_CMP(op) do {\
|
|
2377
|
+
#ifdef MRB_NO_FLOAT
|
|
2378
|
+
#define OP_CMP(op,sym) do {\
|
|
2354
2379
|
int result;\
|
|
2355
2380
|
/* need to check if - is overridden */\
|
|
2356
2381
|
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
|
|
2357
|
-
case TYPES2(
|
|
2382
|
+
case TYPES2(MRB_TT_INTEGER,MRB_TT_INTEGER):\
|
|
2358
2383
|
result = OP_CMP_BODY(op,mrb_fixnum,mrb_fixnum);\
|
|
2359
2384
|
break;\
|
|
2360
2385
|
default:\
|
|
2361
2386
|
c = 1;\
|
|
2362
|
-
mid =
|
|
2387
|
+
mid = MRB_OPSYM(sym);\
|
|
2363
2388
|
goto L_SEND_SYM;\
|
|
2364
2389
|
}\
|
|
2365
2390
|
if (result) {\
|
|
@@ -2370,17 +2395,17 @@ RETRY_TRY_BLOCK:
|
|
|
2370
2395
|
}\
|
|
2371
2396
|
} while(0)
|
|
2372
2397
|
#else
|
|
2373
|
-
#define OP_CMP(op) do {\
|
|
2398
|
+
#define OP_CMP(op, sym) do {\
|
|
2374
2399
|
int result;\
|
|
2375
2400
|
/* need to check if - is overridden */\
|
|
2376
2401
|
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
|
|
2377
|
-
case TYPES2(
|
|
2402
|
+
case TYPES2(MRB_TT_INTEGER,MRB_TT_INTEGER):\
|
|
2378
2403
|
result = OP_CMP_BODY(op,mrb_fixnum,mrb_fixnum);\
|
|
2379
2404
|
break;\
|
|
2380
|
-
case TYPES2(
|
|
2405
|
+
case TYPES2(MRB_TT_INTEGER,MRB_TT_FLOAT):\
|
|
2381
2406
|
result = OP_CMP_BODY(op,mrb_fixnum,mrb_float);\
|
|
2382
2407
|
break;\
|
|
2383
|
-
case TYPES2(MRB_TT_FLOAT,
|
|
2408
|
+
case TYPES2(MRB_TT_FLOAT,MRB_TT_INTEGER):\
|
|
2384
2409
|
result = OP_CMP_BODY(op,mrb_float,mrb_fixnum);\
|
|
2385
2410
|
break;\
|
|
2386
2411
|
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\
|
|
@@ -2388,7 +2413,7 @@ RETRY_TRY_BLOCK:
|
|
|
2388
2413
|
break;\
|
|
2389
2414
|
default:\
|
|
2390
2415
|
c = 1;\
|
|
2391
|
-
mid =
|
|
2416
|
+
mid = MRB_OPSYM(sym);\
|
|
2392
2417
|
goto L_SEND_SYM;\
|
|
2393
2418
|
}\
|
|
2394
2419
|
if (result) {\
|
|
@@ -2405,28 +2430,28 @@ RETRY_TRY_BLOCK:
|
|
|
2405
2430
|
SET_TRUE_VALUE(regs[a]);
|
|
2406
2431
|
}
|
|
2407
2432
|
else {
|
|
2408
|
-
OP_CMP(
|
|
2433
|
+
OP_CMP(==,eq);
|
|
2409
2434
|
}
|
|
2410
2435
|
NEXT;
|
|
2411
2436
|
}
|
|
2412
2437
|
|
|
2413
2438
|
CASE(OP_LT, B) {
|
|
2414
|
-
OP_CMP(
|
|
2439
|
+
OP_CMP(<,lt);
|
|
2415
2440
|
NEXT;
|
|
2416
2441
|
}
|
|
2417
2442
|
|
|
2418
2443
|
CASE(OP_LE, B) {
|
|
2419
|
-
OP_CMP(
|
|
2444
|
+
OP_CMP(<=,le);
|
|
2420
2445
|
NEXT;
|
|
2421
2446
|
}
|
|
2422
2447
|
|
|
2423
2448
|
CASE(OP_GT, B) {
|
|
2424
|
-
OP_CMP(
|
|
2449
|
+
OP_CMP(>,gt);
|
|
2425
2450
|
NEXT;
|
|
2426
2451
|
}
|
|
2427
2452
|
|
|
2428
2453
|
CASE(OP_GE, B) {
|
|
2429
|
-
OP_CMP(
|
|
2454
|
+
OP_CMP(>=,ge);
|
|
2430
2455
|
NEXT;
|
|
2431
2456
|
}
|
|
2432
2457
|
|
|
@@ -2537,10 +2562,19 @@ RETRY_TRY_BLOCK:
|
|
|
2537
2562
|
NEXT;
|
|
2538
2563
|
}
|
|
2539
2564
|
|
|
2565
|
+
CASE(OP_STRING16, BS) {
|
|
2566
|
+
goto op_string;
|
|
2567
|
+
}
|
|
2540
2568
|
CASE(OP_STRING, BB) {
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2569
|
+
size_t len;
|
|
2570
|
+
op_string:
|
|
2571
|
+
len = pool[b].tt >> 2;
|
|
2572
|
+
if (pool[b].tt & IREP_TT_SFLAG) {
|
|
2573
|
+
regs[a] = mrb_str_new_static(mrb, pool[b].u.str, len);
|
|
2574
|
+
}
|
|
2575
|
+
else {
|
|
2576
|
+
regs[a] = mrb_str_new(mrb, pool[b].u.str, len);
|
|
2577
|
+
}
|
|
2544
2578
|
mrb_gc_arena_restore(mrb, ai);
|
|
2545
2579
|
NEXT;
|
|
2546
2580
|
}
|
|
@@ -2588,7 +2622,7 @@ RETRY_TRY_BLOCK:
|
|
|
2588
2622
|
L_MAKE_LAMBDA:
|
|
2589
2623
|
{
|
|
2590
2624
|
struct RProc *p;
|
|
2591
|
-
mrb_irep *nirep = irep->reps[b];
|
|
2625
|
+
const mrb_irep *nirep = irep->reps[b];
|
|
2592
2626
|
|
|
2593
2627
|
if (c & OP_L_CAPTURE) {
|
|
2594
2628
|
p = mrb_closure_new(mrb, nirep);
|
|
@@ -2610,6 +2644,18 @@ RETRY_TRY_BLOCK:
|
|
|
2610
2644
|
c = OP_L_METHOD;
|
|
2611
2645
|
goto L_MAKE_LAMBDA;
|
|
2612
2646
|
}
|
|
2647
|
+
CASE(OP_LAMBDA16, BS) {
|
|
2648
|
+
c = OP_L_LAMBDA;
|
|
2649
|
+
goto L_MAKE_LAMBDA;
|
|
2650
|
+
}
|
|
2651
|
+
CASE(OP_BLOCK16, BS) {
|
|
2652
|
+
c = OP_L_BLOCK;
|
|
2653
|
+
goto L_MAKE_LAMBDA;
|
|
2654
|
+
}
|
|
2655
|
+
CASE(OP_METHOD16, BS) {
|
|
2656
|
+
c = OP_L_METHOD;
|
|
2657
|
+
goto L_MAKE_LAMBDA;
|
|
2658
|
+
}
|
|
2613
2659
|
|
|
2614
2660
|
CASE(OP_RANGE_INC, B) {
|
|
2615
2661
|
mrb_value val = mrb_range_new(mrb, regs[a], regs[a+1], FALSE);
|
|
@@ -2639,6 +2685,7 @@ RETRY_TRY_BLOCK:
|
|
|
2639
2685
|
super = regs[a+1];
|
|
2640
2686
|
if (mrb_nil_p(base)) {
|
|
2641
2687
|
baseclass = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc);
|
|
2688
|
+
if (!baseclass) baseclass = mrb->object_class;
|
|
2642
2689
|
base = mrb_obj_value(baseclass);
|
|
2643
2690
|
}
|
|
2644
2691
|
c = mrb_vm_define_class(mrb, base, super, id);
|
|
@@ -2655,6 +2702,7 @@ RETRY_TRY_BLOCK:
|
|
|
2655
2702
|
base = regs[a];
|
|
2656
2703
|
if (mrb_nil_p(base)) {
|
|
2657
2704
|
baseclass = MRB_PROC_TARGET_CLASS(mrb->c->ci->proc);
|
|
2705
|
+
if (!baseclass) baseclass = mrb->object_class;
|
|
2658
2706
|
base = mrb_obj_value(baseclass);
|
|
2659
2707
|
}
|
|
2660
2708
|
cls = mrb_vm_define_module(mrb, base, id);
|
|
@@ -2663,11 +2711,14 @@ RETRY_TRY_BLOCK:
|
|
|
2663
2711
|
NEXT;
|
|
2664
2712
|
}
|
|
2665
2713
|
|
|
2666
|
-
CASE(
|
|
2667
|
-
|
|
2714
|
+
CASE(OP_EXEC16, BS)
|
|
2715
|
+
goto L_EXEC;
|
|
2716
|
+
CASE(OP_EXEC, BB)
|
|
2717
|
+
L_EXEC:
|
|
2718
|
+
{
|
|
2668
2719
|
mrb_value recv = regs[a];
|
|
2669
2720
|
struct RProc *p;
|
|
2670
|
-
mrb_irep *nirep = irep->reps[b];
|
|
2721
|
+
const mrb_irep *nirep = irep->reps[b];
|
|
2671
2722
|
|
|
2672
2723
|
/* prepare closure */
|
|
2673
2724
|
p = mrb_proc_new(mrb, nirep);
|
|
@@ -2677,19 +2728,7 @@ RETRY_TRY_BLOCK:
|
|
|
2677
2728
|
p->flags |= MRB_PROC_SCOPE;
|
|
2678
2729
|
|
|
2679
2730
|
/* prepare call stack */
|
|
2680
|
-
|
|
2681
|
-
ci->pc = pc;
|
|
2682
|
-
ci->acc = a;
|
|
2683
|
-
ci->mid = 0;
|
|
2684
|
-
ci->stackent = mrb->c->stack;
|
|
2685
|
-
ci->argc = 0;
|
|
2686
|
-
ci->target_class = mrb_class_ptr(recv);
|
|
2687
|
-
|
|
2688
|
-
/* prepare stack */
|
|
2689
|
-
mrb->c->stack += a;
|
|
2690
|
-
|
|
2691
|
-
/* setup block to call */
|
|
2692
|
-
ci->proc = p;
|
|
2731
|
+
cipush(mrb, a, a, mrb_class_ptr(recv), p, 0, 0);
|
|
2693
2732
|
|
|
2694
2733
|
irep = p->body.irep;
|
|
2695
2734
|
pool = irep->pool;
|
|
@@ -2719,7 +2758,7 @@ RETRY_TRY_BLOCK:
|
|
|
2719
2758
|
|
|
2720
2759
|
CASE(OP_TCLASS, B) {
|
|
2721
2760
|
if (!check_target_class(mrb)) goto L_RAISE;
|
|
2722
|
-
regs[a] = mrb_obj_value(mrb->c->ci
|
|
2761
|
+
regs[a] = mrb_obj_value(mrb_vm_ci_target_class(mrb->c->ci));
|
|
2723
2762
|
NEXT;
|
|
2724
2763
|
}
|
|
2725
2764
|
|
|
@@ -2727,7 +2766,7 @@ RETRY_TRY_BLOCK:
|
|
|
2727
2766
|
struct RClass *target;
|
|
2728
2767
|
|
|
2729
2768
|
if (!check_target_class(mrb)) goto L_RAISE;
|
|
2730
|
-
target = mrb->c->ci
|
|
2769
|
+
target = mrb_vm_ci_target_class(mrb->c->ci);
|
|
2731
2770
|
mrb_alias_method(mrb, target, syms[a], syms[b]);
|
|
2732
2771
|
NEXT;
|
|
2733
2772
|
}
|
|
@@ -2735,17 +2774,17 @@ RETRY_TRY_BLOCK:
|
|
|
2735
2774
|
struct RClass *target;
|
|
2736
2775
|
|
|
2737
2776
|
if (!check_target_class(mrb)) goto L_RAISE;
|
|
2738
|
-
target = mrb->c->ci
|
|
2777
|
+
target = mrb_vm_ci_target_class(mrb->c->ci);
|
|
2739
2778
|
mrb_undef_method_id(mrb, target, syms[a]);
|
|
2740
2779
|
NEXT;
|
|
2741
2780
|
}
|
|
2742
2781
|
|
|
2743
2782
|
CASE(OP_DEBUG, Z) {
|
|
2744
2783
|
FETCH_BBB();
|
|
2745
|
-
#ifdef
|
|
2784
|
+
#ifdef MRB_USE_DEBUG_HOOK
|
|
2746
2785
|
mrb->debug_op_hook(mrb, irep, pc, regs);
|
|
2747
2786
|
#else
|
|
2748
|
-
#ifndef
|
|
2787
|
+
#ifndef MRB_NO_STDIO
|
|
2749
2788
|
printf("OP_DEBUG %d %d %d\n", a, b, c);
|
|
2750
2789
|
#else
|
|
2751
2790
|
abort();
|
|
@@ -2755,56 +2794,32 @@ RETRY_TRY_BLOCK:
|
|
|
2755
2794
|
}
|
|
2756
2795
|
|
|
2757
2796
|
CASE(OP_ERR, B) {
|
|
2758
|
-
|
|
2797
|
+
size_t len = pool[a].tt >> 2;
|
|
2759
2798
|
mrb_value exc;
|
|
2760
2799
|
|
|
2761
|
-
|
|
2762
|
-
|
|
2800
|
+
mrb_assert((pool[a].tt&IREP_TT_NFLAG)==0);
|
|
2801
|
+
exc = mrb_exc_new(mrb, E_LOCALJUMP_ERROR, pool[a].u.str, len);
|
|
2763
2802
|
mrb_exc_set(mrb, exc);
|
|
2764
2803
|
goto L_RAISE;
|
|
2765
2804
|
}
|
|
2766
2805
|
|
|
2767
|
-
CASE(
|
|
2768
|
-
insn = READ_B();
|
|
2769
|
-
switch (insn) {
|
|
2770
|
-
#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _1(); goto L_OP_ ## insn ## _BODY;
|
|
2771
|
-
#include "mruby/ops.h"
|
|
2772
|
-
#undef OPCODE
|
|
2773
|
-
}
|
|
2774
|
-
pc--;
|
|
2775
|
-
NEXT;
|
|
2776
|
-
}
|
|
2777
|
-
CASE(OP_EXT2, Z) {
|
|
2778
|
-
insn = READ_B();
|
|
2779
|
-
switch (insn) {
|
|
2780
|
-
#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _2(); goto L_OP_ ## insn ## _BODY;
|
|
2781
|
-
#include "mruby/ops.h"
|
|
2782
|
-
#undef OPCODE
|
|
2783
|
-
}
|
|
2784
|
-
pc--;
|
|
2785
|
-
NEXT;
|
|
2786
|
-
}
|
|
2787
|
-
CASE(OP_EXT3, Z) {
|
|
2788
|
-
uint8_t insn = READ_B();
|
|
2789
|
-
switch (insn) {
|
|
2790
|
-
#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _3(); goto L_OP_ ## insn ## _BODY;
|
|
2791
|
-
#include "mruby/ops.h"
|
|
2792
|
-
#undef OPCODE
|
|
2793
|
-
}
|
|
2794
|
-
pc--;
|
|
2806
|
+
CASE(OP_SENDVK, BB) { /* not yet implemented */
|
|
2795
2807
|
NEXT;
|
|
2796
2808
|
}
|
|
2797
2809
|
|
|
2798
2810
|
CASE(OP_STOP, Z) {
|
|
2799
2811
|
/* stop VM */
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
ecall(mrb);
|
|
2812
|
+
CHECKPOINT_RESTORE(RBREAK_TAG_STOP) {
|
|
2813
|
+
/* do nothing */
|
|
2803
2814
|
}
|
|
2804
|
-
|
|
2805
|
-
|
|
2815
|
+
CHECKPOINT_MAIN(RBREAK_TAG_STOP) {
|
|
2816
|
+
UNWIND_ENSURE(mrb, mrb->c->ci, pc, RBREAK_TAG_STOP, proc, mrb_nil_value());
|
|
2817
|
+
}
|
|
2818
|
+
CHECKPOINT_END(RBREAK_TAG_STOP);
|
|
2819
|
+
L_STOP:
|
|
2806
2820
|
mrb->jmp = prev_jmp;
|
|
2807
2821
|
if (mrb->exc) {
|
|
2822
|
+
mrb_assert(mrb->exc->tt == MRB_TT_EXCEPTION);
|
|
2808
2823
|
return mrb_obj_value(mrb->exc);
|
|
2809
2824
|
}
|
|
2810
2825
|
return regs[irep->nlocals];
|
|
@@ -2814,14 +2829,19 @@ RETRY_TRY_BLOCK:
|
|
|
2814
2829
|
#undef regs
|
|
2815
2830
|
}
|
|
2816
2831
|
MRB_CATCH(&c_jmp) {
|
|
2832
|
+
mrb_callinfo *ci = mrb->c->ci;
|
|
2833
|
+
while (ci > mrb->c->cibase && ci->acc == CI_ACC_DIRECT) {
|
|
2834
|
+
ci = cipop(mrb);
|
|
2835
|
+
}
|
|
2817
2836
|
exc_catched = TRUE;
|
|
2837
|
+
pc = ci->pc;
|
|
2818
2838
|
goto RETRY_TRY_BLOCK;
|
|
2819
2839
|
}
|
|
2820
2840
|
MRB_END_EXC(&c_jmp);
|
|
2821
2841
|
}
|
|
2822
2842
|
|
|
2823
2843
|
static mrb_value
|
|
2824
|
-
mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
|
|
2844
|
+
mrb_run(mrb_state *mrb, const struct RProc *proc, mrb_value self)
|
|
2825
2845
|
{
|
|
2826
2846
|
if (mrb->c->ci->argc < 0) {
|
|
2827
2847
|
return mrb_vm_run(mrb, proc, self, 3); /* receiver, args and block) */
|
|
@@ -2832,34 +2852,29 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
|
|
|
2832
2852
|
}
|
|
2833
2853
|
|
|
2834
2854
|
MRB_API mrb_value
|
|
2835
|
-
mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self,
|
|
2855
|
+
mrb_top_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, mrb_int stack_keep)
|
|
2836
2856
|
{
|
|
2837
|
-
mrb_callinfo *ci;
|
|
2838
2857
|
mrb_value v;
|
|
2839
2858
|
|
|
2840
2859
|
if (!mrb->c->cibase) {
|
|
2841
2860
|
return mrb_vm_run(mrb, proc, self, stack_keep);
|
|
2842
2861
|
}
|
|
2843
2862
|
if (mrb->c->ci == mrb->c->cibase) {
|
|
2844
|
-
mrb->c->ci
|
|
2863
|
+
mrb_vm_ci_env_set(mrb->c->ci, NULL);
|
|
2845
2864
|
return mrb_vm_run(mrb, proc, self, stack_keep);
|
|
2846
2865
|
}
|
|
2847
|
-
|
|
2848
|
-
ci->stackent = mrb->c->stack;
|
|
2849
|
-
ci->mid = 0;
|
|
2850
|
-
ci->acc = CI_ACC_SKIP;
|
|
2851
|
-
ci->target_class = mrb->object_class;
|
|
2866
|
+
cipush(mrb, 0, CI_ACC_SKIP, mrb->object_class, NULL, 0, 0);
|
|
2852
2867
|
v = mrb_vm_run(mrb, proc, self, stack_keep);
|
|
2853
2868
|
|
|
2854
2869
|
return v;
|
|
2855
2870
|
}
|
|
2856
2871
|
|
|
2857
|
-
#if defined(
|
|
2858
|
-
# if !defined(
|
|
2872
|
+
#if defined(MRB_USE_CXX_EXCEPTION) && defined(__cplusplus)
|
|
2873
|
+
# if !defined(MRB_USE_CXX_ABI)
|
|
2859
2874
|
} /* end of extern "C" */
|
|
2860
2875
|
# endif
|
|
2861
2876
|
mrb_int mrb_jmpbuf::jmpbuf_id = 0;
|
|
2862
|
-
# if !defined(
|
|
2877
|
+
# if !defined(MRB_USE_CXX_ABI)
|
|
2863
2878
|
extern "C" {
|
|
2864
2879
|
# endif
|
|
2865
2880
|
#endif
|