script_core 0.2.3 → 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/.rubocop.yml +35 -57
- data/.ruby-version +1 -1
- data/Gemfile +2 -2
- data/README.md +7 -1
- data/ext/enterprise_script_service/Rakefile +1 -1
- data/ext/enterprise_script_service/libseccomp/.travis.yml +24 -12
- data/ext/enterprise_script_service/libseccomp/CHANGELOG +32 -0
- data/ext/enterprise_script_service/libseccomp/CONTRIBUTING.md +37 -26
- data/ext/enterprise_script_service/libseccomp/CREDITS +11 -0
- data/ext/enterprise_script_service/libseccomp/README.md +21 -1
- data/ext/enterprise_script_service/libseccomp/configure.ac +13 -8
- data/ext/enterprise_script_service/libseccomp/doc/Makefile.am +6 -0
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_api_get.3 +12 -2
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_arch_add.3 +38 -6
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_attr_set.3 +53 -2
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_export_bpf.3 +20 -2
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_init.3 +9 -2
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_load.3 +32 -2
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_merge.3 +16 -2
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_alloc.3 +113 -0
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_fd.3 +1 -0
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_free.3 +1 -0
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_id_valid.3 +1 -0
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_receive.3 +1 -0
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_notify_respond.3 +1 -0
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_rule_add.3 +64 -3
- data/ext/enterprise_script_service/libseccomp/doc/man/man3/seccomp_syscall_priority.3 +18 -3
- data/ext/enterprise_script_service/libseccomp/include/seccomp-syscalls.h +19 -0
- data/ext/enterprise_script_service/libseccomp/include/seccomp.h.in +116 -0
- data/ext/enterprise_script_service/libseccomp/src/.gitignore +2 -0
- data/ext/enterprise_script_service/libseccomp/src/Makefile.am +31 -17
- data/ext/enterprise_script_service/libseccomp/src/api.c +254 -58
- data/ext/enterprise_script_service/libseccomp/src/arch-aarch64.h +1 -9
- data/ext/enterprise_script_service/libseccomp/src/arch-arm.c +47 -2
- data/ext/enterprise_script_service/libseccomp/src/arch-arm.h +1 -9
- data/ext/enterprise_script_service/libseccomp/src/arch-gperf-generate +40 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-mips.c +41 -4
- data/ext/enterprise_script_service/libseccomp/src/arch-mips.h +2 -10
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64.c +41 -4
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64.h +3 -11
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64n32.c +41 -4
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64n32.h +2 -10
- data/ext/enterprise_script_service/libseccomp/src/arch-parisc.h +1 -10
- data/ext/enterprise_script_service/libseccomp/src/arch-parisc64.c +3 -3
- data/ext/enterprise_script_service/libseccomp/src/arch-parisc64.h +29 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-ppc.h +1 -9
- data/ext/enterprise_script_service/libseccomp/src/arch-ppc64.c +606 -8
- data/ext/enterprise_script_service/libseccomp/src/arch-ppc64.h +2 -10
- data/ext/enterprise_script_service/libseccomp/src/arch-riscv64.c +31 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-riscv64.h +22 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-s390.c +171 -12
- data/ext/enterprise_script_service/libseccomp/src/arch-s390.h +1 -17
- data/ext/enterprise_script_service/libseccomp/src/arch-s390x.c +166 -10
- data/ext/enterprise_script_service/libseccomp/src/arch-s390x.h +1 -20
- data/ext/enterprise_script_service/libseccomp/src/arch-syscall-dump.c +8 -1
- data/ext/enterprise_script_service/libseccomp/src/arch-syscall-validate +359 -143
- data/ext/enterprise_script_service/libseccomp/src/arch-x32.c +36 -2
- data/ext/enterprise_script_service/libseccomp/src/arch-x32.h +2 -10
- data/ext/enterprise_script_service/libseccomp/src/arch-x86.c +172 -10
- data/ext/enterprise_script_service/libseccomp/src/arch-x86.h +1 -14
- data/ext/enterprise_script_service/libseccomp/src/arch-x86_64.h +1 -9
- data/ext/enterprise_script_service/libseccomp/src/arch.c +11 -3
- data/ext/enterprise_script_service/libseccomp/src/arch.h +7 -0
- data/ext/enterprise_script_service/libseccomp/src/db.c +268 -57
- data/ext/enterprise_script_service/libseccomp/src/db.h +16 -2
- data/ext/enterprise_script_service/libseccomp/src/gen_bpf.c +503 -148
- data/ext/enterprise_script_service/libseccomp/src/gen_bpf.h +2 -1
- data/ext/enterprise_script_service/libseccomp/src/gen_pfc.c +165 -37
- data/ext/enterprise_script_service/libseccomp/src/python/libseccomp.pxd +37 -1
- data/ext/enterprise_script_service/libseccomp/src/python/seccomp.pyx +295 -5
- data/ext/enterprise_script_service/libseccomp/src/syscalls.c +56 -0
- data/ext/enterprise_script_service/libseccomp/src/syscalls.csv +470 -0
- data/ext/enterprise_script_service/libseccomp/src/syscalls.h +62 -0
- data/ext/enterprise_script_service/libseccomp/src/syscalls.perf.template +82 -0
- data/ext/enterprise_script_service/libseccomp/src/system.c +196 -16
- data/ext/enterprise_script_service/libseccomp/src/system.h +68 -13
- data/ext/enterprise_script_service/libseccomp/tests/.gitignore +10 -2
- data/ext/enterprise_script_service/libseccomp/tests/06-sim-actions.tests +1 -1
- data/ext/enterprise_script_service/libseccomp/tests/11-basic-basic_errors.c +5 -5
- data/ext/enterprise_script_service/libseccomp/tests/13-basic-attrs.c +35 -1
- data/ext/enterprise_script_service/libseccomp/tests/13-basic-attrs.py +10 -1
- data/ext/enterprise_script_service/libseccomp/tests/15-basic-resolver.c +4 -3
- data/ext/enterprise_script_service/libseccomp/tests/16-sim-arch_basic.c +12 -0
- data/ext/enterprise_script_service/libseccomp/tests/16-sim-arch_basic.py +1 -0
- data/ext/enterprise_script_service/libseccomp/tests/{18-sim-basic_whitelist.c → 18-sim-basic_allowlist.c} +0 -0
- data/ext/enterprise_script_service/libseccomp/tests/{18-sim-basic_whitelist.py → 18-sim-basic_allowlist.py} +0 -0
- data/ext/enterprise_script_service/libseccomp/tests/18-sim-basic_allowlist.tests +32 -0
- data/ext/enterprise_script_service/libseccomp/tests/23-sim-arch_all_le_basic.c +3 -0
- data/ext/enterprise_script_service/libseccomp/tests/23-sim-arch_all_le_basic.py +1 -0
- data/ext/enterprise_script_service/libseccomp/tests/30-sim-socket_syscalls.c +3 -0
- data/ext/enterprise_script_service/libseccomp/tests/30-sim-socket_syscalls.py +1 -0
- data/ext/enterprise_script_service/libseccomp/tests/30-sim-socket_syscalls.tests +33 -17
- data/ext/enterprise_script_service/libseccomp/tests/{34-sim-basic_blacklist.c → 34-sim-basic_denylist.c} +0 -0
- data/ext/enterprise_script_service/libseccomp/tests/{34-sim-basic_blacklist.py → 34-sim-basic_denylist.py} +0 -0
- data/ext/enterprise_script_service/libseccomp/tests/34-sim-basic_denylist.tests +32 -0
- data/ext/enterprise_script_service/libseccomp/tests/36-sim-ipc_syscalls.c +3 -0
- data/ext/enterprise_script_service/libseccomp/tests/36-sim-ipc_syscalls.py +1 -0
- data/ext/enterprise_script_service/libseccomp/tests/36-sim-ipc_syscalls.tests +25 -25
- data/ext/enterprise_script_service/libseccomp/tests/39-basic-api_level.c +24 -3
- data/ext/enterprise_script_service/libseccomp/tests/39-basic-api_level.py +16 -1
- data/ext/enterprise_script_service/libseccomp/tests/47-live-kill_process.c +3 -3
- data/ext/enterprise_script_service/libseccomp/tests/51-live-user_notification.c +112 -0
- data/ext/enterprise_script_service/libseccomp/tests/51-live-user_notification.py +60 -0
- data/ext/enterprise_script_service/libseccomp/tests/51-live-user_notification.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.c +48 -0
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.py +38 -0
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/53-sim-binary_tree.c +156 -0
- data/ext/enterprise_script_service/libseccomp/tests/53-sim-binary_tree.py +95 -0
- data/ext/enterprise_script_service/libseccomp/tests/53-sim-binary_tree.tests +65 -0
- data/ext/enterprise_script_service/libseccomp/tests/54-live-binary_tree.c +128 -0
- data/ext/enterprise_script_service/libseccomp/tests/54-live-binary_tree.py +95 -0
- data/ext/enterprise_script_service/libseccomp/tests/54-live-binary_tree.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/55-basic-pfc_binary_tree.c +134 -0
- data/ext/enterprise_script_service/libseccomp/tests/55-basic-pfc_binary_tree.sh +46 -0
- data/ext/enterprise_script_service/libseccomp/tests/55-basic-pfc_binary_tree.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/56-basic-iterate_syscalls.c +90 -0
- data/ext/enterprise_script_service/libseccomp/tests/56-basic-iterate_syscalls.py +65 -0
- data/ext/enterprise_script_service/libseccomp/tests/56-basic-iterate_syscalls.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/57-basic-rawsysrc.c +64 -0
- data/ext/enterprise_script_service/libseccomp/tests/57-basic-rawsysrc.py +46 -0
- data/ext/enterprise_script_service/libseccomp/tests/57-basic-rawsysrc.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/58-live-tsync_notify.c +116 -0
- data/ext/enterprise_script_service/libseccomp/tests/58-live-tsync_notify.py +61 -0
- data/ext/enterprise_script_service/libseccomp/tests/58-live-tsync_notify.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/Makefile.am +34 -10
- data/ext/enterprise_script_service/libseccomp/tests/regression +10 -3
- data/ext/enterprise_script_service/libseccomp/tests/util.c +3 -3
- data/ext/enterprise_script_service/libseccomp/tools/Makefile.am +0 -3
- data/ext/enterprise_script_service/libseccomp/tools/check-syntax +1 -1
- data/ext/enterprise_script_service/libseccomp/tools/scmp_arch_detect.c +3 -0
- data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_disasm.c +4 -2
- data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_sim.c +4 -0
- data/ext/enterprise_script_service/libseccomp/tools/util.c +14 -12
- data/ext/enterprise_script_service/libseccomp/tools/util.h +7 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +149 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +55 -0
- 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/.gitignore +3 -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 +7 -10
- data/ext/enterprise_script_service/mruby/.yamllint +8 -0
- data/ext/enterprise_script_service/mruby/AUTHORS +4 -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 +5 -11
- 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 +29 -26
- 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} +4 -21
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +4 -4
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +3 -20
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +4 -21
- 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} +4 -21
- data/ext/enterprise_script_service/mruby/{appveyor_config.rb → build_config/ci/gcc-clang.rb} +11 -8
- 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/build_config/dreamcast_shelf.rb +94 -0
- 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 +142 -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 +53 -30
- 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 +102 -103
- 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 +88 -66
- data/ext/enterprise_script_service/mruby/include/mruby.h +160 -104
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +27 -6
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +80 -46
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +76 -55
- data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +14 -1
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +20 -6
- data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +18 -52
- 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 +74 -14
- data/ext/enterprise_script_service/mruby/include/mruby/istruct.h +4 -1
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +19 -9
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +37 -63
- data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +29 -24
- 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 +93 -21
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +12 -16
- data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +60 -59
- data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +25 -6
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -72
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +71 -78
- 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 +84 -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/lib/mruby/source.rb +3 -1
- 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 -81
- 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 -32
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +10 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/test/array.rb +0 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +30 -18
- 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 -4
- 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 +6 -2
- 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 +46 -35
- 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 +41 -28
- 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 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +26 -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 +6 -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 +7 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +495 -436
- 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 +637 -220
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +13734 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +20 -23
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +9 -9
- 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-error/src/exception.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +19 -238
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/test/eval.rb +21 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +19 -15
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +31 -5
- 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 +5 -6
- 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 +39 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrbgem.rake +2 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +0 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +9 -14
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +107 -59
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +22 -38
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +417 -203
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +20 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +33 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +58 -50
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +13 -14
- 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 +56 -73
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +13 -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 +80 -78
- 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 +8 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -13
- 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 +120 -67
- 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 +65 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +34 -21
- 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 +21 -43
- 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 +12 -20
- 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 +5 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/test/sockettest.c +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +161 -93
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +9 -25
- 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 +17 -14
- 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 +23 -36
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +7 -6
- 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 +17 -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 +37 -41
- 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/00class.rb +10 -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 +3 -23
- 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 +67 -90
- data/ext/enterprise_script_service/mruby/src/backtrace.c +18 -19
- data/ext/enterprise_script_service/mruby/src/class.c +819 -211
- data/ext/enterprise_script_service/mruby/src/codedump.c +226 -197
- data/ext/enterprise_script_service/mruby/src/debug.c +14 -11
- data/ext/enterprise_script_service/mruby/src/dump.c +470 -207
- data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
- data/ext/enterprise_script_service/mruby/src/error.c +94 -20
- data/ext/enterprise_script_service/mruby/src/etc.c +56 -39
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +103 -27
- data/ext/enterprise_script_service/mruby/src/gc.c +86 -349
- data/ext/enterprise_script_service/mruby/src/hash.c +1058 -723
- data/ext/enterprise_script_service/mruby/src/kernel.c +78 -226
- data/ext/enterprise_script_service/mruby/src/load.c +215 -159
- data/ext/enterprise_script_service/mruby/src/numeric.c +400 -382
- data/ext/enterprise_script_service/mruby/src/object.c +115 -90
- data/ext/enterprise_script_service/mruby/src/print.c +31 -6
- data/ext/enterprise_script_service/mruby/src/proc.c +56 -45
- data/ext/enterprise_script_service/mruby/src/range.c +49 -33
- data/ext/enterprise_script_service/mruby/src/state.c +58 -42
- data/ext/enterprise_script_service/mruby/src/string.c +151 -156
- data/ext/enterprise_script_service/mruby/src/symbol.c +132 -66
- 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 +655 -645
- 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 +64 -61
- 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/android.rake +46 -1
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +8 -7
- data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +13 -17
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +21 -25
- data/ext/enterprise_script_service/mruby/test/assert.rb +5 -4
- 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/ensure.rb +8 -26
- data/ext/enterprise_script_service/mruby/test/t/exception.rb +2 -2
- 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 +16 -25
- 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/ext/enterprise_script_service/msgpack/.github/depends/boost.sh +56 -0
- data/ext/enterprise_script_service/msgpack/.github/workflows/coverage.yml +62 -0
- data/ext/enterprise_script_service/msgpack/.github/workflows/gha.yml +304 -0
- data/ext/enterprise_script_service/msgpack/CHANGELOG.md +11 -0
- data/ext/enterprise_script_service/msgpack/CMakeLists.txt +82 -39
- data/ext/enterprise_script_service/msgpack/Files.cmake +22 -12
- data/ext/enterprise_script_service/msgpack/QUICKSTART-C.md +26 -29
- data/ext/enterprise_script_service/msgpack/README.md +3 -2
- data/ext/enterprise_script_service/msgpack/appveyor.yml +6 -2
- data/ext/enterprise_script_service/msgpack/ci/build_cmake.sh +3 -1
- data/ext/enterprise_script_service/msgpack/cmake/CodeCoverage.cmake +55 -0
- data/ext/enterprise_script_service/msgpack/codecov.yml +36 -0
- data/ext/enterprise_script_service/msgpack/example/CMakeLists.txt +9 -5
- data/ext/enterprise_script_service/msgpack/example/boost/CMakeLists.txt +1 -1
- data/ext/enterprise_script_service/msgpack/example/c/CMakeLists.txt +17 -6
- data/ext/enterprise_script_service/msgpack/example/c/boundary.c +296 -0
- data/ext/enterprise_script_service/msgpack/example/c/jsonconv.c +419 -0
- data/ext/enterprise_script_service/msgpack/example/c/simple_c.c +1 -1
- data/ext/enterprise_script_service/msgpack/example/cpp03/CMakeLists.txt +3 -3
- data/ext/enterprise_script_service/msgpack/example/cpp11/CMakeLists.txt +2 -2
- data/ext/enterprise_script_service/msgpack/example/x3/CMakeLists.txt +2 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/pack.h +24 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/array_ref.hpp +5 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/boost/optional.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/cpp17/vector_byte.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/map.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_char.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_unsigned_char.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/wstring.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v3/unpack.hpp +6 -6
- data/ext/enterprise_script_service/msgpack/include/msgpack/version_master.h +2 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/zbuffer.h +4 -4
- data/ext/enterprise_script_service/msgpack/make_file_list.sh +38 -11
- data/ext/enterprise_script_service/msgpack/src/vrefbuffer.c +6 -0
- data/ext/enterprise_script_service/msgpack/test/CMakeLists.txt +86 -64
- data/ext/enterprise_script_service/msgpack/test/array_ref.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_fusion.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_optional.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_string_ref.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/boost_string_view.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_variant.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/buffer.cpp +4 -47
- data/ext/enterprise_script_service/msgpack/test/buffer_c.cpp +148 -0
- data/ext/enterprise_script_service/msgpack/test/carray.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/cases.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/convert.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/fixint.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/fixint_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/fuzz_unpack_pack_fuzzer_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/iterator_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/json.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/limit.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/msgpack_basic.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_c.cpp +159 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_container.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp11.cpp +32 -27
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp17.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_stream.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_tuple.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/msgpack_vref.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_x3_parse.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/object.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/object_with_zone.cpp +12 -8
- data/ext/enterprise_script_service/msgpack/test/pack_unpack.cpp +30 -26
- data/ext/enterprise_script_service/msgpack/test/pack_unpack_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/raw.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference_wrapper_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/shared_ptr_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/size_equal_only.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/streaming.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/streaming_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/unique_ptr_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/user_class.cpp +16 -12
- data/ext/enterprise_script_service/msgpack/test/version.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/visitor.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/zone.cpp +4 -0
- data/lib/script_core/engine.rb +24 -5
- data/lib/script_core/executable.rb +4 -3
- data/lib/script_core/version.rb +1 -1
- data/lib/tasks/script_core.rake +3 -1
- data/script_core.gemspec +1 -2
- data/spec/dummy/app/lib/script_engine.rb +64 -5
- data/spec/script_core_spec.rb +13 -0
- metadata +123 -61
- data/ext/enterprise_script_service/libseccomp/src/arch-aarch64-syscalls.c +0 -559
- data/ext/enterprise_script_service/libseccomp/src/arch-arm-syscalls.c +0 -570
- data/ext/enterprise_script_service/libseccomp/src/arch-mips-syscalls.c +0 -562
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64-syscalls.c +0 -562
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64n32-syscalls.c +0 -562
- data/ext/enterprise_script_service/libseccomp/src/arch-parisc-syscalls.c +0 -542
- data/ext/enterprise_script_service/libseccomp/src/arch-ppc-syscalls.c +0 -559
- data/ext/enterprise_script_service/libseccomp/src/arch-ppc64-syscalls.c +0 -559
- data/ext/enterprise_script_service/libseccomp/src/arch-s390-syscalls.c +0 -626
- data/ext/enterprise_script_service/libseccomp/src/arch-s390x-syscalls.c +0 -626
- data/ext/enterprise_script_service/libseccomp/src/arch-x32-syscalls.c +0 -558
- data/ext/enterprise_script_service/libseccomp/src/arch-x86-syscalls.c +0 -692
- data/ext/enterprise_script_service/libseccomp/src/arch-x86_64-syscalls.c +0 -559
- data/ext/enterprise_script_service/libseccomp/tests/18-sim-basic_whitelist.tests +0 -32
- data/ext/enterprise_script_service/libseccomp/tests/34-sim-basic_blacklist.tests +0 -32
- data/ext/enterprise_script_service/mruby/TODO +0 -8
- 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/travis_config.rb +0 -54
- data/ext/enterprise_script_service/msgpack/.travis.yml +0 -258
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,11 @@
|
|
1
|
-
#include <
|
1
|
+
#include <mruby.h>
|
2
|
+
|
3
|
+
#ifdef MRB_NO_STDIO
|
4
|
+
# error mruby-bin-mrbc conflicts 'MRB_NO_STDIO' in your build configuration
|
5
|
+
#endif
|
6
|
+
|
2
7
|
#include <stdlib.h>
|
3
8
|
#include <string.h>
|
4
|
-
#include <mruby.h>
|
5
9
|
#include <mruby/compile.h>
|
6
10
|
#include <mruby/dump.h>
|
7
11
|
#include <mruby/proc.h>
|
@@ -16,6 +20,7 @@ struct mrbc_args {
|
|
16
20
|
const char *prog;
|
17
21
|
const char *outfile;
|
18
22
|
const char *initname;
|
23
|
+
mrb_bool dump_struct : 1;
|
19
24
|
mrb_bool check_syntax : 1;
|
20
25
|
mrb_bool verbose : 1;
|
21
26
|
mrb_bool remove_lv : 1;
|
@@ -28,12 +33,11 @@ usage(const char *name)
|
|
28
33
|
static const char *const usage_msg[] = {
|
29
34
|
"switches:",
|
30
35
|
"-c check syntax only",
|
31
|
-
"-o<outfile> place the output into <outfile
|
36
|
+
"-o<outfile> place the output into <outfile>; required for multi-files",
|
32
37
|
"-v print version number, then turn on verbose mode",
|
33
38
|
"-g produce debugging information",
|
34
39
|
"-B<symbol> binary <symbol> output in C language format",
|
35
|
-
"-
|
36
|
-
"-E generate big endian iseq data",
|
40
|
+
"-S dump C struct (requires -B)",
|
37
41
|
"--remove-lv remove local variables",
|
38
42
|
"--verbose run at verbose mode",
|
39
43
|
"--version print the version",
|
@@ -42,7 +46,7 @@ usage(const char *name)
|
|
42
46
|
};
|
43
47
|
const char *const *p = usage_msg;
|
44
48
|
|
45
|
-
printf("Usage: %s [switches] programfile
|
49
|
+
printf("Usage: %s [switches] programfile...\n", name);
|
46
50
|
while (*p)
|
47
51
|
printf(" %s\n", *p++);
|
48
52
|
}
|
@@ -50,19 +54,26 @@ usage(const char *name)
|
|
50
54
|
static char *
|
51
55
|
get_outfilename(mrb_state *mrb, char *infile, const char *ext)
|
52
56
|
{
|
53
|
-
size_t
|
54
|
-
size_t extlen;
|
57
|
+
size_t ilen, flen, elen;
|
55
58
|
char *outfile;
|
56
|
-
char *p;
|
59
|
+
char *p = NULL;
|
57
60
|
|
58
|
-
|
59
|
-
|
60
|
-
outfile = (char*)mrb_malloc(mrb, infilelen + extlen + 1);
|
61
|
-
memcpy(outfile, infile, infilelen + 1);
|
61
|
+
ilen = strlen(infile);
|
62
|
+
flen = ilen;
|
62
63
|
if (*ext) {
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
elen = strlen(ext);
|
65
|
+
if ((p = strrchr(infile, '.'))) {
|
66
|
+
ilen = p - infile;
|
67
|
+
}
|
68
|
+
flen += elen;
|
69
|
+
}
|
70
|
+
else {
|
71
|
+
flen = ilen;
|
72
|
+
}
|
73
|
+
outfile = (char*)mrb_malloc(mrb, flen+1);
|
74
|
+
strncpy(outfile, infile, ilen+1);
|
75
|
+
if (p) {
|
76
|
+
strncpy(outfile+ilen, ext, elen+1);
|
66
77
|
}
|
67
78
|
|
68
79
|
return outfile;
|
@@ -96,6 +107,9 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
|
96
107
|
args->outfile = get_outfilename(mrb, argv[i] + 2, "");
|
97
108
|
}
|
98
109
|
break;
|
110
|
+
case 'S':
|
111
|
+
args->dump_struct = TRUE;
|
112
|
+
break;
|
99
113
|
case 'B':
|
100
114
|
if (argv[i][2] == '\0' && argv[i+1]) {
|
101
115
|
i++;
|
@@ -120,10 +134,8 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
|
120
134
|
args->flags |= DUMP_DEBUG_INFO;
|
121
135
|
break;
|
122
136
|
case 'E':
|
123
|
-
args->flags = DUMP_ENDIAN_BIG | (args->flags & ~DUMP_ENDIAN_MASK);
|
124
|
-
break;
|
125
137
|
case 'e':
|
126
|
-
|
138
|
+
fprintf(stderr, "%s: -e/-E option no longer needed.\n", args->prog);
|
127
139
|
break;
|
128
140
|
case 'h':
|
129
141
|
return -1;
|
@@ -156,10 +168,6 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
|
|
156
168
|
break;
|
157
169
|
}
|
158
170
|
}
|
159
|
-
if (args->verbose && args->initname && (args->flags & DUMP_ENDIAN_MASK) == 0) {
|
160
|
-
fprintf(stderr, "%s: generating %s endian C file. specify -e/-E for cross compiling.\n",
|
161
|
-
args->prog, bigendian_p() ? "big" : "little");
|
162
|
-
}
|
163
171
|
return i;
|
164
172
|
}
|
165
173
|
|
@@ -235,13 +243,18 @@ static int
|
|
235
243
|
dump_file(mrb_state *mrb, FILE *wfp, const char *outfile, struct RProc *proc, struct mrbc_args *args)
|
236
244
|
{
|
237
245
|
int n = MRB_DUMP_OK;
|
238
|
-
mrb_irep *irep = proc->body.irep;
|
246
|
+
const mrb_irep *irep = proc->body.irep;
|
239
247
|
|
240
248
|
if (args->remove_lv) {
|
241
|
-
mrb_irep_remove_lv(mrb, irep);
|
249
|
+
mrb_irep_remove_lv(mrb, (mrb_irep*)irep);
|
242
250
|
}
|
243
251
|
if (args->initname) {
|
244
|
-
|
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
|
+
}
|
245
258
|
if (n == MRB_DUMP_INVALID_ARGUMENT) {
|
246
259
|
fprintf(stderr, "%s: invalid C language symbol name\n", args->initname);
|
247
260
|
}
|
@@ -258,7 +271,7 @@ dump_file(mrb_state *mrb, FILE *wfp, const char *outfile, struct RProc *proc, st
|
|
258
271
|
int
|
259
272
|
main(int argc, char **argv)
|
260
273
|
{
|
261
|
-
mrb_state *mrb =
|
274
|
+
mrb_state *mrb = mrb_open_core(NULL, NULL);
|
262
275
|
int n, result;
|
263
276
|
struct mrbc_args args;
|
264
277
|
FILE *wfp;
|
@@ -331,7 +344,7 @@ mrb_init_mrblib(mrb_state *mrb)
|
|
331
344
|
{
|
332
345
|
}
|
333
346
|
|
334
|
-
#ifndef
|
347
|
+
#ifndef MRB_NO_GEMS
|
335
348
|
void
|
336
349
|
mrb_init_mrbgems(mrb_state *mrb)
|
337
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
|
@@ -4,10 +4,9 @@
|
|
4
4
|
spec.summary = 'mruby command'
|
5
5
|
spec.bins = %w(mruby)
|
6
6
|
spec.add_dependency('mruby-compiler', :core => 'mruby-compiler')
|
7
|
-
spec.add_dependency('mruby-error', :core => 'mruby-error')
|
8
7
|
spec.add_test_dependency('mruby-print', :core => 'mruby-print')
|
9
8
|
|
10
9
|
if build.cxx_exception_enabled?
|
11
|
-
build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c"
|
10
|
+
build.compile_as_cxx("#{spec.dir}/tools/mruby/mruby.c")
|
12
11
|
end
|
13
12
|
end
|
@@ -1,11 +1,21 @@
|
|
1
|
-
#include <
|
1
|
+
#include <mruby.h>
|
2
|
+
|
3
|
+
#ifdef MRB_NO_STDIO
|
4
|
+
# error mruby-bin-mruby conflicts 'MRB_NO_STDIO' in your build configuration
|
5
|
+
#endif
|
6
|
+
|
2
7
|
#include <stdlib.h>
|
3
8
|
#include <string.h>
|
4
|
-
#include <mruby.h>
|
5
9
|
#include <mruby/array.h>
|
6
10
|
#include <mruby/compile.h>
|
7
11
|
#include <mruby/dump.h>
|
8
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
|
9
19
|
|
10
20
|
struct _args {
|
11
21
|
FILE *rfp;
|
@@ -213,7 +223,7 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
|
|
213
223
|
}
|
214
224
|
else {
|
215
225
|
args->rfp = strcmp(argv[0], "-") == 0 ?
|
216
|
-
stdin : fopen(argv[0],
|
226
|
+
stdin : fopen(argv[0], "rb");
|
217
227
|
if (args->rfp == NULL) {
|
218
228
|
fprintf(stderr, "%s: Cannot open program file: %s\n", opts->program, argv[0]);
|
219
229
|
return EXIT_FAILURE;
|
@@ -223,6 +233,11 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
|
|
223
233
|
argc--; argv++;
|
224
234
|
}
|
225
235
|
}
|
236
|
+
#if defined(_WIN32) || defined(_WIN64)
|
237
|
+
if (args->rfp == stdin) {
|
238
|
+
_setmode(_fileno(stdin), O_BINARY);
|
239
|
+
}
|
240
|
+
#endif
|
226
241
|
args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1));
|
227
242
|
memcpy(args->argv, argv, (argc+1) * sizeof(char*));
|
228
243
|
args->argc = argc;
|
@@ -303,7 +318,8 @@ main(int argc, char **argv)
|
|
303
318
|
|
304
319
|
/* Load libraries */
|
305
320
|
for (i = 0; i < args.libc; i++) {
|
306
|
-
|
321
|
+
struct REnv *e;
|
322
|
+
FILE *lfp = fopen(args.libv[i], "rb");
|
307
323
|
if (lfp == NULL) {
|
308
324
|
fprintf(stderr, "%s: Cannot open library file: %s\n", *argv, args.libv[i]);
|
309
325
|
mrbc_context_free(mrb, c);
|
@@ -314,9 +330,13 @@ main(int argc, char **argv)
|
|
314
330
|
v = mrb_load_irep_file_cxt(mrb, lfp, c);
|
315
331
|
}
|
316
332
|
else {
|
317
|
-
v =
|
333
|
+
v = mrb_load_detect_file_cxt(mrb, lfp, c);
|
318
334
|
}
|
319
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);
|
320
340
|
}
|
321
341
|
|
322
342
|
/* Load program */
|
@@ -324,7 +344,7 @@ main(int argc, char **argv)
|
|
324
344
|
v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
|
325
345
|
}
|
326
346
|
else if (args.rfp) {
|
327
|
-
v =
|
347
|
+
v = mrb_load_detect_file_cxt(mrb, args.rfp, c);
|
328
348
|
}
|
329
349
|
else {
|
330
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,11 @@
|
|
1
|
-
#include <
|
1
|
+
#include <mruby.h>
|
2
|
+
|
3
|
+
#ifdef MRB_NO_STDIO
|
4
|
+
# error mruby-bin-strip conflicts 'MRB_NO_STDIO' in your build configuration
|
5
|
+
#endif
|
6
|
+
|
2
7
|
#include <stdlib.h>
|
3
8
|
#include <string.h>
|
4
|
-
#include <mruby.h>
|
5
9
|
#include <mruby/irep.h>
|
6
10
|
#include <mruby/dump.h>
|
7
11
|
|
@@ -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)
|
@@ -43,10 +44,15 @@ mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
|
|
43
44
|
const mrb_value *argv;
|
44
45
|
mrb_int argc;
|
45
46
|
mrb_value blk;
|
47
|
+
struct RClass *c;
|
46
48
|
|
47
49
|
mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
|
48
50
|
|
49
|
-
|
51
|
+
c = mrb_class_ptr(self);
|
52
|
+
if (mrb->c->ci->acc < 0) {
|
53
|
+
return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
|
54
|
+
}
|
55
|
+
mrb_vm_ci_target_class_set(mrb->c->ci, c);
|
50
56
|
return mrb_yield_cont(mrb, blk, self, argc, argv);
|
51
57
|
}
|
52
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
|
{
|
@@ -281,15 +327,6 @@ no_optimize(codegen_scope *s)
|
|
281
327
|
return FALSE;
|
282
328
|
}
|
283
329
|
|
284
|
-
static
|
285
|
-
mrb_bool
|
286
|
-
on_eval(codegen_scope *s)
|
287
|
-
{
|
288
|
-
if (s && s->parser && s->parser->on_eval)
|
289
|
-
return TRUE;
|
290
|
-
return FALSE;
|
291
|
-
}
|
292
|
-
|
293
330
|
struct mrb_insn_data
|
294
331
|
mrb_decode_insn(const mrb_code *pc)
|
295
332
|
{
|
@@ -297,39 +334,13 @@ mrb_decode_insn(const mrb_code *pc)
|
|
297
334
|
mrb_code insn = READ_B();
|
298
335
|
uint16_t a = 0;
|
299
336
|
uint16_t b = 0;
|
300
|
-
|
337
|
+
uint16_t c = 0;
|
301
338
|
|
302
339
|
switch (insn) {
|
303
340
|
#define FETCH_Z() /* empty */
|
304
341
|
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x (); break;
|
305
342
|
#include "mruby/ops.h"
|
306
343
|
#undef OPCODE
|
307
|
-
}
|
308
|
-
switch (insn) {
|
309
|
-
case OP_EXT1:
|
310
|
-
insn = READ_B();
|
311
|
-
switch (insn) {
|
312
|
-
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _1 (); break;
|
313
|
-
#include "mruby/ops.h"
|
314
|
-
#undef OPCODE
|
315
|
-
}
|
316
|
-
break;
|
317
|
-
case OP_EXT2:
|
318
|
-
insn = READ_B();
|
319
|
-
switch (insn) {
|
320
|
-
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _2 (); break;
|
321
|
-
#include "mruby/ops.h"
|
322
|
-
#undef OPCODE
|
323
|
-
}
|
324
|
-
break;
|
325
|
-
case OP_EXT3:
|
326
|
-
insn = READ_B();
|
327
|
-
switch (insn) {
|
328
|
-
#define OPCODE(i,x) case OP_ ## i: FETCH_ ## x ## _3 (); break;
|
329
|
-
#include "mruby/ops.h"
|
330
|
-
#undef OPCODE
|
331
|
-
}
|
332
|
-
break;
|
333
344
|
default:
|
334
345
|
break;
|
335
346
|
}
|
@@ -358,22 +369,44 @@ no_peephole(codegen_scope *s)
|
|
358
369
|
return no_optimize(s) || s->lastlabel == s->pc || s->pc == 0 || s->pc == s->lastpc;
|
359
370
|
}
|
360
371
|
|
361
|
-
|
362
|
-
|
372
|
+
#define JMPLINK_START UINT32_MAX
|
373
|
+
|
374
|
+
static void
|
375
|
+
gen_jmpdst(codegen_scope *s, uint32_t pc)
|
363
376
|
{
|
364
|
-
|
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)
|
394
|
+
{
|
395
|
+
uint32_t pos;
|
365
396
|
|
366
397
|
s->lastpc = s->pc;
|
367
398
|
gen_B(s, i);
|
368
399
|
pos = s->pc;
|
369
|
-
|
400
|
+
gen_jmpdst(s, pc);
|
370
401
|
return pos;
|
371
402
|
}
|
372
403
|
|
373
|
-
|
374
|
-
|
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)
|
375
408
|
{
|
376
|
-
|
409
|
+
uint32_t pos;
|
377
410
|
|
378
411
|
if (!no_peephole(s) && !val) {
|
379
412
|
struct mrb_insn_data data = mrb_last_insn(s);
|
@@ -386,30 +419,26 @@ genjmp2(codegen_scope *s, mrb_code i, uint16_t a, int pc, int val)
|
|
386
419
|
|
387
420
|
s->lastpc = s->pc;
|
388
421
|
if (a > 0xff) {
|
389
|
-
|
390
|
-
|
391
|
-
gen_S(s, a);
|
392
|
-
pos = s->pc;
|
393
|
-
gen_S(s, pc);
|
422
|
+
codegen_error(s, "too big operand");
|
423
|
+
pos = 0;
|
394
424
|
}
|
395
425
|
else {
|
396
426
|
gen_B(s, i);
|
397
427
|
gen_B(s, (uint8_t)a);
|
398
428
|
pos = s->pc;
|
399
|
-
|
429
|
+
gen_jmpdst(s, pc);
|
400
430
|
}
|
401
431
|
return pos;
|
402
432
|
}
|
403
433
|
|
434
|
+
#define genjmp2_0(s,i,a,val) genjmp2(s,i,a,JMPLINK_START,val)
|
435
|
+
|
404
436
|
static void
|
405
437
|
gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep)
|
406
438
|
{
|
407
439
|
if (no_peephole(s)) {
|
408
440
|
normal:
|
409
441
|
genop_2(s, OP_MOVE, dst, src);
|
410
|
-
if (on_eval(s)) {
|
411
|
-
genop_0(s, OP_NOP);
|
412
|
-
}
|
413
442
|
return;
|
414
443
|
}
|
415
444
|
else {
|
@@ -429,10 +458,13 @@ gen_move(codegen_scope *s, uint16_t dst, uint16_t src, int nopeep)
|
|
429
458
|
s->pc = s->lastpc;
|
430
459
|
genop_1(s, data.insn, dst);
|
431
460
|
break;
|
432
|
-
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:
|
433
464
|
case OP_GETGV: case OP_GETSV: case OP_GETIV: case OP_GETCV:
|
434
|
-
case OP_GETCONST: case OP_STRING:
|
465
|
+
case OP_GETCONST: case OP_STRING: case OP_STRING16:
|
435
466
|
case OP_LAMBDA: case OP_BLOCK: case OP_METHOD: case OP_BLKPUSH:
|
467
|
+
case OP_LAMBDA16: case OP_BLOCK16: case OP_METHOD16:
|
436
468
|
if (nopeep || data.a != src || data.a < s->nlocals) goto normal;
|
437
469
|
s->pc = s->lastpc;
|
438
470
|
genop_2(s, data.insn, dst, data.b);
|
@@ -500,21 +532,31 @@ gen_addsub(codegen_scope *s, uint8_t op, uint16_t dst)
|
|
500
532
|
}
|
501
533
|
}
|
502
534
|
|
503
|
-
static
|
504
|
-
dispatch(codegen_scope *s,
|
535
|
+
static uint32_t
|
536
|
+
dispatch(codegen_scope *s, uint32_t pos0)
|
505
537
|
{
|
506
|
-
|
538
|
+
int32_t pos1;
|
539
|
+
int32_t offset;
|
540
|
+
int16_t newpos;
|
507
541
|
|
542
|
+
if (pos0 == JMPLINK_START) return 0;
|
543
|
+
|
544
|
+
pos1 = pos0 + 2;
|
545
|
+
offset = s->pc - pos1;
|
546
|
+
if (offset > INT16_MAX) {
|
547
|
+
codegen_error(s, "too big jmp offset");
|
548
|
+
}
|
508
549
|
s->lastlabel = s->pc;
|
509
|
-
newpos = PEEK_S(s->iseq+pos0);
|
510
|
-
emit_S(s, pos0,
|
511
|
-
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;
|
512
554
|
}
|
513
555
|
|
514
556
|
static void
|
515
|
-
dispatch_linked(codegen_scope *s,
|
557
|
+
dispatch_linked(codegen_scope *s, uint32_t pos)
|
516
558
|
{
|
517
|
-
if (pos==
|
559
|
+
if (pos==JMPLINK_START) return;
|
518
560
|
for (;;) {
|
519
561
|
pos = dispatch(s, pos);
|
520
562
|
if (pos==0) break;
|
@@ -551,37 +593,46 @@ static inline int
|
|
551
593
|
new_lit(codegen_scope *s, mrb_value val)
|
552
594
|
{
|
553
595
|
int i;
|
554
|
-
|
596
|
+
mrb_pool_value *pv;
|
555
597
|
|
556
598
|
switch (mrb_type(val)) {
|
557
599
|
case MRB_TT_STRING:
|
558
600
|
for (i=0; i<s->irep->plen; i++) {
|
559
601
|
mrb_int len;
|
560
|
-
pv = &s->
|
561
|
-
|
562
|
-
|
563
|
-
if (
|
564
|
-
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)
|
565
607
|
return i;
|
566
608
|
}
|
567
609
|
break;
|
568
|
-
#ifndef
|
610
|
+
#ifndef MRB_NO_FLOAT
|
569
611
|
case MRB_TT_FLOAT:
|
570
612
|
for (i=0; i<s->irep->plen; i++) {
|
571
613
|
mrb_float f1, f2;
|
572
|
-
pv = &s->
|
573
|
-
if (
|
574
|
-
|
614
|
+
pv = &s->pool[i];
|
615
|
+
if (pv->tt != IREP_TT_FLOAT) continue;
|
616
|
+
pv = &s->pool[i];
|
617
|
+
f1 = pv->u.f;
|
575
618
|
f2 = mrb_float(val);
|
576
619
|
if (f1 == f2 && !signbit(f1) == !signbit(f2)) return i;
|
577
620
|
}
|
578
621
|
break;
|
579
622
|
#endif
|
580
|
-
case
|
623
|
+
case MRB_TT_INTEGER:
|
581
624
|
for (i=0; i<s->irep->plen; i++) {
|
582
|
-
|
583
|
-
|
584
|
-
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
|
585
636
|
}
|
586
637
|
break;
|
587
638
|
default:
|
@@ -591,26 +642,43 @@ new_lit(codegen_scope *s, mrb_value val)
|
|
591
642
|
|
592
643
|
if (s->irep->plen == s->pcapa) {
|
593
644
|
s->pcapa *= 2;
|
594
|
-
s->
|
645
|
+
s->pool = (mrb_pool_value*)codegen_realloc(s, s->pool, sizeof(mrb_pool_value)*s->pcapa);
|
595
646
|
}
|
596
647
|
|
597
|
-
pv = &s->
|
648
|
+
pv = &s->pool[s->irep->plen];
|
598
649
|
i = s->irep->plen++;
|
599
650
|
|
600
651
|
switch (mrb_type(val)) {
|
601
652
|
case MRB_TT_STRING:
|
602
|
-
|
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
|
+
}
|
603
666
|
break;
|
604
667
|
|
605
|
-
#ifndef
|
668
|
+
#ifndef MRB_NO_FLOAT
|
606
669
|
case MRB_TT_FLOAT:
|
607
|
-
|
608
|
-
|
670
|
+
pv->tt = IREP_TT_FLOAT;
|
671
|
+
pv->u.f = mrb_float(val);
|
609
672
|
break;
|
610
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);
|
611
681
|
#endif
|
612
|
-
case MRB_TT_FIXNUM:
|
613
|
-
*pv = val;
|
614
682
|
break;
|
615
683
|
|
616
684
|
default:
|
@@ -620,9 +688,6 @@ new_lit(codegen_scope *s, mrb_value val)
|
|
620
688
|
return i;
|
621
689
|
}
|
622
690
|
|
623
|
-
/* maximum symbol numbers */
|
624
|
-
#define MAXSYMLEN 0x10000
|
625
|
-
|
626
691
|
static int
|
627
692
|
new_sym(codegen_scope *s, mrb_sym sym)
|
628
693
|
{
|
@@ -632,13 +697,16 @@ new_sym(codegen_scope *s, mrb_sym sym)
|
|
632
697
|
|
633
698
|
len = s->irep->slen;
|
634
699
|
for (i=0; i<len; i++) {
|
635
|
-
if (s->
|
700
|
+
if (s->syms[i] == sym) return i;
|
636
701
|
}
|
637
702
|
if (s->irep->slen >= s->scapa) {
|
638
703
|
s->scapa *= 2;
|
639
|
-
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);
|
640
708
|
}
|
641
|
-
s->
|
709
|
+
s->syms[s->irep->slen] = sym;
|
642
710
|
return s->irep->slen++;
|
643
711
|
}
|
644
712
|
|
@@ -674,6 +742,45 @@ lv_idx(codegen_scope *s, mrb_sym id)
|
|
674
742
|
return 0;
|
675
743
|
}
|
676
744
|
|
745
|
+
static int
|
746
|
+
search_upvar(codegen_scope *s, mrb_sym id, int *idx)
|
747
|
+
{
|
748
|
+
const struct RProc *u;
|
749
|
+
int lv = 0;
|
750
|
+
codegen_scope *up = s->prev;
|
751
|
+
|
752
|
+
while (up) {
|
753
|
+
*idx = lv_idx(up, id);
|
754
|
+
if (*idx > 0) {
|
755
|
+
return lv;
|
756
|
+
}
|
757
|
+
lv ++;
|
758
|
+
up = up->prev;
|
759
|
+
}
|
760
|
+
|
761
|
+
if (lv < 1) lv = 1;
|
762
|
+
u = s->parser->upper;
|
763
|
+
while (u && !MRB_PROC_CFUNC_P(u)) {
|
764
|
+
const struct mrb_irep *ir = u->body.irep;
|
765
|
+
uint_fast16_t n = ir->nlocals;
|
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;
|
772
|
+
return lv - 1;
|
773
|
+
}
|
774
|
+
}
|
775
|
+
if (MRB_PROC_SCOPE_P(u)) break;
|
776
|
+
u = u->upper;
|
777
|
+
lv ++;
|
778
|
+
}
|
779
|
+
|
780
|
+
codegen_error(s, "Can't found local variables");
|
781
|
+
return -1; /* not reached */
|
782
|
+
}
|
783
|
+
|
677
784
|
static void
|
678
785
|
for_body(codegen_scope *s, node *tree)
|
679
786
|
{
|
@@ -712,7 +819,7 @@ for_body(codegen_scope *s, node *tree)
|
|
712
819
|
genop_2(s, OP_BLOCK, cursp(), s->irep->rlen-1);
|
713
820
|
push();pop(); /* space for a block */
|
714
821
|
pop();
|
715
|
-
idx = new_sym(s,
|
822
|
+
idx = new_sym(s, MRB_SYM_2(s->mrb, each));
|
716
823
|
genop_3(s, OP_SENDB, cursp(), idx, 0);
|
717
824
|
}
|
718
825
|
|
@@ -749,7 +856,7 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
749
856
|
oa = node_len(tree->car->cdr->car);
|
750
857
|
/* rest argument? */
|
751
858
|
ra = tree->car->cdr->cdr->car ? 1 : 0;
|
752
|
-
/* mandatory
|
859
|
+
/* mandatory arguments after rest argument */
|
753
860
|
pa = node_len(tree->car->cdr->cdr->cdr->car);
|
754
861
|
pargs = tree->car->cdr->cdr->cdr->car;
|
755
862
|
/* keyword arguments */
|
@@ -777,21 +884,28 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
777
884
|
pos = new_label(s);
|
778
885
|
for (i=0; i<oa; i++) {
|
779
886
|
new_label(s);
|
780
|
-
|
887
|
+
genjmp_0(s, OP_JMP);
|
781
888
|
}
|
782
889
|
if (oa > 0) {
|
783
|
-
|
890
|
+
genjmp_0(s, OP_JMP);
|
784
891
|
}
|
785
892
|
opt = tree->car->cdr->car;
|
786
893
|
i = 0;
|
787
894
|
while (opt) {
|
788
895
|
int idx;
|
896
|
+
mrb_sym id = nsym(opt->car->car);
|
789
897
|
|
790
898
|
dispatch(s, pos+i*3+1);
|
791
899
|
codegen(s, opt->car->cdr, VAL);
|
792
900
|
pop();
|
793
|
-
idx = lv_idx(s,
|
794
|
-
|
901
|
+
idx = lv_idx(s, id);
|
902
|
+
if (idx > 0) {
|
903
|
+
gen_move(s, idx, cursp(), 0);
|
904
|
+
}
|
905
|
+
else {
|
906
|
+
int lv = search_upvar(s, id, &idx);
|
907
|
+
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
908
|
+
}
|
795
909
|
i++;
|
796
910
|
opt = opt->cdr;
|
797
911
|
}
|
@@ -818,12 +932,20 @@ lambda_body(codegen_scope *s, node *tree, int blk)
|
|
818
932
|
mrb_assert(nint(kwd->car) == NODE_KW_ARG);
|
819
933
|
|
820
934
|
if (def_arg) {
|
935
|
+
int idx;
|
821
936
|
genop_2(s, OP_KEY_P, lv_idx(s, kwd_sym), new_sym(s, kwd_sym));
|
822
|
-
jmpif_key_p =
|
937
|
+
jmpif_key_p = genjmp2_0(s, OP_JMPIF, lv_idx(s, kwd_sym), NOVAL);
|
823
938
|
codegen(s, def_arg, VAL);
|
824
939
|
pop();
|
825
|
-
|
826
|
-
|
940
|
+
idx = lv_idx(s, kwd_sym);
|
941
|
+
if (idx > 0) {
|
942
|
+
gen_move(s, idx, cursp(), 0);
|
943
|
+
}
|
944
|
+
else {
|
945
|
+
int lv = search_upvar(s, kwd_sym, &idx);
|
946
|
+
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
947
|
+
}
|
948
|
+
jmp_def_set = genjmp_0(s, OP_JMP);
|
827
949
|
dispatch(s, jmpif_key_p);
|
828
950
|
}
|
829
951
|
genop_2(s, OP_KARG, lv_idx(s, kwd_sym), new_sym(s, kwd_sym));
|
@@ -1004,7 +1126,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
|
|
1004
1126
|
if (safe) {
|
1005
1127
|
int recv = cursp()-1;
|
1006
1128
|
gen_move(s, cursp(), recv, 1);
|
1007
|
-
skip =
|
1129
|
+
skip = genjmp2_0(s, OP_JMPNIL, cursp(), val);
|
1008
1130
|
}
|
1009
1131
|
tree = tree->cdr->cdr->car;
|
1010
1132
|
if (tree) {
|
@@ -1103,23 +1225,12 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
|
|
1103
1225
|
if (idx > 0) {
|
1104
1226
|
if (idx != sp) {
|
1105
1227
|
gen_move(s, idx, sp, val);
|
1106
|
-
if (val && on_eval(s)) genop_0(s, OP_NOP);
|
1107
1228
|
}
|
1108
1229
|
break;
|
1109
1230
|
}
|
1110
1231
|
else { /* upvar */
|
1111
|
-
int lv =
|
1112
|
-
|
1113
|
-
|
1114
|
-
while (up) {
|
1115
|
-
idx = lv_idx(up, nsym(tree));
|
1116
|
-
if (idx > 0) {
|
1117
|
-
genop_3(s, OP_SETUPVAR, sp, idx, lv);
|
1118
|
-
break;
|
1119
|
-
}
|
1120
|
-
lv++;
|
1121
|
-
up = up->prev;
|
1122
|
-
}
|
1232
|
+
int lv = search_upvar(s, nsym(tree), &idx);
|
1233
|
+
genop_3(s, OP_SETUPVAR, sp, idx, lv);
|
1123
1234
|
}
|
1124
1235
|
break;
|
1125
1236
|
case NODE_NVAR:
|
@@ -1167,7 +1278,7 @@ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
|
|
1167
1278
|
break;
|
1168
1279
|
|
1169
1280
|
default:
|
1170
|
-
#ifndef
|
1281
|
+
#ifndef MRB_NO_STDIO
|
1171
1282
|
fprintf(stderr, "unknown lhs %d\n", type);
|
1172
1283
|
#endif
|
1173
1284
|
break;
|
@@ -1296,34 +1407,6 @@ raise_error(codegen_scope *s, const char *msg)
|
|
1296
1407
|
genop_1(s, OP_ERR, idx);
|
1297
1408
|
}
|
1298
1409
|
|
1299
|
-
#ifndef MRB_WITHOUT_FLOAT
|
1300
|
-
static double
|
1301
|
-
readint_float(codegen_scope *s, const char *p, int base)
|
1302
|
-
{
|
1303
|
-
const char *e = p + strlen(p);
|
1304
|
-
double f = 0;
|
1305
|
-
int n;
|
1306
|
-
|
1307
|
-
if (*p == '+') p++;
|
1308
|
-
while (p < e) {
|
1309
|
-
char c = *p;
|
1310
|
-
c = tolower((unsigned char)c);
|
1311
|
-
for (n=0; n<base; n++) {
|
1312
|
-
if (mrb_digitmap[n] == c) {
|
1313
|
-
f *= base;
|
1314
|
-
f += n;
|
1315
|
-
break;
|
1316
|
-
}
|
1317
|
-
}
|
1318
|
-
if (n == base) {
|
1319
|
-
codegen_error(s, "malformed readint input");
|
1320
|
-
}
|
1321
|
-
p++;
|
1322
|
-
}
|
1323
|
-
return f;
|
1324
|
-
}
|
1325
|
-
#endif
|
1326
|
-
|
1327
1410
|
static mrb_int
|
1328
1411
|
readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_bool *overflow)
|
1329
1412
|
{
|
@@ -1427,21 +1510,25 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1427
1510
|
|
1428
1511
|
case NODE_RESCUE:
|
1429
1512
|
{
|
1430
|
-
int noexc
|
1513
|
+
int noexc;
|
1514
|
+
uint32_t exend, pos1, pos2, tmp;
|
1431
1515
|
struct loopinfo *lp;
|
1516
|
+
int catch_entry, begin, end;
|
1432
1517
|
|
1433
1518
|
if (tree->car == NULL) goto exit;
|
1434
1519
|
lp = loop_push(s, LOOP_BEGIN);
|
1435
1520
|
lp->pc0 = new_label(s);
|
1436
|
-
|
1521
|
+
catch_entry = catch_handler_new(s);
|
1522
|
+
begin = s->pc;
|
1437
1523
|
codegen(s, tree->car, VAL);
|
1438
1524
|
pop();
|
1439
1525
|
lp->type = LOOP_RESCUE;
|
1440
|
-
|
1441
|
-
|
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);
|
1442
1529
|
tree = tree->cdr;
|
1443
|
-
exend =
|
1444
|
-
pos1 =
|
1530
|
+
exend = JMPLINK_START;
|
1531
|
+
pos1 = JMPLINK_START;
|
1445
1532
|
if (tree->car) {
|
1446
1533
|
node *n2 = tree->car;
|
1447
1534
|
int exc = cursp();
|
@@ -1452,22 +1539,22 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1452
1539
|
node *n3 = n2->car;
|
1453
1540
|
node *n4 = n3->car;
|
1454
1541
|
|
1455
|
-
|
1456
|
-
pos2 =
|
1542
|
+
dispatch(s, pos1);
|
1543
|
+
pos2 = JMPLINK_START;
|
1457
1544
|
do {
|
1458
1545
|
if (n4 && n4->car && nint(n4->car->car) == NODE_SPLAT) {
|
1459
1546
|
codegen(s, n4->car, VAL);
|
1460
1547
|
gen_move(s, cursp(), exc, 0);
|
1461
1548
|
push_n(2); pop_n(2); /* space for one arg and a block */
|
1462
1549
|
pop();
|
1463
|
-
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);
|
1464
1551
|
}
|
1465
1552
|
else {
|
1466
1553
|
if (n4) {
|
1467
1554
|
codegen(s, n4->car, VAL);
|
1468
1555
|
}
|
1469
1556
|
else {
|
1470
|
-
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)));
|
1471
1558
|
push();
|
1472
1559
|
}
|
1473
1560
|
pop();
|
@@ -1479,7 +1566,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1479
1566
|
n4 = n4->cdr;
|
1480
1567
|
}
|
1481
1568
|
} while (n4);
|
1482
|
-
pos1 =
|
1569
|
+
pos1 = genjmp_0(s, OP_JMP);
|
1483
1570
|
dispatch_linked(s, pos2);
|
1484
1571
|
|
1485
1572
|
pop();
|
@@ -1495,15 +1582,14 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1495
1582
|
n2 = n2->cdr;
|
1496
1583
|
push();
|
1497
1584
|
}
|
1498
|
-
if (pos1) {
|
1585
|
+
if (pos1 != JMPLINK_START) {
|
1499
1586
|
dispatch(s, pos1);
|
1500
|
-
genop_1(s,
|
1587
|
+
genop_1(s, OP_RAISEIF, exc);
|
1501
1588
|
}
|
1502
1589
|
}
|
1503
1590
|
pop();
|
1504
1591
|
tree = tree->cdr;
|
1505
1592
|
dispatch(s, noexc);
|
1506
|
-
genop_1(s, OP_POPERR, 1);
|
1507
1593
|
if (tree->car) {
|
1508
1594
|
codegen(s, tree->car, val);
|
1509
1595
|
}
|
@@ -1519,14 +1605,22 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1519
1605
|
if (!tree->cdr || !tree->cdr->cdr ||
|
1520
1606
|
(nint(tree->cdr->cdr->car) == NODE_BEGIN &&
|
1521
1607
|
tree->cdr->cdr->cdr)) {
|
1608
|
+
int catch_entry, begin, end, target;
|
1522
1609
|
int idx;
|
1523
1610
|
|
1524
|
-
s
|
1525
|
-
|
1526
|
-
genop_1(s, OP_EPUSH, idx);
|
1611
|
+
catch_entry = catch_handler_new(s);
|
1612
|
+
begin = s->pc;
|
1527
1613
|
codegen(s, tree->car, val);
|
1528
|
-
s->
|
1529
|
-
|
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);
|
1530
1624
|
}
|
1531
1625
|
else { /* empty ensure ignored */
|
1532
1626
|
codegen(s, tree->car, val);
|
@@ -1537,7 +1631,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1537
1631
|
if (val) {
|
1538
1632
|
int idx = lambda_body(s, tree, 1);
|
1539
1633
|
|
1540
|
-
|
1634
|
+
genop_bs(s, OP_LAMBDA, cursp(), idx);
|
1541
1635
|
push();
|
1542
1636
|
}
|
1543
1637
|
break;
|
@@ -1546,7 +1640,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1546
1640
|
if (val) {
|
1547
1641
|
int idx = lambda_body(s, tree, 1);
|
1548
1642
|
|
1549
|
-
|
1643
|
+
genop_bs(s, OP_BLOCK, cursp(), idx);
|
1550
1644
|
push();
|
1551
1645
|
}
|
1552
1646
|
break;
|
@@ -1574,7 +1668,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1574
1668
|
{
|
1575
1669
|
node *n = tree->car->cdr;
|
1576
1670
|
mrb_sym mid = nsym(n->cdr->car);
|
1577
|
-
mrb_sym mnil =
|
1671
|
+
mrb_sym mnil = MRB_SYM_Q_2(s->mrb, nil);
|
1578
1672
|
if (mid == mnil && n->cdr->cdr->car == NULL) {
|
1579
1673
|
nil_p = TRUE;
|
1580
1674
|
codegen(s, n->car, VAL);
|
@@ -1588,17 +1682,17 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1588
1682
|
pop();
|
1589
1683
|
if (val || tree->cdr->car) {
|
1590
1684
|
if (nil_p) {
|
1591
|
-
pos2 =
|
1592
|
-
pos1 =
|
1685
|
+
pos2 = genjmp2_0(s, OP_JMPNIL, cursp(), val);
|
1686
|
+
pos1 = genjmp_0(s, OP_JMP);
|
1593
1687
|
dispatch(s, pos2);
|
1594
1688
|
}
|
1595
1689
|
else {
|
1596
|
-
pos1 =
|
1690
|
+
pos1 = genjmp2_0(s, OP_JMPNOT, cursp(), val);
|
1597
1691
|
}
|
1598
1692
|
codegen(s, tree->cdr->car, val);
|
1599
1693
|
if (val) pop();
|
1600
1694
|
if (elsepart || val) {
|
1601
|
-
pos2 =
|
1695
|
+
pos2 = genjmp_0(s, OP_JMP);
|
1602
1696
|
dispatch(s, pos1);
|
1603
1697
|
codegen(s, elsepart, val);
|
1604
1698
|
dispatch(s, pos2);
|
@@ -1610,10 +1704,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1610
1704
|
else { /* empty then-part */
|
1611
1705
|
if (elsepart) {
|
1612
1706
|
if (nil_p) {
|
1613
|
-
pos1 =
|
1707
|
+
pos1 = genjmp2_0(s, OP_JMPNIL, cursp(), val);
|
1614
1708
|
}
|
1615
1709
|
else {
|
1616
|
-
pos1 =
|
1710
|
+
pos1 = genjmp2_0(s, OP_JMPIF, cursp(), val);
|
1617
1711
|
}
|
1618
1712
|
codegen(s, elsepart, val);
|
1619
1713
|
dispatch(s, pos1);
|
@@ -1632,7 +1726,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1632
1726
|
|
1633
1727
|
codegen(s, tree->car, VAL);
|
1634
1728
|
pop();
|
1635
|
-
pos =
|
1729
|
+
pos = genjmp2_0(s, OP_JMPNOT, cursp(), val);
|
1636
1730
|
codegen(s, tree->cdr, val);
|
1637
1731
|
dispatch(s, pos);
|
1638
1732
|
}
|
@@ -1644,7 +1738,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1644
1738
|
|
1645
1739
|
codegen(s, tree->car, VAL);
|
1646
1740
|
pop();
|
1647
|
-
pos =
|
1741
|
+
pos = genjmp2_0(s, OP_JMPIF, cursp(), val);
|
1648
1742
|
codegen(s, tree->cdr, val);
|
1649
1743
|
dispatch(s, pos);
|
1650
1744
|
}
|
@@ -1655,7 +1749,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1655
1749
|
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
|
1656
1750
|
|
1657
1751
|
lp->pc0 = new_label(s);
|
1658
|
-
lp->pc1 =
|
1752
|
+
lp->pc1 = genjmp_0(s, OP_JMP);
|
1659
1753
|
lp->pc2 = new_label(s);
|
1660
1754
|
codegen(s, tree->cdr, NOVAL);
|
1661
1755
|
dispatch(s, lp->pc1);
|
@@ -1672,7 +1766,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1672
1766
|
struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
|
1673
1767
|
|
1674
1768
|
lp->pc0 = new_label(s);
|
1675
|
-
lp->pc1 =
|
1769
|
+
lp->pc1 = genjmp_0(s, OP_JMP);
|
1676
1770
|
lp->pc2 = new_label(s);
|
1677
1771
|
codegen(s, tree->cdr, NOVAL);
|
1678
1772
|
dispatch(s, lp->pc1);
|
@@ -1692,10 +1786,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1692
1786
|
case NODE_CASE:
|
1693
1787
|
{
|
1694
1788
|
int head = 0;
|
1695
|
-
|
1789
|
+
uint32_t pos1, pos2, pos3, tmp;
|
1696
1790
|
node *n;
|
1697
1791
|
|
1698
|
-
pos3 =
|
1792
|
+
pos3 = JMPLINK_START;
|
1699
1793
|
if (tree->car) {
|
1700
1794
|
head = cursp();
|
1701
1795
|
codegen(s, tree->car, VAL);
|
@@ -1703,17 +1797,17 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1703
1797
|
tree = tree->cdr;
|
1704
1798
|
while (tree) {
|
1705
1799
|
n = tree->car->car;
|
1706
|
-
pos1 = pos2 =
|
1800
|
+
pos1 = pos2 = JMPLINK_START;
|
1707
1801
|
while (n) {
|
1708
1802
|
codegen(s, n->car, VAL);
|
1709
1803
|
if (head) {
|
1710
1804
|
gen_move(s, cursp(), head, 0);
|
1711
1805
|
push(); push(); pop(); pop(); pop();
|
1712
1806
|
if (nint(n->car->car) == NODE_SPLAT) {
|
1713
|
-
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);
|
1714
1808
|
}
|
1715
1809
|
else {
|
1716
|
-
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);
|
1717
1811
|
}
|
1718
1812
|
}
|
1719
1813
|
else {
|
@@ -1724,20 +1818,20 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1724
1818
|
n = n->cdr;
|
1725
1819
|
}
|
1726
1820
|
if (tree->car->car) {
|
1727
|
-
pos1 =
|
1821
|
+
pos1 = genjmp_0(s, OP_JMP);
|
1728
1822
|
dispatch_linked(s, pos2);
|
1729
1823
|
}
|
1730
1824
|
codegen(s, tree->car->cdr, val);
|
1731
1825
|
if (val) pop();
|
1732
1826
|
tmp = genjmp(s, OP_JMP, pos3);
|
1733
1827
|
pos3 = tmp;
|
1734
|
-
|
1828
|
+
dispatch(s, pos1);
|
1735
1829
|
tree = tree->cdr;
|
1736
1830
|
}
|
1737
1831
|
if (val) {
|
1738
|
-
|
1832
|
+
uint32_t pos = cursp();
|
1739
1833
|
genop_1(s, OP_LOADNIL, cursp());
|
1740
|
-
if (pos3) dispatch_linked(s, pos3);
|
1834
|
+
if (pos3 != JMPLINK_START) dispatch_linked(s, pos3);
|
1741
1835
|
if (head) pop();
|
1742
1836
|
if (cursp() != pos) {
|
1743
1837
|
gen_move(s, cursp(), pos, 0);
|
@@ -1745,7 +1839,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1745
1839
|
push();
|
1746
1840
|
}
|
1747
1841
|
else {
|
1748
|
-
if (pos3) {
|
1842
|
+
if (pos3 != JMPLINK_START) {
|
1749
1843
|
dispatch_linked(s, pos3);
|
1750
1844
|
}
|
1751
1845
|
if (head) {
|
@@ -1860,7 +1954,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1860
1954
|
len++;
|
1861
1955
|
}
|
1862
1956
|
tree = tree->cdr;
|
1863
|
-
if (val &&
|
1957
|
+
if (val && cursp() > 127) {
|
1864
1958
|
pop_n(len*2);
|
1865
1959
|
if (!update) {
|
1866
1960
|
genop_2(s, OP_HASH, cursp(), len);
|
@@ -1988,18 +2082,20 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
1988
2082
|
if ((len == 2 && name[0] == '|' && name[1] == '|') &&
|
1989
2083
|
(nint(tree->car->car) == NODE_CONST ||
|
1990
2084
|
nint(tree->car->car) == NODE_CVAR)) {
|
1991
|
-
int
|
2085
|
+
int catch_entry, begin, end;
|
2086
|
+
int noexc, exc;
|
1992
2087
|
struct loopinfo *lp;
|
1993
2088
|
|
1994
|
-
onerr = genjmp(s, OP_ONERR, 0);
|
1995
2089
|
lp = loop_push(s, LOOP_BEGIN);
|
1996
|
-
lp->
|
2090
|
+
lp->pc0 = new_label(s);
|
2091
|
+
catch_entry = catch_handler_new(s);
|
2092
|
+
begin = s->pc;
|
1997
2093
|
exc = cursp();
|
1998
2094
|
codegen(s, tree->car, VAL);
|
2095
|
+
end = s->pc;
|
2096
|
+
noexc = genjmp_0(s, OP_JMP);
|
1999
2097
|
lp->type = LOOP_RESCUE;
|
2000
|
-
|
2001
|
-
noexc = genjmp(s, OP_JMP, 0);
|
2002
|
-
dispatch(s, onerr);
|
2098
|
+
catch_handler_set(s, catch_entry, MRB_CATCH_RESCUE, begin, end, s->pc);
|
2003
2099
|
genop_1(s, OP_EXCEPT, exc);
|
2004
2100
|
genop_1(s, OP_LOADF, exc);
|
2005
2101
|
dispatch(s, noexc);
|
@@ -2050,10 +2146,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2050
2146
|
if (vsp >= 0) {
|
2051
2147
|
gen_move(s, vsp, cursp(), 1);
|
2052
2148
|
}
|
2053
|
-
pos =
|
2149
|
+
pos = genjmp2_0(s, name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), val);
|
2054
2150
|
}
|
2055
2151
|
else {
|
2056
|
-
pos =
|
2152
|
+
pos = genjmp2_0(s, name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), val);
|
2057
2153
|
}
|
2058
2154
|
codegen(s, tree->cdr->cdr->car, VAL);
|
2059
2155
|
pop();
|
@@ -2237,7 +2333,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2237
2333
|
pop_n(n+1);
|
2238
2334
|
genop_2S(s, OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf));
|
2239
2335
|
if (sendv) n = CALL_MAXARGS;
|
2240
|
-
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);
|
2241
2337
|
if (val) push();
|
2242
2338
|
}
|
2243
2339
|
break;
|
@@ -2252,11 +2348,8 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2252
2348
|
raise_error(s, "unexpected next");
|
2253
2349
|
}
|
2254
2350
|
else if (s->loop->type == LOOP_NORMAL) {
|
2255
|
-
if (s->ensure_level > s->loop->ensure_level) {
|
2256
|
-
genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level);
|
2257
|
-
}
|
2258
2351
|
codegen(s, tree, NOVAL);
|
2259
|
-
genjmp(s,
|
2352
|
+
genjmp(s, OP_JMPUW, s->loop->pc0);
|
2260
2353
|
}
|
2261
2354
|
else {
|
2262
2355
|
if (tree) {
|
@@ -2276,10 +2369,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2276
2369
|
raise_error(s, "unexpected redo");
|
2277
2370
|
}
|
2278
2371
|
else {
|
2279
|
-
|
2280
|
-
genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level);
|
2281
|
-
}
|
2282
|
-
genjmp(s, OP_JMP, s->loop->pc2);
|
2372
|
+
genjmp(s, OP_JMPUW, s->loop->pc2);
|
2283
2373
|
}
|
2284
2374
|
if (val) push();
|
2285
2375
|
break;
|
@@ -2287,32 +2377,16 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2287
2377
|
case NODE_RETRY:
|
2288
2378
|
{
|
2289
2379
|
const char *msg = "unexpected retry";
|
2380
|
+
const struct loopinfo *lp = s->loop;
|
2290
2381
|
|
2291
|
-
|
2382
|
+
while (lp && lp->type != LOOP_RESCUE) {
|
2383
|
+
lp = lp->prev;
|
2384
|
+
}
|
2385
|
+
if (!lp) {
|
2292
2386
|
raise_error(s, msg);
|
2293
2387
|
}
|
2294
2388
|
else {
|
2295
|
-
|
2296
|
-
int n = 0;
|
2297
|
-
|
2298
|
-
while (lp && lp->type != LOOP_RESCUE) {
|
2299
|
-
if (lp->type == LOOP_BEGIN) {
|
2300
|
-
n++;
|
2301
|
-
}
|
2302
|
-
lp = lp->prev;
|
2303
|
-
}
|
2304
|
-
if (!lp) {
|
2305
|
-
raise_error(s, msg);
|
2306
|
-
}
|
2307
|
-
else {
|
2308
|
-
if (n > 0) {
|
2309
|
-
genop_1(s, OP_POPERR, n);
|
2310
|
-
}
|
2311
|
-
if (s->ensure_level > lp->ensure_level) {
|
2312
|
-
genop_1(s, OP_EPOP, s->ensure_level - lp->ensure_level);
|
2313
|
-
}
|
2314
|
-
genjmp(s, OP_JMP, lp->pc0);
|
2315
|
-
}
|
2389
|
+
genjmp(s, OP_JMPUW, lp->pc0);
|
2316
2390
|
}
|
2317
2391
|
if (val) push();
|
2318
2392
|
}
|
@@ -2324,21 +2398,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2324
2398
|
|
2325
2399
|
if (idx > 0) {
|
2326
2400
|
gen_move(s, cursp(), idx, val);
|
2327
|
-
if (val && on_eval(s)) genop_0(s, OP_NOP);
|
2328
2401
|
}
|
2329
2402
|
else {
|
2330
|
-
int lv =
|
2331
|
-
|
2332
|
-
|
2333
|
-
while (up) {
|
2334
|
-
idx = lv_idx(up, nsym(tree));
|
2335
|
-
if (idx > 0) {
|
2336
|
-
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
2337
|
-
break;
|
2338
|
-
}
|
2339
|
-
lv++;
|
2340
|
-
up = up->prev;
|
2341
|
-
}
|
2403
|
+
int lv = search_upvar(s, nsym(tree), &idx);
|
2404
|
+
genop_3(s, OP_GETUPVAR, cursp(), idx, lv);
|
2342
2405
|
}
|
2343
2406
|
push();
|
2344
2407
|
}
|
@@ -2349,7 +2412,6 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2349
2412
|
int idx = nint(tree);
|
2350
2413
|
|
2351
2414
|
gen_move(s, cursp(), idx, val);
|
2352
|
-
if (val && on_eval(s)) genop_0(s, OP_NOP);
|
2353
2415
|
|
2354
2416
|
push();
|
2355
2417
|
}
|
@@ -2430,37 +2492,41 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2430
2492
|
mrb_bool overflow;
|
2431
2493
|
|
2432
2494
|
i = readint_mrb_int(s, p, base, FALSE, &overflow);
|
2433
|
-
#ifndef MRB_WITHOUT_FLOAT
|
2434
2495
|
if (overflow) {
|
2435
|
-
|
2436
|
-
int off = new_lit(s, mrb_float_value(s->mrb, f));
|
2437
|
-
|
2438
|
-
genop_2(s, OP_LOADL, cursp(), off);
|
2496
|
+
codegen_error(s, "integer overflow");
|
2439
2497
|
}
|
2440
|
-
else
|
2441
|
-
|
2442
|
-
|
2443
|
-
|
2444
|
-
|
2498
|
+
else {
|
2499
|
+
if (i < 0) {
|
2500
|
+
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
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);
|
2504
|
+
else goto lit_int;
|
2505
|
+
}
|
2445
2506
|
else if (i < 8) genop_1(s, OP_LOADI_0 + (uint8_t)i, cursp());
|
2446
|
-
else if (i <=
|
2507
|
+
else if (i <= 0xff) genop_2(s, OP_LOADI, cursp(), (uint16_t)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);
|
2447
2510
|
else {
|
2448
|
-
int off
|
2449
|
-
|
2511
|
+
int off;
|
2512
|
+
|
2513
|
+
lit_int:
|
2514
|
+
off = new_lit(s, mrb_int_value(s->mrb, i));
|
2515
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2450
2516
|
}
|
2451
2517
|
}
|
2452
2518
|
push();
|
2453
2519
|
}
|
2454
2520
|
break;
|
2455
2521
|
|
2456
|
-
#ifndef
|
2522
|
+
#ifndef MRB_NO_FLOAT
|
2457
2523
|
case NODE_FLOAT:
|
2458
2524
|
if (val) {
|
2459
2525
|
char *p = (char*)tree;
|
2460
2526
|
mrb_float f = mrb_float_read(p, NULL);
|
2461
2527
|
int off = new_lit(s, mrb_float_value(s->mrb, f));
|
2462
2528
|
|
2463
|
-
|
2529
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2464
2530
|
push();
|
2465
2531
|
}
|
2466
2532
|
break;
|
@@ -2470,14 +2536,14 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2470
2536
|
{
|
2471
2537
|
nt = nint(tree->car);
|
2472
2538
|
switch (nt) {
|
2473
|
-
#ifndef
|
2539
|
+
#ifndef MRB_NO_FLOAT
|
2474
2540
|
case NODE_FLOAT:
|
2475
2541
|
if (val) {
|
2476
2542
|
char *p = (char*)tree->cdr;
|
2477
2543
|
mrb_float f = mrb_float_read(p, NULL);
|
2478
2544
|
int off = new_lit(s, mrb_float_value(s->mrb, -f));
|
2479
2545
|
|
2480
|
-
|
2546
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2481
2547
|
push();
|
2482
2548
|
}
|
2483
2549
|
break;
|
@@ -2491,33 +2557,32 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2491
2557
|
mrb_bool overflow;
|
2492
2558
|
|
2493
2559
|
i = readint_mrb_int(s, p, base, TRUE, &overflow);
|
2494
|
-
#ifndef MRB_WITHOUT_FLOAT
|
2495
2560
|
if (overflow) {
|
2496
|
-
|
2497
|
-
int off = new_lit(s, mrb_float_value(s->mrb, -f));
|
2498
|
-
|
2499
|
-
genop_2(s, OP_LOADL, cursp(), off);
|
2561
|
+
codegen_error(s, "integer overflow");
|
2500
2562
|
}
|
2501
2563
|
else {
|
2502
|
-
#endif
|
2503
2564
|
if (i == -1) genop_1(s, OP_LOADI__1, cursp());
|
2504
|
-
else if (i >= -
|
2565
|
+
else if (i >= -0xff) {
|
2505
2566
|
genop_2(s, OP_LOADINEG, cursp(), (uint16_t)-i);
|
2506
2567
|
}
|
2568
|
+
else if (i >= INT16_MIN) {
|
2569
|
+
genop_2S(s, OP_LOADI16, cursp(), (uint16_t)i);
|
2570
|
+
}
|
2571
|
+
else if (i >= INT32_MIN) {
|
2572
|
+
genop_2SS(s, OP_LOADI32, cursp(), (uint32_t)i);
|
2573
|
+
}
|
2507
2574
|
else {
|
2508
|
-
int off = new_lit(s,
|
2509
|
-
|
2575
|
+
int off = new_lit(s, mrb_int_value(s->mrb, i));
|
2576
|
+
genop_bs(s, OP_LOADL, cursp(), off);
|
2510
2577
|
}
|
2511
|
-
#ifndef MRB_WITHOUT_FLOAT
|
2512
2578
|
}
|
2513
|
-
#endif
|
2514
2579
|
push();
|
2515
2580
|
}
|
2516
2581
|
break;
|
2517
2582
|
|
2518
2583
|
default:
|
2519
2584
|
if (val) {
|
2520
|
-
int sym = new_sym(s,
|
2585
|
+
int sym = new_sym(s, MRB_OPSYM_2(s->mrb, minus));
|
2521
2586
|
codegen(s, tree, VAL);
|
2522
2587
|
pop();
|
2523
2588
|
genop_3(s, OP_SEND, cursp(), sym, 0);
|
@@ -2539,7 +2604,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2539
2604
|
int off = new_lit(s, mrb_str_new(s->mrb, p, len));
|
2540
2605
|
|
2541
2606
|
mrb_gc_arena_restore(s->mrb, ai);
|
2542
|
-
|
2607
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2543
2608
|
push();
|
2544
2609
|
}
|
2545
2610
|
break;
|
@@ -2590,7 +2655,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2590
2655
|
{
|
2591
2656
|
node *n;
|
2592
2657
|
int ai = mrb_gc_arena_save(s->mrb);
|
2593
|
-
int sym = new_sym(s,
|
2658
|
+
int sym = new_sym(s, MRB_SYM_2(s->mrb, Kernel));
|
2594
2659
|
|
2595
2660
|
genop_1(s, OP_LOADSELF, cursp());
|
2596
2661
|
push();
|
@@ -2609,7 +2674,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2609
2674
|
}
|
2610
2675
|
push(); /* for block */
|
2611
2676
|
pop_n(3);
|
2612
|
-
sym = new_sym(s,
|
2677
|
+
sym = new_sym(s, MRB_OPSYM_2(s->mrb, tick)); /* ` */
|
2613
2678
|
genop_3(s, OP_SEND, cursp(), sym, 1);
|
2614
2679
|
if (val) push();
|
2615
2680
|
mrb_gc_arena_restore(s->mrb, ai);
|
@@ -2626,10 +2691,10 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2626
2691
|
|
2627
2692
|
genop_1(s, OP_LOADSELF, cursp());
|
2628
2693
|
push();
|
2629
|
-
|
2694
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2630
2695
|
push(); push();
|
2631
2696
|
pop_n(3);
|
2632
|
-
sym = new_sym(s,
|
2697
|
+
sym = new_sym(s, MRB_OPSYM_2(s->mrb, tick)); /* ` */
|
2633
2698
|
genop_3(s, OP_SEND, cursp(), sym, 1);
|
2634
2699
|
if (val) push();
|
2635
2700
|
mrb_gc_arena_restore(s->mrb, ai);
|
@@ -2649,12 +2714,12 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2649
2714
|
genop_1(s, OP_OCLASS, cursp());
|
2650
2715
|
genop_2(s, OP_GETMCNST, cursp(), sym);
|
2651
2716
|
push();
|
2652
|
-
|
2717
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2653
2718
|
push();
|
2654
2719
|
if (p2 || p3) {
|
2655
2720
|
if (p2) { /* opt */
|
2656
2721
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
|
2657
|
-
|
2722
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2658
2723
|
}
|
2659
2724
|
else {
|
2660
2725
|
genop_1(s, OP_LOADNIL, cursp());
|
@@ -2663,14 +2728,14 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2663
2728
|
argc++;
|
2664
2729
|
if (p3) { /* enc */
|
2665
2730
|
off = new_lit(s, mrb_str_new(s->mrb, p3, 1));
|
2666
|
-
|
2731
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2667
2732
|
push();
|
2668
2733
|
argc++;
|
2669
2734
|
}
|
2670
2735
|
}
|
2671
2736
|
push(); /* space for a block */
|
2672
2737
|
pop_n(argc+2);
|
2673
|
-
sym = new_sym(s,
|
2738
|
+
sym = new_sym(s, MRB_SYM_2(s->mrb, compile));
|
2674
2739
|
genop_3(s, OP_SEND, cursp(), sym, argc);
|
2675
2740
|
mrb_gc_arena_restore(s->mrb, ai);
|
2676
2741
|
push();
|
@@ -2703,7 +2768,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2703
2768
|
p = (char*)n->car;
|
2704
2769
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p));
|
2705
2770
|
codegen(s, tree->car, VAL);
|
2706
|
-
|
2771
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2707
2772
|
pop();
|
2708
2773
|
genop_1(s, OP_STRCAT, cursp());
|
2709
2774
|
push();
|
@@ -2711,20 +2776,20 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2711
2776
|
if (n->cdr->car) { /* opt */
|
2712
2777
|
char *p2 = (char*)n->cdr->car;
|
2713
2778
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
|
2714
|
-
|
2779
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2715
2780
|
push();
|
2716
2781
|
argc++;
|
2717
2782
|
}
|
2718
2783
|
if (n->cdr->cdr) { /* enc */
|
2719
2784
|
char *p2 = (char*)n->cdr->cdr;
|
2720
2785
|
off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
|
2721
|
-
|
2786
|
+
genop_bs(s, OP_STRING, cursp(), off);
|
2722
2787
|
push();
|
2723
2788
|
argc++;
|
2724
2789
|
}
|
2725
2790
|
push(); /* space for a block */
|
2726
2791
|
pop_n(argc+2);
|
2727
|
-
sym = new_sym(s,
|
2792
|
+
sym = new_sym(s, MRB_SYM_2(s->mrb, compile));
|
2728
2793
|
genop_3(s, OP_SEND, cursp(), sym, argc);
|
2729
2794
|
mrb_gc_arena_restore(s->mrb, ai);
|
2730
2795
|
push();
|
@@ -2745,7 +2810,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2745
2810
|
if (val) {
|
2746
2811
|
int sym = new_sym(s, nsym(tree));
|
2747
2812
|
|
2748
|
-
|
2813
|
+
genop_bs(s, OP_LOADSYM, cursp(), sym);
|
2749
2814
|
push();
|
2750
2815
|
}
|
2751
2816
|
break;
|
@@ -2846,7 +2911,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2846
2911
|
}
|
2847
2912
|
else {
|
2848
2913
|
idx = scope_body(s, body, val);
|
2849
|
-
|
2914
|
+
genop_bs(s, OP_EXEC, cursp(), idx);
|
2850
2915
|
}
|
2851
2916
|
if (val) {
|
2852
2917
|
push();
|
@@ -2878,7 +2943,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2878
2943
|
}
|
2879
2944
|
else {
|
2880
2945
|
idx = scope_body(s, tree->cdr->car, val);
|
2881
|
-
|
2946
|
+
genop_bs(s, OP_EXEC, cursp(), idx);
|
2882
2947
|
}
|
2883
2948
|
if (val) {
|
2884
2949
|
push();
|
@@ -2899,7 +2964,7 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2899
2964
|
}
|
2900
2965
|
else {
|
2901
2966
|
idx = scope_body(s, tree->cdr->car, val);
|
2902
|
-
|
2967
|
+
genop_bs(s, OP_EXEC, cursp(), idx);
|
2903
2968
|
}
|
2904
2969
|
if (val) {
|
2905
2970
|
push();
|
@@ -2914,12 +2979,12 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2914
2979
|
|
2915
2980
|
genop_1(s, OP_TCLASS, cursp());
|
2916
2981
|
push();
|
2917
|
-
|
2982
|
+
genop_bs(s, OP_METHOD, cursp(), idx);
|
2918
2983
|
push(); pop();
|
2919
2984
|
pop();
|
2920
2985
|
genop_2(s, OP_DEF, cursp(), sym);
|
2921
2986
|
if (val) {
|
2922
|
-
|
2987
|
+
genop_bs(s, OP_LOADSYM, cursp(), sym);
|
2923
2988
|
push();
|
2924
2989
|
}
|
2925
2990
|
}
|
@@ -2935,11 +3000,11 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2935
3000
|
pop();
|
2936
3001
|
genop_1(s, OP_SCLASS, cursp());
|
2937
3002
|
push();
|
2938
|
-
|
3003
|
+
genop_bs(s, OP_METHOD, cursp(), idx);
|
2939
3004
|
pop();
|
2940
3005
|
genop_2(s, OP_DEF, cursp(), sym);
|
2941
3006
|
if (val) {
|
2942
|
-
|
3007
|
+
genop_bs(s, OP_LOADSYM, cursp(), sym);
|
2943
3008
|
push();
|
2944
3009
|
}
|
2945
3010
|
}
|
@@ -2957,99 +3022,100 @@ codegen(codegen_scope *s, node *tree, int val)
|
|
2957
3022
|
}
|
2958
3023
|
|
2959
3024
|
static void
|
2960
|
-
scope_add_irep(codegen_scope *s
|
3025
|
+
scope_add_irep(codegen_scope *s)
|
2961
3026
|
{
|
2962
|
-
|
2963
|
-
|
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;
|
2964
3033
|
return;
|
2965
3034
|
}
|
2966
|
-
|
2967
|
-
|
2968
|
-
|
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++;
|
2969
3046
|
}
|
2970
|
-
s->irep->reps[s->irep->rlen] = irep;
|
2971
|
-
s->irep->rlen++;
|
2972
3047
|
}
|
2973
3048
|
|
2974
3049
|
static codegen_scope*
|
2975
|
-
scope_new(mrb_state *mrb, codegen_scope *prev, node *
|
3050
|
+
scope_new(mrb_state *mrb, codegen_scope *prev, node *nlv)
|
2976
3051
|
{
|
2977
3052
|
static const codegen_scope codegen_scope_zero = { 0 };
|
2978
3053
|
mrb_pool *pool = mrb_pool_open(mrb);
|
2979
|
-
codegen_scope *
|
3054
|
+
codegen_scope *s = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
|
2980
3055
|
|
2981
|
-
if (!
|
3056
|
+
if (!s) {
|
2982
3057
|
if (prev)
|
2983
3058
|
codegen_error(prev, "unexpected scope");
|
2984
3059
|
return NULL;
|
2985
3060
|
}
|
2986
|
-
*
|
2987
|
-
|
2988
|
-
|
2989
|
-
if (!prev) return
|
2990
|
-
|
2991
|
-
|
2992
|
-
|
2993
|
-
|
2994
|
-
|
2995
|
-
|
2996
|
-
|
2997
|
-
|
2998
|
-
|
2999
|
-
|
3000
|
-
|
3001
|
-
|
3002
|
-
|
3003
|
-
|
3004
|
-
|
3005
|
-
|
3006
|
-
|
3007
|
-
|
3008
|
-
|
3009
|
-
|
3010
|
-
|
3011
|
-
|
3012
|
-
|
3013
|
-
|
3014
|
-
p->nlocals = p->sp;
|
3015
|
-
if (lv) {
|
3016
|
-
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;
|
3017
3089
|
size_t i = 0;
|
3018
3090
|
|
3019
|
-
|
3020
|
-
for (i=0, n=
|
3021
|
-
|
3022
|
-
if (lv_name(n)) {
|
3023
|
-
p->irep->lv[i].r = lv_idx(p, lv_name(n));
|
3024
|
-
}
|
3025
|
-
else {
|
3026
|
-
p->irep->lv[i].r = 0;
|
3027
|
-
}
|
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);
|
3028
3094
|
}
|
3029
|
-
mrb_assert(i + 1 ==
|
3095
|
+
mrb_assert(i + 1 == s->nlocals);
|
3030
3096
|
}
|
3031
|
-
|
3097
|
+
s->ai = mrb_gc_arena_save(mrb);
|
3032
3098
|
|
3033
|
-
|
3034
|
-
if (
|
3035
|
-
|
3099
|
+
s->filename_sym = prev->filename_sym;
|
3100
|
+
if (s->filename_sym) {
|
3101
|
+
s->lines = (uint16_t*)mrb_malloc(mrb, sizeof(short)*s->icapa);
|
3036
3102
|
}
|
3037
|
-
|
3103
|
+
s->lineno = prev->lineno;
|
3038
3104
|
|
3039
3105
|
/* debug setting */
|
3040
|
-
|
3041
|
-
if (
|
3042
|
-
mrb_debug_info_alloc(mrb,
|
3106
|
+
s->debug_start_pos = 0;
|
3107
|
+
if (s->filename_sym) {
|
3108
|
+
mrb_debug_info_alloc(mrb, s->irep);
|
3043
3109
|
}
|
3044
3110
|
else {
|
3045
|
-
|
3111
|
+
s->irep->debug_info = NULL;
|
3046
3112
|
}
|
3047
|
-
|
3048
|
-
|
3113
|
+
s->parser = prev->parser;
|
3114
|
+
s->filename_index = prev->filename_index;
|
3049
3115
|
|
3050
|
-
|
3116
|
+
s->rlev = prev->rlev+1;
|
3051
3117
|
|
3052
|
-
return
|
3118
|
+
return s;
|
3053
3119
|
}
|
3054
3120
|
|
3055
3121
|
static void
|
@@ -3058,17 +3124,26 @@ scope_finish(codegen_scope *s)
|
|
3058
3124
|
mrb_state *mrb = s->mrb;
|
3059
3125
|
mrb_irep *irep = s->irep;
|
3060
3126
|
|
3061
|
-
if (s->nlocals
|
3127
|
+
if (s->nlocals > 0xff) {
|
3062
3128
|
codegen_error(s, "too many local variables");
|
3063
3129
|
}
|
3064
3130
|
irep->flags = 0;
|
3065
3131
|
if (s->iseq) {
|
3066
|
-
|
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);
|
3067
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;
|
3068
3141
|
}
|
3069
|
-
|
3070
|
-
|
3071
|
-
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);
|
3072
3147
|
if (s->filename_sym) {
|
3073
3148
|
mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index);
|
3074
3149
|
const char *filename = mrb_sym_name_len(s->mrb, fname, NULL);
|
@@ -3091,9 +3166,8 @@ loop_push(codegen_scope *s, enum looptype t)
|
|
3091
3166
|
struct loopinfo *p = (struct loopinfo *)codegen_palloc(s, sizeof(struct loopinfo));
|
3092
3167
|
|
3093
3168
|
p->type = t;
|
3094
|
-
p->pc0 = p->pc1 = p->pc2 = p->pc3 =
|
3169
|
+
p->pc0 = p->pc1 = p->pc2 = p->pc3 = JMPLINK_START;
|
3095
3170
|
p->prev = s->loop;
|
3096
|
-
p->ensure_level = s->ensure_level;
|
3097
3171
|
p->acc = cursp();
|
3098
3172
|
s->loop = p;
|
3099
3173
|
|
@@ -3109,7 +3183,6 @@ loop_break(codegen_scope *s, node *tree)
|
|
3109
3183
|
}
|
3110
3184
|
else {
|
3111
3185
|
struct loopinfo *loop;
|
3112
|
-
int n = 0;
|
3113
3186
|
|
3114
3187
|
if (tree) {
|
3115
3188
|
gen_retval(s, tree);
|
@@ -3118,7 +3191,6 @@ loop_break(codegen_scope *s, node *tree)
|
|
3118
3191
|
loop = s->loop;
|
3119
3192
|
while (loop) {
|
3120
3193
|
if (loop->type == LOOP_BEGIN) {
|
3121
|
-
n++;
|
3122
3194
|
loop = loop->prev;
|
3123
3195
|
}
|
3124
3196
|
else if (loop->type == LOOP_RESCUE) {
|
@@ -3132,20 +3204,14 @@ loop_break(codegen_scope *s, node *tree)
|
|
3132
3204
|
raise_error(s, "unexpected break");
|
3133
3205
|
return;
|
3134
3206
|
}
|
3135
|
-
if (n > 0) {
|
3136
|
-
genop_1(s, OP_POPERR, n);
|
3137
|
-
}
|
3138
3207
|
|
3139
3208
|
if (loop->type == LOOP_NORMAL) {
|
3140
3209
|
int tmp;
|
3141
3210
|
|
3142
|
-
if (s->ensure_level > s->loop->ensure_level) {
|
3143
|
-
genop_1(s, OP_EPOP, s->ensure_level - s->loop->ensure_level);
|
3144
|
-
}
|
3145
3211
|
if (tree) {
|
3146
3212
|
gen_move(s, loop->acc, cursp(), 0);
|
3147
3213
|
}
|
3148
|
-
tmp = genjmp(s,
|
3214
|
+
tmp = genjmp(s, OP_JMPUW, loop->pc3);
|
3149
3215
|
loop->pc3 = tmp;
|
3150
3216
|
}
|
3151
3217
|
else {
|
@@ -3168,6 +3234,28 @@ loop_pop(codegen_scope *s, int val)
|
|
3168
3234
|
if (val) push();
|
3169
3235
|
}
|
3170
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
|
+
|
3171
3259
|
static struct RProc*
|
3172
3260
|
generate_code(mrb_state *mrb, parser_state *p, int val)
|
3173
3261
|
{
|
@@ -3214,13 +3302,14 @@ mrb_irep_remove_lv(mrb_state *mrb, mrb_irep *irep)
|
|
3214
3302
|
{
|
3215
3303
|
int i;
|
3216
3304
|
|
3305
|
+
if (irep->flags & MRB_IREP_NO_FREE) return;
|
3217
3306
|
if (irep->lv) {
|
3218
|
-
mrb_free(mrb, irep->lv);
|
3307
|
+
mrb_free(mrb, (void*)irep->lv);
|
3219
3308
|
irep->lv = NULL;
|
3220
3309
|
}
|
3221
|
-
|
3310
|
+
if (!irep->reps) return;
|
3222
3311
|
for (i = 0; i < irep->rlen; ++i) {
|
3223
|
-
mrb_irep_remove_lv(mrb, irep->reps[i]);
|
3312
|
+
mrb_irep_remove_lv(mrb, (mrb_irep*)irep->reps[i]);
|
3224
3313
|
}
|
3225
3314
|
}
|
3226
3315
|
|
@@ -3234,6 +3323,7 @@ uint8_t mrb_insn_size[] = {
|
|
3234
3323
|
#define BB 3
|
3235
3324
|
#define BBB 4
|
3236
3325
|
#define BS 4
|
3326
|
+
#define BSS 6
|
3237
3327
|
#define SB 4
|
3238
3328
|
#define OPCODE(_,x) x,
|
3239
3329
|
#include "mruby/ops.h"
|
@@ -3241,38 +3331,7 @@ uint8_t mrb_insn_size[] = {
|
|
3241
3331
|
#undef B
|
3242
3332
|
#undef BB
|
3243
3333
|
#undef BS
|
3334
|
+
#undef BSS
|
3244
3335
|
#undef SB
|
3245
3336
|
#undef BBB
|
3246
3337
|
};
|
3247
|
-
/* EXT1 instruction sizes */
|
3248
|
-
uint8_t mrb_insn_size1[] = {
|
3249
|
-
#define B 3
|
3250
|
-
#define BB 4
|
3251
|
-
#define BBB 5
|
3252
|
-
#define BS 5
|
3253
|
-
#define SB 5
|
3254
|
-
#define OPCODE(_,x) x,
|
3255
|
-
#include "mruby/ops.h"
|
3256
|
-
#undef OPCODE
|
3257
|
-
#undef B
|
3258
|
-
};
|
3259
|
-
/* EXT2 instruction sizes */
|
3260
|
-
uint8_t mrb_insn_size2[] = {
|
3261
|
-
#define B 2
|
3262
|
-
#define OPCODE(_,x) x,
|
3263
|
-
#include "mruby/ops.h"
|
3264
|
-
#undef OPCODE
|
3265
|
-
#undef BB
|
3266
|
-
#undef BBB
|
3267
|
-
#undef BS
|
3268
|
-
#undef SB
|
3269
|
-
};
|
3270
|
-
/* EXT3 instruction sizes */
|
3271
|
-
#define BB 5
|
3272
|
-
#define BBB 6
|
3273
|
-
#define BS 4
|
3274
|
-
#define SB 5
|
3275
|
-
uint8_t mrb_insn_size3[] = {
|
3276
|
-
#define OPCODE(_,x) x,
|
3277
|
-
#include "mruby/ops.h"
|
3278
|
-
};
|