script_core 0.2.7 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +2 -2
- data/ext/enterprise_script_service/Rakefile +1 -1
- data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +117 -74
- data/ext/enterprise_script_service/mruby/.github/workflows/codeql-analysis.yml +41 -37
- data/ext/enterprise_script_service/mruby/.github/workflows/lint.yml +23 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/oss-fuzz.yml +27 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/spell-checker.yml +17 -0
- data/ext/enterprise_script_service/mruby/.gitlab-ci.yml +3 -3
- data/ext/enterprise_script_service/mruby/.markdownlint.yml +16 -0
- data/ext/enterprise_script_service/mruby/.travis.yml +2 -2
- data/ext/enterprise_script_service/mruby/.yamllint +8 -0
- data/ext/enterprise_script_service/mruby/AUTHORS +3 -0
- data/ext/enterprise_script_service/mruby/CODEOWNERS +1 -0
- data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +6 -13
- data/ext/enterprise_script_service/mruby/Doxyfile +4 -4
- data/ext/enterprise_script_service/mruby/LICENSE +1 -1
- data/ext/enterprise_script_service/mruby/Makefile +1 -1
- data/ext/enterprise_script_service/mruby/README.md +4 -14
- data/ext/enterprise_script_service/mruby/Rakefile +18 -108
- data/ext/enterprise_script_service/mruby/TODO.md +17 -0
- data/ext/enterprise_script_service/mruby/appveyor.yml +31 -25
- data/ext/enterprise_script_service/mruby/benchmark/bm_ao_render.rb +1 -1
- data/ext/enterprise_script_service/mruby/build_config.rb +9 -152
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_ArduinoDue.rb → build_config/ArduinoDue.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelEdison.rb → build_config/IntelEdison.rb} +2 -2
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_IntelGalileo.rb → build_config/IntelGalileo.rb} +1 -18
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_RX630.rb → build_config/RX630.rb} +2 -19
- data/ext/enterprise_script_service/mruby/build_config/android_arm64-v8a.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/android_armeabi.rb +11 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_android_armeabi_v7a_neon_hard.rb → build_config/android_armeabi_v7a_neon_hard.rb} +0 -15
- data/ext/enterprise_script_service/mruby/build_config/bench.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/boxing.rb +21 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_chipKITMax32.rb → build_config/chipKITMax32.rb} +2 -19
- data/ext/enterprise_script_service/mruby/{travis_config.rb → build_config/ci/gcc-clang.rb} +10 -10
- data/ext/enterprise_script_service/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/default.rb +80 -0
- data/ext/enterprise_script_service/mruby/{examples/targets/build_config_dreamcast_shelf.rb → build_config/dreamcast_shelf.rb} +5 -19
- data/ext/enterprise_script_service/mruby/build_config/gameboyadvance.rb +73 -0
- data/ext/enterprise_script_service/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enterprise_script_service/mruby/build_config/host-debug.rb +20 -0
- data/ext/enterprise_script_service/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enterprise_script_service/mruby/build_config/host-m32.rb +15 -0
- data/ext/enterprise_script_service/mruby/build_config/host-shared.rb +36 -0
- data/ext/enterprise_script_service/mruby/build_config/mrbc.rb +11 -0
- data/ext/enterprise_script_service/mruby/build_config/no-float.rb +17 -0
- data/ext/enterprise_script_service/mruby/doc/guides/compile.md +138 -49
- data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +5 -4
- data/ext/enterprise_script_service/mruby/doc/guides/gc-arena-howto.md +1 -1
- data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +49 -22
- data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +31 -14
- data/ext/enterprise_script_service/mruby/doc/guides/symbol.md +83 -0
- data/ext/enterprise_script_service/mruby/doc/limitations.md +35 -36
- data/ext/enterprise_script_service/mruby/doc/mruby3.md +163 -0
- data/ext/enterprise_script_service/mruby/doc/opcode.md +93 -107
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/c_extension_example/src/example.c +5 -1
- data/ext/enterprise_script_service/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +1 -1
- data/ext/enterprise_script_service/mruby/include/mrbconf.h +81 -62
- data/ext/enterprise_script_service/mruby/include/mruby.h +137 -96
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +23 -6
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +73 -48
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +8 -8
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +79 -48
- data/ext/enterprise_script_service/mruby/include/mruby/class.h +10 -8
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +4 -1
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +13 -7
- data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +17 -35
- data/ext/enterprise_script_service/mruby/include/mruby/endian.h +44 -0
- data/ext/enterprise_script_service/mruby/include/mruby/error.h +39 -5
- data/ext/enterprise_script_service/mruby/include/mruby/gc.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/hash.h +33 -13
- data/ext/enterprise_script_service/mruby/include/mruby/irep.h +64 -14
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +6 -14
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +36 -63
- data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +1 -27
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +27 -23
- data/ext/enterprise_script_service/mruby/include/mruby/presym.h +40 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/disable.h +70 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/enable.h +37 -0
- data/ext/enterprise_script_service/mruby/include/mruby/presym/scanning.h +73 -0
- data/ext/enterprise_script_service/mruby/include/mruby/proc.h +80 -13
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +10 -15
- data/ext/enterprise_script_service/mruby/include/mruby/throw.h +14 -3
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +29 -19
- data/ext/enterprise_script_service/mruby/include/mruby/variable.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +26 -7
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +198 -44
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +55 -37
- data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +12 -10
- data/ext/enterprise_script_service/mruby/lib/{mruby-core-ext.rb → mruby/core_ext.rb} +10 -3
- data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +75 -32
- data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +1 -1
- data/ext/enterprise_script_service/mruby/lib/mruby/presym.rb +132 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +9 -88
- data/ext/enterprise_script_service/mruby/mrbgems/full-core.gembox +1 -4
- data/ext/enterprise_script_service/mruby/mrbgems/math.gembox +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/metaprog.gembox +15 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +28 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mruby-config +18 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +3 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +10 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +14 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +2 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +23 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +11 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +41 -34
- data/ext/enterprise_script_service/mruby/mrbgems/{mruby-compiler → mruby-bin-mrbc}/bintest/mrbc.rb +0 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +3 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +19 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +25 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +22 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-catch/mrblib/catch.rb +27 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +2 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +430 -399
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +49 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +559 -217
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +4774 -4193
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +18 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +8 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +1 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/mrbgem.rake +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +17 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +18 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +30 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +7 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-inline-struct/test/inline.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +18 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +9 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +55 -52
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +99 -87
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +2 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +2 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +7 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +13 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/test/math.rb +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +43 -58
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/README.md +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +77 -74
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +14 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +5 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +18 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/src/memsize.c +231 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/README.md +15 -18
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +38 -88
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +1 -30
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +62 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +32 -19
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +98 -43
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +39 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +20 -40
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +27 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +11 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +216 -38
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +6 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/README.md +6 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +47 -45
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +102 -71
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +4 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +23 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +13 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +18 -25
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +6 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/README.md +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +5 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +16 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +4 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +27 -27
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-ext.gembox +18 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib-io.gembox +12 -0
- data/ext/enterprise_script_service/mruby/mrbgems/stdlib.gembox +54 -0
- data/ext/enterprise_script_service/mruby/mrblib/10error.rb +4 -0
- data/ext/enterprise_script_service/mruby/mrblib/array.rb +17 -9
- data/ext/enterprise_script_service/mruby/mrblib/enum.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrblib/hash.rb +0 -20
- data/ext/enterprise_script_service/mruby/mrblib/init_mrblib.c +0 -11
- data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +36 -11
- data/ext/enterprise_script_service/mruby/mrblib/range.rb +25 -3
- data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +2 -2
- data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +1 -1
- data/ext/enterprise_script_service/mruby/src/array.c +43 -80
- data/ext/enterprise_script_service/mruby/src/backtrace.c +16 -17
- data/ext/enterprise_script_service/mruby/src/class.c +774 -182
- data/ext/enterprise_script_service/mruby/src/codedump.c +223 -198
- data/ext/enterprise_script_service/mruby/src/debug.c +6 -6
- data/ext/enterprise_script_service/mruby/src/dump.c +466 -141
- data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
- data/ext/enterprise_script_service/mruby/src/error.c +36 -13
- data/ext/enterprise_script_service/mruby/src/etc.c +43 -34
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +5 -6
- data/ext/enterprise_script_service/mruby/src/gc.c +73 -71
- data/ext/enterprise_script_service/mruby/src/hash.c +1050 -707
- data/ext/enterprise_script_service/mruby/src/kernel.c +75 -220
- data/ext/enterprise_script_service/mruby/src/load.c +196 -166
- data/ext/enterprise_script_service/mruby/src/numeric.c +352 -314
- data/ext/enterprise_script_service/mruby/src/object.c +97 -90
- data/ext/enterprise_script_service/mruby/src/print.c +4 -3
- data/ext/enterprise_script_service/mruby/src/proc.c +48 -56
- data/ext/enterprise_script_service/mruby/src/range.c +45 -21
- data/ext/enterprise_script_service/mruby/src/state.c +25 -32
- data/ext/enterprise_script_service/mruby/src/string.c +59 -101
- data/ext/enterprise_script_service/mruby/src/symbol.c +121 -56
- data/ext/enterprise_script_service/mruby/src/value_array.h +1 -0
- data/ext/enterprise_script_service/mruby/src/variable.c +158 -158
- data/ext/enterprise_script_service/mruby/src/vm.c +617 -602
- data/ext/enterprise_script_service/mruby/tasks/benchmark.rake +6 -6
- data/ext/enterprise_script_service/mruby/tasks/bin.rake +23 -0
- data/ext/enterprise_script_service/mruby/tasks/core.rake +12 -0
- data/ext/enterprise_script_service/mruby/tasks/doc.rake +50 -38
- data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +83 -77
- data/ext/enterprise_script_service/mruby/tasks/libmruby.rake +10 -1
- data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +13 -1
- data/ext/enterprise_script_service/mruby/tasks/mrblib.rake +40 -0
- data/ext/enterprise_script_service/mruby/tasks/presym.rake +44 -0
- data/ext/enterprise_script_service/mruby/tasks/test.rake +68 -0
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +6 -5
- data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +10 -14
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +17 -21
- data/ext/enterprise_script_service/mruby/test/bintest.rb +5 -5
- data/ext/enterprise_script_service/mruby/test/t/argumenterror.rb +16 -0
- data/ext/enterprise_script_service/mruby/test/t/array.rb +7 -3
- data/ext/enterprise_script_service/mruby/test/t/bs_literal.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/float.rb +18 -8
- data/ext/enterprise_script_service/mruby/test/t/hash.rb +903 -281
- data/ext/enterprise_script_service/mruby/test/t/integer.rb +10 -38
- data/ext/enterprise_script_service/mruby/test/t/kernel.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/literals.rb +50 -0
- data/ext/enterprise_script_service/mruby/test/t/module.rb +2 -2
- data/ext/enterprise_script_service/mruby/test/t/numeric.rb +1 -1
- data/ext/enterprise_script_service/mruby/test/t/range.rb +83 -1
- data/ext/enterprise_script_service/mruby/test/t/string.rb +4 -0
- data/ext/enterprise_script_service/mruby/test/t/superclass.rb +10 -10
- data/ext/enterprise_script_service/mruby/test/t/syntax.rb +24 -0
- data/ext/enterprise_script_service/mruby/test/t/vformat.rb +3 -3
- data/ext/enterprise_script_service/mruby_config.rb +2 -5
- data/ext/enterprise_script_service/mruby_engine.cpp +1 -1
- data/lib/script_core/version.rb +1 -1
- data/spec/script_core_spec.rb +13 -0
- metadata +61 -23
- data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +0 -24
- data/ext/enterprise_script_service/mruby/TODO +0 -8
- data/ext/enterprise_script_service/mruby/appveyor_config.rb +0 -46
- data/ext/enterprise_script_service/mruby/benchmark/build_config_boxing.rb +0 -28
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_arm64-v8a.rb +0 -26
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_android_armeabi.rb +0 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +0 -30
- data/ext/enterprise_script_service/mruby/mrblib/mrblib.rake +0 -18
- data/ext/enterprise_script_service/mruby/src/crc.c +0 -39
- data/ext/enterprise_script_service/mruby/src/mruby_core.rake +0 -19
@@ -13,13 +13,14 @@
|
|
13
13
|
#include <mruby/variable.h>
|
14
14
|
#include <mruby/error.h>
|
15
15
|
#include <mruby/istruct.h>
|
16
|
+
#include <mruby/presym.h>
|
16
17
|
|
17
18
|
MRB_API mrb_bool
|
18
19
|
mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func)
|
19
20
|
{
|
20
21
|
struct RClass *c = mrb_class(mrb, obj);
|
21
22
|
mrb_method_t m = mrb_method_search_vm(mrb, &c, mid);
|
22
|
-
struct RProc *p;
|
23
|
+
const struct RProc *p;
|
23
24
|
|
24
25
|
if (MRB_METHOD_UNDEF_P(m)) return FALSE;
|
25
26
|
if (MRB_METHOD_FUNC_P(m))
|
@@ -33,7 +34,7 @@ mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func)
|
|
33
34
|
static mrb_bool
|
34
35
|
mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj)
|
35
36
|
{
|
36
|
-
return mrb_func_basic_p(mrb, obj,
|
37
|
+
return mrb_func_basic_p(mrb, obj, MRB_SYM(to_s), mrb_any_to_s);
|
37
38
|
}
|
38
39
|
|
39
40
|
/* 15.3.1.3.17 */
|
@@ -96,7 +97,19 @@ mrb_equal_m(mrb_state *mrb, mrb_value self)
|
|
96
97
|
mrb_value
|
97
98
|
mrb_obj_id_m(mrb_state *mrb, mrb_value self)
|
98
99
|
{
|
99
|
-
return
|
100
|
+
return mrb_int_value(mrb, mrb_obj_id(self));
|
101
|
+
}
|
102
|
+
|
103
|
+
static int
|
104
|
+
env_bidx(struct REnv *e)
|
105
|
+
{
|
106
|
+
int bidx;
|
107
|
+
|
108
|
+
/* use saved block arg position */
|
109
|
+
bidx = MRB_ENV_BIDX(e);
|
110
|
+
/* bidx may be useless (e.g. define_method) */
|
111
|
+
if (bidx >= MRB_ENV_LEN(e)) return -1;
|
112
|
+
return bidx;
|
100
113
|
}
|
101
114
|
|
102
115
|
/* 15.3.1.2.2 */
|
@@ -129,7 +142,9 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
|
|
129
142
|
mrb_callinfo *ci = &mrb->c->ci[-1];
|
130
143
|
mrb_callinfo *cibase = mrb->c->cibase;
|
131
144
|
mrb_value *bp;
|
132
|
-
|
145
|
+
int bidx;
|
146
|
+
struct REnv *e = NULL;
|
147
|
+
const struct RProc *p;
|
133
148
|
|
134
149
|
if (ci <= cibase) {
|
135
150
|
/* toplevel does not have block */
|
@@ -139,33 +154,39 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
|
|
139
154
|
/* search method/class/module proc */
|
140
155
|
while (p) {
|
141
156
|
if (MRB_PROC_SCOPE_P(p)) break;
|
157
|
+
e = MRB_PROC_ENV(p);
|
142
158
|
p = p->upper;
|
143
159
|
}
|
144
160
|
if (p == NULL) return mrb_false_value();
|
161
|
+
if (e) {
|
162
|
+
bidx = env_bidx(e);
|
163
|
+
if (bidx < 0) return mrb_false_value();
|
164
|
+
bp = &e->stack[bidx];
|
165
|
+
goto block_given;
|
166
|
+
}
|
145
167
|
/* search ci corresponding to proc */
|
146
168
|
while (cibase < ci) {
|
147
169
|
if (ci->proc == p) break;
|
148
170
|
ci--;
|
149
171
|
}
|
150
172
|
if (ci == cibase) {
|
151
|
-
|
173
|
+
/* proc is closure */
|
174
|
+
if (!MRB_PROC_ENV_P(p)) return mrb_false_value();
|
175
|
+
e = MRB_PROC_ENV(p);
|
176
|
+
bidx = env_bidx(e);
|
177
|
+
if (bidx < 0) return mrb_false_value();
|
178
|
+
bp = &e->stack[bidx];
|
152
179
|
}
|
153
|
-
else if (ci
|
154
|
-
struct REnv *e = ci->env;
|
155
|
-
int bidx;
|
156
|
-
|
180
|
+
else if ((e = mrb_vm_ci_env(ci)) != NULL) {
|
157
181
|
/* top-level does not have block slot (always false) */
|
158
|
-
if (e->stack == mrb->c->stbase)
|
159
|
-
|
160
|
-
/* use saved block arg position */
|
161
|
-
bidx = MRB_ENV_BIDX(e);
|
182
|
+
if (e->stack == mrb->c->stbase) return mrb_false_value();
|
183
|
+
bidx = env_bidx(e);
|
162
184
|
/* bidx may be useless (e.g. define_method) */
|
163
|
-
if (bidx
|
164
|
-
return mrb_false_value();
|
185
|
+
if (bidx < 0) return mrb_false_value();
|
165
186
|
bp = &e->stack[bidx];
|
166
187
|
}
|
167
188
|
else {
|
168
|
-
bp = ci
|
189
|
+
bp = ci->stack+1;
|
169
190
|
if (ci->argc >= 0) {
|
170
191
|
bp += ci->argc;
|
171
192
|
}
|
@@ -173,6 +194,7 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
|
|
173
194
|
bp++;
|
174
195
|
}
|
175
196
|
}
|
197
|
+
block_given:
|
176
198
|
if (mrb_nil_p(*bp))
|
177
199
|
return mrb_false_value();
|
178
200
|
return mrb_true_value();
|
@@ -187,7 +209,7 @@ mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
|
|
187
209
|
* called with an explicit receiver, as <code>class</code> is also a
|
188
210
|
* reserved word in Ruby.
|
189
211
|
*
|
190
|
-
* 1.class #=>
|
212
|
+
* 1.class #=> Integer
|
191
213
|
* self.class #=> Object
|
192
214
|
*/
|
193
215
|
static mrb_value
|
@@ -196,189 +218,8 @@ mrb_obj_class_m(mrb_state *mrb, mrb_value self)
|
|
196
218
|
return mrb_obj_value(mrb_obj_class(mrb, self));
|
197
219
|
}
|
198
220
|
|
199
|
-
static struct RClass*
|
200
|
-
mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj)
|
201
|
-
{
|
202
|
-
struct RClass *klass = mrb_basic_ptr(obj)->c;
|
203
|
-
|
204
|
-
if (klass->tt != MRB_TT_SCLASS)
|
205
|
-
return klass;
|
206
|
-
else {
|
207
|
-
/* copy singleton(unnamed) class */
|
208
|
-
struct RClass *clone = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, mrb->class_class);
|
209
|
-
|
210
|
-
switch (mrb_type(obj)) {
|
211
|
-
case MRB_TT_CLASS:
|
212
|
-
case MRB_TT_SCLASS:
|
213
|
-
break;
|
214
|
-
default:
|
215
|
-
clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass));
|
216
|
-
break;
|
217
|
-
}
|
218
|
-
clone->super = klass->super;
|
219
|
-
if (klass->iv) {
|
220
|
-
mrb_iv_copy(mrb, mrb_obj_value(clone), mrb_obj_value(klass));
|
221
|
-
mrb_obj_iv_set(mrb, (struct RObject*)clone, mrb_intern_lit(mrb, "__attached__"), obj);
|
222
|
-
}
|
223
|
-
if (klass->mt) {
|
224
|
-
clone->mt = kh_copy(mt, mrb, klass->mt);
|
225
|
-
}
|
226
|
-
else {
|
227
|
-
clone->mt = kh_init(mt, mrb);
|
228
|
-
}
|
229
|
-
clone->tt = MRB_TT_SCLASS;
|
230
|
-
return clone;
|
231
|
-
}
|
232
|
-
}
|
233
|
-
|
234
|
-
static void
|
235
|
-
copy_class(mrb_state *mrb, mrb_value dst, mrb_value src)
|
236
|
-
{
|
237
|
-
struct RClass *dc = mrb_class_ptr(dst);
|
238
|
-
struct RClass *sc = mrb_class_ptr(src);
|
239
|
-
/* if the origin is not the same as the class, then the origin and
|
240
|
-
the current class need to be copied */
|
241
|
-
if (sc->flags & MRB_FL_CLASS_IS_PREPENDED) {
|
242
|
-
struct RClass *c0 = sc->super;
|
243
|
-
struct RClass *c1 = dc;
|
244
|
-
|
245
|
-
/* copy prepended iclasses */
|
246
|
-
while (!(c0->flags & MRB_FL_CLASS_IS_ORIGIN)) {
|
247
|
-
c1->super = mrb_class_ptr(mrb_obj_dup(mrb, mrb_obj_value(c0)));
|
248
|
-
c1 = c1->super;
|
249
|
-
c0 = c0->super;
|
250
|
-
}
|
251
|
-
c1->super = mrb_class_ptr(mrb_obj_dup(mrb, mrb_obj_value(c0)));
|
252
|
-
c1->super->flags |= MRB_FL_CLASS_IS_ORIGIN;
|
253
|
-
}
|
254
|
-
if (sc->mt) {
|
255
|
-
dc->mt = kh_copy(mt, mrb, sc->mt);
|
256
|
-
}
|
257
|
-
else {
|
258
|
-
dc->mt = kh_init(mt, mrb);
|
259
|
-
}
|
260
|
-
dc->super = sc->super;
|
261
|
-
MRB_SET_INSTANCE_TT(dc, MRB_INSTANCE_TT(sc));
|
262
|
-
}
|
263
|
-
|
264
|
-
static void
|
265
|
-
init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
|
266
|
-
{
|
267
|
-
switch (mrb_type(obj)) {
|
268
|
-
case MRB_TT_ICLASS:
|
269
|
-
copy_class(mrb, dest, obj);
|
270
|
-
return;
|
271
|
-
case MRB_TT_CLASS:
|
272
|
-
case MRB_TT_MODULE:
|
273
|
-
copy_class(mrb, dest, obj);
|
274
|
-
mrb_iv_copy(mrb, dest, obj);
|
275
|
-
mrb_iv_remove(mrb, dest, mrb_intern_lit(mrb, "__classname__"));
|
276
|
-
break;
|
277
|
-
case MRB_TT_OBJECT:
|
278
|
-
case MRB_TT_SCLASS:
|
279
|
-
case MRB_TT_HASH:
|
280
|
-
case MRB_TT_DATA:
|
281
|
-
case MRB_TT_EXCEPTION:
|
282
|
-
mrb_iv_copy(mrb, dest, obj);
|
283
|
-
break;
|
284
|
-
case MRB_TT_ISTRUCT:
|
285
|
-
mrb_istruct_copy(dest, obj);
|
286
|
-
break;
|
287
|
-
|
288
|
-
default:
|
289
|
-
break;
|
290
|
-
}
|
291
|
-
mrb_funcall(mrb, dest, "initialize_copy", 1, obj);
|
292
|
-
}
|
293
|
-
|
294
|
-
/* 15.3.1.3.8 */
|
295
|
-
/*
|
296
|
-
* call-seq:
|
297
|
-
* obj.clone -> an_object
|
298
|
-
*
|
299
|
-
* Produces a shallow copy of <i>obj</i>---the instance variables of
|
300
|
-
* <i>obj</i> are copied, but not the objects they reference. Copies
|
301
|
-
* the frozen state of <i>obj</i>. See also the discussion
|
302
|
-
* under <code>Object#dup</code>.
|
303
|
-
*
|
304
|
-
* class Klass
|
305
|
-
* attr_accessor :str
|
306
|
-
* end
|
307
|
-
* s1 = Klass.new #=> #<Klass:0x401b3a38>
|
308
|
-
* s1.str = "Hello" #=> "Hello"
|
309
|
-
* s2 = s1.clone #=> #<Klass:0x401b3998 @str="Hello">
|
310
|
-
* s2.str[1,4] = "i" #=> "i"
|
311
|
-
* s1.inspect #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
|
312
|
-
* s2.inspect #=> "#<Klass:0x401b3998 @str=\"Hi\">"
|
313
|
-
*
|
314
|
-
* This method may have class-specific behavior. If so, that
|
315
|
-
* behavior will be documented under the #+initialize_copy+ method of
|
316
|
-
* the class.
|
317
|
-
*
|
318
|
-
* Some Class(True False Nil Symbol Fixnum Float) Object cannot clone.
|
319
|
-
*/
|
320
|
-
MRB_API mrb_value
|
321
|
-
mrb_obj_clone(mrb_state *mrb, mrb_value self)
|
322
|
-
{
|
323
|
-
struct RObject *p;
|
324
|
-
mrb_value clone;
|
325
|
-
|
326
|
-
if (mrb_immediate_p(self)) {
|
327
|
-
return self;
|
328
|
-
}
|
329
|
-
if (mrb_sclass_p(self)) {
|
330
|
-
mrb_raise(mrb, E_TYPE_ERROR, "can't clone singleton class");
|
331
|
-
}
|
332
|
-
p = (struct RObject*)mrb_obj_alloc(mrb, mrb_type(self), mrb_obj_class(mrb, self));
|
333
|
-
p->c = mrb_singleton_class_clone(mrb, self);
|
334
|
-
mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)p->c);
|
335
|
-
clone = mrb_obj_value(p);
|
336
|
-
init_copy(mrb, clone, self);
|
337
|
-
p->flags |= mrb_obj_ptr(self)->flags & MRB_FL_OBJ_IS_FROZEN;
|
338
|
-
|
339
|
-
return clone;
|
340
|
-
}
|
341
|
-
|
342
|
-
/* 15.3.1.3.9 */
|
343
|
-
/*
|
344
|
-
* call-seq:
|
345
|
-
* obj.dup -> an_object
|
346
|
-
*
|
347
|
-
* Produces a shallow copy of <i>obj</i>---the instance variables of
|
348
|
-
* <i>obj</i> are copied, but not the objects they reference.
|
349
|
-
* <code>dup</code> copies the frozen state of <i>obj</i>. See also
|
350
|
-
* the discussion under <code>Object#clone</code>. In general,
|
351
|
-
* <code>clone</code> and <code>dup</code> may have different semantics
|
352
|
-
* in descendant classes. While <code>clone</code> is used to duplicate
|
353
|
-
* an object, including its internal state, <code>dup</code> typically
|
354
|
-
* uses the class of the descendant object to create the new instance.
|
355
|
-
*
|
356
|
-
* This method may have class-specific behavior. If so, that
|
357
|
-
* behavior will be documented under the #+initialize_copy+ method of
|
358
|
-
* the class.
|
359
|
-
*/
|
360
|
-
|
361
|
-
MRB_API mrb_value
|
362
|
-
mrb_obj_dup(mrb_state *mrb, mrb_value obj)
|
363
|
-
{
|
364
|
-
struct RBasic *p;
|
365
|
-
mrb_value dup;
|
366
|
-
|
367
|
-
if (mrb_immediate_p(obj)) {
|
368
|
-
return obj;
|
369
|
-
}
|
370
|
-
if (mrb_sclass_p(obj)) {
|
371
|
-
mrb_raise(mrb, E_TYPE_ERROR, "can't dup singleton class");
|
372
|
-
}
|
373
|
-
p = mrb_obj_alloc(mrb, mrb_type(obj), mrb_obj_class(mrb, obj));
|
374
|
-
dup = mrb_obj_value(p);
|
375
|
-
init_copy(mrb, dup, obj);
|
376
|
-
|
377
|
-
return dup;
|
378
|
-
}
|
379
|
-
|
380
221
|
static mrb_value
|
381
|
-
mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj)
|
222
|
+
mrb_obj_extend(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value obj)
|
382
223
|
{
|
383
224
|
mrb_int i;
|
384
225
|
|
@@ -389,8 +230,8 @@ mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj)
|
|
389
230
|
mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
|
390
231
|
}
|
391
232
|
while (argc--) {
|
392
|
-
|
393
|
-
|
233
|
+
mrb_funcall_id(mrb, argv[argc], MRB_SYM(extend_object), 1, obj);
|
234
|
+
mrb_funcall_id(mrb, argv[argc], MRB_SYM(extended), 1, obj);
|
394
235
|
}
|
395
236
|
return obj;
|
396
237
|
}
|
@@ -423,7 +264,7 @@ mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj)
|
|
423
264
|
static mrb_value
|
424
265
|
mrb_obj_extend_m(mrb_state *mrb, mrb_value self)
|
425
266
|
{
|
426
|
-
mrb_value *argv;
|
267
|
+
const mrb_value *argv;
|
427
268
|
mrb_int argc;
|
428
269
|
|
429
270
|
mrb_get_args(mrb, "*", &argv, &argc);
|
@@ -454,20 +295,20 @@ mrb_obj_frozen(mrb_state *mrb, mrb_value self)
|
|
454
295
|
* call-seq:
|
455
296
|
* obj.hash -> fixnum
|
456
297
|
*
|
457
|
-
* Generates a <code>
|
298
|
+
* Generates a <code>Integer</code> hash value for this object. This
|
458
299
|
* function must have the property that <code>a.eql?(b)</code> implies
|
459
300
|
* <code>a.hash == b.hash</code>. The hash value is used by class
|
460
301
|
* <code>Hash</code>. Any hash value that exceeds the capacity of a
|
461
|
-
* <code>
|
302
|
+
* <code>Integer</code> will be truncated before being used.
|
462
303
|
*/
|
463
304
|
static mrb_value
|
464
305
|
mrb_obj_hash(mrb_state *mrb, mrb_value self)
|
465
306
|
{
|
466
|
-
return
|
307
|
+
return mrb_int_value(mrb, mrb_obj_id(self));
|
467
308
|
}
|
468
309
|
|
469
310
|
/* 15.3.1.3.16 */
|
470
|
-
|
311
|
+
mrb_value
|
471
312
|
mrb_obj_init_copy(mrb_state *mrb, mrb_value self)
|
472
313
|
{
|
473
314
|
mrb_value orig = mrb_get_arg1(mrb);
|
@@ -479,7 +320,6 @@ mrb_obj_init_copy(mrb_state *mrb, mrb_value self)
|
|
479
320
|
return self;
|
480
321
|
}
|
481
322
|
|
482
|
-
|
483
323
|
MRB_API mrb_bool
|
484
324
|
mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c)
|
485
325
|
{
|
@@ -498,11 +338,11 @@ mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c)
|
|
498
338
|
static mrb_value
|
499
339
|
obj_is_instance_of(mrb_state *mrb, mrb_value self)
|
500
340
|
{
|
501
|
-
|
341
|
+
struct RClass *c;
|
502
342
|
|
503
|
-
mrb_get_args(mrb, "
|
343
|
+
mrb_get_args(mrb, "c", &c);
|
504
344
|
|
505
|
-
return mrb_bool_value(mrb_obj_is_instance_of(mrb, self,
|
345
|
+
return mrb_bool_value(mrb_obj_is_instance_of(mrb, self, c));
|
506
346
|
}
|
507
347
|
|
508
348
|
/* 15.3.1.3.24 */
|
@@ -535,16 +375,13 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self)
|
|
535
375
|
static mrb_value
|
536
376
|
mrb_obj_is_kind_of_m(mrb_state *mrb, mrb_value self)
|
537
377
|
{
|
538
|
-
|
378
|
+
struct RClass *c;
|
539
379
|
|
540
|
-
mrb_get_args(mrb, "
|
380
|
+
mrb_get_args(mrb, "c", &c);
|
541
381
|
|
542
|
-
return mrb_bool_value(mrb_obj_is_kind_of(mrb, self,
|
382
|
+
return mrb_bool_value(mrb_obj_is_kind_of(mrb, self, c));
|
543
383
|
}
|
544
384
|
|
545
|
-
KHASH_DECLARE(st, mrb_sym, char, FALSE)
|
546
|
-
KHASH_DEFINE(st, mrb_sym, char, FALSE, kh_int_hash_func, kh_int_hash_equal)
|
547
|
-
|
548
385
|
/* 15.3.1.3.32 */
|
549
386
|
/*
|
550
387
|
* call_seq:
|
@@ -687,7 +524,7 @@ static mrb_value
|
|
687
524
|
mrb_obj_missing(mrb_state *mrb, mrb_value mod)
|
688
525
|
{
|
689
526
|
mrb_sym name;
|
690
|
-
mrb_value *a;
|
527
|
+
const mrb_value *a;
|
691
528
|
mrb_int alen;
|
692
529
|
|
693
530
|
mrb_get_args(mrb, "n*!", &name, &a, &alen);
|
@@ -727,7 +564,7 @@ obj_respond_to(mrb_state *mrb, mrb_value self)
|
|
727
564
|
mrb_get_args(mrb, "n|b", &id, &priv);
|
728
565
|
respond_to_p = basic_obj_respond_to(mrb, self, id, !priv);
|
729
566
|
if (!respond_to_p) {
|
730
|
-
rtm_id =
|
567
|
+
rtm_id = MRB_SYM_Q(respond_to_missing);
|
731
568
|
if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) {
|
732
569
|
mrb_value args[2], v;
|
733
570
|
args[0] = mrb_symbol_value(id);
|
@@ -744,9 +581,27 @@ mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
|
|
744
581
|
{
|
745
582
|
mrb_value v = mrb_get_arg1(mrb);
|
746
583
|
mrb_int i, len;
|
747
|
-
mrb_sym eqq =
|
748
|
-
mrb_value ary
|
584
|
+
mrb_sym eqq = MRB_OPSYM(eqq);
|
585
|
+
mrb_value ary;
|
749
586
|
|
587
|
+
if (mrb_array_p(self)) {
|
588
|
+
ary = self;
|
589
|
+
}
|
590
|
+
else if (mrb_nil_p(self)) {
|
591
|
+
return mrb_false_value();
|
592
|
+
}
|
593
|
+
else if (!mrb_respond_to(mrb, self, mrb_intern_lit(mrb, "to_a"))) {
|
594
|
+
mrb_value c = mrb_funcall_argv(mrb, self, eqq, 1, &v);
|
595
|
+
if (mrb_test(c)) return mrb_true_value();
|
596
|
+
return mrb_false_value();
|
597
|
+
}
|
598
|
+
else {
|
599
|
+
ary = mrb_funcall(mrb, self, "to_a", 0);
|
600
|
+
if (mrb_nil_p(ary)) {
|
601
|
+
return mrb_funcall_argv(mrb, self, eqq, 1, &v);
|
602
|
+
}
|
603
|
+
mrb_ensure_array_type(mrb, ary);
|
604
|
+
}
|
750
605
|
len = RARRAY_LEN(ary);
|
751
606
|
for (i=0; i<len; i++) {
|
752
607
|
mrb_value c = mrb_funcall_argv(mrb, mrb_ary_entry(ary, i), eqq, 1, &v);
|
@@ -15,6 +15,7 @@
|
|
15
15
|
#include <mruby/debug.h>
|
16
16
|
#include <mruby/error.h>
|
17
17
|
#include <mruby/data.h>
|
18
|
+
#include <mruby/endian.h>
|
18
19
|
|
19
20
|
#if SIZE_MAX < UINT32_MAX
|
20
21
|
# error size_t must be at least 32 bits wide
|
@@ -25,58 +26,56 @@
|
|
25
26
|
|
26
27
|
#define SIZE_ERROR_MUL(nmemb, size) ((size_t)(nmemb) > SIZE_MAX / (size))
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
{
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
struct rite_binary_header header;
|
39
|
-
return ((uint8_t *)header.binary_crc - (uint8_t *)&header) + sizeof(header.binary_crc);
|
40
|
-
}
|
41
|
-
|
42
|
-
#ifndef MRB_WITHOUT_FLOAT
|
43
|
-
double mrb_str_len_to_dbl(mrb_state *mrb, const char *s, size_t len, mrb_bool badcheck);
|
29
|
+
#define DEFINE_READ_IREP_FUNC(funcdecl, basecall) \
|
30
|
+
funcdecl \
|
31
|
+
{ \
|
32
|
+
int ai = mrb_gc_arena_save(mrb); \
|
33
|
+
struct RProc *proc = basecall; \
|
34
|
+
struct mrb_irep *irep = (mrb_irep*)(proc ? proc->body.irep : NULL); \
|
35
|
+
if (irep) proc->body.irep = NULL; \
|
36
|
+
mrb_gc_arena_restore(mrb, ai); \
|
37
|
+
return irep; \
|
38
|
+
}
|
44
39
|
|
40
|
+
#ifndef MRB_NO_FLOAT
|
45
41
|
static double
|
46
|
-
str_to_double(mrb_state *mrb, const char *p
|
42
|
+
str_to_double(mrb_state *mrb, const char *p)
|
47
43
|
{
|
48
|
-
/*
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
44
|
+
/* dump IEEE754 little endian binary */
|
45
|
+
union {
|
46
|
+
char s[sizeof(double)];
|
47
|
+
double f;
|
48
|
+
} u;
|
49
|
+
|
50
|
+
if (littleendian) {
|
51
|
+
memcpy(u.s, p, sizeof(double));
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
size_t i;
|
55
|
+
for (i=0; i<sizeof(double); i++) {
|
56
|
+
u.s[i] = p[sizeof(double)-i-1];
|
57
|
+
}
|
58
|
+
}
|
59
|
+
return u.f;
|
54
60
|
}
|
55
61
|
#endif
|
56
62
|
|
57
|
-
mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str,
|
58
|
-
|
59
|
-
static void
|
60
|
-
tempirep_free(mrb_state *mrb, void *p)
|
61
|
-
{
|
62
|
-
if (p) mrb_irep_decref(mrb, (mrb_irep *)p);
|
63
|
-
}
|
64
|
-
|
65
|
-
static const mrb_data_type tempirep_type = { "temporary irep", tempirep_free };
|
63
|
+
mrb_value mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, int badcheck);
|
66
64
|
|
67
|
-
static
|
68
|
-
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
|
65
|
+
static mrb_bool
|
66
|
+
read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags, mrb_irep **irepp)
|
69
67
|
{
|
70
68
|
int i;
|
71
69
|
const uint8_t *src = bin;
|
72
70
|
ptrdiff_t diff;
|
73
71
|
uint16_t tt, pool_data_len, snl;
|
74
72
|
int plen;
|
75
|
-
|
76
|
-
|
73
|
+
mrb_pool_value *pool;
|
74
|
+
mrb_sym *syms;
|
77
75
|
int ai = mrb_gc_arena_save(mrb);
|
76
|
+
mrb_irep *irep = mrb_add_irep(mrb);
|
78
77
|
|
79
|
-
|
78
|
+
*irepp = irep;
|
80
79
|
|
81
80
|
/* skip record size */
|
82
81
|
src += sizeof(uint32_t);
|
@@ -90,163 +89,199 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flag
|
|
90
89
|
src += sizeof(uint16_t);
|
91
90
|
|
92
91
|
/* number of child irep */
|
93
|
-
irep->rlen = (
|
92
|
+
irep->rlen = (uint8_t)bin_to_uint16(src);
|
94
93
|
src += sizeof(uint16_t);
|
95
94
|
|
96
95
|
/* Binary Data Section */
|
97
|
-
/* ISEQ BLOCK */
|
98
|
-
irep->
|
99
|
-
src += sizeof(
|
100
|
-
|
96
|
+
/* ISEQ BLOCK (and CATCH HANDLER TABLE BLOCK) */
|
97
|
+
irep->clen = bin_to_uint16(src); /* number of catch handler */
|
98
|
+
src += sizeof(uint16_t);
|
99
|
+
irep->ilen = bin_to_uint16(src);
|
100
|
+
src += sizeof(uint16_t);
|
101
101
|
|
102
102
|
if (irep->ilen > 0) {
|
103
|
+
size_t data_len = sizeof(mrb_code) * irep->ilen +
|
104
|
+
sizeof(struct mrb_irep_catch_handler) * irep->clen;
|
105
|
+
mrb_static_assert1(sizeof(struct mrb_irep_catch_handler) == 13);
|
103
106
|
if (SIZE_ERROR_MUL(irep->ilen, sizeof(mrb_code))) {
|
104
|
-
return
|
107
|
+
return FALSE;
|
105
108
|
}
|
106
109
|
if ((flags & FLAG_SRC_MALLOC) == 0) {
|
107
110
|
irep->iseq = (mrb_code*)src;
|
108
|
-
src += sizeof(mrb_code) * irep->ilen;
|
109
111
|
irep->flags |= MRB_ISEQ_NO_FREE;
|
110
112
|
}
|
111
113
|
else {
|
112
|
-
size_t data_len = sizeof(mrb_code) * irep->ilen;
|
113
114
|
void *buf = mrb_malloc(mrb, data_len);
|
114
115
|
irep->iseq = (mrb_code *)buf;
|
115
116
|
memcpy(buf, src, data_len);
|
116
|
-
src += data_len;
|
117
117
|
}
|
118
|
+
src += data_len;
|
118
119
|
}
|
119
120
|
|
120
121
|
/* POOL BLOCK */
|
121
|
-
plen =
|
122
|
-
src += sizeof(
|
122
|
+
plen = bin_to_uint16(src); /* number of pool */
|
123
|
+
src += sizeof(uint16_t);
|
123
124
|
if (plen > 0) {
|
124
125
|
if (SIZE_ERROR_MUL(plen, sizeof(mrb_value))) {
|
125
|
-
return
|
126
|
+
return FALSE;
|
126
127
|
}
|
127
|
-
irep->pool = (
|
128
|
+
irep->pool = pool = (mrb_pool_value*)mrb_calloc(mrb, sizeof(mrb_pool_value), plen);
|
128
129
|
|
129
130
|
for (i = 0; i < plen; i++) {
|
130
|
-
const char *s;
|
131
131
|
mrb_bool st = (flags & FLAG_SRC_MALLOC)==0;
|
132
132
|
|
133
133
|
tt = *src++; /* pool TT */
|
134
|
-
pool_data_len = bin_to_uint16(src); /* pool data length */
|
135
|
-
src += sizeof(uint16_t);
|
136
|
-
s = (const char*)src;
|
137
|
-
src += pool_data_len;
|
138
134
|
switch (tt) { /* pool data */
|
139
|
-
case
|
140
|
-
|
141
|
-
|
142
|
-
|
135
|
+
case IREP_TT_INT32:
|
136
|
+
{
|
137
|
+
mrb_int v = (int32_t)bin_to_uint32(src);
|
138
|
+
src += sizeof(uint32_t);
|
139
|
+
#ifdef MRB_64BIT
|
140
|
+
pool[i].tt = IREP_TT_INT64;
|
141
|
+
pool[i].u.i64 = (int64_t)v;
|
143
142
|
#else
|
144
|
-
|
143
|
+
pool[i].tt = IREP_TT_INT32;
|
144
|
+
pool[i].u.i32 = v;
|
145
145
|
#endif
|
146
146
|
}
|
147
147
|
break;
|
148
|
+
case IREP_TT_INT64:
|
149
|
+
#ifdef MRB_64BIT
|
150
|
+
{
|
151
|
+
uint64_t i64 = bin_to_uint32(src);
|
152
|
+
src += sizeof(uint32_t);
|
153
|
+
i64 <<= 32;
|
154
|
+
i64 |= bin_to_uint32(src);
|
155
|
+
src += sizeof(uint32_t);
|
156
|
+
pool[i].u.i64 = (int64_t)i64;
|
157
|
+
}
|
158
|
+
break;
|
159
|
+
#else
|
160
|
+
return FALSE; /* INT64 not supported on MRB_32BIT */
|
161
|
+
#endif
|
148
162
|
|
149
|
-
#ifndef MRB_WITHOUT_FLOAT
|
150
163
|
case IREP_TT_FLOAT:
|
151
|
-
|
164
|
+
#ifndef MRB_NO_FLOAT
|
165
|
+
pool[i].tt = tt;
|
166
|
+
pool[i].u.f = str_to_double(mrb, (const char*)src);
|
167
|
+
src += sizeof(double);
|
152
168
|
break;
|
169
|
+
#else
|
170
|
+
return FALSE; /* MRB_NO_FLOAT */
|
153
171
|
#endif
|
154
172
|
|
155
|
-
case
|
156
|
-
|
173
|
+
case IREP_TT_STR:
|
174
|
+
pool_data_len = bin_to_uint16(src); /* pool data length */
|
175
|
+
src += sizeof(uint16_t);
|
176
|
+
if (st) {
|
177
|
+
pool[i].tt = (pool_data_len<<2) | IREP_TT_SSTR;
|
178
|
+
pool[i].u.str = (const char*)src;
|
179
|
+
}
|
180
|
+
else {
|
181
|
+
char *p;
|
182
|
+
pool[i].tt = (pool_data_len<<2) | IREP_TT_STR;
|
183
|
+
p = (char*)mrb_malloc(mrb, pool_data_len+1);
|
184
|
+
memcpy(p, src, pool_data_len+1);
|
185
|
+
pool[i].u.str = (const char*)p;
|
186
|
+
}
|
187
|
+
src += pool_data_len + 1;
|
157
188
|
break;
|
158
189
|
|
159
190
|
default:
|
160
191
|
/* should not happen */
|
161
|
-
|
162
|
-
break;
|
192
|
+
return FALSE;
|
163
193
|
}
|
164
|
-
irep->plen
|
165
|
-
mrb_gc_arena_restore(mrb, ai);
|
194
|
+
irep->plen = i+1;
|
166
195
|
}
|
167
196
|
}
|
168
197
|
|
169
198
|
/* SYMS BLOCK */
|
170
|
-
irep->slen = (
|
171
|
-
src += sizeof(
|
199
|
+
irep->slen = bin_to_uint16(src); /* syms length */
|
200
|
+
src += sizeof(uint16_t);
|
172
201
|
if (irep->slen > 0) {
|
173
202
|
if (SIZE_ERROR_MUL(irep->slen, sizeof(mrb_sym))) {
|
174
|
-
return
|
203
|
+
return FALSE;
|
175
204
|
}
|
176
|
-
irep->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen);
|
205
|
+
irep->syms = syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen);
|
177
206
|
|
178
207
|
for (i = 0; i < irep->slen; i++) {
|
179
208
|
snl = bin_to_uint16(src); /* symbol name length */
|
180
209
|
src += sizeof(uint16_t);
|
181
210
|
|
182
211
|
if (snl == MRB_DUMP_NULL_SYM_LEN) {
|
183
|
-
|
212
|
+
syms[i] = 0;
|
184
213
|
continue;
|
185
214
|
}
|
186
215
|
|
187
216
|
if (flags & FLAG_SRC_MALLOC) {
|
188
|
-
|
217
|
+
syms[i] = mrb_intern(mrb, (char *)src, snl);
|
189
218
|
}
|
190
219
|
else {
|
191
|
-
|
220
|
+
syms[i] = mrb_intern_static(mrb, (char *)src, snl);
|
192
221
|
}
|
193
222
|
src += snl + 1;
|
194
|
-
|
195
223
|
mrb_gc_arena_restore(mrb, ai);
|
196
224
|
}
|
197
225
|
}
|
198
226
|
|
199
|
-
irep->reps = (mrb_irep**)mrb_calloc(mrb, irep->rlen, sizeof(mrb_irep*));
|
200
|
-
|
201
227
|
diff = src - bin;
|
202
228
|
mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
|
203
229
|
*len = (size_t)diff;
|
204
230
|
|
205
|
-
|
206
|
-
|
207
|
-
return irep;
|
231
|
+
return TRUE;
|
208
232
|
}
|
209
233
|
|
210
|
-
static
|
211
|
-
read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
|
234
|
+
static mrb_bool
|
235
|
+
read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags, mrb_irep **irepp)
|
212
236
|
{
|
213
|
-
struct RData *irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
|
214
237
|
int ai = mrb_gc_arena_save(mrb);
|
215
|
-
|
238
|
+
mrb_bool readsuccess = read_irep_record_1(mrb, bin, len, flags, irepp);
|
239
|
+
mrb_irep **reps;
|
216
240
|
int i;
|
217
241
|
|
218
242
|
mrb_gc_arena_restore(mrb, ai);
|
219
|
-
if (
|
220
|
-
return
|
243
|
+
if (!readsuccess) {
|
244
|
+
return FALSE;
|
221
245
|
}
|
222
246
|
|
223
|
-
|
247
|
+
reps = (mrb_irep**)mrb_calloc(mrb, (*irepp)->rlen, sizeof(mrb_irep*));
|
248
|
+
(*irepp)->reps = (const mrb_irep**)reps;
|
224
249
|
|
225
250
|
bin += *len;
|
226
|
-
for (i=0; i<
|
251
|
+
for (i=0; i<(*irepp)->rlen; i++) {
|
227
252
|
size_t rlen;
|
228
253
|
|
229
|
-
|
254
|
+
readsuccess = read_irep_record(mrb, bin, &rlen, flags, &reps[i]);
|
230
255
|
mrb_gc_arena_restore(mrb, ai);
|
231
|
-
if (
|
232
|
-
return
|
256
|
+
if (!readsuccess) {
|
257
|
+
return FALSE;
|
233
258
|
}
|
234
259
|
bin += rlen;
|
235
260
|
*len += rlen;
|
236
261
|
}
|
237
262
|
|
238
|
-
|
239
|
-
|
240
|
-
return irep;
|
263
|
+
return TRUE;
|
241
264
|
}
|
242
265
|
|
243
266
|
static mrb_irep*
|
244
|
-
read_section_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)
|
267
|
+
read_section_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags, struct RProc **proc)
|
245
268
|
{
|
246
269
|
size_t len;
|
247
270
|
|
271
|
+
/*
|
272
|
+
* This proc object keeps all the data in progress to avoid memory leaks
|
273
|
+
* if something goes wrong while reading irep.
|
274
|
+
*/
|
275
|
+
*proc = mrb_proc_new(mrb, NULL);
|
276
|
+
|
277
|
+
mrb_irep **irepp = (mrb_irep**)&(*proc)->body.irep;
|
248
278
|
bin += sizeof(struct rite_section_irep_header);
|
249
|
-
|
279
|
+
if (read_irep_record(mrb, bin, &len, flags, irepp)) {
|
280
|
+
return *irepp;
|
281
|
+
}
|
282
|
+
else {
|
283
|
+
return NULL;
|
284
|
+
}
|
250
285
|
}
|
251
286
|
|
252
287
|
static int
|
@@ -257,25 +292,26 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *
|
|
257
292
|
size_t record_size;
|
258
293
|
uint16_t f_idx;
|
259
294
|
int i;
|
295
|
+
mrb_irep_debug_info *debug;
|
260
296
|
|
261
297
|
if (irep->debug_info) { return MRB_DUMP_INVALID_IREP; }
|
262
298
|
|
263
|
-
irep->debug_info = (mrb_irep_debug_info*)mrb_calloc(mrb, 1, sizeof(mrb_irep_debug_info));
|
264
|
-
|
299
|
+
irep->debug_info = debug = (mrb_irep_debug_info*)mrb_calloc(mrb, 1, sizeof(mrb_irep_debug_info));
|
300
|
+
debug->pc_count = (uint32_t)irep->ilen;
|
265
301
|
|
266
302
|
record_size = (size_t)bin_to_uint32(bin);
|
267
303
|
bin += sizeof(uint32_t);
|
268
304
|
|
269
|
-
|
270
|
-
|
305
|
+
debug->flen = bin_to_uint16(bin);
|
306
|
+
debug->files = (mrb_irep_debug_info_file**)mrb_calloc(mrb, irep->debug_info->flen, sizeof(mrb_irep_debug_info*));
|
271
307
|
bin += sizeof(uint16_t);
|
272
308
|
|
273
|
-
for (f_idx = 0; f_idx <
|
309
|
+
for (f_idx = 0; f_idx < debug->flen; ++f_idx) {
|
274
310
|
mrb_irep_debug_info_file *file;
|
275
311
|
uint16_t filename_idx;
|
276
312
|
|
277
313
|
file = (mrb_irep_debug_info_file *)mrb_calloc(mrb, 1, sizeof(*file));
|
278
|
-
|
314
|
+
debug->files[f_idx] = file;
|
279
315
|
|
280
316
|
file->start_pos = bin_to_uint32(bin);
|
281
317
|
bin += sizeof(uint32_t);
|
@@ -329,7 +365,7 @@ read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *
|
|
329
365
|
size_t len;
|
330
366
|
int ret;
|
331
367
|
|
332
|
-
ret = read_debug_record(mrb, bin, irep->reps[i], &len, filenames, filenames_len);
|
368
|
+
ret = read_debug_record(mrb, bin, (mrb_irep*)irep->reps[i], &len, filenames, filenames_len);
|
333
369
|
if (ret != MRB_DUMP_OK) return ret;
|
334
370
|
bin += len;
|
335
371
|
}
|
@@ -393,34 +429,31 @@ static int
|
|
393
429
|
read_lv_record(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, size_t *record_len, mrb_sym const *syms, uint32_t syms_len)
|
394
430
|
{
|
395
431
|
const uint8_t *bin = start;
|
432
|
+
mrb_sym *lv;
|
396
433
|
ptrdiff_t diff;
|
397
434
|
int i;
|
398
435
|
|
399
|
-
irep->lv = (
|
436
|
+
irep->lv = lv = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * (irep->nlocals - 1));
|
400
437
|
|
401
|
-
for (i = 0; i + 1< irep->nlocals; ++i) {
|
438
|
+
for (i = 0; i + 1 < irep->nlocals; ++i) {
|
402
439
|
uint16_t const sym_idx = bin_to_uint16(bin);
|
403
440
|
bin += sizeof(uint16_t);
|
404
441
|
if (sym_idx == RITE_LV_NULL_MARK) {
|
405
|
-
|
406
|
-
irep->lv[i].r = 0;
|
442
|
+
lv[i] = 0;
|
407
443
|
}
|
408
444
|
else {
|
409
445
|
if (sym_idx >= syms_len) {
|
410
446
|
return MRB_DUMP_GENERAL_FAILURE;
|
411
447
|
}
|
412
|
-
|
413
|
-
|
414
|
-
irep->lv[i].r = bin_to_uint16(bin);
|
448
|
+
lv[i] = syms[sym_idx];
|
415
449
|
}
|
416
|
-
bin += sizeof(uint16_t);
|
417
450
|
}
|
418
451
|
|
419
452
|
for (i = 0; i < irep->rlen; ++i) {
|
420
453
|
size_t len;
|
421
454
|
int ret;
|
422
455
|
|
423
|
-
ret = read_lv_record(mrb, bin, irep->reps[i], &len, syms, syms_len);
|
456
|
+
ret = read_lv_record(mrb, bin, (mrb_irep*)irep->reps[i], &len, syms, syms_len);
|
424
457
|
if (ret != MRB_DUMP_OK) return ret;
|
425
458
|
bin += len;
|
426
459
|
}
|
@@ -479,7 +512,7 @@ lv_exit:
|
|
479
512
|
}
|
480
513
|
|
481
514
|
static int
|
482
|
-
read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size,
|
515
|
+
read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint8_t *flags)
|
483
516
|
{
|
484
517
|
const struct rite_binary_header *header = (const struct rite_binary_header *)bin;
|
485
518
|
|
@@ -491,13 +524,15 @@ read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint16_
|
|
491
524
|
return MRB_DUMP_INVALID_FILE_HEADER;
|
492
525
|
}
|
493
526
|
|
494
|
-
if
|
527
|
+
/* if major version is different, they are incompatible */
|
528
|
+
if (memcmp(header->major_version, RITE_BINARY_MAJOR_VER, sizeof(header->major_version)) != 0) {
|
495
529
|
return MRB_DUMP_INVALID_FILE_HEADER;
|
496
530
|
}
|
497
|
-
|
498
|
-
if (
|
499
|
-
|
531
|
+
/* if minor version is different, we can accept the older version */
|
532
|
+
if (memcmp(header->minor_version, RITE_BINARY_MINOR_VER, sizeof(header->minor_version)) > 0) {
|
533
|
+
return MRB_DUMP_INVALID_FILE_HEADER;
|
500
534
|
}
|
535
|
+
|
501
536
|
*bin_size = (size_t)bin_to_uint32(header->binary_size);
|
502
537
|
|
503
538
|
if (bufsize < *bin_size) {
|
@@ -507,40 +542,30 @@ read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint16_
|
|
507
542
|
return MRB_DUMP_OK;
|
508
543
|
}
|
509
544
|
|
510
|
-
static
|
545
|
+
static struct RProc*
|
511
546
|
read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
|
512
547
|
{
|
513
548
|
int result;
|
514
|
-
struct
|
549
|
+
struct RProc *proc = NULL;
|
515
550
|
mrb_irep *irep = NULL;
|
516
551
|
const struct rite_section_header *section_header;
|
517
|
-
uint16_t crc;
|
518
552
|
size_t bin_size = 0;
|
519
|
-
size_t n;
|
520
553
|
|
521
554
|
if ((mrb == NULL) || (bin == NULL)) {
|
522
555
|
return NULL;
|
523
556
|
}
|
524
557
|
|
525
|
-
result = read_binary_header(bin, bufsize, &bin_size, &
|
558
|
+
result = read_binary_header(bin, bufsize, &bin_size, &flags);
|
526
559
|
if (result != MRB_DUMP_OK) {
|
527
560
|
return NULL;
|
528
561
|
}
|
529
562
|
|
530
|
-
n = offset_crc_body();
|
531
|
-
if (crc != calc_crc_16_ccitt(bin + n, bin_size - n, 0)) {
|
532
|
-
return NULL;
|
533
|
-
}
|
534
|
-
|
535
|
-
irep_obj = mrb_data_object_alloc(mrb, mrb->object_class, NULL, &tempirep_type);
|
536
|
-
|
537
563
|
bin += sizeof(struct rite_binary_header);
|
538
564
|
do {
|
539
565
|
section_header = (const struct rite_section_header *)bin;
|
540
566
|
if (memcmp(section_header->section_ident, RITE_SECTION_IREP_IDENT, sizeof(section_header->section_ident)) == 0) {
|
541
|
-
irep = read_section_irep(mrb, bin, flags);
|
567
|
+
irep = read_section_irep(mrb, bin, flags, &proc);
|
542
568
|
if (!irep) return NULL;
|
543
|
-
irep_obj->data = irep;
|
544
569
|
}
|
545
570
|
else if (memcmp(section_header->section_ident, RITE_SECTION_DEBUG_IDENT, sizeof(section_header->section_ident)) == 0) {
|
546
571
|
if (!irep) return NULL; /* corrupted data */
|
@@ -559,13 +584,11 @@ read_irep(mrb_state *mrb, const uint8_t *bin, size_t bufsize, uint8_t flags)
|
|
559
584
|
bin += bin_to_uint32(section_header->section_size);
|
560
585
|
} while (memcmp(section_header->section_ident, RITE_BINARY_EOF, sizeof(section_header->section_ident)) != 0);
|
561
586
|
|
562
|
-
|
563
|
-
|
564
|
-
return irep;
|
587
|
+
return proc;
|
565
588
|
}
|
566
589
|
|
567
|
-
|
568
|
-
|
590
|
+
static struct RProc*
|
591
|
+
mrb_proc_read_irep(mrb_state *mrb, const uint8_t *bin)
|
569
592
|
{
|
570
593
|
#if defined(MRB_USE_LINK_TIME_RO_DATA_P) || defined(MRB_USE_CUSTOM_RO_DATA_P)
|
571
594
|
uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC;
|
@@ -576,34 +599,38 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
|
|
576
599
|
return read_irep(mrb, bin, (size_t)-1, flags);
|
577
600
|
}
|
578
601
|
|
579
|
-
|
580
|
-
|
602
|
+
DEFINE_READ_IREP_FUNC(
|
603
|
+
mrb_irep *mrb_read_irep(mrb_state *mrb, const uint8_t *bin),
|
604
|
+
mrb_proc_read_irep(mrb, bin))
|
605
|
+
|
606
|
+
static struct RProc*
|
607
|
+
mrb_proc_read_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize)
|
581
608
|
{
|
582
609
|
return read_irep(mrb, (const uint8_t *)buf, bufsize, FLAG_SRC_MALLOC);
|
583
610
|
}
|
584
611
|
|
612
|
+
DEFINE_READ_IREP_FUNC(
|
613
|
+
MRB_API mrb_irep *mrb_read_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize),
|
614
|
+
mrb_proc_read_irep_buf(mrb, buf, bufsize))
|
615
|
+
|
585
616
|
void mrb_exc_set(mrb_state *mrb, mrb_value exc);
|
586
617
|
|
587
618
|
static void
|
588
619
|
irep_error(mrb_state *mrb)
|
589
620
|
{
|
590
|
-
mrb_exc_set(mrb,
|
621
|
+
mrb_exc_set(mrb, mrb_exc_new_lit(mrb, E_SCRIPT_ERROR, "irep load error"));
|
591
622
|
}
|
592
623
|
|
593
624
|
void mrb_codedump_all(mrb_state*, struct RProc*);
|
594
625
|
|
595
626
|
static mrb_value
|
596
|
-
load_irep(mrb_state *mrb,
|
627
|
+
load_irep(mrb_state *mrb, struct RProc *proc, mrbc_context *c)
|
597
628
|
{
|
598
|
-
|
599
|
-
|
600
|
-
if (!irep) {
|
629
|
+
if (!proc || !proc->body.irep) {
|
601
630
|
irep_error(mrb);
|
602
631
|
return mrb_nil_value();
|
603
632
|
}
|
604
|
-
proc = mrb_proc_new(mrb, irep);
|
605
633
|
proc->c = NULL;
|
606
|
-
mrb_irep_decref(mrb, irep);
|
607
634
|
if (c && c->dump_result) mrb_codedump_all(mrb, proc);
|
608
635
|
if (c && c->no_exec) return mrb_obj_value(proc);
|
609
636
|
return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0);
|
@@ -612,22 +639,15 @@ load_irep(mrb_state *mrb, mrb_irep *irep, mrbc_context *c)
|
|
612
639
|
MRB_API mrb_value
|
613
640
|
mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
|
614
641
|
{
|
615
|
-
struct
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
irep_obj->data = irep;
|
620
|
-
mrb_irep_incref(mrb, irep);
|
621
|
-
ret = load_irep(mrb, irep, c);
|
622
|
-
irep_obj->data = NULL;
|
623
|
-
mrb_irep_decref(mrb, irep);
|
624
|
-
return ret;
|
642
|
+
struct RProc *proc = mrb_proc_read_irep(mrb, bin);
|
643
|
+
if (!proc) return mrb_undef_value();
|
644
|
+
return load_irep(mrb, proc, c);
|
625
645
|
}
|
626
646
|
|
627
647
|
MRB_API mrb_value
|
628
648
|
mrb_load_irep_buf_cxt(mrb_state *mrb, const void *buf, size_t bufsize, mrbc_context *c)
|
629
649
|
{
|
630
|
-
return load_irep(mrb,
|
650
|
+
return load_irep(mrb, mrb_proc_read_irep_buf(mrb, buf, bufsize), c);
|
631
651
|
}
|
632
652
|
|
633
653
|
MRB_API mrb_value
|
@@ -642,12 +662,18 @@ mrb_load_irep_buf(mrb_state *mrb, const void *buf, size_t bufsize)
|
|
642
662
|
return mrb_load_irep_buf_cxt(mrb, buf, bufsize, NULL);
|
643
663
|
}
|
644
664
|
|
645
|
-
|
665
|
+
MRB_API mrb_value
|
666
|
+
mrb_load_proc(mrb_state *mrb, const struct RProc *proc)
|
667
|
+
{
|
668
|
+
return mrb_vm_run(mrb, proc, mrb_top_self(mrb), 0);
|
669
|
+
}
|
670
|
+
|
671
|
+
#ifndef MRB_NO_STDIO
|
646
672
|
|
647
|
-
|
648
|
-
|
673
|
+
static struct RProc*
|
674
|
+
mrb_proc_read_irep_file(mrb_state *mrb, FILE *fp)
|
649
675
|
{
|
650
|
-
|
676
|
+
struct RProc *proc = NULL;
|
651
677
|
uint8_t *buf;
|
652
678
|
const size_t header_size = sizeof(struct rite_binary_header);
|
653
679
|
size_t buf_size = 0;
|
@@ -662,7 +688,7 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
|
|
662
688
|
if (fread(buf, header_size, 1, fp) == 0) {
|
663
689
|
goto irep_exit;
|
664
690
|
}
|
665
|
-
result = read_binary_header(buf, (size_t)-1, &buf_size,
|
691
|
+
result = read_binary_header(buf, (size_t)-1, &buf_size, &flags);
|
666
692
|
if (result != MRB_DUMP_OK || buf_size <= header_size) {
|
667
693
|
goto irep_exit;
|
668
694
|
}
|
@@ -671,17 +697,21 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp)
|
|
671
697
|
if (fread(buf+header_size, buf_size-header_size, 1, fp) == 0) {
|
672
698
|
goto irep_exit;
|
673
699
|
}
|
674
|
-
|
700
|
+
proc = read_irep(mrb, buf, (size_t)-1, FLAG_SRC_MALLOC);
|
675
701
|
|
676
702
|
irep_exit:
|
677
703
|
mrb_free(mrb, buf);
|
678
|
-
return
|
704
|
+
return proc;
|
679
705
|
}
|
680
706
|
|
707
|
+
DEFINE_READ_IREP_FUNC(
|
708
|
+
mrb_irep *mrb_read_irep_file(mrb_state *mrb, FILE *fp),
|
709
|
+
mrb_proc_read_irep_file(mrb, fp))
|
710
|
+
|
681
711
|
MRB_API mrb_value
|
682
712
|
mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c)
|
683
713
|
{
|
684
|
-
return load_irep(mrb,
|
714
|
+
return load_irep(mrb, mrb_proc_read_irep_file(mrb, fp), c);
|
685
715
|
}
|
686
716
|
|
687
717
|
MRB_API mrb_value
|
@@ -689,4 +719,4 @@ mrb_load_irep_file(mrb_state *mrb, FILE* fp)
|
|
689
719
|
{
|
690
720
|
return mrb_load_irep_file_cxt(mrb, fp, NULL);
|
691
721
|
}
|
692
|
-
#endif /*
|
722
|
+
#endif /* MRB_NO_STDIO */
|