script_core 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.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
|
-
};
|