script_core 0.2.7 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +2 -2
- data/ext/enterprise_script_service/Rakefile +1 -1
- data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +117 -74
- data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +41 -37
- data/ext/enterprise_script_service/mruby/.github/workflows/lint.yml +23 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/oss-fuzz.yml +27 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/spell-checker.yml +17 -0
- data/ext/enterprise_script_service/mruby/.gitlab-ci.yml +3 -3
- data/ext/enterprise_script_service/mruby/.markdownlint.yml +16 -0
- data/ext/enterprise_script_service/mruby/.travis.yml +2 -2
- data/ext/enterprise_script_service/mruby/.yamllint +8 -0
- data/ext/enterprise_script_service/mruby/AUTHORS +3 -0
- data/ext/enterprise_script_service/mruby/CODEOWNERS +1 -0
- data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +6 -13
- data/ext/enterprise_script_service/mruby/Doxyfile +4 -4
- data/ext/enterprise_script_service/mruby/LICENSE +1 -1
- data/ext/enterprise_script_service/mruby/Makefile +1 -1
- data/ext/enterprise_script_service/mruby/README.md +4 -14
- data/ext/enterprise_script_service/mruby/Rakefile +18 -108
- data/ext/enterprise_script_service/mruby/TODO.md +17 -0
- data/ext/enterprise_script_service/mruby/appveyor.yml +31 -25
- data/ext/enterprise_script_service/mruby/benchmark/bm_ao_render.rb +1 -1
- data/ext/enterprise_script_service/mruby/build_config.rb +9 -152
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_ArduinoDue.rb → build_config/ArduinoDue.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +2 -2
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +1 -18
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +2 -19
- data/ext/enterprise_script_service/mruby/build_config/android_arm64-v8a.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/android_armeabi.rb +11 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_android_armeabi_v7a_neon_hard.rb → build_config/android_armeabi_v7a_neon_hard.rb} +0 -15
- data/ext/enterprise_script_service/mruby/build_config/bench.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/boxing.rb +21 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_chipKITMax32.rb → build_config/chipKITMax32.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{travis_config.rb → build_config/ci/gcc-clang.rb} +10 -10
- data/ext/enterprise_script_service/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/default.rb +80 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_dreamcast_shelf.rb → build_config/dreamcast_shelf.rb} +5 -19
- data/ext/enterprise_script_service/mruby/build_config/gameboyadvance.rb +73 -0
- data/ext/enterprise_script_service/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enterprise_script_service/mruby/build_config/host-debug.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/host-m32.rb +15 -0
- data/ext/enterprise_script_service/mruby/build_config/host-shared.rb +36 -0
- data/ext/enterprise_script_service/mruby/build_config/mrbc.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/no-float.rb +17 -0
- data/ext/enterprise_script_service/mruby/doc/guides/compile.md +138 -49
- data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +5 -4
- data/ext/enterprise_script_service/mruby/doc/guides/gc-arena-howto.md +1 -1
- data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +49 -22
- data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +31 -14
- data/ext/enterprise_script_service/mruby/doc/guides/symbol.md +83 -0
- data/ext/enterprise_script_service/mruby/doc/limitations.md +35 -36
- data/ext/enterprise_script_service/mruby/doc/mruby3.md +163 -0
- data/ext/enterprise_script_service/mruby/doc/opcode.md +93 -107
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/include/mrbconf.h +81 -62
- data/ext/enterprise_script_service/mruby/include/mruby.h +137 -96
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +23 -6
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +73 -48
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +79 -48
- data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +4 -1
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +13 -7
- data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +17 -35
- data/ext/enterprise_script_service/mruby/include/mruby/endian.h +44 -0
- data/ext/enterprise_script_service/mruby/include/mruby/error.h +39 -5
- data/ext/enterprise_script_service/mruby/include/mruby/gc.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/hash.h +33 -13
- data/ext/enterprise_script_service/mruby/include/mruby/irep.h +64 -14
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +6 -14
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +36 -63
- data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +27 -23
- data/ext/enterprise_script_service/mruby/include/mruby/presym.h +40 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/disable.h +70 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/enable.h +37 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/scanning.h +73 -0
- data/ext/enterprise_script_service/mruby/include/mruby/proc.h +80 -13
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +10 -15
- data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +29 -19
- data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +26 -7
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -44
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +55 -37
- data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +12 -10
- data/ext/enterprise_script_service/mruby/lib/{mruby-core-ext.rb → mruby/core_ext.rb} +10 -3
- data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +75 -32
- data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +1 -1
- data/ext/enterprise_script_service/mruby/lib/mruby/presym.rb +132 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +9 -88
- data/ext/enterprise_script_service/mruby/mrbgems/full-core.gembox +1 -4
- data/ext/enterprise_script_service/mruby/mrbgems/math.gembox +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/metaprog.gembox +15 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +28 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mruby-config +18 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +3 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +10 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +14 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +2 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +23 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +11 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +41 -34
- data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb +0 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +3 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +19 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +25 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +22 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrblib/catch.rb +27 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +2 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +430 -399
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +49 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +559 -217
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +4774 -4193
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +18 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +8 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +1 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/mrbgem.rake +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +17 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +18 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +30 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +7 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-inline-struct/test/inline.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +18 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +55 -52
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +99 -87
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +2 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +2 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +7 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +13 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/test/math.rb +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +43 -58
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/README.md +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +77 -74
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +14 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/src/memsize.c +231 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/README.md +15 -18
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +38 -88
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +1 -30
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +62 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +32 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +98 -43
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +39 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +20 -40
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +27 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +11 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +216 -38
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +6 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/README.md +6 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +102 -71
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +23 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +13 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +18 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +6 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/README.md +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +5 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +16 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +27 -27
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-ext.gembox +18 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-io.gembox +12 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib.gembox +54 -0
- data/ext/enterprise_script_service/mruby/mrblib/10error.rb +4 -0
- data/ext/enterprise_script_service/mruby/mrblib/array.rb +17 -9
- data/ext/enterprise_script_service/mruby/mrblib/enum.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrblib/hash.rb +0 -20
- data/ext/enterprise_script_service/mruby/mrblib/init_mrblib.c +0 -11
- data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +36 -11
- data/ext/enterprise_script_service/mruby/mrblib/range.rb +25 -3
- data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +2 -2
- data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +1 -1
- data/ext/enterprise_script_service/mruby/src/array.c +43 -80
- data/ext/enterprise_script_service/mruby/src/backtrace.c +16 -17
- data/ext/enterprise_script_service/mruby/src/class.c +774 -182
- data/ext/enterprise_script_service/mruby/src/codedump.c +223 -198
- data/ext/enterprise_script_service/mruby/src/debug.c +6 -6
- data/ext/enterprise_script_service/mruby/src/dump.c +466 -141
- data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
- data/ext/enterprise_script_service/mruby/src/error.c +36 -13
- data/ext/enterprise_script_service/mruby/src/etc.c +43 -34
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +5 -6
- data/ext/enterprise_script_service/mruby/src/gc.c +73 -71
- data/ext/enterprise_script_service/mruby/src/hash.c +1050 -707
- data/ext/enterprise_script_service/mruby/src/kernel.c +75 -220
- data/ext/enterprise_script_service/mruby/src/load.c +196 -166
- data/ext/enterprise_script_service/mruby/src/numeric.c +352 -314
- data/ext/enterprise_script_service/mruby/src/object.c +97 -90
- data/ext/enterprise_script_service/mruby/src/print.c +4 -3
- data/ext/enterprise_script_service/mruby/src/proc.c +48 -56
- data/ext/enterprise_script_service/mruby/src/range.c +45 -21
- data/ext/enterprise_script_service/mruby/src/state.c +25 -32
- data/ext/enterprise_script_service/mruby/src/string.c +59 -101
- data/ext/enterprise_script_service/mruby/src/symbol.c +121 -56
- data/ext/enterprise_script_service/mruby/src/value_array.h +1 -0
- data/ext/enterprise_script_service/mruby/src/variable.c +158 -158
- data/ext/enterprise_script_service/mruby/src/vm.c +617 -602
- data/ext/enterprise_script_service/mruby/tasks/benchmark.rake +6 -6
- data/ext/enterprise_script_service/mruby/tasks/bin.rake +23 -0
- data/ext/enterprise_script_service/mruby/tasks/core.rake +12 -0
- data/ext/enterprise_script_service/mruby/tasks/doc.rake +50 -38
- data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +83 -77
- data/ext/enterprise_script_service/mruby/tasks/libmruby.rake +10 -1
- data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +13 -1
- data/ext/enterprise_script_service/mruby/tasks/mrblib.rake +40 -0
- data/ext/enterprise_script_service/mruby/tasks/presym.rake +44 -0
- data/ext/enterprise_script_service/mruby/tasks/test.rake +68 -0
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +6 -5
- data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +10 -14
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +17 -21
- data/ext/enterprise_script_service/mruby/test/bintest.rb +5 -5
- data/ext/enterprise_script_service/mruby/test/t/argumenterror.rb +16 -0
- data/ext/enterprise_script_service/mruby/test/t/array.rb +7 -3
- data/ext/enterprise_script_service/mruby/test/t/bs_literal.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/float.rb +18 -8
- data/ext/enterprise_script_service/mruby/test/t/hash.rb +903 -281
- data/ext/enterprise_script_service/mruby/test/t/integer.rb +10 -38
- data/ext/enterprise_script_service/mruby/test/t/kernel.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/literals.rb +50 -0
- data/ext/enterprise_script_service/mruby/test/t/module.rb +2 -2
- data/ext/enterprise_script_service/mruby/test/t/numeric.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/range.rb +83 -1
- data/ext/enterprise_script_service/mruby/test/t/string.rb +4 -0
- data/ext/enterprise_script_service/mruby/test/t/superclass.rb +10 -10
- data/ext/enterprise_script_service/mruby/test/t/syntax.rb +24 -0
- data/ext/enterprise_script_service/mruby/test/t/vformat.rb +3 -3
- data/ext/enterprise_script_service/mruby_config.rb +2 -5
- data/ext/enterprise_script_service/mruby_engine.cpp +1 -1
- data/lib/script_core/version.rb +1 -1
- data/spec/script_core_spec.rb +13 -0
- metadata +61 -23
- data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +0 -24
- data/ext/enterprise_script_service/mruby/TODO +0 -8
- data/ext/enterprise_script_service/mruby/appveyor_config.rb +0 -46
- data/ext/enterprise_script_service/mruby/benchmark/build_config_boxing.rb +0 -28
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_arm64-v8a.rb +0 -26
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_armeabi.rb +0 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +0 -30
- data/ext/enterprise_script_service/mruby/mrblib/mrblib.rake +0 -18
- data/ext/enterprise_script_service/mruby/src/crc.c +0 -39
- data/ext/enterprise_script_service/mruby/src/mruby_core.rake +0 -19
data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb
RENAMED
File without changes
|
@@ -2,15 +2,14 @@
|
|
2
2
|
spec.license = 'MIT'
|
3
3
|
spec.author = 'mruby developers'
|
4
4
|
spec.summary = 'mruby compiler executable'
|
5
|
-
|
6
5
|
spec.add_dependency 'mruby-compiler', :core => 'mruby-compiler'
|
7
6
|
|
8
7
|
exec = exefile("#{build.build_dir}/bin/mrbc")
|
9
|
-
mrbc_objs = Dir.glob("#{spec.dir}/tools/mrbc/*.c").map { |f| objfile(f.pathmap("#{spec.build_dir}/tools/mrbc/%n")) }
|
8
|
+
mrbc_objs = Dir.glob("#{spec.dir}/tools/mrbc/*.c").map { |f| objfile(f.pathmap("#{spec.build_dir}/tools/mrbc/%n")) }
|
10
9
|
|
11
|
-
file exec => mrbc_objs
|
10
|
+
file exec => mrbc_objs << build.libmruby_core_static do |t|
|
12
11
|
build.linker.run t.name, t.prerequisites
|
13
12
|
end
|
14
13
|
|
15
|
-
build.bins << 'mrbc'
|
14
|
+
build.bins << 'mrbc'
|
16
15
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#include <mruby.h>
|
2
2
|
|
3
|
-
#ifdef
|
4
|
-
# error mruby-bin-mrbc conflicts '
|
3
|
+
#ifdef MRB_NO_STDIO
|
4
|
+
# error mruby-bin-mrbc conflicts 'MRB_NO_STDIO' in your build configuration
|
5
5
|
#endif
|
6
6
|
|
7
7
|
#include <stdlib.h>
|
@@ -20,6 +20,7 @@ struct mrbc_args {
|
|
20
20
|
const char *prog;
|
21
21
|
const char *outfile;
|
22
22
|
const char *initname;
|
23
|
+
mrb_bool dump_struct : 1;
|
23
24
|
mrb_bool check_syntax : 1;
|
24
25
|
mrb_bool verbose : 1;
|
25
26
|
mrb_bool remove_lv : 1;
|
@@ -32,10 +33,11 @@ usage(const char *name)
|
|
32
33
|
static const char *const usage_msg[] = {
|
33
34
|
"switches:",
|
34
35
|
"-c check syntax only",
|
35
|
-
"-o<outfile> place the output into <outfile
|
36
|
+
"-o<outfile> place the output into <outfile>; required for multi-files",
|
36
37
|
"-v print version number, then turn on verbose mode",
|
37
38
|
"-g produce debugging information",
|
38
39
|
"-B<symbol> binary <symbol> output in C language format",
|
40
|
+
"-S dump C struct (requires -B)",
|
39
41
|
"--remove-lv remove local variables",
|
40
42
|
"--verbose run at verbose mode",
|
41
43
|
"--version print the version",
|
@@ -44,7 +46,7 @@ usage(const char *name)
|
|
44
46
|
};
|
45
47
|
const char *const *p = usage_msg;
|
46
48
|
|
47
|
-
printf("Usage: %s [switches] programfile
|
49
|
+
printf("Usage: %s [switches] programfile...\n", name);
|
48
50
|
while (*p)
|
49
51
|
printf(" %s\n", *p++);
|
50
52
|
}
|
@@ -105,6 +107,9 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
|
105
107
|
args->outfile = get_outfilename(mrb, argv[i] + 2, "");
|
106
108
|
}
|
107
109
|
break;
|
110
|
+
case 'S':
|
111
|
+
args->dump_struct = TRUE;
|
112
|
+
break;
|
108
113
|
case 'B':
|
109
114
|
if (argv[i][2] == '\0' && argv[i+1]) {
|
110
115
|
i++;
|
@@ -238,13 +243,18 @@ static int
|
|
238
243
|
dump_file(mrb_state *mrb, FILE *wfp, const char *outfile, struct RProc *proc, struct mrbc_args *args)
|
239
244
|
{
|
240
245
|
int n = MRB_DUMP_OK;
|
241
|
-
mrb_irep *irep = proc->body.irep;
|
246
|
+
const mrb_irep *irep = proc->body.irep;
|
242
247
|
|
243
248
|
if (args->remove_lv) {
|
244
|
-
mrb_irep_remove_lv(mrb, irep);
|
249
|
+
mrb_irep_remove_lv(mrb, (mrb_irep*)irep);
|
245
250
|
}
|
246
251
|
if (args->initname) {
|
247
|
-
|
252
|
+
if (args->dump_struct) {
|
253
|
+
n = mrb_dump_irep_cstruct(mrb, irep, args->flags, wfp, args->initname);
|
254
|
+
}
|
255
|
+
else {
|
256
|
+
n = mrb_dump_irep_cfunc(mrb, irep, args->flags, wfp, args->initname);
|
257
|
+
}
|
248
258
|
if (n == MRB_DUMP_INVALID_ARGUMENT) {
|
249
259
|
fprintf(stderr, "%s: invalid C language symbol name\n", args->initname);
|
250
260
|
}
|
@@ -261,7 +271,7 @@ dump_file(mrb_state *mrb, FILE *wfp, const char *outfile, struct RProc *proc, st
|
|
261
271
|
int
|
262
272
|
main(int argc, char **argv)
|
263
273
|
{
|
264
|
-
mrb_state *mrb =
|
274
|
+
mrb_state *mrb = mrb_open_core(NULL, NULL);
|
265
275
|
int n, result;
|
266
276
|
struct mrbc_args args;
|
267
277
|
FILE *wfp;
|
@@ -334,7 +344,7 @@ mrb_init_mrblib(mrb_state *mrb)
|
|
334
344
|
{
|
335
345
|
}
|
336
346
|
|
337
|
-
#ifndef
|
347
|
+
#ifndef MRB_NO_GEMS
|
338
348
|
void
|
339
349
|
mrb_init_mrbgems(mrb_state *mrb)
|
340
350
|
{
|
@@ -19,7 +19,7 @@ def assert_mruby(exp_out, exp_err, exp_success, args)
|
|
19
19
|
script, bin = Tempfile.new('test.rb'), Tempfile.new('test.mrb')
|
20
20
|
File.write script.path, 'p "ok"'
|
21
21
|
system "#{cmd('mrbc')} -g -o #{bin.path} #{script.path}"
|
22
|
-
o = `#{cmd('mruby')}
|
22
|
+
o = `#{cmd('mruby')} #{bin.path}`.strip
|
23
23
|
assert_equal '"ok"', o
|
24
24
|
end
|
25
25
|
|
@@ -33,7 +33,7 @@ def assert_mruby(exp_out, exp_err, exp_success, args)
|
|
33
33
|
|
34
34
|
# .mrb file
|
35
35
|
`#{cmd('mrbc')} -o "#{bin.path}" "#{script.path}"`
|
36
|
-
assert_equal "\"#{bin.path}\"", `#{cmd('mruby')}
|
36
|
+
assert_equal "\"#{bin.path}\"", `#{cmd('mruby')} "#{bin.path}"`.chomp
|
37
37
|
|
38
38
|
# one liner
|
39
39
|
assert_equal '"-e"', `#{cmd('mruby')} -e #{shellquote('p $0')}`.chomp
|
@@ -48,7 +48,7 @@ def assert_mruby(exp_out, exp_err, exp_success, args)
|
|
48
48
|
script, bin = Tempfile.new('test.rb'), Tempfile.new('test.mrb')
|
49
49
|
File.write script.path, 'p [3.21, 2e308.infinite?, -2e308.infinite?]'
|
50
50
|
system "#{cmd('mrbc')} -g -o #{bin.path} #{script.path}"
|
51
|
-
assert_equal "[3.21, 1, -1]", `#{cmd('mruby')}
|
51
|
+
assert_equal "[3.21, 1, -1]", `#{cmd('mruby')} #{bin.path}`.chomp!
|
52
52
|
end
|
53
53
|
|
54
54
|
assert '__END__', '8.6' do
|
@@ -129,7 +129,7 @@ def hoge
|
|
129
129
|
end
|
130
130
|
|
131
131
|
assert('mruby -v option') do
|
132
|
-
ver_re = '\Amruby \d+\.\d+\.\d
|
132
|
+
ver_re = '\Amruby \d+\.\d+\.\d+.* \(\d+-\d+-\d+\)\n'
|
133
133
|
assert_mruby(/#{ver_re}\z/, "", true, %w[-v])
|
134
134
|
assert_mruby(/#{ver_re}^[^\n]*NODE.*\n:end\n\z/m, "", true, %w[-v -e p(:end)])
|
135
135
|
end
|
@@ -162,3 +162,24 @@ def hoge
|
|
162
162
|
code = "def f(#{(1..100).map{|n| "a#{n}"} * ","}); end"
|
163
163
|
assert_mruby("", /\Acodegen error:.*\n\z/, false, ["-e", code])
|
164
164
|
end
|
165
|
+
|
166
|
+
assert('top level local variables are in file scope') do
|
167
|
+
arb, amrb = Tempfile.new('a.rb'), Tempfile.new('a.mrb')
|
168
|
+
brb, bmrb = Tempfile.new('b.rb'), Tempfile.new('b.mrb')
|
169
|
+
crb, cmrb = Tempfile.new('c.rb'), Tempfile.new('c.mrb')
|
170
|
+
drb, dmrb = Tempfile.new('d.rb'), Tempfile.new('d.mrb')
|
171
|
+
|
172
|
+
File.write arb.path, 'a = 1'
|
173
|
+
system "#{cmd('mrbc')} -g -o #{amrb.path} #{arb.path}"
|
174
|
+
File.write brb.path, 'p a'
|
175
|
+
system "#{cmd('mrbc')} -g -o #{bmrb.path} #{brb.path}"
|
176
|
+
assert_mruby("", /:1: undefined method 'a' \(NoMethodError\)\n\z/, false, ["-r", arb.path, brb.path])
|
177
|
+
assert_mruby("", /:1: undefined method 'a' \(NoMethodError\)\n\z/, false, ["-b", "-r", amrb.path, bmrb.path])
|
178
|
+
|
179
|
+
File.write crb.path, 'a, b, c = 1, 2, 3; A = -> { b = -2; [a, b, c] }'
|
180
|
+
system "#{cmd('mrbc')} -g -o #{cmrb.path} #{crb.path}"
|
181
|
+
File.write drb.path, 'a, b = 5, 6; p A.call; p a, b'
|
182
|
+
system "#{cmd('mrbc')} -g -o #{dmrb.path} #{drb.path}"
|
183
|
+
assert_mruby("[1, -2, 3]\n5\n6\n", "", true, ["-r", crb.path, drb.path])
|
184
|
+
assert_mruby("[1, -2, 3]\n5\n6\n", "", true, ["-b", "-r", cmrb.path, dmrb.path])
|
185
|
+
end
|
@@ -7,6 +7,6 @@
|
|
7
7
|
spec.add_test_dependency('mruby-print', :core => 'mruby-print')
|
8
8
|
|
9
9
|
if build.cxx_exception_enabled?
|
10
|
-
build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c"
|
10
|
+
build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c")
|
11
11
|
end
|
12
12
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#include <mruby.h>
|
2
2
|
|
3
|
-
#ifdef
|
4
|
-
# error mruby-bin-mruby conflicts '
|
3
|
+
#ifdef MRB_NO_STDIO
|
4
|
+
# error mruby-bin-mruby conflicts 'MRB_NO_STDIO' in your build configuration
|
5
5
|
#endif
|
6
6
|
|
7
7
|
#include <stdlib.h>
|
@@ -10,6 +10,12 @@
|
|
10
10
|
#include <mruby/compile.h>
|
11
11
|
#include <mruby/dump.h>
|
12
12
|
#include <mruby/variable.h>
|
13
|
+
#include <mruby/proc.h>
|
14
|
+
|
15
|
+
#if defined(_WIN32) || defined(_WIN64)
|
16
|
+
# include <io.h> /* for setmode */
|
17
|
+
# include <fcntl.h>
|
18
|
+
#endif
|
13
19
|
|
14
20
|
struct _args {
|
15
21
|
FILE *rfp;
|
@@ -217,7 +223,7 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
|
|
217
223
|
}
|
218
224
|
else {
|
219
225
|
args->rfp = strcmp(argv[0], "-") == 0 ?
|
220
|
-
stdin : fopen(argv[0],
|
226
|
+
stdin : fopen(argv[0], "rb");
|
221
227
|
if (args->rfp == NULL) {
|
222
228
|
fprintf(stderr, "%s: Cannot open program file: %s\n", opts->program, argv[0]);
|
223
229
|
return EXIT_FAILURE;
|
@@ -227,6 +233,11 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
|
|
227
233
|
argc--; argv++;
|
228
234
|
}
|
229
235
|
}
|
236
|
+
#if defined(_WIN32) || defined(_WIN64)
|
237
|
+
if (args->rfp == stdin) {
|
238
|
+
_setmode(_fileno(stdin), O_BINARY);
|
239
|
+
}
|
240
|
+
#endif
|
230
241
|
args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1));
|
231
242
|
memcpy(args->argv, argv, (argc+1) * sizeof(char*));
|
232
243
|
args->argc = argc;
|
@@ -307,7 +318,8 @@ main(int argc, char **argv)
|
|
307
318
|
|
308
319
|
/* Load libraries */
|
309
320
|
for (i = 0; i < args.libc; i++) {
|
310
|
-
|
321
|
+
struct REnv *e;
|
322
|
+
FILE *lfp = fopen(args.libv[i], "rb");
|
311
323
|
if (lfp == NULL) {
|
312
324
|
fprintf(stderr, "%s: Cannot open library file: %s\n", *argv, args.libv[i]);
|
313
325
|
mrbc_context_free(mrb, c);
|
@@ -318,9 +330,13 @@ main(int argc, char **argv)
|
|
318
330
|
v = mrb_load_irep_file_cxt(mrb, lfp, c);
|
319
331
|
}
|
320
332
|
else {
|
321
|
-
v =
|
333
|
+
v = mrb_load_detect_file_cxt(mrb, lfp, c);
|
322
334
|
}
|
323
335
|
fclose(lfp);
|
336
|
+
e = mrb_vm_ci_env(mrb->c->cibase);
|
337
|
+
mrb_vm_ci_env_set(mrb->c->cibase, NULL);
|
338
|
+
mrb_env_unshare(mrb, e);
|
339
|
+
mrbc_cleanup_local_variables(mrb, c);
|
324
340
|
}
|
325
341
|
|
326
342
|
/* Load program */
|
@@ -328,7 +344,7 @@ main(int argc, char **argv)
|
|
328
344
|
v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
|
329
345
|
}
|
330
346
|
else if (args.rfp) {
|
331
|
-
v =
|
347
|
+
v = mrb_load_detect_file_cxt(mrb, args.rfp, c);
|
332
348
|
}
|
333
349
|
else {
|
334
350
|
char* utf8 = mrb_utf8_from_locale(args.cmdline, -1);
|
@@ -32,7 +32,7 @@
|
|
32
32
|
o = `#{cmd('mruby-strip')} #{compiled1.path}`
|
33
33
|
assert_equal 0, $?.exitstatus
|
34
34
|
assert_equal "", o
|
35
|
-
assert_equal `#{cmd('mruby')} #{script_file.path}`, `#{cmd('mruby')}
|
35
|
+
assert_equal `#{cmd('mruby')} #{script_file.path}`, `#{cmd('mruby')} #{compiled1.path}`
|
36
36
|
|
37
37
|
o = `#{cmd('mruby-strip')} #{compiled1.path} #{compiled2.path}`
|
38
38
|
assert_equal 0, $?.exitstatus
|
data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#include <mruby.h>
|
2
2
|
|
3
|
-
#ifdef
|
4
|
-
# error mruby-bin-strip conflicts '
|
3
|
+
#ifdef MRB_NO_STDIO
|
4
|
+
# error mruby-bin-strip conflicts 'MRB_NO_STDIO' in your build configuration
|
5
5
|
#endif
|
6
6
|
|
7
7
|
#include <stdlib.h>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class ThrowCatchJump < Exception
|
2
|
+
def initialize(tag, val)
|
3
|
+
@tag = tag
|
4
|
+
@val = val
|
5
|
+
super("uncaught throw :#{tag}")
|
6
|
+
end
|
7
|
+
def _tag
|
8
|
+
@tag
|
9
|
+
end
|
10
|
+
def _val
|
11
|
+
@val
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module Kernel
|
16
|
+
def catch(tag, &block)
|
17
|
+
block.call(tag)
|
18
|
+
rescue ThrowCatchJump => e
|
19
|
+
unless e._tag == tag
|
20
|
+
raise e
|
21
|
+
end
|
22
|
+
return e._val
|
23
|
+
end
|
24
|
+
def throw(tag, val=nil)
|
25
|
+
raise ThrowCatchJump.new(tag, val)
|
26
|
+
end
|
27
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "mruby.h"
|
2
2
|
#include "mruby/class.h"
|
3
3
|
#include "mruby/string.h"
|
4
|
+
#include "mruby/proc.h"
|
4
5
|
|
5
6
|
static mrb_value
|
6
7
|
mrb_mod_name(mrb_state *mrb, mrb_value self)
|
@@ -51,7 +52,7 @@ mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
|
|
51
52
|
if (mrb->c->ci->acc < 0) {
|
52
53
|
return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
|
53
54
|
}
|
54
|
-
mrb->c->ci
|
55
|
+
mrb_vm_ci_target_class_set(mrb->c->ci, c);
|
55
56
|
return mrb_yield_cont(mrb, blk, self, argc, argv);
|
56
57
|
}
|
57
58
|
|
@@ -5,16 +5,17 @@
|
|
5
5
|
*/
|
6
6
|
|
7
7
|
#include <ctype.h>
|
8
|
-
#include <limits.h>
|
9
8
|
#include <stdlib.h>
|
10
9
|
#include <string.h>
|
11
10
|
#include <math.h>
|
12
11
|
#include <mruby.h>
|
13
12
|
#include <mruby/compile.h>
|
14
13
|
#include <mruby/proc.h>
|
14
|
+
#include <mruby/dump.h>
|
15
15
|
#include <mruby/numeric.h>
|
16
16
|
#include <mruby/string.h>
|
17
17
|
#include <mruby/debug.h>
|
18
|
+
#include <mruby/presym.h>
|
18
19
|
#include "node.h"
|
19
20
|
#include <mruby/opcode.h>
|
20
21
|
#include <mruby/re.h>
|
@@ -39,8 +40,8 @@ enum looptype {
|
|
39
40
|
|
40
41
|
struct loopinfo {
|
41
42
|
enum looptype type;
|
42
|
-
|
43
|
-
int
|
43
|
+
uint32_t pc0, pc1, pc2, pc3;
|
44
|
+
int acc;
|
44
45
|
struct loopinfo *prev;
|
45
46
|
};
|
46
47
|
|
@@ -54,14 +55,13 @@ typedef struct scope {
|
|
54
55
|
node *lv;
|
55
56
|
|
56
57
|
uint16_t sp;
|
57
|
-
|
58
|
-
|
59
|
-
|
58
|
+
uint32_t pc;
|
59
|
+
uint32_t lastpc;
|
60
|
+
uint32_t lastlabel;
|
60
61
|
int ainfo:15;
|
61
62
|
mrb_bool mscope:1;
|
62
63
|
|
63
64
|
struct loopinfo *loop;
|
64
|
-
int ensure_level;
|
65
65
|
mrb_sym filename_sym;
|
66
66
|
uint16_t lineno;
|
67
67
|
|
@@ -70,6 +70,10 @@ typedef struct scope {
|
|
70
70
|
uint32_t icapa;
|
71
71
|
|
72
72
|
mrb_irep *irep;
|
73
|
+
mrb_pool_value *pool;
|
74
|
+
mrb_sym *syms;
|
75
|
+
mrb_irep **reps;
|
76
|
+
struct mrb_irep_catch_handler *catch_table;
|
73
77
|
uint32_t pcapa, scapa, rcapa;
|
74
78
|
|
75
79
|
uint16_t nlocals;
|
@@ -89,6 +93,15 @@ static struct loopinfo *loop_push(codegen_scope *s, enum looptype t);
|
|
89
93
|
static void loop_break(codegen_scope *s, node *tree);
|
90
94
|
static void loop_pop(codegen_scope *s, int val);
|
91
95
|
|
96
|
+
/*
|
97
|
+
* The search for catch handlers starts at the end of the table in mrb_vm_run().
|
98
|
+
* Therefore, the next handler to be added must meet one of the following conditions.
|
99
|
+
* - Larger start position
|
100
|
+
* - Same start position but smaller end position
|
101
|
+
*/
|
102
|
+
static int catch_handler_new(codegen_scope *s);
|
103
|
+
static void catch_handler_set(codegen_scope *s, int ent, enum mrb_catch_type type, uint32_t begin, uint32_t end, uint32_t target);
|
104
|
+
|
92
105
|
static void gen_assignment(codegen_scope *s, node *tree, int sp, int val);
|
93
106
|
static void gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val);
|
94
107
|
|
@@ -101,12 +114,31 @@ codegen_error(codegen_scope *s, const char *message)
|
|
101
114
|
if (!s) return;
|
102
115
|
while (s->prev) {
|
103
116
|
codegen_scope *tmp = s->prev;
|
104
|
-
|
105
|
-
|
117
|
+
if (s->irep) {
|
118
|
+
mrb_free(s->mrb, s->iseq);
|
119
|
+
for (int i=0; i<s->irep->plen; i++) {
|
120
|
+
mrb_pool_value *pv = &s->pool[i];
|
121
|
+
if ((pv->tt & 0x3) == IREP_TT_STR) {
|
122
|
+
mrb_free(s->mrb, (void*)pv->u.str);
|
123
|
+
}
|
124
|
+
}
|
125
|
+
mrb_free(s->mrb, s->pool);
|
126
|
+
mrb_free(s->mrb, s->syms);
|
127
|
+
mrb_free(s->mrb, s->catch_table);
|
128
|
+
if (s->reps) {
|
129
|
+
/* copied from mrb_irep_free() in state.c */
|
130
|
+
for (int i=0; i<s->irep->rlen; i++) {
|
131
|
+
if (s->reps[i])
|
132
|
+
mrb_irep_decref(s->mrb, (mrb_irep*)s->reps[i]);
|
133
|
+
}
|
134
|
+
mrb_free(s->mrb, s->reps);
|
135
|
+
}
|
136
|
+
mrb_free(s->mrb, s->lines);
|
137
|
+
}
|
106
138
|
mrb_pool_close(s->mpool);
|
107
139
|
s = tmp;
|
108
140
|
}
|
109
|
-
#ifndef
|
141
|
+
#ifndef MRB_NO_STDIO
|
110
142
|
if (s->filename_sym && s->lineno) {
|
111
143
|
const char *filename = mrb_sym_name_len(s->mrb, s->filename_sym, NULL);
|
112
144
|
fprintf(stderr, "codegen error:%s:%d: %s\n", filename, s->lineno, message);
|
@@ -145,13 +177,15 @@ new_label(codegen_scope *s)
|
|
145
177
|
static void
|
146
178
|
emit_B(codegen_scope *s, uint32_t pc, uint8_t i)
|
147
179
|
{
|
148
|
-
if (pc >= MAXARG_S || s->icapa >= MAXARG_S) {
|
149
|
-
codegen_error(s, "too big code block");
|
150
|
-
}
|
151
180
|
if (pc >= s->icapa) {
|
152
|
-
|
153
|
-
|
154
|
-
|
181
|
+
if (pc == UINT32_MAX) {
|
182
|
+
codegen_error(s, "too big code block");
|
183
|
+
}
|
184
|
+
if (pc >= UINT32_MAX / 2) {
|
185
|
+
pc = UINT32_MAX;
|
186
|
+
}
|
187
|
+
else {
|
188
|
+
s->icapa *= 2;
|
155
189
|
}
|
156
190
|
s->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa);
|
157
191
|
if (s->lines) {
|
@@ -203,9 +237,7 @@ genop_1(codegen_scope *s, mrb_code i, uint16_t a)
|
|
203
237
|
{
|
204
238
|
s->lastpc = s->pc;
|
205
239
|
if (a > 0xff) {
|
206
|
-
|
207
|
-
gen_B(s, i);
|
208
|
-
gen_S(s, a);
|
240
|
+
codegen_error(s, "too big operand");
|
209
241
|
}
|
210
242
|
else {
|
211
243
|
gen_B(s, i);
|
@@ -217,24 +249,30 @@ static void
|
|
217
249
|
genop_2(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b)
|
218
250
|
{
|
219
251
|
s->lastpc = s->pc;
|
220
|
-
if (a > 0xff
|
221
|
-
|
222
|
-
gen_B(s, i);
|
223
|
-
gen_S(s, a);
|
224
|
-
gen_S(s, b);
|
252
|
+
if (a > 0xff || b > 0xff) {
|
253
|
+
codegen_error(s, "too big operand");
|
225
254
|
}
|
226
|
-
else
|
227
|
-
gen_B(s, OP_EXT2);
|
255
|
+
else {
|
228
256
|
gen_B(s, i);
|
229
257
|
gen_B(s, (uint8_t)a);
|
230
|
-
gen_S(s, b);
|
231
|
-
}
|
232
|
-
else if (a > 0xff) {
|
233
|
-
gen_B(s, OP_EXT1);
|
234
|
-
gen_B(s, i);
|
235
|
-
gen_S(s, a);
|
236
258
|
gen_B(s, (uint8_t)b);
|
237
259
|
}
|
260
|
+
}
|
261
|
+
|
262
|
+
/* similar to `genop_2` but generate `genop_2S` with `i+1` */
|
263
|
+
/* works for OP_LOADL, OP_LOADSYM, OP_STRING */
|
264
|
+
static void
|
265
|
+
genop_bs(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b)
|
266
|
+
{
|
267
|
+
s->lastpc = s->pc;
|
268
|
+
if (a > 0xff || b > 0xffff) {
|
269
|
+
codegen_error(s, "too big operand");
|
270
|
+
}
|
271
|
+
if (b > 0xff) {
|
272
|
+
gen_B(s, i+1);
|
273
|
+
gen_B(s, (uint8_t)a);
|
274
|
+
gen_S(s, b);
|
275
|
+
}
|
238
276
|
else {
|
239
277
|
gen_B(s, i);
|
240
278
|
gen_B(s, (uint8_t)a);
|
@@ -256,6 +294,14 @@ genop_2S(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b)
|
|
256
294
|
gen_S(s, b);
|
257
295
|
}
|
258
296
|
|
297
|
+
static void
|
298
|
+
genop_2SS(codegen_scope *s, mrb_code i, uint16_t a, uint32_t b)
|
299
|
+
{
|
300
|
+
genop_1(s, i, a);
|
301
|
+
gen_S(s, b>>16);
|
302
|
+
gen_S(s, b&0xffff);
|
303
|
+
}
|
304
|
+
|
259
305
|
static void
|
260
306
|
genop_W(codegen_scope *s, mrb_code i, uint32_t a)
|
261
307
|
{
|
@@ -288,39 +334,13 @@ mrb_decode_insn(const mrb_code *pc)
|
|
288
334
|
mrb_code insn = READ_B();
|
289
335
|
uint16_t a = 0;
|
290
336
|
uint16_t b = 0;
|
291
|
-
|
337
|
+
uint16_t c = 0;
|
292
338
|
|
293
339
|
switch (insn) {
|
294
340
|
#define FETCH_Z() /* empty */
|
295
341
|
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x (); break;
|
296
342
|
#include "mruby/ops.h"
|
297
343
|
#undef OPCODE
|
298
|
-
}
|
299
|
-
switch (insn) {
|
300
|
-
case OP_EXT1:
|
301
|
-
insn = READ_B();
|
302
|
-
switch (insn) {
|
303
|
-
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _1 (); break;
|
304
|
-
#include "mruby/ops.h"
|
305
|
-
#undef OPCODE
|
306
|
-
}
|
307
|
-
break;
|
308
|
-
case OP_EXT2:
|
309
|
-
insn = READ_B();
|
310
|
-
switch (insn) {
|
311
|
-
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _2 (); break;
|
312
|
-
#include "mruby/ops.h"
|
313
|
-
#undef OPCODE
|
314
|
-
}
|
315
|
-
break;
|
316
|
-
case OP_EXT3:
|
317
|
-
insn = READ_B();
|
318
|
-
switch (insn) {
|
319
|
-
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _3 (); break;
|
320
|
-
#include "mruby/ops.h"
|
321
|
-
#undef OPCODE
|
322
|
-
}
|
323
|
-
break;
|
324
344
|
default:
|
325
345
|
break;
|
326
346
|
}
|
@@ -349,22 +369,44 @@ no_peephole(codegen_scope *s)
|
|
349
369
|
return no_optimize(s) || s->lastlabel == s->pc || s->pc == 0 || s->pc == s->lastpc;
|
350
370
|
}
|
351
371
|
|
352
|
-
|
353
|
-
|
372
|
+
#define JMPLINK_START UINT32_MAX
|
373
|
+
|
374
|
+
static void
|
375
|
+
gen_jmpdst(codegen_scope *s, uint32_t pc)
|
376
|
+
{
|
377
|
+
|
378
|
+
if (pc == JMPLINK_START) {
|
379
|
+
gen_S(s, 0);
|
380
|
+
}
|
381
|
+
else {
|
382
|
+
uint32_t pos2 = s->pc+2;
|
383
|
+
int32_t off = pc - pos2;
|
384
|
+
|
385
|
+
if (off > INT16_MAX || INT16_MIN > off) {
|
386
|
+
codegen_error(s, "too big jump offset");
|
387
|
+
}
|
388
|
+
gen_S(s, (uint16_t)off);
|
389
|
+
}
|
390
|
+
}
|
391
|
+
|
392
|
+
static uint32_t
|
393
|
+
genjmp(codegen_scope *s, mrb_code i, uint32_t pc)
|
354
394
|
{
|
355
|
-
|
395
|
+
uint32_t pos;
|
356
396
|
|
357
397
|
s->lastpc = s->pc;
|
358
398
|
gen_B(s, i);
|
359
399
|
pos = s->pc;
|
360
|
-
|
400
|
+
gen_jmpdst(s, pc);
|
361
401
|
return pos;
|
362
402
|
}
|
363
403
|
|
364
|
-
|
365
|
-
|
404
|
+
#define genjmp_0(s,i) genjmp(s,i,JMPLINK_START)
|
405
|
+
|
406
|
+
static uint32_t
|
407
|
+
genjmp2(codegen_scope *s, mrb_code i, uint16_t a, uint32_t pc, int val)
|
366
408
|
{
|
367
|
-
|
409
|
+
uint32_t pos;
|
368
410
|
|
369
411
|
if (!no_peephole(s) && !val) {
|
370
412
|
struct mrb_insn_data data = mrb_last_insn(s);
|
@@ -377,21 +419,20 @@ genjmp2(codegen_scope *s, mrb_code i, uint16_t a, int pc, int val)
|
|
377
419
|
|
378
420
|
s->lastpc = s->pc;
|
379
421
|
if (a > 0xff) {
|
380
|
-
|
381
|
-
|
382
|
-
gen_S(s, a);
|
383
|
-
pos = s->pc;
|
384
|
-
gen_S(s, pc);
|
422
|
+
codegen_error(s, "too big operand");
|
423
|
+
pos = 0;
|
385
424
|
}
|
386
425
|
else {
|
387
426
|
gen_B(s, i);
|
388
427
|
gen_B(s, (uint8_t)a);
|
389
428
|
pos = s->pc;
|
390
|
-
|
429
|
+
gen_jmpdst(s, pc);
|
391
430
|
}
|
392
431
|
return pos;
|
393
432
|
}
|
394
433
|
|
434
|
+
#define genjmp2_0(s,i,a,val) genjmp2(s,i,a,JMPLINK_START,val)
|
435
|
+
|
395
436
|
static void
|
396
437
|
gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep)
|
397
438
|
{
|
@@ -417,10 +458,13 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep)
|
|
417
458
|
s->pc = s->lastpc;
|
418
459
|
genop_1(s, data.insn, dst);
|
419
460
|
break;
|
420
|
-
case OP_LOADI: case OP_LOADINEG:
|
461
|
+
case OP_LOADI: case OP_LOADINEG:
|
462
|
+
case OP_LOADL: case OP_LOADSYM:
|
463
|
+
case OP_LOADL16: case OP_LOADSYM16:
|
421
464
|
case OP_GETGV: case OP_GETSV: case OP_GETIV: case OP_GETCV:
|
422
|
-
case OP_GETCONST: case OP_STRING:
|
465
|
+
case OP_GETCONST: case OP_STRING: case OP_STRING16:
|
423
466
|
case OP_LAMBDA: case OP_BLOCK: case OP_METHOD: case OP_BLKPUSH:
|
467
|
+
case OP_LAMBDA16: case OP_BLOCK16: case OP_METHOD16:
|
424
468
|
if (nopeep || data.a != src || data.a < s->nlocals) goto normal;
|
425
469
|
s->pc = s->lastpc;
|
426
470
|
genop_2(s, data.insn, dst, data.b);
|
@@ -488,21 +532,31 @@ gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst)
|
|
488
532
|
}
|
489
533
|
}
|
490
534
|
|
491
|
-
static
|
492
|
-
dispatch(codegen_scope *s,
|
535
|
+
static uint32_t
|
536
|
+
dispatch(codegen_scope *s, uint32_t pos0)
|
493
537
|
{
|
494
|
-
|
538
|
+
int32_t pos1;
|
539
|
+
int32_t offset;
|
540
|
+
int16_t newpos;
|
541
|
+
|
542
|
+
if (pos0 == JMPLINK_START) return 0;
|
495
543
|
|
544
|
+
pos1 = pos0 + 2;
|
545
|
+
offset = s->pc - pos1;
|
546
|
+
if (offset > INT16_MAX) {
|
547
|
+
codegen_error(s, "too big jmp offset");
|
548
|
+
}
|
496
549
|
s->lastlabel = s->pc;
|
497
|
-
newpos = PEEK_S(s->iseq+pos0);
|
498
|
-
emit_S(s, pos0,
|
499
|
-
return
|
550
|
+
newpos = (int16_t)PEEK_S(s->iseq+pos0);
|
551
|
+
emit_S(s, pos0, (uint16_t)offset);
|
552
|
+
if (newpos == 0) return 0;
|
553
|
+
return pos1+newpos;
|
500
554
|
}
|
501
555
|
|
502
556
|
static void
|
503
|
-
dispatch_linked(codegen_scope *s,
|
557
|
+
dispatch_linked(codegen_scope *s, uint32_t pos)
|
504
558
|
{
|
505
|
-
if (pos==
|
559
|
+
if (pos==JMPLINK_START) return;
|
506
560
|
for (;;) {
|
507
561
|
pos = dispatch(s, pos);
|
508
562
|
if (pos==0) break;
|
@@ -539,37 +593,46 @@ static inline int
|
|
539
593
|
new_lit(codegen_scope *s, mrb_value val)
|
540
594
|
{
|
541
595
|
int i;
|
542
|
-
|
596
|
+
mrb_pool_value *pv;
|
543
597
|
|
544
598
|
switch (mrb_type(val)) {
|
545
599
|
case MRB_TT_STRING:
|
546
600
|
for (i=0; i<s->irep->plen; i++) {
|
547
601
|
mrb_int len;
|
548
|
-
pv = &s->
|
549
|
-
|
550
|
-
|
551
|
-
if (
|
552
|
-
if (memcmp(
|
602
|
+
pv = &s->pool[i];
|
603
|
+
if (pv->tt & IREP_TT_NFLAG) continue;
|
604
|
+
len = pv->tt>>2;
|
605
|
+
if (RSTRING_LEN(val) != len) continue;
|
606
|
+
if (memcmp(pv->u.str, RSTRING_PTR(val), len) == 0)
|
553
607
|
return i;
|
554
608
|
}
|
555
609
|
break;
|
556
|
-
#ifndef
|
610
|
+
#ifndef MRB_NO_FLOAT
|
557
611
|
case MRB_TT_FLOAT:
|
558
612
|
for (i=0; i<s->irep->plen; i++) {
|
559
613
|
mrb_float f1, f2;
|
560
|
-
pv = &s->
|
561
|
-
if (
|
562
|
-
|
614
|
+
pv = &s->pool[i];
|
615
|
+
if (pv->tt != IREP_TT_FLOAT) continue;
|
616
|
+
pv = &s->pool[i];
|
617
|
+
f1 = pv->u.f;
|
563
618
|
f2 = mrb_float(val);
|
564
619
|
if (f1 == f2 && !signbit(f1) == !signbit(f2)) return i;
|
565
620
|
}
|
566
621
|
break;
|
567
622
|
#endif
|
568
|
-
case
|
623
|
+
case MRB_TT_INTEGER:
|
569
624
|
for (i=0; i<s->irep->plen; i++) {
|
570
|
-
|
571
|
-
|
572
|
-
if (
|
625
|
+
mrb_int v = mrb_integer(val);
|
626
|
+
pv = &s->pool[i];
|
627
|
+
if (pv->tt == IREP_TT_INT32) {
|
628
|
+
if (v == pv->u.i32) return i;
|
629
|
+
}
|
630
|
+
#ifdef MRB_64BIT
|
631
|
+
else if (pv->tt == IREP_TT_INT64) {
|
632
|
+
if (v == pv->u.i64) return i;
|
633
|
+
}
|
634
|
+
continue;
|
635
|
+
#endif
|
573
636
|
}
|
574
637
|
break;
|
575
638
|
default:
|
@@ -579,26 +642,43 @@ new_lit(codegen_scope *s, mrb_value val)
|
|
579
642
|
|
580
643
|
if (s->irep->plen == s->pcapa) {
|
581
644
|
s->pcapa *= 2;
|
582
|
-
s->
|
645
|
+
s->pool = (mrb_pool_value*)codegen_realloc(s, s->pool, sizeof(mrb_pool_value)*s->pcapa);
|
583
646
|
}
|
584
647
|
|
585
|
-
pv = &s->
|
648
|
+
pv = &s->pool[s->irep->plen];
|
586
649
|
i = s->irep->plen++;
|
587
650
|
|
588
651
|
switch (mrb_type(val)) {
|
589
652
|
case MRB_TT_STRING:
|
590
|
-
|
653
|
+
if (RSTR_NOFREE_P(RSTRING(val))) {
|
654
|
+
pv->tt = (uint32_t)(RSTRING_LEN(val)<<2) | IREP_TT_SSTR;
|
655
|
+
pv->u.str = RSTRING_PTR(val);
|
656
|
+
}
|
657
|
+
else {
|
658
|
+
char *p;
|
659
|
+
mrb_int len = RSTRING_LEN(val);
|
660
|
+
pv->tt = (uint32_t)(len<<2) | IREP_TT_STR;
|
661
|
+
p = (char*)codegen_realloc(s, NULL, len+1);
|
662
|
+
memcpy(p, RSTRING_PTR(val), len);
|
663
|
+
p[len] = '\0';
|
664
|
+
pv->u.str = p;
|
665
|
+
}
|
591
666
|
break;
|
592
667
|
|
593
|
-
#ifndef
|
668
|
+
#ifndef MRB_NO_FLOAT
|
594
669
|
case MRB_TT_FLOAT:
|
595
|
-
|
596
|
-
|
670
|
+
pv->tt = IREP_TT_FLOAT;
|
671
|
+
pv->u.f = mrb_float(val);
|
597
672
|
break;
|
598
673
|
#endif
|
674
|
+
case MRB_TT_INTEGER:
|
675
|
+
#ifdef MRB_INT64
|
676
|
+
pv->tt = IREP_TT_INT64;
|
677
|
+
pv->u.i64 = mrb_integer(val);
|
678
|
+
#else
|
679
|
+
pv->tt = IREP_TT_INT32;
|
680
|
+
pv->u.i32 = mrb_integer(val);
|
599
681
|
#endif
|
600
|
-
case MRB_TT_FIXNUM:
|
601
|
-
*pv = val;
|
602
682
|
break;
|
603
683
|
|
604
684
|
default:
|
@@ -608,9 +688,6 @@ new_lit(codegen_scope *s, mrb_value val)
|
|
608
688
|
return i;
|
609
689
|
}
|
610
690
|
|
611
|
-
/* maximum symbol numbers */
|
612
|
-
#define MAXSYMLEN 0x10000
|
613
|
-
|
614
691
|
static int
|
615
692
|
new_sym(codegen_scope *s, mrb_sym sym)
|
616
693
|
{
|
@@ -620,13 +697,16 @@ new_sym(codegen_scope *s, mrb_sym sym)
|
|
620
697
|
|
621
698
|
len = s->irep->slen;
|
622
699
|
for (i=0; i<len; i++) {
|
623
|
-
if (s->
|
700
|
+
if (s->syms[i] == sym) return i;
|
624
701
|
}
|
625
702
|
if (s->irep->slen >= s->scapa) {
|
626
703
|
s->scapa *= 2;
|
627
|
-
s->
|
704
|
+
if (s->scapa > 0xffff) {
|
705
|
+
codegen_error(s, "too many symbols");
|
706
|
+
}
|
707
|
+
s->syms = (mrb_sym*)codegen_realloc(s, s->syms, sizeof(mrb_sym)*s->scapa);
|
628
708
|
}
|
629
|
-
s->
|
709
|
+
s->syms[s->irep->slen] = sym;
|
630
710
|
return s->irep->slen++;
|
631
711
|
}
|
632
712
|
|
@@ -665,7 +745,7 @@ lv_idx(codegen_scope *s, mrb_sym id)
|
|
665
745
|
static int
|
666
746
|
search_upvar(codegen_scope *s, mrb_sym id, int *idx)
|
667
747
|
{
|
668
|
-
struct RProc *u;
|
748
|
+
const struct RProc *u;
|
669
749
|
int lv = 0;
|
670
750
|
codegen_scope *up = s->prev;
|
671
751
|
|
@@ -681,12 +761,14 @@ search_upvar(codegen_scope *s, mrb_sym id, int *idx)
|
|
681
761
|
if (lv < 1) lv = 1;
|
682
762
|
u = s->parser->upper;
|
683
763
|
while (u && !MRB_PROC_CFUNC_P(u)) {
|
684
|
-
struct mrb_irep *ir = u->body.irep;
|
764
|
+
const struct mrb_irep *ir = u->body.irep;
|
685
765
|
uint_fast16_t n = ir->nlocals;
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
766
|
+
int i;
|
767
|
+
|
768
|
+
const mrb_sym *v = ir->lv;
|
769
|
+
for (i=1; n > 1; n--, v++, i++) {
|
770
|
+
if (*v == id) {
|
771
|
+
*idx = i;
|
690
772
|
return lv - 1;
|
691
773
|
}
|
692
774
|
}
|
@@ -737,7 +819,7 @@ for_body(codegen_scope *s, node *tree)
|
|
737
819
|
genop_2(s, OP_BLOCK, cursp(), s->irep->rlen-1);
|
738
820
|
push();pop(); /* space for a block */
|
739
821
|
pop();
|
740
|
-
idx = new_sym(s,
|
822
|
+
idx = new_sym(s, MRB_SYM_2(s->mrb, each));
|
741
823
|
genop_3(s, OP_SENDB, cursp(), idx, 0);
|
742
824
|
}
|
743
825
|
|
@@ -774,7 +856,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
774
856
|
oa = node_len(tree->car->cdr->car);
|
775
857
|
/* rest argument? */
|
776
858
|
ra = tree->car->cdr->cdr->car ? 1 : 0;
|
777
|
-
/* mandatory
|
859
|
+
/* mandatory arguments after rest argument */
|
778
860
|
pa = node_len(tree->car->cdr->cdr->cdr->car);
|
779
861
|
pargs = tree->car->cdr->cdr->cdr->car;
|
780
862
|
/* keyword arguments */
|
@@ -802,10 +884,10 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
802
884
|
pos = new_label(s);
|
803
885
|
for (i=0; i<oa; i++) {
|
804
886
|
new_label(s);
|
805
|
-
|
887
|
+
genjmp_0(s, OP_JMP);
|
806
888
|
}
|
807
889
|
if (oa > 0) {
|
808
|
-
|
890
|
+
genjmp_0(s, OP_JMP);
|
809
891
|
}
|
810
892
|
opt = tree->car->cdr->car;
|
811
893
|
i = 0;
|
@@ -852,7 +934,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
852
934
|
if (def_arg) {
|
853
935
|
int idx;
|
854
936
|
genop_2(s, OP_KEY_P, lv_idx(s, kwd_sym), new_sym(s, kwd_sym));
|
855
|
-
jmpif_key_p =
|
937
|
+
jmpif_key_p = genjmp2_0(s, OP_JMPIF, lv_idx(s, kwd_sym), NOVAL);
|
856
938
|
codegen(s, def_arg, VAL);
|
857
939
|
pop();
|
858
940
|
idx = lv_idx(s, kwd_sym);
|
@@ -863,7 +945,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
863
945
|
int lv = search_upvar(s, kwd_sym, &idx);
|
864
946
|
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
865
947
|
}
|
866
|
-
jmp_def_set =
|
948
|
+
jmp_def_set = genjmp_0(s, OP_JMP);
|
867
949
|
dispatch(s, jmpif_key_p);
|
868
950
|
}
|
869
951
|
genop_2(s, OP_KARG, lv_idx(s, kwd_sym), new_sym(s, kwd_sym));
|
@@ -1044,7 +1126,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
|
|
1044
1126
|
if (safe) {
|
1045
1127
|
int recv = cursp()-1;
|
1046
1128
|
gen_move(s, cursp(), recv, 1);
|
1047
|
-
skip =
|
1129
|
+
skip = genjmp2_0(s, OP_JMPNIL, cursp(), val);
|
1048
1130
|
}
|
1049
1131
|
tree = tree->cdr->cdr->car;
|
1050
1132
|
if (tree) {
|
@@ -1196,7 +1278,7 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
|
|
1196
1278
|
break;
|
1197
1279
|
|
1198
1280
|
default:
|
1199
|
-
#ifndef
|
1281
|
+
#ifndef MRB_NO_STDIO
|
1200
1282
|
fprintf(stderr, "unknown lhs %d\n", type);
|
1201
1283
|
#endif
|
1202
1284
|
break;
|
@@ -1325,34 +1407,6 @@ raise_error(codegen_scope *s, const char *msg)
|
|
1325
1407
|
genop_1(s, OP_ERR, idx);
|
1326
1408
|
}
|
1327
1409
|
|
1328
|
-
#ifndef MRB_WITHOUT_FLOAT
|
1329
|
-
static double
|
1330
|
-
readint_float(codegen_scope *s, const char *p, int base)
|
1331
|
-
{
|
1332
|
-
const char *e = p + strlen(p);
|
1333
|
-
double f = 0;
|
1334
|
-
int n;
|
1335
|
-
|
1336
|
-
if (*p == '+') p++;
|
1337
|
-
while (p < e) {
|
1338
|
-
char c = *p;
|
1339
|
-
c = tolower((unsigned char)c);
|
1340
|
-
for (n=0; n<base; n++) {
|
1341
|
-
if (mrb_digitmap[n] == c) {
|
1342
|
-
f *= base;
|
1343
|
-
f += n;
|
1344
|
-
break;
|
1345
|
-
}
|
1346
|
-
}
|
1347
|
-
if (n == base) {
|
1348
|
-
codegen_error(s, "malformed readint input");
|
1349
|
-
}
|
1350
|
-
p++;
|
1351
|
-
}
|
1352
|
-
return f;
|
1353
|
-
}
|
1354
|
-
#endif
|
1355
|
-
|
1356
1410
|
static mrb_int
|
1357
1411
|
readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_bool *overflow)
|
1358
1412
|
{
|
@@ -1456,21 +1510,25 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1456
1510
|
|
1457
1511
|
case NODE_RESCUE:
|
1458
1512
|
{
|
1459
|
-
int noexc
|
1513
|
+
int noexc;
|
1514
|
+
uint32_t exend, pos1, pos2, tmp;
|
1460
1515
|
struct loopinfo *lp;
|
1516
|
+
int catch_entry, begin, end;
|
1461
1517
|
|
1462
1518
|
if (tree->car == NULL) goto exit;
|
1463
1519
|
lp = loop_push(s, LOOP_BEGIN);
|
1464
1520
|
lp->pc0 = new_label(s);
|
1465
|
-
|
1521
|
+
catch_entry = catch_handler_new(s);
|
1522
|
+
begin = s->pc;
|
1466
1523
|
codegen(s, tree->car, VAL);
|
1467
1524
|
pop();
|
1468
1525
|
lp->type = LOOP_RESCUE;
|
1469
|
-
|
1470
|
-
|
1526
|
+
end = s->pc;
|
1527
|
+
noexc = genjmp_0(s, OP_JMP);
|
1528
|
+
catch_handler_set(s, catch_entry, MRB_CATCH_RESCUE, begin, end, s->pc);
|
1471
1529
|
tree = tree->cdr;
|
1472
|
-
exend =
|
1473
|
-
pos1 =
|
1530
|
+
exend = JMPLINK_START;
|
1531
|
+
pos1 = JMPLINK_START;
|
1474
1532
|
if (tree->car) {
|
1475
1533
|
node *n2 = tree->car;
|
1476
1534
|
int exc = cursp();
|
@@ -1481,22 +1539,22 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1481
1539
|
node *n3 = n2->car;
|
1482
1540
|
node *n4 = n3->car;
|
1483
1541
|
|
1484
|
-
|
1485
|
-
pos2 =
|
1542
|
+
dispatch(s, pos1);
|
1543
|
+
pos2 = JMPLINK_START;
|
1486
1544
|
do {
|
1487
1545
|
if (n4 && n4->car && nint(n4->car->car) == NODE_SPLAT) {
|
1488
1546
|
codegen(s, n4->car, VAL);
|
1489
1547
|
gen_move(s, cursp(), exc, 0);
|
1490
1548
|
push_n(2); pop_n(2); /* space for one arg and a block */
|
1491
1549
|
pop();
|
1492
|
-
genop_3(s, OP_SEND, cursp(), new_sym(s,
|
1550
|
+
genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM_2(s->mrb, __case_eqq)), 1);
|
1493
1551
|
}
|
1494
1552
|
else {
|
1495
1553
|
if (n4) {
|
1496
1554
|
codegen(s, n4->car, VAL);
|
1497
1555
|
}
|
1498
1556
|
else {
|
1499
|
-
genop_2(s, OP_GETCONST, cursp(), new_sym(s,
|
1557
|
+
genop_2(s, OP_GETCONST, cursp(), new_sym(s, MRB_SYM_2(s->mrb, StandardError)));
|
1500
1558
|
push();
|
1501
1559
|
}
|
1502
1560
|
pop();
|
@@ -1508,7 +1566,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1508
1566
|
n4 = n4->cdr;
|
1509
1567
|
}
|
1510
1568
|
} while (n4);
|
1511
|
-
pos1 =
|
1569
|
+
pos1 = genjmp_0(s, OP_JMP);
|
1512
1570
|
dispatch_linked(s, pos2);
|
1513
1571
|
|
1514
1572
|
pop();
|
@@ -1524,15 +1582,14 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1524
1582
|
n2 = n2->cdr;
|
1525
1583
|
push();
|
1526
1584
|
}
|
1527
|
-
if (pos1) {
|
1585
|
+
if (pos1 != JMPLINK_START) {
|
1528
1586
|
dispatch(s, pos1);
|
1529
|
-
genop_1(s,
|
1587
|
+
genop_1(s, OP_RAISEIF, exc);
|
1530
1588
|
}
|
1531
1589
|
}
|
1532
1590
|
pop();
|
1533
1591
|
tree = tree->cdr;
|
1534
1592
|
dispatch(s, noexc);
|
1535
|
-
genop_1(s, OP_POPERR, 1);
|
1536
1593
|
if (tree->car) {
|
1537
1594
|
codegen(s, tree->car, val);
|
1538
1595
|
}
|
@@ -1548,14 +1605,22 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1548
1605
|
if (!tree->cdr || !tree->cdr->cdr ||
|
1549
1606
|
(nint(tree->cdr->cdr->car) == NODE_BEGIN &&
|
1550
1607
|
tree->cdr->cdr->cdr)) {
|
1608
|
+
int catch_entry, begin, end, target;
|
1551
1609
|
int idx;
|
1552
1610
|
|
1553
|
-
s
|
1554
|
-
|
1555
|
-
genop_1(s, OP_EPUSH, idx);
|
1611
|
+
catch_entry = catch_handler_new(s);
|
1612
|
+
begin = s->pc;
|
1556
1613
|
codegen(s, tree->car, val);
|
1557
|
-
s->
|
1558
|
-
|
1614
|
+
end = target = s->pc;
|
1615
|
+
push();
|
1616
|
+
idx = cursp();
|
1617
|
+
genop_1(s, OP_EXCEPT, idx);
|
1618
|
+
push();
|
1619
|
+
codegen(s, tree->cdr->cdr, NOVAL);
|
1620
|
+
pop();
|
1621
|
+
genop_1(s, OP_RAISEIF, idx);
|
1622
|
+
pop();
|
1623
|
+
catch_handler_set(s, catch_entry, MRB_CATCH_ENSURE, begin, end, target);
|
1559
1624
|
}
|
1560
1625
|
else { /* empty ensure ignored */
|
1561
1626
|
codegen(s, tree->car, val);
|
@@ -1566,7 +1631,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1566
1631
|
if (val) {
|
1567
1632
|
int idx = lambda_body(s, tree, 1);
|
1568
1633
|
|
1569
|
-
|
1634
|
+
genop_bs(s, OP_LAMBDA, cursp(), idx);
|
1570
1635
|
push();
|
1571
1636
|
}
|
1572
1637
|
break;
|
@@ -1575,7 +1640,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1575
1640
|
if (val) {
|
1576
1641
|
int idx = lambda_body(s, tree, 1);
|
1577
1642
|
|
1578
|
-
|
1643
|
+
genop_bs(s, OP_BLOCK, cursp(), idx);
|
1579
1644
|
push();
|
1580
1645
|
}
|
1581
1646
|
break;
|
@@ -1603,7 +1668,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1603
1668
|
{
|
1604
1669
|
node *n = tree->car->cdr;
|
1605
1670
|
mrb_sym mid = nsym(n->cdr->car);
|
1606
|
-
mrb_sym mnil =
|
1671
|
+
mrb_sym mnil = MRB_SYM_Q_2(s->mrb, nil);
|
1607
1672
|
if (mid == mnil && n->cdr->cdr->car == NULL) {
|
1608
1673
|
nil_p = TRUE;
|
1609
1674
|
codegen(s, n->car, VAL);
|
@@ -1617,17 +1682,17 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1617
1682
|
pop();
|
1618
1683
|
if (val || tree->cdr->car) {
|
1619
1684
|
if (nil_p) {
|
1620
|
-
pos2 =
|
1621
|
-
pos1 =
|
1685
|
+
pos2 = genjmp2_0(s, OP_JMPNIL, cursp(), val);
|
1686
|
+
pos1 = genjmp_0(s, OP_JMP);
|
1622
1687
|
dispatch(s, pos2);
|
1623
1688
|
}
|
1624
1689
|
else {
|
1625
|
-
pos1 =
|
1690
|
+
pos1 = genjmp2_0(s, OP_JMPNOT, cursp(), val);
|
1626
1691
|
}
|
1627
1692
|
codegen(s, tree->cdr->car, val);
|
1628
1693
|
if (val) pop();
|
1629
1694
|
if (elsepart || val) {
|
1630
|
-
pos2 =
|
1695
|
+
pos2 = genjmp_0(s, OP_JMP);
|
1631
1696
|
dispatch(s, pos1);
|
1632
1697
|
codegen(s, elsepart, val);
|
1633
1698
|
dispatch(s, pos2);
|
@@ -1639,10 +1704,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1639
1704
|
else { /* empty then-part */
|
1640
1705
|
if (elsepart) {
|
1641
1706
|
if (nil_p) {
|
1642
|
-
pos1 =
|
1707
|
+
pos1 = genjmp2_0(s, OP_JMPNIL, cursp(), val);
|
1643
1708
|
}
|
1644
1709
|
else {
|
1645
|
-
pos1 =
|
1710
|
+
pos1 = genjmp2_0(s, OP_JMPIF, cursp(), val);
|
1646
1711
|
}
|
1647
1712
|
codegen(s, elsepart, val);
|
1648
1713
|
dispatch(s, pos1);
|
@@ -1661,7 +1726,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1661
1726
|
|
1662
1727
|
codegen(s, tree->car, VAL);
|
1663
1728
|
pop();
|
1664
|
-
pos =
|
1729
|
+
pos = genjmp2_0(s, OP_JMPNOT, cursp(), val);
|
1665
1730
|
codegen(s, tree->cdr, val);
|
1666
1731
|
dispatch(s, pos);
|
1667
1732
|
}
|
@@ -1673,7 +1738,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1673
1738
|
|
1674
1739
|
codegen(s, tree->car, VAL);
|
1675
1740
|
pop();
|
1676
|
-
pos =
|
1741
|
+
pos = genjmp2_0(s, OP_JMPIF, cursp(), val);
|
1677
1742
|
codegen(s, tree->cdr, val);
|
1678
1743
|
dispatch(s, pos);
|
1679
1744
|
}
|
@@ -1684,7 +1749,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1684
1749
|
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
|
1685
1750
|
|
1686
1751
|
lp->pc0 = new_label(s);
|
1687
|
-
lp->pc1 =
|
1752
|
+
lp->pc1 = genjmp_0(s, OP_JMP);
|
1688
1753
|
lp->pc2 = new_label(s);
|
1689
1754
|
codegen(s, tree->cdr, NOVAL);
|
1690
1755
|
dispatch(s, lp->pc1);
|
@@ -1701,7 +1766,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1701
1766
|
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
|
1702
1767
|
|
1703
1768
|
lp->pc0 = new_label(s);
|
1704
|
-
lp->pc1 =
|
1769
|
+
lp->pc1 = genjmp_0(s, OP_JMP);
|
1705
1770
|
lp->pc2 = new_label(s);
|
1706
1771
|
codegen(s, tree->cdr, NOVAL);
|
1707
1772
|
dispatch(s, lp->pc1);
|
@@ -1721,10 +1786,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1721
1786
|
case NODE_CASE:
|
1722
1787
|
{
|
1723
1788
|
int head = 0;
|
1724
|
-
|
1789
|
+
uint32_t pos1, pos2, pos3, tmp;
|
1725
1790
|
node *n;
|
1726
1791
|
|
1727
|
-
pos3 =
|
1792
|
+
pos3 = JMPLINK_START;
|
1728
1793
|
if (tree->car) {
|
1729
1794
|
head = cursp();
|
1730
1795
|
codegen(s, tree->car, VAL);
|
@@ -1732,17 +1797,17 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1732
1797
|
tree = tree->cdr;
|
1733
1798
|
while (tree) {
|
1734
1799
|
n = tree->car->car;
|
1735
|
-
pos1 = pos2 =
|
1800
|
+
pos1 = pos2 = JMPLINK_START;
|
1736
1801
|
while (n) {
|
1737
1802
|
codegen(s, n->car, VAL);
|
1738
1803
|
if (head) {
|
1739
1804
|
gen_move(s, cursp(), head, 0);
|
1740
1805
|
push(); push(); pop(); pop(); pop();
|
1741
1806
|
if (nint(n->car->car) == NODE_SPLAT) {
|
1742
|
-
genop_3(s, OP_SEND, cursp(), new_sym(s,
|
1807
|
+
genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM_2(s->mrb, __case_eqq)), 1);
|
1743
1808
|
}
|
1744
1809
|
else {
|
1745
|
-
genop_3(s, OP_SEND, cursp(), new_sym(s,
|
1810
|
+
genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_OPSYM_2(s->mrb, eqq)), 1);
|
1746
1811
|
}
|
1747
1812
|
}
|
1748
1813
|
else {
|
@@ -1753,20 +1818,20 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1753
1818
|
n = n->cdr;
|
1754
1819
|
}
|
1755
1820
|
if (tree->car->car) {
|
1756
|
-
pos1 =
|
1821
|
+
pos1 = genjmp_0(s, OP_JMP);
|
1757
1822
|
dispatch_linked(s, pos2);
|
1758
1823
|
}
|
1759
1824
|
codegen(s, tree->car->cdr, val);
|
1760
1825
|
if (val) pop();
|
1761
1826
|
tmp = genjmp(s, OP_JMP, pos3);
|
1762
1827
|
pos3 = tmp;
|
1763
|
-
|
1828
|
+
dispatch(s, pos1);
|
1764
1829
|
tree = tree->cdr;
|
1765
1830
|
}
|
1766
1831
|
if (val) {
|
1767
|
-
|
1832
|
+
uint32_t pos = cursp();
|
1768
1833
|
genop_1(s, OP_LOADNIL, cursp());
|
1769
|
-
if (pos3) dispatch_linked(s, pos3);
|
1834
|
+
if (pos3 != JMPLINK_START) dispatch_linked(s, pos3);
|
1770
1835
|
if (head) pop();
|
1771
1836
|
if (cursp() != pos) {
|
1772
1837
|
gen_move(s, cursp(), pos, 0);
|
@@ -1774,7 +1839,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1774
1839
|
push();
|
1775
1840
|
}
|
1776
1841
|
else {
|
1777
|
-
if (pos3) {
|
1842
|
+
if (pos3 != JMPLINK_START) {
|
1778
1843
|
dispatch_linked(s, pos3);
|
1779
1844
|
}
|
1780
1845
|
if (head) {
|
@@ -2017,18 +2082,20 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2017
2082
|
if ((len == 2 && name[0] == '|' && name[1] == '|') &&
|
2018
2083
|
(nint(tree->car->car) == NODE_CONST ||
|
2019
2084
|
nint(tree->car->car) == NODE_CVAR)) {
|
2020
|
-
int
|
2085
|
+
int catch_entry, begin, end;
|
2086
|
+
int noexc, exc;
|
2021
2087
|
struct loopinfo *lp;
|
2022
2088
|
|
2023
|
-
onerr = genjmp(s, OP_ONERR, 0);
|
2024
2089
|
lp = loop_push(s, LOOP_BEGIN);
|
2025
|
-
lp->
|
2090
|
+
lp->pc0 = new_label(s);
|
2091
|
+
catch_entry = catch_handler_new(s);
|
2092
|
+
begin = s->pc;
|
2026
2093
|
exc = cursp();
|
2027
2094
|
codegen(s, tree->car, VAL);
|
2095
|
+
end = s->pc;
|
2096
|
+
noexc = genjmp_0(s, OP_JMP);
|
2028
2097
|
lp->type = LOOP_RESCUE;
|
2029
|
-
|
2030
|
-
noexc = genjmp(s, OP_JMP, 0);
|
2031
|
-
dispatch(s, onerr);
|
2098
|
+
catch_handler_set(s, catch_entry, MRB_CATCH_RESCUE, begin, end, s->pc);
|
2032
2099
|
genop_1(s, OP_EXCEPT, exc);
|
2033
2100
|
genop_1(s, OP_LOADF, exc);
|
2034
2101
|
dispatch(s, noexc);
|
@@ -2079,10 +2146,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2079
2146
|
if (vsp >= 0) {
|
2080
2147
|
gen_move(s, vsp, cursp(), 1);
|
2081
2148
|
}
|
2082
|
-
pos =
|
2149
|
+
pos = genjmp2_0(s, name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), val);
|
2083
2150
|
}
|
2084
2151
|
else {
|
2085
|
-
pos =
|
2152
|
+
pos = genjmp2_0(s, name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), val);
|
2086
2153
|
}
|
2087
2154
|
codegen(s, tree->cdr->cdr->car, VAL);
|
2088
2155
|
pop();
|
@@ -2266,7 +2333,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2266
2333
|
pop_n(n+1);
|
2267
2334
|
genop_2S(s, OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf));
|
2268
2335
|
if (sendv) n = CALL_MAXARGS;
|
2269
|
-
genop_3(s, OP_SEND, cursp(), new_sym(s,
|
2336
|
+
genop_3(s, OP_SEND, cursp(), new_sym(s, MRB_SYM_2(s->mrb, call)), n);
|
2270
2337
|
if (val) push();
|
2271
2338
|
}
|
2272
2339
|
break;
|
@@ -2281,11 +2348,8 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2281
2348
|
raise_error(s, "unexpected next");
|
2282
2349
|
}
|
2283
2350
|
else if (s->loop->type == LOOP_NORMAL) {
|
2284
|
-
if (s->ensure_level > s->loop->ensure_level) {
|
2285
|
-
genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level);
|
2286
|
-
}
|
2287
2351
|
codegen(s, tree, NOVAL);
|
2288
|
-
genjmp(s,
|
2352
|
+
genjmp(s, OP_JMPUW, s->loop->pc0);
|
2289
2353
|
}
|
2290
2354
|
else {
|
2291
2355
|
if (tree) {
|
@@ -2305,10 +2369,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2305
2369
|
raise_error(s, "unexpected redo");
|
2306
2370
|
}
|
2307
2371
|
else {
|
2308
|
-
|
2309
|
-
genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level);
|
2310
|
-
}
|
2311
|
-
genjmp(s, OP_JMP, s->loop->pc2);
|
2372
|
+
genjmp(s, OP_JMPUW, s->loop->pc2);
|
2312
2373
|
}
|
2313
2374
|
if (val) push();
|
2314
2375
|
break;
|
@@ -2316,32 +2377,16 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2316
2377
|
case NODE_RETRY:
|
2317
2378
|
{
|
2318
2379
|
const char *msg = "unexpected retry";
|
2380
|
+
const struct loopinfo *lp = s->loop;
|
2319
2381
|
|
2320
|
-
|
2382
|
+
while (lp && lp->type != LOOP_RESCUE) {
|
2383
|
+
lp = lp->prev;
|
2384
|
+
}
|
2385
|
+
if (!lp) {
|
2321
2386
|
raise_error(s, msg);
|
2322
2387
|
}
|
2323
2388
|
else {
|
2324
|
-
|
2325
|
-
int n = 0;
|
2326
|
-
|
2327
|
-
while (lp && lp->type != LOOP_RESCUE) {
|
2328
|
-
if (lp->type == LOOP_BEGIN) {
|
2329
|
-
n++;
|
2330
|
-
}
|
2331
|
-
lp = lp->prev;
|
2332
|
-
}
|
2333
|
-
if (!lp) {
|
2334
|
-
raise_error(s, msg);
|
2335
|
-
}
|
2336
|
-
else {
|
2337
|
-
if (n > 0) {
|
2338
|
-
genop_1(s, OP_POPERR, n);
|
2339
|
-
}
|
2340
|
-
if (s->ensure_level > lp->ensure_level) {
|
2341
|
-
genop_1(s, OP_EPOP, s->ensure_level - lp->ensure_level);
|
2342
|
-
}
|
2343
|
-
genjmp(s, OP_JMP, lp->pc0);
|
2344
|
-
}
|
2389
|
+
genjmp(s, OP_JMPUW, lp->pc0);
|
2345
2390
|
}
|
2346
2391
|
if (val) push();
|
2347
2392
|
}
|
@@ -2447,45 +2492,41 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2447
2492
|
mrb_bool overflow;
|
2448
2493
|
|
2449
2494
|
i = readint_mrb_int(s, p, base, FALSE, &overflow);
|
2450
|
-
#ifndef MRB_WITHOUT_FLOAT
|
2451
2495
|
if (overflow) {
|
2452
|
-
|
2453
|
-
int off = new_lit(s, mrb_float_value(s->mrb, f));
|
2454
|
-
|
2455
|
-
genop_2(s, OP_LOADL, cursp(), off);
|
2496
|
+
codegen_error(s, "integer overflow");
|
2456
2497
|
}
|
2457
|
-
else
|
2458
|
-
#endif
|
2459
|
-
{
|
2498
|
+
else {
|
2460
2499
|
if (i < 0) {
|
2461
2500
|
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
2462
|
-
else if (i >= -0xff) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
2463
|
-
else if (i >=
|
2501
|
+
else if (i >= -0xff) genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
2502
|
+
else if (i >= INT16_MIN) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
|
2503
|
+
else if (i >= INT32_MIN) genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
|
2464
2504
|
else goto lit_int;
|
2465
2505
|
}
|
2466
2506
|
else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp());
|
2467
2507
|
else if (i <= 0xff) genop_2(s, OP_LOADI, cursp(), (uint16_t)i);
|
2468
|
-
else if (i <=
|
2508
|
+
else if (i <= INT16_MAX) genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
|
2509
|
+
else if (i <= INT32_MAX) genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
|
2469
2510
|
else {
|
2470
2511
|
int off;
|
2471
2512
|
|
2472
2513
|
lit_int:
|
2473
|
-
off = new_lit(s,
|
2474
|
-
|
2514
|
+
off = new_lit(s, mrb_int_value(s->mrb, i));
|
2515
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2475
2516
|
}
|
2476
2517
|
}
|
2477
2518
|
push();
|
2478
2519
|
}
|
2479
2520
|
break;
|
2480
2521
|
|
2481
|
-
#ifndef
|
2522
|
+
#ifndef MRB_NO_FLOAT
|
2482
2523
|
case NODE_FLOAT:
|
2483
2524
|
if (val) {
|
2484
2525
|
char *p = (char*)tree;
|
2485
2526
|
mrb_float f = mrb_float_read(p, NULL);
|
2486
2527
|
int off = new_lit(s, mrb_float_value(s->mrb, f));
|
2487
2528
|
|
2488
|
-
|
2529
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2489
2530
|
push();
|
2490
2531
|
}
|
2491
2532
|
break;
|
@@ -2495,14 +2536,14 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2495
2536
|
{
|
2496
2537
|
nt = nint(tree->car);
|
2497
2538
|
switch (nt) {
|
2498
|
-
#ifndef
|
2539
|
+
#ifndef MRB_NO_FLOAT
|
2499
2540
|
case NODE_FLOAT:
|
2500
2541
|
if (val) {
|
2501
2542
|
char *p = (char*)tree->cdr;
|
2502
2543
|
mrb_float f = mrb_float_read(p, NULL);
|
2503
2544
|
int off = new_lit(s, mrb_float_value(s->mrb, -f));
|
2504
2545
|
|
2505
|
-
|
2546
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2506
2547
|
push();
|
2507
2548
|
}
|
2508
2549
|
break;
|
@@ -2516,36 +2557,32 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2516
2557
|
mrb_bool overflow;
|
2517
2558
|
|
2518
2559
|
i = readint_mrb_int(s, p, base, TRUE, &overflow);
|
2519
|
-
#ifndef MRB_WITHOUT_FLOAT
|
2520
2560
|
if (overflow) {
|
2521
|
-
|
2522
|
-
int off = new_lit(s, mrb_float_value(s->mrb, -f));
|
2523
|
-
|
2524
|
-
genop_2(s, OP_LOADL, cursp(), off);
|
2561
|
+
codegen_error(s, "integer overflow");
|
2525
2562
|
}
|
2526
2563
|
else {
|
2527
|
-
#endif
|
2528
2564
|
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
2529
2565
|
else if (i >= -0xff) {
|
2530
2566
|
genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
2531
2567
|
}
|
2532
|
-
else if (i >=
|
2568
|
+
else if (i >= INT16_MIN) {
|
2533
2569
|
genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
|
2534
2570
|
}
|
2571
|
+
else if (i >= INT32_MIN) {
|
2572
|
+
genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
|
2573
|
+
}
|
2535
2574
|
else {
|
2536
|
-
int off = new_lit(s,
|
2537
|
-
|
2575
|
+
int off = new_lit(s, mrb_int_value(s->mrb, i));
|
2576
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2538
2577
|
}
|
2539
|
-
#ifndef MRB_WITHOUT_FLOAT
|
2540
2578
|
}
|
2541
|
-
#endif
|
2542
2579
|
push();
|
2543
2580
|
}
|
2544
2581
|
break;
|
2545
2582
|
|
2546
2583
|
default:
|
2547
2584
|
if (val) {
|
2548
|
-
int sym = new_sym(s,
|
2585
|
+
int sym = new_sym(s, MRB_OPSYM_2(s->mrb, minus));
|
2549
2586
|
codegen(s, tree, VAL);
|
2550
2587
|
pop();
|
2551
2588
|
genop_3(s, OP_SEND, cursp(), sym, 0);
|
@@ -2567,7 +2604,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2567
2604
|
int off = new_lit(s, mrb_str_new(s->mrb, p, len));
|
2568
2605
|
|
2569
2606
|
mrb_gc_arena_restore(s->mrb, ai);
|
2570
|
-
|
2607
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2571
2608
|
push();
|
2572
2609
|
}
|
2573
2610
|
break;
|
@@ -2618,7 +2655,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2618
2655
|
{
|
2619
2656
|
node *n;
|
2620
2657
|
int ai = mrb_gc_arena_save(s->mrb);
|
2621
|
-
int sym = new_sym(s,
|
2658
|
+
int sym = new_sym(s, MRB_SYM_2(s->mrb, Kernel));
|
2622
2659
|
|
2623
2660
|
genop_1(s, OP_LOADSELF, cursp());
|
2624
2661
|
push();
|
@@ -2637,7 +2674,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2637
2674
|
}
|
2638
2675
|
push(); /* for block */
|
2639
2676
|
pop_n(3);
|
2640
|
-
sym = new_sym(s,
|
2677
|
+
sym = new_sym(s, MRB_OPSYM_2(s->mrb, tick)); /* ` */
|
2641
2678
|
genop_3(s, OP_SEND, cursp(), sym, 1);
|
2642
2679
|
if (val) push();
|
2643
2680
|
mrb_gc_arena_restore(s->mrb, ai);
|
@@ -2654,10 +2691,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2654
2691
|
|
2655
2692
|
genop_1(s, OP_LOADSELF, cursp());
|
2656
2693
|
push();
|
2657
|
-
|
2694
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2658
2695
|
push(); push();
|
2659
2696
|
pop_n(3);
|
2660
|
-
sym = new_sym(s,
|
2697
|
+
sym = new_sym(s, MRB_OPSYM_2(s->mrb, tick)); /* ` */
|
2661
2698
|
genop_3(s, OP_SEND, cursp(), sym, 1);
|
2662
2699
|
if (val) push();
|
2663
2700
|
mrb_gc_arena_restore(s->mrb, ai);
|
@@ -2677,12 +2714,12 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2677
2714
|
genop_1(s, OP_OCLASS, cursp());
|
2678
2715
|
genop_2(s, OP_GETMCNST, cursp(), sym);
|
2679
2716
|
push();
|
2680
|
-
|
2717
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2681
2718
|
push();
|
2682
2719
|
if (p2 || p3) {
|
2683
2720
|
if (p2) { /* opt */
|
2684
2721
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
|
2685
|
-
|
2722
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2686
2723
|
}
|
2687
2724
|
else {
|
2688
2725
|
genop_1(s, OP_LOADNIL, cursp());
|
@@ -2691,14 +2728,14 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2691
2728
|
argc++;
|
2692
2729
|
if (p3) { /* enc */
|
2693
2730
|
off = new_lit(s, mrb_str_new(s->mrb, p3, 1));
|
2694
|
-
|
2731
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2695
2732
|
push();
|
2696
2733
|
argc++;
|
2697
2734
|
}
|
2698
2735
|
}
|
2699
2736
|
push(); /* space for a block */
|
2700
2737
|
pop_n(argc+2);
|
2701
|
-
sym = new_sym(s,
|
2738
|
+
sym = new_sym(s, MRB_SYM_2(s->mrb, compile));
|
2702
2739
|
genop_3(s, OP_SEND, cursp(), sym, argc);
|
2703
2740
|
mrb_gc_arena_restore(s->mrb, ai);
|
2704
2741
|
push();
|
@@ -2731,7 +2768,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2731
2768
|
p = (char*)n->car;
|
2732
2769
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p));
|
2733
2770
|
codegen(s, tree->car, VAL);
|
2734
|
-
|
2771
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2735
2772
|
pop();
|
2736
2773
|
genop_1(s, OP_STRCAT, cursp());
|
2737
2774
|
push();
|
@@ -2739,20 +2776,20 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2739
2776
|
if (n->cdr->car) { /* opt */
|
2740
2777
|
char *p2 = (char*)n->cdr->car;
|
2741
2778
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
|
2742
|
-
|
2779
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2743
2780
|
push();
|
2744
2781
|
argc++;
|
2745
2782
|
}
|
2746
2783
|
if (n->cdr->cdr) { /* enc */
|
2747
2784
|
char *p2 = (char*)n->cdr->cdr;
|
2748
2785
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
|
2749
|
-
|
2786
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2750
2787
|
push();
|
2751
2788
|
argc++;
|
2752
2789
|
}
|
2753
2790
|
push(); /* space for a block */
|
2754
2791
|
pop_n(argc+2);
|
2755
|
-
sym = new_sym(s,
|
2792
|
+
sym = new_sym(s, MRB_SYM_2(s->mrb, compile));
|
2756
2793
|
genop_3(s, OP_SEND, cursp(), sym, argc);
|
2757
2794
|
mrb_gc_arena_restore(s->mrb, ai);
|
2758
2795
|
push();
|
@@ -2773,7 +2810,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2773
2810
|
if (val) {
|
2774
2811
|
int sym = new_sym(s, nsym(tree));
|
2775
2812
|
|
2776
|
-
|
2813
|
+
genop_bs(s, OP_LOADSYM, cursp(), sym);
|
2777
2814
|
push();
|
2778
2815
|
}
|
2779
2816
|
break;
|
@@ -2874,7 +2911,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2874
2911
|
}
|
2875
2912
|
else {
|
2876
2913
|
idx = scope_body(s, body, val);
|
2877
|
-
|
2914
|
+
genop_bs(s, OP_EXEC, cursp(), idx);
|
2878
2915
|
}
|
2879
2916
|
if (val) {
|
2880
2917
|
push();
|
@@ -2906,7 +2943,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2906
2943
|
}
|
2907
2944
|
else {
|
2908
2945
|
idx = scope_body(s, tree->cdr->car, val);
|
2909
|
-
|
2946
|
+
genop_bs(s, OP_EXEC, cursp(), idx);
|
2910
2947
|
}
|
2911
2948
|
if (val) {
|
2912
2949
|
push();
|
@@ -2927,7 +2964,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2927
2964
|
}
|
2928
2965
|
else {
|
2929
2966
|
idx = scope_body(s, tree->cdr->car, val);
|
2930
|
-
|
2967
|
+
genop_bs(s, OP_EXEC, cursp(), idx);
|
2931
2968
|
}
|
2932
2969
|
if (val) {
|
2933
2970
|
push();
|
@@ -2942,12 +2979,12 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2942
2979
|
|
2943
2980
|
genop_1(s, OP_TCLASS, cursp());
|
2944
2981
|
push();
|
2945
|
-
|
2982
|
+
genop_bs(s, OP_METHOD, cursp(), idx);
|
2946
2983
|
push(); pop();
|
2947
2984
|
pop();
|
2948
2985
|
genop_2(s, OP_DEF, cursp(), sym);
|
2949
2986
|
if (val) {
|
2950
|
-
|
2987
|
+
genop_bs(s, OP_LOADSYM, cursp(), sym);
|
2951
2988
|
push();
|
2952
2989
|
}
|
2953
2990
|
}
|
@@ -2963,11 +3000,11 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2963
3000
|
pop();
|
2964
3001
|
genop_1(s, OP_SCLASS, cursp());
|
2965
3002
|
push();
|
2966
|
-
|
3003
|
+
genop_bs(s, OP_METHOD, cursp(), idx);
|
2967
3004
|
pop();
|
2968
3005
|
genop_2(s, OP_DEF, cursp(), sym);
|
2969
3006
|
if (val) {
|
2970
|
-
|
3007
|
+
genop_bs(s, OP_LOADSYM, cursp(), sym);
|
2971
3008
|
push();
|
2972
3009
|
}
|
2973
3010
|
}
|
@@ -2985,99 +3022,100 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2985
3022
|
}
|
2986
3023
|
|
2987
3024
|
static void
|
2988
|
-
scope_add_irep(codegen_scope *s
|
3025
|
+
scope_add_irep(codegen_scope *s)
|
2989
3026
|
{
|
2990
|
-
|
2991
|
-
|
3027
|
+
mrb_irep *irep;
|
3028
|
+
codegen_scope *prev = s->prev;
|
3029
|
+
|
3030
|
+
if (prev->irep == NULL) {
|
3031
|
+
irep = mrb_add_irep(s->mrb);
|
3032
|
+
prev->irep = s->irep = irep;
|
2992
3033
|
return;
|
2993
3034
|
}
|
2994
|
-
|
2995
|
-
|
2996
|
-
|
3035
|
+
else {
|
3036
|
+
if (prev->irep->rlen == UINT16_MAX) {
|
3037
|
+
codegen_error(s, "too many nested blocks/methods");
|
3038
|
+
}
|
3039
|
+
s->irep = irep = mrb_add_irep(s->mrb);
|
3040
|
+
if (prev->irep->rlen == prev->rcapa) {
|
3041
|
+
prev->rcapa *= 2;
|
3042
|
+
prev->reps = (mrb_irep**)codegen_realloc(s, prev->reps, sizeof(mrb_irep*)*prev->rcapa);
|
3043
|
+
}
|
3044
|
+
prev->reps[prev->irep->rlen] = irep;
|
3045
|
+
prev->irep->rlen++;
|
2997
3046
|
}
|
2998
|
-
s->irep->reps[s->irep->rlen] = irep;
|
2999
|
-
s->irep->rlen++;
|
3000
3047
|
}
|
3001
3048
|
|
3002
3049
|
static codegen_scope*
|
3003
|
-
scope_new(mrb_state *mrb, codegen_scope *prev, node *
|
3050
|
+
scope_new(mrb_state *mrb, codegen_scope *prev, node *nlv)
|
3004
3051
|
{
|
3005
3052
|
static const codegen_scope codegen_scope_zero = { 0 };
|
3006
3053
|
mrb_pool *pool = mrb_pool_open(mrb);
|
3007
|
-
codegen_scope *
|
3054
|
+
codegen_scope *s = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
|
3008
3055
|
|
3009
|
-
if (!
|
3056
|
+
if (!s) {
|
3010
3057
|
if (prev)
|
3011
3058
|
codegen_error(prev, "unexpected scope");
|
3012
3059
|
return NULL;
|
3013
3060
|
}
|
3014
|
-
*
|
3015
|
-
|
3016
|
-
|
3017
|
-
if (!prev) return
|
3018
|
-
|
3019
|
-
|
3020
|
-
|
3021
|
-
|
3022
|
-
|
3023
|
-
|
3024
|
-
|
3025
|
-
|
3026
|
-
|
3027
|
-
|
3028
|
-
|
3029
|
-
|
3030
|
-
|
3031
|
-
|
3032
|
-
|
3033
|
-
|
3034
|
-
|
3035
|
-
|
3036
|
-
|
3037
|
-
|
3038
|
-
|
3039
|
-
|
3040
|
-
|
3041
|
-
|
3042
|
-
p->nlocals = p->sp;
|
3043
|
-
if (lv) {
|
3044
|
-
node *n = lv;
|
3061
|
+
*s = codegen_scope_zero;
|
3062
|
+
s->mrb = mrb;
|
3063
|
+
s->mpool = pool;
|
3064
|
+
if (!prev) return s;
|
3065
|
+
s->prev = prev;
|
3066
|
+
s->ainfo = -1;
|
3067
|
+
s->mscope = 0;
|
3068
|
+
|
3069
|
+
scope_add_irep(s);
|
3070
|
+
|
3071
|
+
s->rcapa = 8;
|
3072
|
+
s->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*s->rcapa);
|
3073
|
+
|
3074
|
+
s->icapa = 1024;
|
3075
|
+
s->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*s->icapa);
|
3076
|
+
|
3077
|
+
s->pcapa = 32;
|
3078
|
+
s->pool = (mrb_pool_value*)mrb_malloc(mrb, sizeof(mrb_pool_value)*s->pcapa);
|
3079
|
+
|
3080
|
+
s->scapa = 256;
|
3081
|
+
s->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*s->scapa);
|
3082
|
+
|
3083
|
+
s->lv = nlv;
|
3084
|
+
s->sp += node_len(nlv)+1; /* add self */
|
3085
|
+
s->nlocals = s->sp;
|
3086
|
+
if (nlv) {
|
3087
|
+
mrb_sym *lv;
|
3088
|
+
node *n = nlv;
|
3045
3089
|
size_t i = 0;
|
3046
3090
|
|
3047
|
-
|
3048
|
-
for (i=0, n=
|
3049
|
-
|
3050
|
-
if (lv_name(n)) {
|
3051
|
-
p->irep->lv[i].r = lv_idx(p, lv_name(n));
|
3052
|
-
}
|
3053
|
-
else {
|
3054
|
-
p->irep->lv[i].r = 0;
|
3055
|
-
}
|
3091
|
+
s->irep->lv = lv = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*(s->nlocals-1));
|
3092
|
+
for (i=0, n=nlv; n; i++,n=n->cdr) {
|
3093
|
+
lv[i] = lv_name(n);
|
3056
3094
|
}
|
3057
|
-
mrb_assert(i + 1 ==
|
3095
|
+
mrb_assert(i + 1 == s->nlocals);
|
3058
3096
|
}
|
3059
|
-
|
3097
|
+
s->ai = mrb_gc_arena_save(mrb);
|
3060
3098
|
|
3061
|
-
|
3062
|
-
if (
|
3063
|
-
|
3099
|
+
s->filename_sym = prev->filename_sym;
|
3100
|
+
if (s->filename_sym) {
|
3101
|
+
s->lines = (uint16_t*)mrb_malloc(mrb, sizeof(short)*s->icapa);
|
3064
3102
|
}
|
3065
|
-
|
3103
|
+
s->lineno = prev->lineno;
|
3066
3104
|
|
3067
3105
|
/* debug setting */
|
3068
|
-
|
3069
|
-
if (
|
3070
|
-
mrb_debug_info_alloc(mrb,
|
3106
|
+
s->debug_start_pos = 0;
|
3107
|
+
if (s->filename_sym) {
|
3108
|
+
mrb_debug_info_alloc(mrb, s->irep);
|
3071
3109
|
}
|
3072
3110
|
else {
|
3073
|
-
|
3111
|
+
s->irep->debug_info = NULL;
|
3074
3112
|
}
|
3075
|
-
|
3076
|
-
|
3113
|
+
s->parser = prev->parser;
|
3114
|
+
s->filename_index = prev->filename_index;
|
3077
3115
|
|
3078
|
-
|
3116
|
+
s->rlev = prev->rlev+1;
|
3079
3117
|
|
3080
|
-
return
|
3118
|
+
return s;
|
3081
3119
|
}
|
3082
3120
|
|
3083
3121
|
static void
|
@@ -3086,17 +3124,26 @@ scope_finish(codegen_scope *s)
|
|
3086
3124
|
mrb_state *mrb = s->mrb;
|
3087
3125
|
mrb_irep *irep = s->irep;
|
3088
3126
|
|
3089
|
-
if (s->nlocals
|
3127
|
+
if (s->nlocals > 0xff) {
|
3090
3128
|
codegen_error(s, "too many local variables");
|
3091
3129
|
}
|
3092
3130
|
irep->flags = 0;
|
3093
3131
|
if (s->iseq) {
|
3094
|
-
|
3132
|
+
size_t catchsize = sizeof(struct mrb_irep_catch_handler) * irep->clen;
|
3133
|
+
irep->iseq = (const mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc + catchsize);
|
3095
3134
|
irep->ilen = s->pc;
|
3135
|
+
if (irep->clen > 0) {
|
3136
|
+
memcpy((void *)(irep->iseq + irep->ilen), s->catch_table, catchsize);
|
3137
|
+
}
|
3138
|
+
}
|
3139
|
+
else {
|
3140
|
+
irep->clen = 0;
|
3096
3141
|
}
|
3097
|
-
|
3098
|
-
|
3099
|
-
irep->
|
3142
|
+
mrb_free(s->mrb, s->catch_table);
|
3143
|
+
s->catch_table = NULL;
|
3144
|
+
irep->pool = (const mrb_pool_value*)codegen_realloc(s, s->pool, sizeof(mrb_pool_value)*irep->plen);
|
3145
|
+
irep->syms = (const mrb_sym*)codegen_realloc(s, s->syms, sizeof(mrb_sym)*irep->slen);
|
3146
|
+
irep->reps = (const mrb_irep**)codegen_realloc(s, s->reps, sizeof(mrb_irep*)*irep->rlen);
|
3100
3147
|
if (s->filename_sym) {
|
3101
3148
|
mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index);
|
3102
3149
|
const char *filename = mrb_sym_name_len(s->mrb, fname, NULL);
|
@@ -3119,9 +3166,8 @@ loop_push(codegen_scope *s, enum looptype t)
|
|
3119
3166
|
struct loopinfo *p = (struct loopinfo *)codegen_palloc(s, sizeof(struct loopinfo));
|
3120
3167
|
|
3121
3168
|
p->type = t;
|
3122
|
-
p->pc0 = p->pc1 = p->pc2 = p->pc3 =
|
3169
|
+
p->pc0 = p->pc1 = p->pc2 = p->pc3 = JMPLINK_START;
|
3123
3170
|
p->prev = s->loop;
|
3124
|
-
p->ensure_level = s->ensure_level;
|
3125
3171
|
p->acc = cursp();
|
3126
3172
|
s->loop = p;
|
3127
3173
|
|
@@ -3137,7 +3183,6 @@ loop_break(codegen_scope *s, node *tree)
|
|
3137
3183
|
}
|
3138
3184
|
else {
|
3139
3185
|
struct loopinfo *loop;
|
3140
|
-
int n = 0;
|
3141
3186
|
|
3142
3187
|
if (tree) {
|
3143
3188
|
gen_retval(s, tree);
|
@@ -3146,7 +3191,6 @@ loop_break(codegen_scope *s, node *tree)
|
|
3146
3191
|
loop = s->loop;
|
3147
3192
|
while (loop) {
|
3148
3193
|
if (loop->type == LOOP_BEGIN) {
|
3149
|
-
n++;
|
3150
3194
|
loop = loop->prev;
|
3151
3195
|
}
|
3152
3196
|
else if (loop->type == LOOP_RESCUE) {
|
@@ -3160,20 +3204,14 @@ loop_break(codegen_scope *s, node *tree)
|
|
3160
3204
|
raise_error(s, "unexpected break");
|
3161
3205
|
return;
|
3162
3206
|
}
|
3163
|
-
if (n > 0) {
|
3164
|
-
genop_1(s, OP_POPERR, n);
|
3165
|
-
}
|
3166
3207
|
|
3167
3208
|
if (loop->type == LOOP_NORMAL) {
|
3168
3209
|
int tmp;
|
3169
3210
|
|
3170
|
-
if (s->ensure_level > s->loop->ensure_level) {
|
3171
|
-
genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level);
|
3172
|
-
}
|
3173
3211
|
if (tree) {
|
3174
3212
|
gen_move(s, loop->acc, cursp(), 0);
|
3175
3213
|
}
|
3176
|
-
tmp = genjmp(s,
|
3214
|
+
tmp = genjmp(s, OP_JMPUW, loop->pc3);
|
3177
3215
|
loop->pc3 = tmp;
|
3178
3216
|
}
|
3179
3217
|
else {
|
@@ -3196,6 +3234,28 @@ loop_pop(codegen_scope *s, int val)
|
|
3196
3234
|
if (val) push();
|
3197
3235
|
}
|
3198
3236
|
|
3237
|
+
static int
|
3238
|
+
catch_handler_new(codegen_scope *s)
|
3239
|
+
{
|
3240
|
+
size_t newsize = sizeof(struct mrb_irep_catch_handler) * (s->irep->clen + 1);
|
3241
|
+
s->catch_table = (struct mrb_irep_catch_handler *)codegen_realloc(s, (void *)s->catch_table, newsize);
|
3242
|
+
return s->irep->clen ++;
|
3243
|
+
}
|
3244
|
+
|
3245
|
+
static void
|
3246
|
+
catch_handler_set(codegen_scope *s, int ent, enum mrb_catch_type type, uint32_t begin, uint32_t end, uint32_t target)
|
3247
|
+
{
|
3248
|
+
struct mrb_irep_catch_handler *e;
|
3249
|
+
|
3250
|
+
mrb_assert(ent >= 0 && ent < s->irep->clen);
|
3251
|
+
|
3252
|
+
e = &s->catch_table[ent];
|
3253
|
+
uint8_to_bin(type, &e->type);
|
3254
|
+
mrb_irep_catch_handler_pack(begin, e->begin);
|
3255
|
+
mrb_irep_catch_handler_pack(end, e->end);
|
3256
|
+
mrb_irep_catch_handler_pack(target, e->target);
|
3257
|
+
}
|
3258
|
+
|
3199
3259
|
static struct RProc*
|
3200
3260
|
generate_code(mrb_state *mrb, parser_state *p, int val)
|
3201
3261
|
{
|
@@ -3242,13 +3302,14 @@ mrb_irep_remove_lv(mrb_state *mrb, mrb_irep *irep)
|
|
3242
3302
|
{
|
3243
3303
|
int i;
|
3244
3304
|
|
3305
|
+
if (irep->flags & MRB_IREP_NO_FREE) return;
|
3245
3306
|
if (irep->lv) {
|
3246
|
-
mrb_free(mrb, irep->lv);
|
3307
|
+
mrb_free(mrb, (void*)irep->lv);
|
3247
3308
|
irep->lv = NULL;
|
3248
3309
|
}
|
3249
|
-
|
3310
|
+
if (!irep->reps) return;
|
3250
3311
|
for (i = 0; i < irep->rlen; ++i) {
|
3251
|
-
mrb_irep_remove_lv(mrb, irep->reps[i]);
|
3312
|
+
mrb_irep_remove_lv(mrb, (mrb_irep*)irep->reps[i]);
|
3252
3313
|
}
|
3253
3314
|
}
|
3254
3315
|
|
@@ -3262,6 +3323,7 @@ uint8_t mrb_insn_size[] = {
|
|
3262
3323
|
#define BB 3
|
3263
3324
|
#define BBB 4
|
3264
3325
|
#define BS 4
|
3326
|
+
#define BSS 6
|
3265
3327
|
#define SB 4
|
3266
3328
|
#define OPCODE(_,x) x,
|
3267
3329
|
#include "mruby/ops.h"
|
@@ -3269,38 +3331,7 @@ uint8_t mrb_insn_size[] = {
|
|
3269
3331
|
#undef B
|
3270
3332
|
#undef BB
|
3271
3333
|
#undef BS
|
3334
|
+
#undef BSS
|
3272
3335
|
#undef SB
|
3273
3336
|
#undef BBB
|
3274
3337
|
};
|
3275
|
-
/* EXT1 instruction sizes */
|
3276
|
-
uint8_t mrb_insn_size1[] = {
|
3277
|
-
#define B 3
|
3278
|
-
#define BB 4
|
3279
|
-
#define BBB 5
|
3280
|
-
#define BS 5
|
3281
|
-
#define SB 5
|
3282
|
-
#define OPCODE(_,x) x,
|
3283
|
-
#include "mruby/ops.h"
|
3284
|
-
#undef OPCODE
|
3285
|
-
#undef B
|
3286
|
-
};
|
3287
|
-
/* EXT2 instruction sizes */
|
3288
|
-
uint8_t mrb_insn_size2[] = {
|
3289
|
-
#define B 2
|
3290
|
-
#define OPCODE(_,x) x,
|
3291
|
-
#include "mruby/ops.h"
|
3292
|
-
#undef OPCODE
|
3293
|
-
#undef BB
|
3294
|
-
#undef BBB
|
3295
|
-
#undef BS
|
3296
|
-
#undef SB
|
3297
|
-
};
|
3298
|
-
/* EXT3 instruction sizes */
|
3299
|
-
#define BB 5
|
3300
|
-
#define BBB 6
|
3301
|
-
#define BS 4
|
3302
|
-
#define SB 5
|
3303
|
-
uint8_t mrb_insn_size3[] = {
|
3304
|
-
#define OPCODE(_,x) x,
|
3305
|
-
#include "mruby/ops.h"
|
3306
|
-
};
|