enclave 0.1.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 +7 -0
- data/README.md +182 -0
- data/Rakefile +30 -0
- data/ext/enclave/enclave.c +390 -0
- data/ext/enclave/extconf.rb +33 -0
- data/ext/enclave/mruby/Makefile +63 -0
- data/ext/enclave/mruby/Rakefile +102 -0
- data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
- data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
- data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
- data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
- data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
- data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
- data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
- data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
- data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
- data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
- data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
- data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
- data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
- data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
- data/ext/enclave/mruby/build_config/RX630.rb +63 -0
- data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
- data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
- data/ext/enclave/mruby/build_config/bench.rb +11 -0
- data/ext/enclave/mruby/build_config/boxing.rb +19 -0
- data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
- data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
- data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
- data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
- data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
- data/ext/enclave/mruby/build_config/default.rb +83 -0
- data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
- data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
- data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
- data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
- data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
- data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
- data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
- data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
- data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
- data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
- data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
- data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
- data/ext/enclave/mruby/build_config/minimal.rb +4 -0
- data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
- data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
- data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
- data/ext/enclave/mruby/build_config/no-float.rb +17 -0
- data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
- data/ext/enclave/mruby/build_config/serenity.rb +26 -0
- data/ext/enclave/mruby/build_config.rb +9 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/include/mruby.h +1632 -0
- data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
- data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
- data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
- data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
- data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
- data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
- data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
- data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
- data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
- data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
- data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
- data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
- data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
- data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
- data/ext/enclave/mruby/mrblib/10error.rb +23 -0
- data/ext/enclave/mruby/mrblib/array.rb +102 -0
- data/ext/enclave/mruby/mrblib/compar.rb +102 -0
- data/ext/enclave/mruby/mrblib/enum.rb +358 -0
- data/ext/enclave/mruby/mrblib/hash.rb +276 -0
- data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
- data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
- data/ext/enclave/mruby/mrblib/range.rb +98 -0
- data/ext/enclave/mruby/mrblib/string.rb +173 -0
- data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
- data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
- data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
- data/ext/enclave/mruby/src/allocf.c +37 -0
- data/ext/enclave/mruby/src/array.c +2302 -0
- data/ext/enclave/mruby/src/backtrace.c +294 -0
- data/ext/enclave/mruby/src/cdump.c +498 -0
- data/ext/enclave/mruby/src/class.c +4394 -0
- data/ext/enclave/mruby/src/codedump.c +693 -0
- data/ext/enclave/mruby/src/debug.c +290 -0
- data/ext/enclave/mruby/src/dump.c +998 -0
- data/ext/enclave/mruby/src/enum.c +30 -0
- data/ext/enclave/mruby/src/error.c +937 -0
- data/ext/enclave/mruby/src/etc.c +421 -0
- data/ext/enclave/mruby/src/fmt_fp.c +372 -0
- data/ext/enclave/mruby/src/gc.c +1610 -0
- data/ext/enclave/mruby/src/hash.c +2355 -0
- data/ext/enclave/mruby/src/init.c +50 -0
- data/ext/enclave/mruby/src/kernel.c +718 -0
- data/ext/enclave/mruby/src/load.c +760 -0
- data/ext/enclave/mruby/src/mempool.c +225 -0
- data/ext/enclave/mruby/src/numeric.c +2420 -0
- data/ext/enclave/mruby/src/numops.c +112 -0
- data/ext/enclave/mruby/src/object.c +883 -0
- data/ext/enclave/mruby/src/print.c +136 -0
- data/ext/enclave/mruby/src/proc.c +572 -0
- data/ext/enclave/mruby/src/range.c +597 -0
- data/ext/enclave/mruby/src/readfloat.c +228 -0
- data/ext/enclave/mruby/src/readint.c +27 -0
- data/ext/enclave/mruby/src/readnum.c +43 -0
- data/ext/enclave/mruby/src/state.c +247 -0
- data/ext/enclave/mruby/src/string.c +3577 -0
- data/ext/enclave/mruby/src/symbol.c +1023 -0
- data/ext/enclave/mruby/src/value_array.h +28 -0
- data/ext/enclave/mruby/src/variable.c +1475 -0
- data/ext/enclave/mruby/src/version.c +17 -0
- data/ext/enclave/mruby/src/vm.c +3696 -0
- data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
- data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
- data/ext/enclave/mruby/tasks/bin.rake +23 -0
- data/ext/enclave/mruby/tasks/core.rake +12 -0
- data/ext/enclave/mruby/tasks/doc.rake +118 -0
- data/ext/enclave/mruby/tasks/install.rake +40 -0
- data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
- data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
- data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
- data/ext/enclave/mruby/tasks/presym.rake +57 -0
- data/ext/enclave/mruby/tasks/test.rake +84 -0
- data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
- data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
- data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
- data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
- data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
- data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
- data/ext/enclave/mruby/test/assert.rb +404 -0
- data/ext/enclave/mruby/test/bintest.rb +55 -0
- data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
- data/ext/enclave/mruby/test/t/array.rb +478 -0
- data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
- data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
- data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
- data/ext/enclave/mruby/test/t/class.rb +505 -0
- data/ext/enclave/mruby/test/t/codegen.rb +196 -0
- data/ext/enclave/mruby/test/t/comparable.rb +79 -0
- data/ext/enclave/mruby/test/t/ensure.rb +36 -0
- data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
- data/ext/enclave/mruby/test/t/exception.rb +425 -0
- data/ext/enclave/mruby/test/t/false.rb +31 -0
- data/ext/enclave/mruby/test/t/float.rb +296 -0
- data/ext/enclave/mruby/test/t/gc.rb +45 -0
- data/ext/enclave/mruby/test/t/hash.rb +976 -0
- data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
- data/ext/enclave/mruby/test/t/integer.rb +247 -0
- data/ext/enclave/mruby/test/t/iterations.rb +61 -0
- data/ext/enclave/mruby/test/t/kernel.rb +462 -0
- data/ext/enclave/mruby/test/t/lang.rb +74 -0
- data/ext/enclave/mruby/test/t/literals.rb +386 -0
- data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
- data/ext/enclave/mruby/test/t/methods.rb +138 -0
- data/ext/enclave/mruby/test/t/module.rb +931 -0
- data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
- data/ext/enclave/mruby/test/t/nil.rb +39 -0
- data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
- data/ext/enclave/mruby/test/t/numeric.rb +114 -0
- data/ext/enclave/mruby/test/t/object.rb +10 -0
- data/ext/enclave/mruby/test/t/proc.rb +198 -0
- data/ext/enclave/mruby/test/t/range.rb +194 -0
- data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
- data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
- data/ext/enclave/mruby/test/t/string.rb +981 -0
- data/ext/enclave/mruby/test/t/superclass.rb +46 -0
- data/ext/enclave/mruby/test/t/symbol.rb +30 -0
- data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
- data/ext/enclave/mruby/test/t/true.rb +31 -0
- data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/unicode.rb +39 -0
- data/ext/enclave/mruby/test/t/vformat.rb +57 -0
- data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
- data/ext/enclave/mruby/tools/lrama/MIT +21 -0
- data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
- data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
- data/ext/enclave/sandbox_build_config.rb +15 -0
- data/ext/enclave/sandbox_core.c +722 -0
- data/ext/enclave/sandbox_core.h +87 -0
- data/lib/enclave/result.rb +29 -0
- data/lib/enclave/tool.rb +38 -0
- data/lib/enclave/version.rb +3 -0
- data/lib/enclave.rb +73 -0
- metadata +819 -0
|
@@ -0,0 +1,1475 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** variable.c - mruby variables
|
|
3
|
+
**
|
|
4
|
+
** See Copyright Notice in mruby.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include <mruby.h>
|
|
8
|
+
#include <mruby/array.h>
|
|
9
|
+
#include <mruby/class.h>
|
|
10
|
+
#include <mruby/proc.h>
|
|
11
|
+
#include <mruby/string.h>
|
|
12
|
+
#include <mruby/variable.h>
|
|
13
|
+
#include <mruby/internal.h>
|
|
14
|
+
#include <mruby/presym.h>
|
|
15
|
+
|
|
16
|
+
/* Instance variable table structure */
|
|
17
|
+
typedef struct iv_tbl {
|
|
18
|
+
int size, alloc;
|
|
19
|
+
mrb_value *ptr;
|
|
20
|
+
} iv_tbl;
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
/* Creates the instance variable table. */
|
|
25
|
+
static iv_tbl*
|
|
26
|
+
iv_new(mrb_state *mrb)
|
|
27
|
+
{
|
|
28
|
+
iv_tbl *t;
|
|
29
|
+
|
|
30
|
+
t = (iv_tbl*)mrb_malloc(mrb, sizeof(iv_tbl));
|
|
31
|
+
t->size = 0;
|
|
32
|
+
t->alloc = 0;
|
|
33
|
+
t->ptr = NULL;
|
|
34
|
+
|
|
35
|
+
return t;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static void iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val);
|
|
39
|
+
|
|
40
|
+
#define IV_INITIAL_SIZE 2
|
|
41
|
+
|
|
42
|
+
static void
|
|
43
|
+
iv_rehash(mrb_state *mrb, iv_tbl *t)
|
|
44
|
+
{
|
|
45
|
+
int old_alloc = t->alloc;
|
|
46
|
+
int new_alloc = old_alloc > 0 ? old_alloc << 1 : IV_INITIAL_SIZE;
|
|
47
|
+
|
|
48
|
+
if (old_alloc == 0) {
|
|
49
|
+
/* first-time init */
|
|
50
|
+
t->ptr = (mrb_value*)mrb_calloc(mrb, new_alloc, sizeof(mrb_value)+sizeof(mrb_sym));
|
|
51
|
+
t->alloc = new_alloc;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* realloc may extend in place, avoiding malloc+memcpy+free */
|
|
56
|
+
size_t new_size = (size_t)new_alloc * (sizeof(mrb_value) + sizeof(mrb_sym));
|
|
57
|
+
t->ptr = (mrb_value*)mrb_realloc(mrb, t->ptr, new_size);
|
|
58
|
+
|
|
59
|
+
/* move keys from old position to new position */
|
|
60
|
+
mrb_sym *old_keys = (mrb_sym*)&t->ptr[old_alloc];
|
|
61
|
+
mrb_sym *new_keys = (mrb_sym*)&t->ptr[new_alloc];
|
|
62
|
+
memmove(new_keys, old_keys, sizeof(mrb_sym) * t->size);
|
|
63
|
+
|
|
64
|
+
/* clear extended value region (where old keys were + new slots) */
|
|
65
|
+
memset(&t->ptr[old_alloc], 0, sizeof(mrb_value) * (new_alloc - old_alloc));
|
|
66
|
+
|
|
67
|
+
/* clear extended key region */
|
|
68
|
+
memset(&new_keys[t->size], 0, sizeof(mrb_sym) * (new_alloc - t->size));
|
|
69
|
+
|
|
70
|
+
t->alloc = new_alloc;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Branch-free binary search helper: returns the index where `target` should be inserted/found. */
|
|
74
|
+
static inline int
|
|
75
|
+
iv_bsearch_idx(mrb_sym *keys, int size, mrb_sym target) {
|
|
76
|
+
if (size == 0) return 0;
|
|
77
|
+
int n = size;
|
|
78
|
+
mrb_sym *p = keys;
|
|
79
|
+
/* While more than one element remains, halve the range each iteration */
|
|
80
|
+
while (n > 1) {
|
|
81
|
+
int half = n >> 1;
|
|
82
|
+
MRB_MEM_PREFETCH(p + (half >> 1));
|
|
83
|
+
MRB_MEM_PREFETCH(p + half + (half >> 1));
|
|
84
|
+
mrb_sym mid_sym = p[half];
|
|
85
|
+
/*
|
|
86
|
+
* Update pointer p without a branch:
|
|
87
|
+
* If mid_sym < target, move p forward by half; otherwise keep p unchanged.
|
|
88
|
+
* Compiler will emit a CMOV or equivalent.
|
|
89
|
+
*/
|
|
90
|
+
p = (mid_sym < target) ? p + half : p;
|
|
91
|
+
n -= half;
|
|
92
|
+
}
|
|
93
|
+
/* Final adjustment: if the remaining element is still less than target, advance by one */
|
|
94
|
+
return (int)(p - keys) + (p[0] < target);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Set (insert or update) the value for `sym` in the instance variable table using branch-free search. */
|
|
98
|
+
static void
|
|
99
|
+
iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
|
|
100
|
+
{
|
|
101
|
+
/* If table is uninitialized, allocate and initialize */
|
|
102
|
+
if (t->alloc == 0) {
|
|
103
|
+
iv_rehash(mrb, t);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* Obtain pointers to keys and values arrays */
|
|
107
|
+
mrb_sym *keys = (mrb_sym*)&t->ptr[t->alloc];
|
|
108
|
+
mrb_value *vals = t->ptr;
|
|
109
|
+
|
|
110
|
+
/* Determine insertion/update index:
|
|
111
|
+
* If table has entries, use branch-free search; otherwise index = 0.
|
|
112
|
+
*/
|
|
113
|
+
int lo = iv_bsearch_idx(keys, t->size, sym);
|
|
114
|
+
|
|
115
|
+
/* If the key already exists, update its value and return */
|
|
116
|
+
if (lo < t->size && keys[lo] == sym) {
|
|
117
|
+
vals[lo] = val;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* Grow table if full, then recompute position */
|
|
122
|
+
if (t->size == t->alloc) {
|
|
123
|
+
iv_rehash(mrb, t);
|
|
124
|
+
keys = (mrb_sym*)&t->ptr[t->alloc];
|
|
125
|
+
vals = t->ptr;
|
|
126
|
+
lo = iv_bsearch_idx(keys, t->size, sym);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* Shift existing entries right to make room at index lo */
|
|
130
|
+
int move_count = t->size - lo;
|
|
131
|
+
if (move_count > 0) {
|
|
132
|
+
memmove(&keys[lo + 1], &keys[lo], move_count * sizeof(mrb_sym));
|
|
133
|
+
memmove(&vals[lo + 1], &vals[lo], move_count * sizeof(mrb_value));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Insert the new key and value */
|
|
137
|
+
keys[lo] = sym;
|
|
138
|
+
vals[lo] = val;
|
|
139
|
+
t->size++;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* Get a value for `sym` from the instance variable table using branch-free search. */
|
|
143
|
+
static int
|
|
144
|
+
iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
|
|
145
|
+
{
|
|
146
|
+
/* Return 0 if table is null, uninitialized, or empty */
|
|
147
|
+
if (t == NULL || t->alloc == 0 || t->size == 0) return 0;
|
|
148
|
+
|
|
149
|
+
mrb_sym *keys = (mrb_sym*)&t->ptr[t->alloc];
|
|
150
|
+
mrb_value *vals = t->ptr;
|
|
151
|
+
|
|
152
|
+
/* Find index in a branch-free manner */
|
|
153
|
+
int lo = iv_bsearch_idx(keys, t->size, sym);
|
|
154
|
+
|
|
155
|
+
/* If found, store value (if vp provided) and return 1-based position */
|
|
156
|
+
if (lo < t->size && keys[lo] == sym) {
|
|
157
|
+
if (vp) *vp = vals[lo];
|
|
158
|
+
return lo + 1;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* Not found */
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* Delete the entry for `sym` from the instance variable table using branch-free search. */
|
|
166
|
+
static mrb_bool
|
|
167
|
+
iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
|
|
168
|
+
{
|
|
169
|
+
/* Return FALSE if table is null, uninitialized, or empty */
|
|
170
|
+
if (t == NULL || t->alloc == 0 || t->size == 0) return FALSE;
|
|
171
|
+
|
|
172
|
+
mrb_sym *keys = (mrb_sym*)&t->ptr[t->alloc];
|
|
173
|
+
mrb_value *vals = t->ptr;
|
|
174
|
+
|
|
175
|
+
/* Find index in a branch-free manner */
|
|
176
|
+
int lo = iv_bsearch_idx(keys, t->size, sym);
|
|
177
|
+
|
|
178
|
+
/* If found, optionally return value and shift entries left to delete */
|
|
179
|
+
if (lo < t->size && keys[lo] == sym) {
|
|
180
|
+
if (vp) *vp = vals[lo];
|
|
181
|
+
int move_count = t->size - lo - 1;
|
|
182
|
+
if (move_count > 0) {
|
|
183
|
+
memmove(&keys[lo], &keys[lo + 1], move_count * sizeof(mrb_sym));
|
|
184
|
+
memmove(&vals[lo], &vals[lo + 1], move_count * sizeof(mrb_value));
|
|
185
|
+
}
|
|
186
|
+
t->size--;
|
|
187
|
+
return TRUE;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* Not found */
|
|
191
|
+
return FALSE;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Iterates over the instance variable table. */
|
|
195
|
+
static void
|
|
196
|
+
iv_foreach(mrb_state *mrb, iv_tbl *t, mrb_iv_foreach_func *func, void *p)
|
|
197
|
+
{
|
|
198
|
+
if (t == NULL || t->alloc == 0 || t->size == 0) return;
|
|
199
|
+
for (int i = 0; i < t->size; i++) {
|
|
200
|
+
mrb_sym *keys = (mrb_sym*)&t->ptr[t->alloc];
|
|
201
|
+
mrb_value *vals = t->ptr;
|
|
202
|
+
if ((*func)(mrb, keys[i], vals[i], p) != 0) return;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* Get the size of the instance variable table. */
|
|
207
|
+
static size_t
|
|
208
|
+
iv_size(mrb_state *mrb, iv_tbl *t)
|
|
209
|
+
{
|
|
210
|
+
return t ? t->size : 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* Copy the sorted table */
|
|
214
|
+
static iv_tbl*
|
|
215
|
+
iv_copy(mrb_state *mrb, iv_tbl *t)
|
|
216
|
+
{
|
|
217
|
+
if (t == NULL || t->alloc == 0 || t->size == 0) return NULL;
|
|
218
|
+
|
|
219
|
+
/* create new table and mirror alloc/size */
|
|
220
|
+
iv_tbl *t2 = iv_new(mrb);
|
|
221
|
+
t2->alloc = t->alloc;
|
|
222
|
+
t2->size = t->size;
|
|
223
|
+
|
|
224
|
+
/* allocate the same block shape */
|
|
225
|
+
t2->ptr = (mrb_value*)mrb_calloc(mrb, t2->alloc, sizeof(mrb_value)+sizeof(mrb_sym));
|
|
226
|
+
|
|
227
|
+
/* copy values[0...size] and keys[0...size] */
|
|
228
|
+
memcpy(t2->ptr, t->ptr, sizeof(mrb_value)*t2->size);
|
|
229
|
+
memcpy(&t2->ptr[t2->alloc], &t->ptr[t->alloc], sizeof(mrb_sym)*t2->size);
|
|
230
|
+
|
|
231
|
+
return t2;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* Free memory of the instance variable table. */
|
|
235
|
+
static void
|
|
236
|
+
iv_free(mrb_state *mrb, iv_tbl *t)
|
|
237
|
+
{
|
|
238
|
+
mrb_free(mrb, t->ptr);
|
|
239
|
+
mrb_free(mrb, t);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
static int
|
|
243
|
+
iv_mark_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
|
|
244
|
+
{
|
|
245
|
+
mrb_gc_mark_value(mrb, v);
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
static void
|
|
250
|
+
mark_tbl(mrb_state *mrb, iv_tbl *t)
|
|
251
|
+
{
|
|
252
|
+
iv_foreach(mrb, t, iv_mark_i, 0);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
void
|
|
256
|
+
mrb_gc_mark_gv(mrb_state *mrb)
|
|
257
|
+
{
|
|
258
|
+
mark_tbl(mrb, mrb->globals);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
void
|
|
262
|
+
mrb_gc_free_gv(mrb_state *mrb)
|
|
263
|
+
{
|
|
264
|
+
if (mrb->globals) {
|
|
265
|
+
iv_free(mrb, mrb->globals);
|
|
266
|
+
mrb->globals = NULL;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
size_t
|
|
271
|
+
mrb_gc_mark_iv(mrb_state *mrb, struct RObject *obj)
|
|
272
|
+
{
|
|
273
|
+
mark_tbl(mrb, obj->iv);
|
|
274
|
+
return iv_size(mrb, obj->iv);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
void
|
|
278
|
+
mrb_gc_free_iv(mrb_state *mrb, struct RObject *obj)
|
|
279
|
+
{
|
|
280
|
+
if (obj->iv) {
|
|
281
|
+
iv_free(mrb, obj->iv);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
mrb_value
|
|
286
|
+
mrb_vm_special_get(mrb_state *mrb, mrb_sym i)
|
|
287
|
+
{
|
|
288
|
+
return mrb_fixnum_value(0);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
void
|
|
292
|
+
mrb_vm_special_set(mrb_state *mrb, mrb_sym i, mrb_value v)
|
|
293
|
+
{
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
static mrb_bool
|
|
297
|
+
obj_iv_p(mrb_value obj)
|
|
298
|
+
{
|
|
299
|
+
switch (mrb_unboxed_type(obj)) {
|
|
300
|
+
case MRB_TT_OBJECT:
|
|
301
|
+
case MRB_TT_CLASS:
|
|
302
|
+
case MRB_TT_MODULE:
|
|
303
|
+
case MRB_TT_SCLASS:
|
|
304
|
+
case MRB_TT_HASH:
|
|
305
|
+
case MRB_TT_CDATA:
|
|
306
|
+
case MRB_TT_EXCEPTION:
|
|
307
|
+
return TRUE;
|
|
308
|
+
default:
|
|
309
|
+
return FALSE;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
static iv_tbl*
|
|
314
|
+
class_iv_ptr(struct RClass *c)
|
|
315
|
+
{
|
|
316
|
+
return c->tt == MRB_TT_ICLASS ? c->c->iv : c->iv;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/*
|
|
320
|
+
* Retrieves an instance variable from an object.
|
|
321
|
+
*
|
|
322
|
+
* Args:
|
|
323
|
+
* mrb: The mruby state.
|
|
324
|
+
* obj: The object from which to retrieve the instance variable.
|
|
325
|
+
* sym: The symbol representing the name of the instance variable.
|
|
326
|
+
*
|
|
327
|
+
* Returns:
|
|
328
|
+
* The value of the instance variable, or mrb_nil_value() if the
|
|
329
|
+
* instance variable is not defined.
|
|
330
|
+
*/
|
|
331
|
+
MRB_API mrb_value
|
|
332
|
+
mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym)
|
|
333
|
+
{
|
|
334
|
+
mrb_value v;
|
|
335
|
+
|
|
336
|
+
if (obj->iv && iv_get(mrb, obj->iv, sym, &v))
|
|
337
|
+
return v;
|
|
338
|
+
return mrb_nil_value();
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/*
|
|
342
|
+
* Retrieves an instance variable from an mrb_value.
|
|
343
|
+
*
|
|
344
|
+
* This function is a wrapper around mrb_obj_iv_get. It checks if the
|
|
345
|
+
* given mrb_value is an object that can have instance variables before
|
|
346
|
+
* attempting to retrieve the variable.
|
|
347
|
+
*
|
|
348
|
+
* Args:
|
|
349
|
+
* mrb: The mruby state.
|
|
350
|
+
* obj: The mrb_value from which to retrieve the instance variable.
|
|
351
|
+
* sym: The symbol representing the name of the instance variable.
|
|
352
|
+
*
|
|
353
|
+
* Returns:
|
|
354
|
+
* The value of the instance variable, or mrb_nil_value() if the
|
|
355
|
+
* instance variable is not defined or if the object cannot have
|
|
356
|
+
* instance variables.
|
|
357
|
+
*/
|
|
358
|
+
MRB_API mrb_value
|
|
359
|
+
mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym)
|
|
360
|
+
{
|
|
361
|
+
if (obj_iv_p(obj)) {
|
|
362
|
+
return mrb_obj_iv_get(mrb, mrb_obj_ptr(obj), sym);
|
|
363
|
+
}
|
|
364
|
+
return mrb_nil_value();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
static inline mrb_bool
|
|
368
|
+
namespace_p(enum mrb_vtype tt)
|
|
369
|
+
{
|
|
370
|
+
return tt == MRB_TT_CLASS || tt == MRB_TT_MODULE ? TRUE : FALSE;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
static inline void
|
|
374
|
+
assign_class_name(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
|
|
375
|
+
{
|
|
376
|
+
if (namespace_p(mrb_type(v))) {
|
|
377
|
+
struct RObject *c = mrb_obj_ptr(v);
|
|
378
|
+
if (obj != c && ISUPPER(mrb_sym_name_len(mrb, sym, NULL)[0])) {
|
|
379
|
+
mrb_sym id_classname = MRB_SYM(__classname__);
|
|
380
|
+
mrb_value o = mrb_obj_iv_get(mrb, c, id_classname);
|
|
381
|
+
|
|
382
|
+
if (mrb_nil_p(o)) {
|
|
383
|
+
mrb_sym id_outer = MRB_SYM(__outer__);
|
|
384
|
+
o = mrb_obj_iv_get(mrb, c, id_outer);
|
|
385
|
+
|
|
386
|
+
if (mrb_nil_p(o)) {
|
|
387
|
+
if ((struct RClass*)obj == mrb->object_class) {
|
|
388
|
+
mrb_obj_iv_set_force(mrb, c, id_classname, mrb_symbol_value(sym));
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
mrb_obj_iv_set_force(mrb, c, id_outer, mrb_obj_value(obj));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
void
|
|
400
|
+
mrb_obj_iv_set_force(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
|
|
401
|
+
{
|
|
402
|
+
if (namespace_p(obj->tt)) {
|
|
403
|
+
assign_class_name(mrb, obj, sym, v);
|
|
404
|
+
}
|
|
405
|
+
if (!obj->iv) {
|
|
406
|
+
obj->iv = iv_new(mrb);
|
|
407
|
+
}
|
|
408
|
+
iv_put(mrb, obj->iv, sym, v);
|
|
409
|
+
mrb_field_write_barrier_value(mrb, (struct RBasic*)obj, v);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/*
|
|
413
|
+
* Sets an instance variable on an object.
|
|
414
|
+
*
|
|
415
|
+
* This function checks if the object is frozen before setting the variable.
|
|
416
|
+
* It then calls mrb_obj_iv_set_force to actually set the variable.
|
|
417
|
+
*
|
|
418
|
+
* Args:
|
|
419
|
+
* mrb: The mruby state.
|
|
420
|
+
* obj: The object on which to set the instance variable.
|
|
421
|
+
* sym: The symbol representing the name of the instance variable.
|
|
422
|
+
* v: The value to set for the instance variable.
|
|
423
|
+
*/
|
|
424
|
+
MRB_API void
|
|
425
|
+
mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
|
|
426
|
+
{
|
|
427
|
+
mrb_check_frozen(mrb, obj);
|
|
428
|
+
mrb_obj_iv_set_force(mrb, obj, sym, v);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/*
|
|
432
|
+
* Iterates over the instance variables of an object.
|
|
433
|
+
*
|
|
434
|
+
* This function calls the provided callback function for each instance
|
|
435
|
+
* variable in the object.
|
|
436
|
+
*
|
|
437
|
+
* Args:
|
|
438
|
+
* mrb: The mruby state.
|
|
439
|
+
* obj: The mrb_value whose instance variables to iterate over.
|
|
440
|
+
* func: The callback function to call for each instance variable.
|
|
441
|
+
* The function should take mrb_state*, mrb_sym, mrb_value, and void*
|
|
442
|
+
* as arguments and return an int. If the callback returns a non-zero
|
|
443
|
+
* value, iteration stops.
|
|
444
|
+
* p: A pointer to user data that will be passed to the callback function.
|
|
445
|
+
*/
|
|
446
|
+
MRB_API void
|
|
447
|
+
mrb_iv_foreach(mrb_state *mrb, mrb_value obj, mrb_iv_foreach_func *func, void *p)
|
|
448
|
+
{
|
|
449
|
+
if (!obj_iv_p(obj)) return;
|
|
450
|
+
iv_foreach(mrb, mrb_obj_ptr(obj)->iv, func, p);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/*
|
|
454
|
+
* Sets an instance variable on an mrb_value.
|
|
455
|
+
*
|
|
456
|
+
* This function is a wrapper around mrb_obj_iv_set. It checks if the
|
|
457
|
+
* given mrb_value is an object that can have instance variables before
|
|
458
|
+
* attempting to set the variable. If the object cannot have instance
|
|
459
|
+
* variables, it raises an E_ARGUMENT_ERROR.
|
|
460
|
+
*
|
|
461
|
+
* Args:
|
|
462
|
+
* mrb: The mruby state.
|
|
463
|
+
* obj: The mrb_value on which to set the instance variable.
|
|
464
|
+
* sym: The symbol representing the name of the instance variable.
|
|
465
|
+
* v: The value to set for the instance variable.
|
|
466
|
+
*
|
|
467
|
+
* Raises:
|
|
468
|
+
* E_ARGUMENT_ERROR: If the object cannot have instance variables.
|
|
469
|
+
*/
|
|
470
|
+
MRB_API void
|
|
471
|
+
mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v)
|
|
472
|
+
{
|
|
473
|
+
if (obj_iv_p(obj)) {
|
|
474
|
+
mrb_obj_iv_set(mrb, mrb_obj_ptr(obj), sym, v);
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "cannot set instance variable");
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/*
|
|
482
|
+
* Checks if an instance variable is defined on an object.
|
|
483
|
+
*
|
|
484
|
+
* Args:
|
|
485
|
+
* mrb: The mruby state.
|
|
486
|
+
* obj: The object to check.
|
|
487
|
+
* sym: The symbol representing the name of the instance variable.
|
|
488
|
+
*
|
|
489
|
+
* Returns:
|
|
490
|
+
* TRUE if the instance variable is defined, FALSE otherwise.
|
|
491
|
+
*/
|
|
492
|
+
MRB_API mrb_bool
|
|
493
|
+
mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym)
|
|
494
|
+
{
|
|
495
|
+
iv_tbl *t;
|
|
496
|
+
|
|
497
|
+
t = obj->iv;
|
|
498
|
+
if (t && iv_get(mrb, t, sym, NULL)) return TRUE;
|
|
499
|
+
return FALSE;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/*
|
|
503
|
+
* Checks if an instance variable is defined on an mrb_value.
|
|
504
|
+
*
|
|
505
|
+
* This function is a wrapper around mrb_obj_iv_defined. It checks if the
|
|
506
|
+
* given mrb_value is an object that can have instance variables before
|
|
507
|
+
* attempting to check for the variable.
|
|
508
|
+
*
|
|
509
|
+
* Args:
|
|
510
|
+
* mrb: The mruby state.
|
|
511
|
+
* obj: The mrb_value to check.
|
|
512
|
+
* sym: The symbol representing the name of the instance variable.
|
|
513
|
+
*
|
|
514
|
+
* Returns:
|
|
515
|
+
* TRUE if the instance variable is defined and the object can have
|
|
516
|
+
* instance variables, FALSE otherwise.
|
|
517
|
+
*/
|
|
518
|
+
MRB_API mrb_bool
|
|
519
|
+
mrb_iv_defined(mrb_state *mrb, mrb_value obj, mrb_sym sym)
|
|
520
|
+
{
|
|
521
|
+
if (!obj_iv_p(obj)) return FALSE;
|
|
522
|
+
return mrb_obj_iv_defined(mrb, mrb_obj_ptr(obj), sym);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/*
|
|
526
|
+
* Checks if a symbol is a valid instance variable name.
|
|
527
|
+
*
|
|
528
|
+
* A valid instance variable name must:
|
|
529
|
+
* - Be at least 2 characters long.
|
|
530
|
+
* - Start with '@'.
|
|
531
|
+
* - Not have a digit as the second character.
|
|
532
|
+
* - The rest of the name must be a valid identifier.
|
|
533
|
+
*
|
|
534
|
+
* Args:
|
|
535
|
+
* mrb: The mruby state.
|
|
536
|
+
* iv_name: The symbol to check.
|
|
537
|
+
*
|
|
538
|
+
* Returns:
|
|
539
|
+
* TRUE if the symbol is a valid instance variable name, FALSE otherwise.
|
|
540
|
+
*/
|
|
541
|
+
MRB_API mrb_bool
|
|
542
|
+
mrb_iv_name_sym_p(mrb_state *mrb, mrb_sym iv_name)
|
|
543
|
+
{
|
|
544
|
+
mrb_int len;
|
|
545
|
+
const char *s = mrb_sym_name_len(mrb, iv_name, &len);
|
|
546
|
+
|
|
547
|
+
if (len < 2) return FALSE;
|
|
548
|
+
if (s[0] != '@') return FALSE;
|
|
549
|
+
if (ISDIGIT(s[1])) return FALSE;
|
|
550
|
+
return mrb_ident_p(s+1, len-1);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/*
|
|
554
|
+
* Checks if a symbol is a valid instance variable name and raises a
|
|
555
|
+
* name error if it's not.
|
|
556
|
+
*
|
|
557
|
+
* Args:
|
|
558
|
+
* mrb: The mruby state.
|
|
559
|
+
* iv_name: The symbol to check.
|
|
560
|
+
*
|
|
561
|
+
* Raises:
|
|
562
|
+
* E_NAME_ERROR: If the symbol is not a valid instance variable name.
|
|
563
|
+
*/
|
|
564
|
+
MRB_API void
|
|
565
|
+
mrb_iv_name_sym_check(mrb_state *mrb, mrb_sym iv_name)
|
|
566
|
+
{
|
|
567
|
+
if (!mrb_iv_name_sym_p(mrb, iv_name)) {
|
|
568
|
+
mrb_name_error(mrb, iv_name, "'%n' is not allowed as an instance variable name", iv_name);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/*
|
|
573
|
+
* Copies instance variables from one object to another.
|
|
574
|
+
*
|
|
575
|
+
* If the destination object already has instance variables, they are freed
|
|
576
|
+
* before copying.
|
|
577
|
+
*
|
|
578
|
+
* Args:
|
|
579
|
+
* mrb: The mruby state.
|
|
580
|
+
* dest: The destination object (mrb_value).
|
|
581
|
+
* src: The source object (mrb_value).
|
|
582
|
+
*/
|
|
583
|
+
MRB_API void
|
|
584
|
+
mrb_iv_copy(mrb_state *mrb, mrb_value dest, mrb_value src)
|
|
585
|
+
{
|
|
586
|
+
struct RObject *d = mrb_obj_ptr(dest);
|
|
587
|
+
struct RObject *s = mrb_obj_ptr(src);
|
|
588
|
+
|
|
589
|
+
if (d->iv) {
|
|
590
|
+
iv_free(mrb, d->iv);
|
|
591
|
+
d->iv = 0;
|
|
592
|
+
}
|
|
593
|
+
if (s->iv) {
|
|
594
|
+
mrb_write_barrier(mrb, (struct RBasic*)d);
|
|
595
|
+
d->iv = iv_copy(mrb, s->iv);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/*
|
|
600
|
+
* Removes an instance variable from an object.
|
|
601
|
+
*
|
|
602
|
+
* Args:
|
|
603
|
+
* mrb: The mruby state.
|
|
604
|
+
* obj: The object (mrb_value) from which to remove the instance variable.
|
|
605
|
+
* sym: The symbol representing the name of the instance variable.
|
|
606
|
+
*
|
|
607
|
+
* Returns:
|
|
608
|
+
* The value of the removed instance variable, or mrb_undef_value() if
|
|
609
|
+
* the instance variable was not defined or if the object cannot have
|
|
610
|
+
* instance variables.
|
|
611
|
+
*/
|
|
612
|
+
MRB_API mrb_value
|
|
613
|
+
mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym)
|
|
614
|
+
{
|
|
615
|
+
if (obj_iv_p(obj)) {
|
|
616
|
+
struct RObject *o = mrb_obj_ptr(obj);
|
|
617
|
+
iv_tbl *t = o->iv;
|
|
618
|
+
mrb_value val;
|
|
619
|
+
|
|
620
|
+
mrb_check_frozen(mrb, o);
|
|
621
|
+
if (iv_del(mrb, t, sym, &val)) {
|
|
622
|
+
return val;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return mrb_undef_value();
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
static int
|
|
629
|
+
iv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
|
|
630
|
+
{
|
|
631
|
+
mrb_value ary = *(mrb_value*)p;
|
|
632
|
+
mrb_int len;
|
|
633
|
+
const char* s = mrb_sym_name_len(mrb, sym, &len);
|
|
634
|
+
|
|
635
|
+
if (len > 1 && s[0] == '@' && s[1] != '@') {
|
|
636
|
+
mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
|
|
637
|
+
}
|
|
638
|
+
return 0;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/* 15.3.1.3.23 */
|
|
642
|
+
/*
|
|
643
|
+
* call-seq:
|
|
644
|
+
* obj.instance_variables -> array
|
|
645
|
+
*
|
|
646
|
+
* Returns an array of instance variable names for the receiver. Note
|
|
647
|
+
* that simply defining an accessor does not create the corresponding
|
|
648
|
+
* instance variable.
|
|
649
|
+
*
|
|
650
|
+
* class Fred
|
|
651
|
+
* attr_accessor :a1
|
|
652
|
+
* def initialize
|
|
653
|
+
* @iv = 3
|
|
654
|
+
* end
|
|
655
|
+
* end
|
|
656
|
+
* Fred.new.instance_variables #=> [:@iv]
|
|
657
|
+
*/
|
|
658
|
+
mrb_value
|
|
659
|
+
mrb_obj_instance_variables(mrb_state *mrb, mrb_value self)
|
|
660
|
+
{
|
|
661
|
+
mrb_value ary = mrb_ary_new(mrb);
|
|
662
|
+
|
|
663
|
+
if (obj_iv_p(self)) {
|
|
664
|
+
iv_foreach(mrb, mrb_obj_ptr(self)->iv, iv_i, &ary);
|
|
665
|
+
}
|
|
666
|
+
return ary;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
static int
|
|
670
|
+
cv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
|
|
671
|
+
{
|
|
672
|
+
mrb_value ary = *(mrb_value*)p;
|
|
673
|
+
mrb_int len;
|
|
674
|
+
const char* s = mrb_sym_name_len(mrb, sym, &len);
|
|
675
|
+
|
|
676
|
+
if (len > 2 && s[0] == '@' && s[1] == '@') {
|
|
677
|
+
mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
|
|
678
|
+
}
|
|
679
|
+
return 0;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
/* 15.2.2.4.19 */
|
|
683
|
+
/*
|
|
684
|
+
* call-seq:
|
|
685
|
+
* mod.class_variables(inherit=true) -> array
|
|
686
|
+
*
|
|
687
|
+
* Returns an array of the names of class variables in *mod*.
|
|
688
|
+
*
|
|
689
|
+
* class One
|
|
690
|
+
* @@var1 = 1
|
|
691
|
+
* end
|
|
692
|
+
* class Two < One
|
|
693
|
+
* @@var2 = 2
|
|
694
|
+
* end
|
|
695
|
+
* One.class_variables #=> [:@@var1]
|
|
696
|
+
* Two.class_variables #=> [:@@var2]
|
|
697
|
+
*/
|
|
698
|
+
mrb_value
|
|
699
|
+
mrb_mod_class_variables(mrb_state *mrb, mrb_value mod)
|
|
700
|
+
{
|
|
701
|
+
mrb_bool inherit = TRUE;
|
|
702
|
+
|
|
703
|
+
mrb_get_args(mrb, "|b", &inherit);
|
|
704
|
+
mrb_value ary = mrb_ary_new(mrb);
|
|
705
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
706
|
+
while (c) {
|
|
707
|
+
iv_foreach(mrb, class_iv_ptr(c), cv_i, &ary);
|
|
708
|
+
if (!inherit) break;
|
|
709
|
+
c = c->super;
|
|
710
|
+
}
|
|
711
|
+
return ary;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
mrb_value
|
|
715
|
+
mrb_mod_cv_get(mrb_state *mrb, struct RClass *c, mrb_sym sym)
|
|
716
|
+
{
|
|
717
|
+
struct RClass * cls = c;
|
|
718
|
+
mrb_value v = mrb_nil_value();
|
|
719
|
+
mrb_bool given = FALSE;
|
|
720
|
+
|
|
721
|
+
while (c) {
|
|
722
|
+
if (iv_get(mrb, class_iv_ptr(c), sym, &v)) {
|
|
723
|
+
given = TRUE;
|
|
724
|
+
}
|
|
725
|
+
c = c->super;
|
|
726
|
+
}
|
|
727
|
+
if (given) return v;
|
|
728
|
+
if (cls->tt == MRB_TT_SCLASS) {
|
|
729
|
+
mrb_value klass = mrb_obj_iv_get(mrb, (struct RObject*)cls, MRB_SYM(__attached__));
|
|
730
|
+
|
|
731
|
+
c = mrb_class_ptr(klass);
|
|
732
|
+
if (c->tt == MRB_TT_CLASS || c->tt == MRB_TT_MODULE) {
|
|
733
|
+
given = FALSE;
|
|
734
|
+
while (c) {
|
|
735
|
+
if (iv_get(mrb, class_iv_ptr(c), sym, &v)) {
|
|
736
|
+
given = TRUE;
|
|
737
|
+
}
|
|
738
|
+
c = c->super;
|
|
739
|
+
}
|
|
740
|
+
if (given) return v;
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
mrb_name_error(mrb, sym, "uninitialized class variable %n in %C", sym, cls);
|
|
744
|
+
/* not reached */
|
|
745
|
+
return mrb_nil_value();
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/*
|
|
749
|
+
* Retrieves a class variable from a module or class.
|
|
750
|
+
*
|
|
751
|
+
* This function is a wrapper around mrb_mod_cv_get.
|
|
752
|
+
*
|
|
753
|
+
* Args:
|
|
754
|
+
* mrb: The mruby state.
|
|
755
|
+
* mod: The module or class (mrb_value) from which to retrieve the class variable.
|
|
756
|
+
* sym: The symbol representing the name of the class variable.
|
|
757
|
+
*
|
|
758
|
+
* Returns:
|
|
759
|
+
* The value of the class variable.
|
|
760
|
+
*
|
|
761
|
+
* Raises:
|
|
762
|
+
* E_NAME_ERROR: If the class variable is not defined.
|
|
763
|
+
*/
|
|
764
|
+
MRB_API mrb_value
|
|
765
|
+
mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
|
|
766
|
+
{
|
|
767
|
+
return mrb_mod_cv_get(mrb, mrb_class_ptr(mod), sym);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
/*
|
|
771
|
+
* Sets a class variable in a module or class.
|
|
772
|
+
*
|
|
773
|
+
* This function searches for the class variable in the superclass chain.
|
|
774
|
+
* If found, it updates the value in the class where it's defined.
|
|
775
|
+
* Otherwise, it sets the variable in the given class `c`.
|
|
776
|
+
*
|
|
777
|
+
* Args:
|
|
778
|
+
* mrb: The mruby state.
|
|
779
|
+
* c: The class or module (struct RClass*) in which to set the class variable.
|
|
780
|
+
* sym: The symbol representing the name of the class variable.
|
|
781
|
+
* v: The value to set for the class variable.
|
|
782
|
+
*/
|
|
783
|
+
MRB_API void
|
|
784
|
+
mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
|
|
785
|
+
{
|
|
786
|
+
struct RClass * cls = c;
|
|
787
|
+
|
|
788
|
+
while (c) {
|
|
789
|
+
iv_tbl *t = class_iv_ptr(c);
|
|
790
|
+
int pos = iv_get(mrb, t, sym, NULL);
|
|
791
|
+
|
|
792
|
+
if (pos) {
|
|
793
|
+
mrb_check_frozen(mrb, c);
|
|
794
|
+
t->ptr[pos-1] = v; /* iv_get returns pos+1 to put */
|
|
795
|
+
mrb_field_write_barrier_value(mrb, (struct RBasic*)c, v);
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
c = c->super;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
if (cls->tt == MRB_TT_SCLASS) {
|
|
802
|
+
mrb_value klass = mrb_obj_iv_get(mrb, (struct RObject*)cls, MRB_SYM(__attached__));
|
|
803
|
+
|
|
804
|
+
switch (mrb_type(klass)) {
|
|
805
|
+
case MRB_TT_CLASS:
|
|
806
|
+
case MRB_TT_MODULE:
|
|
807
|
+
case MRB_TT_SCLASS:
|
|
808
|
+
c = mrb_class_ptr(klass);
|
|
809
|
+
break;
|
|
810
|
+
default:
|
|
811
|
+
c = cls;
|
|
812
|
+
break;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
else if (cls->tt == MRB_TT_ICLASS) {
|
|
816
|
+
c = cls->c;
|
|
817
|
+
}
|
|
818
|
+
else {
|
|
819
|
+
c = cls;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
mrb_check_frozen(mrb, c);
|
|
823
|
+
if (!c->iv) {
|
|
824
|
+
c->iv = iv_new(mrb);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
iv_put(mrb, c->iv, sym, v);
|
|
828
|
+
mrb_field_write_barrier_value(mrb, (struct RBasic*)c, v);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/*
|
|
832
|
+
* Sets a class variable in a module or class.
|
|
833
|
+
*
|
|
834
|
+
* This function is a wrapper around mrb_mod_cv_set.
|
|
835
|
+
*
|
|
836
|
+
* Args:
|
|
837
|
+
* mrb: The mruby state.
|
|
838
|
+
* mod: The module or class (mrb_value) in which to set the class variable.
|
|
839
|
+
* sym: The symbol representing the name of the class variable.
|
|
840
|
+
* v: The value to set for the class variable.
|
|
841
|
+
*/
|
|
842
|
+
MRB_API void
|
|
843
|
+
mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v)
|
|
844
|
+
{
|
|
845
|
+
mrb_mod_cv_set(mrb, mrb_class_ptr(mod), sym, v);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/*
|
|
849
|
+
* Checks if a class variable is defined in a module or class or its ancestors.
|
|
850
|
+
*
|
|
851
|
+
* Args:
|
|
852
|
+
* mrb: The mruby state.
|
|
853
|
+
* c: The class or module (struct RClass*) to check.
|
|
854
|
+
* sym: The symbol representing the name of the class variable.
|
|
855
|
+
*
|
|
856
|
+
* Returns:
|
|
857
|
+
* TRUE if the class variable is defined, FALSE otherwise.
|
|
858
|
+
*/
|
|
859
|
+
mrb_bool
|
|
860
|
+
mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym)
|
|
861
|
+
{
|
|
862
|
+
while (c) {
|
|
863
|
+
iv_tbl *t = class_iv_ptr(c);
|
|
864
|
+
if (iv_get(mrb, t, sym, NULL)) return TRUE;
|
|
865
|
+
c = c->super;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
return FALSE;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/*
|
|
872
|
+
* Checks if a class variable is defined in a module or class or its ancestors.
|
|
873
|
+
*
|
|
874
|
+
* This function is a wrapper around mrb_mod_cv_defined.
|
|
875
|
+
*
|
|
876
|
+
* Args:
|
|
877
|
+
* mrb: The mruby state.
|
|
878
|
+
* mod: The module or class (mrb_value) to check.
|
|
879
|
+
* sym: The symbol representing the name of the class variable.
|
|
880
|
+
*
|
|
881
|
+
* Returns:
|
|
882
|
+
* TRUE if the class variable is defined, FALSE otherwise.
|
|
883
|
+
*/
|
|
884
|
+
MRB_API mrb_bool
|
|
885
|
+
mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym)
|
|
886
|
+
{
|
|
887
|
+
return mrb_mod_cv_defined(mrb, mrb_class_ptr(mod), sym);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
mrb_value
|
|
891
|
+
mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym)
|
|
892
|
+
{
|
|
893
|
+
struct RClass *c;
|
|
894
|
+
|
|
895
|
+
const struct RProc *p = mrb->c->ci->proc;
|
|
896
|
+
|
|
897
|
+
for (;;) {
|
|
898
|
+
c = MRB_PROC_TARGET_CLASS(p);
|
|
899
|
+
if (c && c->tt != MRB_TT_SCLASS) break;
|
|
900
|
+
p = p->upper;
|
|
901
|
+
}
|
|
902
|
+
return mrb_mod_cv_get(mrb, c, sym);
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
void
|
|
906
|
+
mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
|
|
907
|
+
{
|
|
908
|
+
struct RClass *c;
|
|
909
|
+
const struct RProc *p = mrb->c->ci->proc;
|
|
910
|
+
|
|
911
|
+
for (;;) {
|
|
912
|
+
c = MRB_PROC_TARGET_CLASS(p);
|
|
913
|
+
if (c && c->tt != MRB_TT_SCLASS) break;
|
|
914
|
+
p = p->upper;
|
|
915
|
+
}
|
|
916
|
+
mrb_mod_cv_set(mrb, c, sym, v);
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
static void
|
|
920
|
+
mod_const_check(mrb_state *mrb, mrb_value mod)
|
|
921
|
+
{
|
|
922
|
+
switch (mrb_type(mod)) {
|
|
923
|
+
case MRB_TT_CLASS:
|
|
924
|
+
case MRB_TT_MODULE:
|
|
925
|
+
case MRB_TT_SCLASS:
|
|
926
|
+
break;
|
|
927
|
+
default:
|
|
928
|
+
mrb_raise(mrb, E_TYPE_ERROR, "constant look-up for non class/module");
|
|
929
|
+
break;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
static mrb_value
|
|
934
|
+
const_get_nohook(mrb_state *mrb, struct RClass *base, mrb_sym sym, mrb_bool skip)
|
|
935
|
+
{
|
|
936
|
+
struct RClass *c = base;
|
|
937
|
+
mrb_value v;
|
|
938
|
+
mrb_bool retry = FALSE;
|
|
939
|
+
|
|
940
|
+
/* if skip then skip the current class (already searched) */
|
|
941
|
+
if (skip) c = c->super;
|
|
942
|
+
L_RETRY:
|
|
943
|
+
while (c) {
|
|
944
|
+
if (!MRB_FLAG_TEST(c, MRB_FL_CLASS_IS_PREPENDED) && iv_get(mrb, class_iv_ptr(c), sym, &v)) {
|
|
945
|
+
return v;
|
|
946
|
+
}
|
|
947
|
+
c = c->super;
|
|
948
|
+
if (!skip && c == mrb->object_class) break;
|
|
949
|
+
}
|
|
950
|
+
if (!retry && base->tt == MRB_TT_MODULE && skip) {
|
|
951
|
+
c = mrb->object_class;
|
|
952
|
+
retry = TRUE;
|
|
953
|
+
goto L_RETRY;
|
|
954
|
+
}
|
|
955
|
+
return mrb_undef_value();
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
static mrb_value
|
|
959
|
+
const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym, mrb_bool skip)
|
|
960
|
+
{
|
|
961
|
+
mrb_value v = const_get_nohook(mrb, base, sym, skip);
|
|
962
|
+
|
|
963
|
+
/* call const_missing hook */
|
|
964
|
+
if (mrb_undef_p(v)) {
|
|
965
|
+
mrb_value mod = mrb_obj_value(base);
|
|
966
|
+
if (mrb_func_basic_p(mrb, mod, MRB_SYM(const_missing), mrb_mod_const_missing)) {
|
|
967
|
+
return mrb_const_missing(mrb, mod, sym);
|
|
968
|
+
}
|
|
969
|
+
mrb_value name = mrb_symbol_value(sym);
|
|
970
|
+
return mrb_funcall_argv(mrb, mod, MRB_SYM(const_missing), 1, &name);
|
|
971
|
+
}
|
|
972
|
+
return v;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
mrb_value
|
|
976
|
+
mrb_exc_const_get(mrb_state *mrb, mrb_sym sym)
|
|
977
|
+
{
|
|
978
|
+
return const_get_nohook(mrb, mrb->object_class, sym, FALSE);
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
/*
|
|
982
|
+
* Retrieves a constant from a module or class.
|
|
983
|
+
*
|
|
984
|
+
* It first checks if `mod` is a class or module, then calls the
|
|
985
|
+
* internal `const_get` function to retrieve the constant.
|
|
986
|
+
* This function will also call the `const_missing` hook if the
|
|
987
|
+
* constant is not found.
|
|
988
|
+
*
|
|
989
|
+
* Args:
|
|
990
|
+
* mrb: The mruby state.
|
|
991
|
+
* mod: The module or class (mrb_value) from which to retrieve the constant.
|
|
992
|
+
* sym: The symbol representing the name of the constant.
|
|
993
|
+
*
|
|
994
|
+
* Returns:
|
|
995
|
+
* The value of the constant.
|
|
996
|
+
*
|
|
997
|
+
* Raises:
|
|
998
|
+
* E_TYPE_ERROR: If `mod` is not a class or module.
|
|
999
|
+
* E_NAME_ERROR: If the constant is not defined and `const_missing` is not defined or also raises an error.
|
|
1000
|
+
*/
|
|
1001
|
+
MRB_API mrb_value
|
|
1002
|
+
mrb_const_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
|
|
1003
|
+
{
|
|
1004
|
+
mod_const_check(mrb, mod);
|
|
1005
|
+
return const_get(mrb, mrb_class_ptr(mod), sym, FALSE);
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
mrb_value
|
|
1009
|
+
mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
|
|
1010
|
+
{
|
|
1011
|
+
const struct RProc *proc = mrb->c->ci->proc;
|
|
1012
|
+
struct RClass *c = MRB_PROC_TARGET_CLASS(proc), *c2;
|
|
1013
|
+
mrb_value v;
|
|
1014
|
+
|
|
1015
|
+
if (!c) c = mrb->object_class;
|
|
1016
|
+
if (iv_get(mrb, class_iv_ptr(c), sym, &v)) {
|
|
1017
|
+
return v;
|
|
1018
|
+
}
|
|
1019
|
+
for (proc = proc->upper; proc; proc = proc->upper) {
|
|
1020
|
+
c2 = MRB_PROC_TARGET_CLASS(proc);
|
|
1021
|
+
if (!c2) c2 = mrb->object_class;
|
|
1022
|
+
if (iv_get(mrb, class_iv_ptr(c2), sym, &v)) {
|
|
1023
|
+
return v;
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
if (c->tt == MRB_TT_SCLASS) {
|
|
1027
|
+
v = const_get_nohook(mrb, c, sym, TRUE);
|
|
1028
|
+
if (!mrb_undef_p(v)) {
|
|
1029
|
+
return v;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
mrb_value klass;
|
|
1033
|
+
for (c2 = c; c2 && c2->tt == MRB_TT_SCLASS; c2 = mrb_class_ptr(klass)) {
|
|
1034
|
+
if (!iv_get(mrb, class_iv_ptr(c2), MRB_SYM(__attached__), &klass)) {
|
|
1035
|
+
c2 = NULL;
|
|
1036
|
+
break;
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
if (c2 && (c2->tt == MRB_TT_CLASS || c2->tt == MRB_TT_MODULE)) c = c2;
|
|
1040
|
+
}
|
|
1041
|
+
return const_get(mrb, c, sym, TRUE);
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
/*
|
|
1045
|
+
* Sets a constant in a module or class.
|
|
1046
|
+
*
|
|
1047
|
+
* It first checks if `mod` is a class or module.
|
|
1048
|
+
* If the value `v` being set is a class or module, it calls
|
|
1049
|
+
* `mrb_class_name_class` to set up the class/module name.
|
|
1050
|
+
* Then, it sets the constant using `mrb_obj_iv_set` and calls
|
|
1051
|
+
* the `const_added` hook.
|
|
1052
|
+
*
|
|
1053
|
+
* Args:
|
|
1054
|
+
* mrb: The mruby state.
|
|
1055
|
+
* mod: The module or class (mrb_value) in which to set the constant.
|
|
1056
|
+
* sym: The symbol representing the name of the constant.
|
|
1057
|
+
* v: The value to set for the constant.
|
|
1058
|
+
*
|
|
1059
|
+
* Raises:
|
|
1060
|
+
* E_TYPE_ERROR: If `mod` is not a class or module.
|
|
1061
|
+
*/
|
|
1062
|
+
MRB_API void
|
|
1063
|
+
mrb_const_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v)
|
|
1064
|
+
{
|
|
1065
|
+
mod_const_check(mrb, mod);
|
|
1066
|
+
if (mrb_type(v) == MRB_TT_CLASS || mrb_type(v) == MRB_TT_MODULE) {
|
|
1067
|
+
mrb_class_name_class(mrb, mrb_class_ptr(mod), mrb_class_ptr(v), sym);
|
|
1068
|
+
}
|
|
1069
|
+
mrb_obj_iv_set(mrb, mrb_obj_ptr(mod), sym, v);
|
|
1070
|
+
|
|
1071
|
+
if (!mrb->bootstrapping) {
|
|
1072
|
+
mrb_value name = mrb_symbol_value(sym);
|
|
1073
|
+
mrb_funcall_argv(mrb, mod, MRB_SYM(const_added), 1, &name);
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
/*
|
|
1078
|
+
* Removes a constant from a module or class.
|
|
1079
|
+
*
|
|
1080
|
+
* It first checks if `mod` is a class or module, then removes the
|
|
1081
|
+
* constant using `mrb_iv_remove`.
|
|
1082
|
+
*
|
|
1083
|
+
* Args:
|
|
1084
|
+
* mrb: The mruby state.
|
|
1085
|
+
* mod: The module or class (mrb_value) from which to remove the constant.
|
|
1086
|
+
* sym: The symbol representing the name of the constant.
|
|
1087
|
+
*
|
|
1088
|
+
* Raises:
|
|
1089
|
+
* E_TYPE_ERROR: If `mod` is not a class or module.
|
|
1090
|
+
*/
|
|
1091
|
+
MRB_API void
|
|
1092
|
+
mrb_const_remove(mrb_state *mrb, mrb_value mod, mrb_sym sym)
|
|
1093
|
+
{
|
|
1094
|
+
mod_const_check(mrb, mod);
|
|
1095
|
+
mrb_iv_remove(mrb, mod, sym);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
/*
|
|
1099
|
+
* Defines a constant in a module or class using a symbol for the name.
|
|
1100
|
+
*
|
|
1101
|
+
* This is a direct way to set a constant without triggering `const_added` hook.
|
|
1102
|
+
*
|
|
1103
|
+
* Args:
|
|
1104
|
+
* mrb: The mruby state.
|
|
1105
|
+
* mod: The module or class (struct RClass*) in which to define the constant.
|
|
1106
|
+
* name: The symbol representing the name of the constant.
|
|
1107
|
+
* v: The value to set for the constant.
|
|
1108
|
+
*/
|
|
1109
|
+
MRB_API void
|
|
1110
|
+
mrb_define_const_id(mrb_state *mrb, struct RClass *mod, mrb_sym name, mrb_value v)
|
|
1111
|
+
{
|
|
1112
|
+
mrb_obj_iv_set(mrb, (struct RObject*)mod, name, v);
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
/*
|
|
1116
|
+
* Defines a constant in a module or class using a C string for the name.
|
|
1117
|
+
*
|
|
1118
|
+
* This is a direct way to set a constant without triggering `const_added` hook.
|
|
1119
|
+
* The C string name is interned into a symbol.
|
|
1120
|
+
*
|
|
1121
|
+
* Args:
|
|
1122
|
+
* mrb: The mruby state.
|
|
1123
|
+
* mod: The module or class (struct RClass*) in which to define the constant.
|
|
1124
|
+
* name: The C string representing the name of the constant.
|
|
1125
|
+
* v: The value to set for the constant.
|
|
1126
|
+
*/
|
|
1127
|
+
MRB_API void
|
|
1128
|
+
mrb_define_const(mrb_state *mrb, struct RClass *mod, const char *name, mrb_value v)
|
|
1129
|
+
{
|
|
1130
|
+
mrb_obj_iv_set(mrb, (struct RObject*)mod, mrb_intern_cstr(mrb, name), v);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
/*
|
|
1134
|
+
* Defines a global constant.
|
|
1135
|
+
*
|
|
1136
|
+
* Global constants are defined in the `Object` class.
|
|
1137
|
+
* This function is a convenience wrapper around `mrb_define_const`.
|
|
1138
|
+
*
|
|
1139
|
+
* Args:
|
|
1140
|
+
* mrb: The mruby state.
|
|
1141
|
+
* name: The C string representing the name of the global constant.
|
|
1142
|
+
* val: The value to set for the global constant.
|
|
1143
|
+
*/
|
|
1144
|
+
MRB_API void
|
|
1145
|
+
mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val)
|
|
1146
|
+
{
|
|
1147
|
+
mrb_define_const(mrb, mrb->object_class, name, val);
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
static int
|
|
1151
|
+
const_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
|
|
1152
|
+
{
|
|
1153
|
+
mrb_value ary = *(mrb_value*)p;
|
|
1154
|
+
mrb_int len;
|
|
1155
|
+
const char* s = mrb_sym_name_len(mrb, sym, &len);
|
|
1156
|
+
|
|
1157
|
+
if (len >= 1 && ISUPPER(s[0])) {
|
|
1158
|
+
mrb_int i, alen = RARRAY_LEN(ary);
|
|
1159
|
+
|
|
1160
|
+
for (i=0; i<alen; i++) {
|
|
1161
|
+
if (mrb_symbol(RARRAY_PTR(ary)[i]) == sym)
|
|
1162
|
+
break;
|
|
1163
|
+
}
|
|
1164
|
+
if (i==alen) {
|
|
1165
|
+
mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
return 0;
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
mrb_value
|
|
1172
|
+
mrb_mod_const_at(mrb_state *mrb, struct RClass *c, mrb_value ary)
|
|
1173
|
+
{
|
|
1174
|
+
iv_foreach(mrb, class_iv_ptr(c), const_i, &ary);
|
|
1175
|
+
return ary;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
/* 15.2.2.4.24 */
|
|
1179
|
+
/*
|
|
1180
|
+
* call-seq:
|
|
1181
|
+
* mod.constants -> array
|
|
1182
|
+
*
|
|
1183
|
+
* Returns an array of all names of constants defined in the receiver.
|
|
1184
|
+
*/
|
|
1185
|
+
mrb_value
|
|
1186
|
+
mrb_mod_constants(mrb_state *mrb, mrb_value mod)
|
|
1187
|
+
{
|
|
1188
|
+
mrb_bool inherit = TRUE;
|
|
1189
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
1190
|
+
|
|
1191
|
+
mrb_get_args(mrb, "|b", &inherit);
|
|
1192
|
+
mrb_value ary = mrb_ary_new(mrb);
|
|
1193
|
+
while (c) {
|
|
1194
|
+
mrb_mod_const_at(mrb, c, ary);
|
|
1195
|
+
if (!inherit) break;
|
|
1196
|
+
c = c->super;
|
|
1197
|
+
if (c == mrb->object_class) break;
|
|
1198
|
+
}
|
|
1199
|
+
return ary;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/*
|
|
1203
|
+
* Retrieves a global variable.
|
|
1204
|
+
*
|
|
1205
|
+
* Args:
|
|
1206
|
+
* mrb: The mruby state.
|
|
1207
|
+
* sym: The symbol representing the name of the global variable.
|
|
1208
|
+
*
|
|
1209
|
+
* Returns:
|
|
1210
|
+
* The value of the global variable, or mrb_nil_value() if the
|
|
1211
|
+
* global variable is not defined.
|
|
1212
|
+
*/
|
|
1213
|
+
MRB_API mrb_value
|
|
1214
|
+
mrb_gv_get(mrb_state *mrb, mrb_sym sym)
|
|
1215
|
+
{
|
|
1216
|
+
mrb_value v;
|
|
1217
|
+
|
|
1218
|
+
if (iv_get(mrb, mrb->globals, sym, &v))
|
|
1219
|
+
return v;
|
|
1220
|
+
return mrb_nil_value();
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
/*
|
|
1224
|
+
* Sets a global variable.
|
|
1225
|
+
*
|
|
1226
|
+
* If the global variable table (`mrb->globals`) does not exist, it is created.
|
|
1227
|
+
*
|
|
1228
|
+
* Args:
|
|
1229
|
+
* mrb: The mruby state.
|
|
1230
|
+
* sym: The symbol representing the name of the global variable.
|
|
1231
|
+
* v: The value to set for the global variable.
|
|
1232
|
+
*/
|
|
1233
|
+
MRB_API void
|
|
1234
|
+
mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
|
|
1235
|
+
{
|
|
1236
|
+
iv_tbl *t;
|
|
1237
|
+
|
|
1238
|
+
if (!mrb->globals) {
|
|
1239
|
+
mrb->globals = iv_new(mrb);
|
|
1240
|
+
}
|
|
1241
|
+
t = mrb->globals;
|
|
1242
|
+
iv_put(mrb, t, sym, v);
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
/*
|
|
1246
|
+
* Removes a global variable.
|
|
1247
|
+
*
|
|
1248
|
+
* Args:
|
|
1249
|
+
* mrb: The mruby state.
|
|
1250
|
+
* sym: The symbol representing the name of the global variable to remove.
|
|
1251
|
+
*/
|
|
1252
|
+
MRB_API void
|
|
1253
|
+
mrb_gv_remove(mrb_state *mrb, mrb_sym sym)
|
|
1254
|
+
{
|
|
1255
|
+
iv_del(mrb, mrb->globals, sym, NULL);
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
static int
|
|
1259
|
+
gv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
|
|
1260
|
+
{
|
|
1261
|
+
mrb_value ary = *(mrb_value*)p;
|
|
1262
|
+
mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
|
|
1263
|
+
return 0;
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
/* 15.3.1.2.4 */
|
|
1267
|
+
/* 15.3.1.3.14 */
|
|
1268
|
+
/*
|
|
1269
|
+
* call-seq:
|
|
1270
|
+
* global_variables -> array
|
|
1271
|
+
*
|
|
1272
|
+
* Returns an array of the names of global variables.
|
|
1273
|
+
*
|
|
1274
|
+
* global_variables.grep /std/ #=> [:$stdin, :$stdout, :$stderr]
|
|
1275
|
+
*/
|
|
1276
|
+
mrb_value
|
|
1277
|
+
mrb_f_global_variables(mrb_state *mrb, mrb_value self)
|
|
1278
|
+
{
|
|
1279
|
+
iv_tbl *t = mrb->globals;
|
|
1280
|
+
mrb_value ary = mrb_ary_new(mrb);
|
|
1281
|
+
|
|
1282
|
+
iv_foreach(mrb, t, gv_i, &ary);
|
|
1283
|
+
return ary;
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
static mrb_bool
|
|
1287
|
+
const_defined_0(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool exclude, mrb_bool recurse)
|
|
1288
|
+
{
|
|
1289
|
+
struct RClass *klass = mrb_class_ptr(mod);
|
|
1290
|
+
struct RClass *tmp;
|
|
1291
|
+
mrb_bool mod_retry = FALSE;
|
|
1292
|
+
|
|
1293
|
+
tmp = klass;
|
|
1294
|
+
retry:
|
|
1295
|
+
while (tmp) {
|
|
1296
|
+
if (iv_get(mrb, class_iv_ptr(tmp), id, NULL)) {
|
|
1297
|
+
return TRUE;
|
|
1298
|
+
}
|
|
1299
|
+
if (!recurse && (klass != mrb->object_class)) break;
|
|
1300
|
+
tmp = tmp->super;
|
|
1301
|
+
}
|
|
1302
|
+
if (!exclude && !mod_retry && (klass->tt == MRB_TT_MODULE)) {
|
|
1303
|
+
mod_retry = TRUE;
|
|
1304
|
+
tmp = mrb->object_class;
|
|
1305
|
+
goto retry;
|
|
1306
|
+
}
|
|
1307
|
+
return FALSE;
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
/*
|
|
1311
|
+
* Checks if a constant is defined in a module or class or its ancestors.
|
|
1312
|
+
*
|
|
1313
|
+
* This function calls `const_defined_0` with `recurse = TRUE`, meaning
|
|
1314
|
+
* it will search the superclass chain.
|
|
1315
|
+
*
|
|
1316
|
+
* Args:
|
|
1317
|
+
* mrb: The mruby state.
|
|
1318
|
+
* mod: The module or class (mrb_value) to check.
|
|
1319
|
+
* id: The symbol representing the name of the constant.
|
|
1320
|
+
*
|
|
1321
|
+
* Returns:
|
|
1322
|
+
* TRUE if the constant is defined, FALSE otherwise.
|
|
1323
|
+
*/
|
|
1324
|
+
MRB_API mrb_bool
|
|
1325
|
+
mrb_const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id)
|
|
1326
|
+
{
|
|
1327
|
+
return const_defined_0(mrb, mod, id, TRUE, TRUE);
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
/*
|
|
1331
|
+
* Checks if a constant is defined directly in a module or class.
|
|
1332
|
+
*
|
|
1333
|
+
* This function calls `const_defined_0` with `recurse = FALSE`, meaning
|
|
1334
|
+
* it will only search the given module/class, not its ancestors.
|
|
1335
|
+
*
|
|
1336
|
+
* Args:
|
|
1337
|
+
* mrb: The mruby state.
|
|
1338
|
+
* mod: The module or class (mrb_value) to check.
|
|
1339
|
+
* id: The symbol representing the name of the constant.
|
|
1340
|
+
*
|
|
1341
|
+
* Returns:
|
|
1342
|
+
* TRUE if the constant is defined directly in the module/class, FALSE otherwise.
|
|
1343
|
+
*/
|
|
1344
|
+
MRB_API mrb_bool
|
|
1345
|
+
mrb_const_defined_at(mrb_state *mrb, mrb_value mod, mrb_sym id)
|
|
1346
|
+
{
|
|
1347
|
+
return const_defined_0(mrb, mod, id, TRUE, FALSE);
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
/*
|
|
1351
|
+
* Retrieves an attribute (instance variable) from an object.
|
|
1352
|
+
*
|
|
1353
|
+
* This function is a simple wrapper around `mrb_iv_get`.
|
|
1354
|
+
*
|
|
1355
|
+
* Args:
|
|
1356
|
+
* mrb: The mruby state.
|
|
1357
|
+
* obj: The object (mrb_value) from which to retrieve the attribute.
|
|
1358
|
+
* id: The symbol representing the name of the attribute (instance variable).
|
|
1359
|
+
*
|
|
1360
|
+
* Returns:
|
|
1361
|
+
* The value of the attribute, or mrb_nil_value() if not defined.
|
|
1362
|
+
*/
|
|
1363
|
+
MRB_API mrb_value
|
|
1364
|
+
mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id)
|
|
1365
|
+
{
|
|
1366
|
+
return mrb_iv_get(mrb, obj, id);
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
struct csym_arg {
|
|
1370
|
+
struct RClass *c;
|
|
1371
|
+
mrb_sym sym;
|
|
1372
|
+
};
|
|
1373
|
+
|
|
1374
|
+
static int
|
|
1375
|
+
csym_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
|
|
1376
|
+
{
|
|
1377
|
+
struct csym_arg *a = (struct csym_arg*)p;
|
|
1378
|
+
struct RClass *c = a->c;
|
|
1379
|
+
|
|
1380
|
+
if (mrb_type(v) == c->tt && mrb_class_ptr(v) == c) {
|
|
1381
|
+
a->sym = sym;
|
|
1382
|
+
return 1; /* stop iteration */
|
|
1383
|
+
}
|
|
1384
|
+
return 0;
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
static mrb_sym
|
|
1388
|
+
find_class_sym(mrb_state *mrb, struct RClass *outer, struct RClass *c)
|
|
1389
|
+
{
|
|
1390
|
+
struct csym_arg arg;
|
|
1391
|
+
|
|
1392
|
+
if (!outer) return 0;
|
|
1393
|
+
if (outer == c) return 0;
|
|
1394
|
+
arg.c = c;
|
|
1395
|
+
arg.sym = 0;
|
|
1396
|
+
iv_foreach(mrb, class_iv_ptr(outer), csym_i, &arg);
|
|
1397
|
+
return arg.sym;
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
MRB_API struct RClass*
|
|
1401
|
+
mrb_class_outer(mrb_state *mrb, struct RClass *c)
|
|
1402
|
+
{
|
|
1403
|
+
mrb_value ov = mrb_obj_iv_get(mrb, (struct RObject*)c, MRB_SYM(__outer__));
|
|
1404
|
+
if (mrb_nil_p(ov)) return NULL;
|
|
1405
|
+
switch (mrb_type(ov)) {
|
|
1406
|
+
case MRB_TT_CLASS:
|
|
1407
|
+
case MRB_TT_MODULE:
|
|
1408
|
+
return mrb_class_ptr(ov);
|
|
1409
|
+
default:
|
|
1410
|
+
break;
|
|
1411
|
+
}
|
|
1412
|
+
return NULL;
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
static mrb_bool
|
|
1416
|
+
detect_outer_loop(mrb_state *mrb, struct RClass *c)
|
|
1417
|
+
{
|
|
1418
|
+
struct RClass *t = c; /* tortoise */
|
|
1419
|
+
struct RClass *h = c; /* hare */
|
|
1420
|
+
|
|
1421
|
+
for (;;) {
|
|
1422
|
+
if (h == NULL) return FALSE;
|
|
1423
|
+
h = mrb_class_outer(mrb, h);
|
|
1424
|
+
if (h == NULL) return FALSE;
|
|
1425
|
+
h = mrb_class_outer(mrb, h);
|
|
1426
|
+
t = mrb_class_outer(mrb, t);
|
|
1427
|
+
if (t == h) return TRUE;
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
mrb_value
|
|
1432
|
+
mrb_class_find_path(mrb_state *mrb, struct RClass *c)
|
|
1433
|
+
{
|
|
1434
|
+
if (detect_outer_loop(mrb, c)) return mrb_nil_value();
|
|
1435
|
+
struct RClass *outer = mrb_class_outer(mrb, c);
|
|
1436
|
+
if (outer == NULL) return mrb_nil_value();
|
|
1437
|
+
|
|
1438
|
+
mrb_sym name = find_class_sym(mrb, outer, c);
|
|
1439
|
+
if (name == 0) return mrb_nil_value();
|
|
1440
|
+
|
|
1441
|
+
mrb_value path = mrb_str_new_capa(mrb, 40);
|
|
1442
|
+
const char *cname = mrb_class_name(mrb, outer);
|
|
1443
|
+
mrb_str_cat_cstr(mrb, path, cname);
|
|
1444
|
+
mrb_str_cat_cstr(mrb, path, "::");
|
|
1445
|
+
|
|
1446
|
+
mrb_int len;
|
|
1447
|
+
const char *str = mrb_sym_name_len(mrb, name, &len);
|
|
1448
|
+
mrb_str_cat(mrb, path, str, len);
|
|
1449
|
+
if (RSTRING_PTR(path)[0] != '#') {
|
|
1450
|
+
iv_del(mrb, c->iv, MRB_SYM(__outer__), NULL);
|
|
1451
|
+
iv_put(mrb, c->iv, MRB_SYM(__classname__), path);
|
|
1452
|
+
mrb_field_write_barrier_value(mrb, (struct RBasic*)c, path);
|
|
1453
|
+
path = mrb_str_dup(mrb, path);
|
|
1454
|
+
}
|
|
1455
|
+
return path;
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
size_t
|
|
1459
|
+
mrb_obj_iv_tbl_memsize(mrb_value obj)
|
|
1460
|
+
{
|
|
1461
|
+
iv_tbl *t = mrb_obj_ptr(obj)->iv;
|
|
1462
|
+
if (t == NULL) return 0;
|
|
1463
|
+
return sizeof(iv_tbl) + t->alloc*(sizeof(mrb_value)+sizeof(mrb_sym));
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
|
|
1467
|
+
|
|
1468
|
+
mrb_bool
|
|
1469
|
+
mrb_ident_p(const char *s, mrb_int len)
|
|
1470
|
+
{
|
|
1471
|
+
for (mrb_int i = 0; i < len; i++) {
|
|
1472
|
+
if (!identchar(s[i])) return FALSE;
|
|
1473
|
+
}
|
|
1474
|
+
return TRUE;
|
|
1475
|
+
}
|