esruby 0.0.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/LICENSE +21 -0
- data/README.md +22 -0
- data/bin/esruby +34 -0
- data/lib/esruby.rb +26 -0
- data/lib/esruby/build.rb +140 -0
- data/lib/esruby/build/configuration.rb +77 -0
- data/lib/esruby/gem.rb +5 -0
- data/lib/esruby/gem/specification.rb +35 -0
- data/resources/build_config.eruby +53 -0
- data/resources/cpp/esruby.cpp +64 -0
- data/resources/cpp/esruby.hpp +42 -0
- data/resources/cpp/main.cpp +9 -0
- data/resources/js/esruby.js +45 -0
- data/resources/mruby/AUTHORS +40 -0
- data/resources/mruby/CONTRIBUTING.md +68 -0
- data/resources/mruby/LEGAL +6 -0
- data/resources/mruby/MITL +20 -0
- data/resources/mruby/Makefile +17 -0
- data/resources/mruby/NEWS +13 -0
- data/resources/mruby/README.md +92 -0
- data/resources/mruby/Rakefile +152 -0
- data/resources/mruby/TODO +10 -0
- data/resources/mruby/appveyor.yml +38 -0
- data/resources/mruby/appveyor_config.rb +50 -0
- data/resources/mruby/benchmark/bm_ao_render.rb +314 -0
- data/resources/mruby/benchmark/bm_app_lc_fizzbuzz.rb +52 -0
- data/resources/mruby/benchmark/bm_fib.rb +7 -0
- data/resources/mruby/benchmark/bm_so_lists.rb +47 -0
- data/resources/mruby/benchmark/build_config_boxing.rb +28 -0
- data/resources/mruby/benchmark/build_config_cc.rb +13 -0
- data/resources/mruby/benchmark/plot.gpl +5 -0
- data/resources/mruby/bin/mirb +0 -0
- data/resources/mruby/bin/mrbc +0 -0
- data/resources/mruby/bin/mruby +0 -0
- data/resources/mruby/bin/mruby-strip +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/README.md +82 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrbgem.rake +63 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/regexp_pcre.rb +232 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/string_pcre.rb +333 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/132html +313 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/AUTHORS +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CMakeLists.txt +959 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/COPYING +5 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ChangeLog +4981 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CheckMan +67 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CleanTxt +113 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Detrail +35 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/HACKING +473 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/INSTALL +370 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/LICENCE +92 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.am +877 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.in +2917 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NEWS +611 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-AUTOTOOLS-BUILD +639 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-UNIX-USE +7 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/PrepareRelease +253 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/README +935 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunGrepTest +551 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest +1015 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest.bat +616 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/aclocal.m4 +1230 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.0 +21280 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.1 +21280 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/requests +273 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.0 +2421 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.1 +1144 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/COPYING-CMAKE-SCRIPTS +22 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindEditline.cmake +17 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindPackageHandleStandardArgs.cmake +58 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindReadline.cmake +29 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/compile +343 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config-cmake.h.in +54 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.guess +1552 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h +392 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.generic +392 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.in +343 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.sub +1804 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure +21280 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure.ac +1082 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/depcomp +708 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/dftables.c +212 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/index.html +180 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre-config.html +109 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre.html +204 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre16.html +383 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_assign_jit_stack.html +76 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile.html +108 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile2.html +112 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_config.html +91 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_named_substring.html +65 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_substring.html +61 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_dfa_exec.html +128 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_exec.html +110 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_study.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring_list.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_fullinfo.html +108 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_named_substring.html +68 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringnumber.html +57 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringtable_entries.html +60 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring.html +64 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring_list.html +61 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_exec.html +108 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_alloc.html +55 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_free.html +48 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_maketables.html +48 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_pattern_to_host_byte_order.html +58 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_refcount.html +51 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_study.html +68 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_utf16_to_host_byte_order.html +57 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_version.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreapi.html +2786 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrebuild.html +517 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecallout.html +243 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecompat.html +216 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecpp.html +368 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcredemo.html +426 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcregrep.html +757 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrejit.html +458 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrelimits.html +86 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrematching.html +233 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepartial.html +474 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepattern.html +2953 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreperform.html +195 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreposix.html +292 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreprecompile.html +158 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresample.html +110 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrestack.html +225 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresyntax.html +521 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcretest.html +1082 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreunicode.html +270 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/index.html.src +180 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.1 +92 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.txt +86 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.3 +202 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.txt +9909 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre16.3 +390 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre32.3 +389 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_assign_jit_stack.3 +61 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile.3 +98 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile2.3 +106 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_config.3 +76 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_named_substring.3 +59 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_substring.3 +52 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_dfa_exec.3 +125 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_exec.3 +103 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_study.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring_list.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_fullinfo.3 +95 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_named_substring.3 +62 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringnumber.3 +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringtable_entries.3 +48 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring.3 +55 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring_list.3 +49 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_exec.3 +104 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_alloc.3 +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_free.3 +35 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_maketables.3 +33 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_pattern_to_host_byte_order.3 +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_refcount.3 +36 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_study.3 +56 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf16_to_host_byte_order.3 +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf32_to_host_byte_order.3 +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_version.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreapi.3 +2823 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrebuild.3 +520 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecallout.3 +214 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecompat.3 +185 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecpp.3 +348 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.1 +679 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.txt +740 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrejit.3 +437 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrelimits.3 +67 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrematching.3 +206 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepartial.3 +445 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepattern.3 +2983 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreperform.3 +177 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreposix.3 +270 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreprecompile.3 +151 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresample.3 +99 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrestack.3 +215 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresyntax.3 +496 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.1 +1079 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.txt +1012 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreunicode.3 +255 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/perltest.txt +42 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/install-sh +527 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre16.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre32.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcrecpp.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcreposix.pc.in +13 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ltmain.sh +9636 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ax_pthread.m4 +309 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/libtool.m4 +7844 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltoptions.m4 +369 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltsugar.m4 +123 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltversion.m4 +23 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/lt~obsolete.m4 +98 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/pcre_visibility.m4 +89 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp.bat +66 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_c.txt +20 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_l.txt +20 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/missing +331 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre-config.in +133 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h +653 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.generic +653 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.in +653 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_byte_order.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_chartables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_config.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_dfa_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_fullinfo.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_get.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_globals.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_jit_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_maketables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_newline.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ord2utf16.c +90 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_printint.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_refcount.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_string_utils.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_study.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_tables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ucd.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_utf16_utils.c +130 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_valid_utf16.c +156 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_version.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_xclass.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_byte_order.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_chartables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_config.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_dfa_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_fullinfo.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_get.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_globals.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_jit_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_maketables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_newline.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ord2utf32.c +82 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_printint.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_refcount.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_string_utils.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_study.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_tables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ucd.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_utf32_utils.c +141 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_valid_utf32.c +131 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_version.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_xclass.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_byte_order.c +318 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c +198 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c.dist +198 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_compile.c +8386 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_config.c +186 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_dfa_exec.c +3582 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_exec.c +7049 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_fullinfo.c +231 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_get.c +662 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_globals.c +84 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_internal.h +2744 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_compile.c +8560 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_test.c +1614 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_maketables.c +151 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_newline.c +210 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ord2utf8.c +94 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_printint.c +766 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_refcount.c +92 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.cc +199 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.h +172 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner_unittest.cc +159 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_string_utils.c +211 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.cc +43 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.h.in +179 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece_unittest.cc +150 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_study.c +1562 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_tables.c +655 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ucd.c +3298 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_valid_utf8.c +312 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_version.c +98 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_xclass.c +198 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.cc +922 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.h +710 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_internal.h +71 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_unittest.cc +1291 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpparg.h.in +174 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcredemo.c +406 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregexp.pas +845 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregrep.c +3180 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.c +419 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.h +146 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcretest.c +5488 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/perltest.pl +237 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfig.h +110 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfigInternal.h +484 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitExecAllocator.c +289 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.c +1766 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.h +985 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_Thumb2.c +2008 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_v5.c +2515 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_32.c +404 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_common.c +1881 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_32.c +269 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_64.c +421 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_common.c +2014 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_32.c +164 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_common.c +1348 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_32.c +547 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_64.c +810 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_common.c +2836 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitUtils.c +332 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepbinary +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepfilelist +3 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput +611 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput3 +15 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput8 +11 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputv +4 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputx +43 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greplist +7 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput +707 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput8 +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutputN +16 -1
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greppatN4 +2 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved8 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput1 +5306 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput10 +1337 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput11 +135 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput12 +89 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput13 +9 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput14 +329 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput15 +430 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput16 +35 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput17 +296 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput18 +296 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput19 +22 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput2 +3813 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput20 +19 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput21 +16 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput22 +13 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput23 +16 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput24 +77 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput25 +32 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput26 +80 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput3 +95 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput4 +624 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput5 +772 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput6 +1319 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput7 +672 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput8 +4801 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput9 +717 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinputEBC +121 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput1 +8798 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput10 +2726 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-16 +713 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-32 +713 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-8 +713 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput12 +181 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput13 +21 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput14 +476 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput15 +1269 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput16 +121 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput17 +505 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-16 +1022 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-32 +1019 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput19 +88 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput2 +12484 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput20 +27 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-16 +90 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-32 +90 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-16 +71 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-32 +71 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput23 +42 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput24 +145 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput25 +79 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput26 +148 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput3 +169 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput4 +1094 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput5 +1849 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput6 +2137 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput7 +1473 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput8 +8019 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput9 +1371 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutputEBC +182 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestinput3 +91 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestoutput3 +166 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ucp.h +197 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/run_test.rb +23 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/src/mruby_regexp_pcre.c +364 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/matchdata.rb +94 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/regexp.rb +264 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/string.rb +201 -0
- data/resources/mruby/build_config.rb +152 -0
- data/resources/mruby/doc/guides/compile.md +488 -0
- data/resources/mruby/doc/guides/debugger.md +370 -0
- data/resources/mruby/doc/guides/gc-arena-howto.md +177 -0
- data/resources/mruby/doc/guides/mrbconf.md +146 -0
- data/resources/mruby/doc/guides/mrbgems.md +340 -0
- data/resources/mruby/doc/limitations.md +187 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/README.md +4 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +23 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +20 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/README.md +4 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +23 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/src/example.c +20 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/README.md +4 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +25 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
- data/resources/mruby/examples/targets/build_config_ArduinoDue.rb +90 -0
- data/resources/mruby/examples/targets/build_config_IntelEdison.rb +69 -0
- data/resources/mruby/examples/targets/build_config_IntelGalileo.rb +106 -0
- data/resources/mruby/examples/targets/build_config_RX630.rb +81 -0
- data/resources/mruby/examples/targets/build_config_android_arm64-v8a.rb +26 -0
- data/resources/mruby/examples/targets/build_config_android_armeabi.rb +26 -0
- data/resources/mruby/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb +28 -0
- data/resources/mruby/examples/targets/build_config_chipKITMax32.rb +86 -0
- data/resources/mruby/include/mrbconf.h +145 -0
- data/resources/mruby/include/mruby.h +1280 -0
- data/resources/mruby/include/mruby/array.h +279 -0
- data/resources/mruby/include/mruby/boxing_nan.h +102 -0
- data/resources/mruby/include/mruby/boxing_no.h +56 -0
- data/resources/mruby/include/mruby/boxing_word.h +136 -0
- data/resources/mruby/include/mruby/class.h +94 -0
- data/resources/mruby/include/mruby/common.h +72 -0
- data/resources/mruby/include/mruby/compile.h +194 -0
- data/resources/mruby/include/mruby/data.h +75 -0
- data/resources/mruby/include/mruby/debug.h +66 -0
- data/resources/mruby/include/mruby/dump.h +196 -0
- data/resources/mruby/include/mruby/error.h +75 -0
- data/resources/mruby/include/mruby/gc.h +91 -0
- data/resources/mruby/include/mruby/hash.h +182 -0
- data/resources/mruby/include/mruby/irep.h +62 -0
- data/resources/mruby/include/mruby/istruct.h +47 -0
- data/resources/mruby/include/mruby/khash.h +274 -0
- data/resources/mruby/include/mruby/numeric.h +161 -0
- data/resources/mruby/include/mruby/object.h +45 -0
- data/resources/mruby/include/mruby/opcode.h +161 -0
- data/resources/mruby/include/mruby/proc.h +131 -0
- data/resources/mruby/include/mruby/range.h +49 -0
- data/resources/mruby/include/mruby/re.h +16 -0
- data/resources/mruby/include/mruby/string.h +440 -0
- data/resources/mruby/include/mruby/throw.h +55 -0
- data/resources/mruby/include/mruby/value.h +309 -0
- data/resources/mruby/include/mruby/variable.h +138 -0
- data/resources/mruby/include/mruby/version.h +110 -0
- data/resources/mruby/lib/mruby-core-ext.rb +79 -0
- data/resources/mruby/lib/mruby/build.rb +355 -0
- data/resources/mruby/lib/mruby/build/command.rb +324 -0
- data/resources/mruby/lib/mruby/build/load_gems.rb +122 -0
- data/resources/mruby/lib/mruby/gem.rb +459 -0
- data/resources/mruby/lib/mruby/source.rb +30 -0
- data/resources/mruby/minirake +484 -0
- data/resources/mruby/mrbgems/default.gembox +82 -0
- data/resources/mruby/mrbgems/full-core.gembox +9 -0
- data/resources/mruby/mrbgems/mruby-array-ext/mrbgem.rake +6 -0
- data/resources/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +935 -0
- data/resources/mruby/mrbgems/mruby-array-ext/src/array.c +246 -0
- data/resources/mruby/mrbgems/mruby-array-ext/test/array.rb +422 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +286 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +701 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +9 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +505 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +240 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +78 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +502 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +58 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +759 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +165 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +16 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +20 -0
- data/resources/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +12 -0
- data/resources/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +33 -0
- data/resources/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +611 -0
- data/resources/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +16 -0
- data/resources/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +336 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby-config/mrbgem.rake +30 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config +20 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config.bat +42 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +60 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +12 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +254 -0
- data/resources/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +73 -0
- data/resources/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +6 -0
- data/resources/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +155 -0
- data/resources/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-class-ext/src/class.c +68 -0
- data/resources/mruby/mrbgems/mruby-class-ext/test/module.rb +55 -0
- data/resources/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +31 -0
- data/resources/mruby/mrbgems/mruby-compiler/bintest/mrbc.rb +30 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/codegen.c +3083 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/keywords +50 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/lex.def +211 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/node.h +118 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/parse.y +6661 -0
- data/resources/mruby/mrbgems/mruby-compiler/mrbgem.rake +40 -0
- data/resources/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +813 -0
- data/resources/mruby/mrbgems/mruby-enum-ext/test/enum.rb +185 -0
- data/resources/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +178 -0
- data/resources/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +53 -0
- data/resources/mruby/mrbgems/mruby-enumerator/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +645 -0
- data/resources/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +546 -0
- data/resources/mruby/mrbgems/mruby-error/mrbgem.rake +10 -0
- data/resources/mruby/mrbgems/mruby-error/src/exception.c +100 -0
- data/resources/mruby/mrbgems/mruby-error/test/exception.c +59 -0
- data/resources/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
- data/resources/mruby/mrbgems/mruby-eval/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-eval/src/eval.c +346 -0
- data/resources/mruby/mrbgems/mruby-eval/test/eval.rb +101 -0
- data/resources/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
- data/resources/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-fiber/src/fiber.c +420 -0
- data/resources/mruby/mrbgems/mruby-fiber/test/fiber.rb +208 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +8 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +502 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +128 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/test/hash.rb +300 -0
- data/resources/mruby/mrbgems/mruby-inline-struct/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.c +83 -0
- data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.rb +151 -0
- data/resources/mruby/mrbgems/mruby-io/README.md +193 -0
- data/resources/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +38 -0
- data/resources/mruby/mrbgems/mruby-io/mrbgem.rake +17 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/file.rb +208 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +29 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/io.rb +387 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/kernel.rb +15 -0
- data/resources/mruby/mrbgems/mruby-io/run_test.rb +26 -0
- data/resources/mruby/mrbgems/mruby-io/src/file.c +489 -0
- data/resources/mruby/mrbgems/mruby-io/src/file_test.c +381 -0
- data/resources/mruby/mrbgems/mruby-io/src/io.c +1320 -0
- data/resources/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +20 -0
- data/resources/mruby/mrbgems/mruby-io/test/file.rb +197 -0
- data/resources/mruby/mrbgems/mruby-io/test/file_test.rb +117 -0
- data/resources/mruby/mrbgems/mruby-io/test/gc_filedes.sh +4 -0
- data/resources/mruby/mrbgems/mruby-io/test/io.rb +642 -0
- data/resources/mruby/mrbgems/mruby-io/test/mruby_io_test.c +256 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/mrblib/kernel.rb +13 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +264 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +86 -0
- data/resources/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-math/src/math.c +783 -0
- data/resources/mruby/mrbgems/mruby-math/test/math.rb +152 -0
- data/resources/mruby/mrbgems/mruby-method/README.md +59 -0
- data/resources/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-method/mrblib/kernel.rb +9 -0
- data/resources/mruby/mrbgems/mruby-method/mrblib/method.rb +20 -0
- data/resources/mruby/mrbgems/mruby-method/mrblib/unbound_method.rb +9 -0
- data/resources/mruby/mrbgems/mruby-method/src/method.c +418 -0
- data/resources/mruby/mrbgems/mruby-method/test/method.rb +425 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +25 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +102 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +28 -0
- data/resources/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +19 -0
- data/resources/mruby/mrbgems/mruby-object-ext/src/object.c +112 -0
- data/resources/mruby/mrbgems/mruby-object-ext/test/nil.rb +11 -0
- data/resources/mruby/mrbgems/mruby-object-ext/test/object.rb +53 -0
- data/resources/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +187 -0
- data/resources/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
- data/resources/mruby/mrbgems/mruby-pack/README.md +70 -0
- data/resources/mruby/mrbgems/mruby-pack/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-pack/packtest.rb +157 -0
- data/resources/mruby/mrbgems/mruby-pack/run_test.rb +26 -0
- data/resources/mruby/mrbgems/mruby-pack/src/pack.c +1281 -0
- data/resources/mruby/mrbgems/mruby-pack/test/pack.rb +165 -0
- data/resources/mruby/mrbgems/mruby-print/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-print/mrblib/print.rb +64 -0
- data/resources/mruby/mrbgems/mruby-print/src/print.c +64 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +42 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/src/proc.c +173 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.rb +96 -0
- data/resources/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.c +224 -0
- data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.h +80 -0
- data/resources/mruby/mrbgems/mruby-random/src/random.c +349 -0
- data/resources/mruby/mrbgems/mruby-random/src/random.h +12 -0
- data/resources/mruby/mrbgems/mruby-random/test/random.rb +88 -0
- data/resources/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +31 -0
- data/resources/mruby/mrbgems/mruby-range-ext/src/range.c +176 -0
- data/resources/mruby/mrbgems/mruby-range-ext/test/range.rb +32 -0
- data/resources/mruby/mrbgems/mruby-socket/README.md +55 -0
- data/resources/mruby/mrbgems/mruby-socket/mrbgem.rake +17 -0
- data/resources/mruby/mrbgems/mruby-socket/mrblib/socket.rb +621 -0
- data/resources/mruby/mrbgems/mruby-socket/run_test.rb +28 -0
- data/resources/mruby/mrbgems/mruby-socket/src/const.cstub +453 -0
- data/resources/mruby/mrbgems/mruby-socket/src/const.def +163 -0
- data/resources/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
- data/resources/mruby/mrbgems/mruby-socket/src/socket.c +928 -0
- data/resources/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
- data/resources/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
- data/resources/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
- data/resources/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
- data/resources/mruby/mrbgems/mruby-socket/test/sockettest.c +46 -0
- data/resources/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
- data/resources/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
- data/resources/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
- data/resources/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +9 -0
- data/resources/mruby/mrbgems/mruby-sprintf/src/kernel.c +30 -0
- data/resources/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1126 -0
- data/resources/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +110 -0
- data/resources/mruby/mrbgems/mruby-string-ext/mrbgem.rake +6 -0
- data/resources/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +368 -0
- data/resources/mruby/mrbgems/mruby-string-ext/src/string.c +804 -0
- data/resources/mruby/mrbgems/mruby-string-ext/test/string.rb +682 -0
- data/resources/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-struct/mrblib/struct.rb +103 -0
- data/resources/mruby/mrbgems/mruby-struct/src/struct.c +726 -0
- data/resources/mruby/mrbgems/mruby-struct/test/struct.rb +205 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +78 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +64 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +48 -0
- data/resources/mruby/mrbgems/mruby-test/README.md +7 -0
- data/resources/mruby/mrbgems/mruby-test/driver.c +175 -0
- data/resources/mruby/mrbgems/mruby-test/init_mrbtest.c +38 -0
- data/resources/mruby/mrbgems/mruby-test/mrbgem.rake +191 -0
- data/resources/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-time/mrblib/time.rb +9 -0
- data/resources/mruby/mrbgems/mruby-time/src/time.c +869 -0
- data/resources/mruby/mrbgems/mruby-time/test/time.rb +228 -0
- data/resources/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +11 -0
- data/resources/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +24 -0
- data/resources/mruby/mrblib/00class.rb +29 -0
- data/resources/mruby/mrblib/10error.rb +59 -0
- data/resources/mruby/mrblib/array.rb +243 -0
- data/resources/mruby/mrblib/compar.rb +84 -0
- data/resources/mruby/mrblib/enum.rb +348 -0
- data/resources/mruby/mrblib/float.rb +9 -0
- data/resources/mruby/mrblib/hash.rb +358 -0
- data/resources/mruby/mrblib/init_mrblib.c +11 -0
- data/resources/mruby/mrblib/kernel.rb +50 -0
- data/resources/mruby/mrblib/mrblib.rake +21 -0
- data/resources/mruby/mrblib/numeric.rb +163 -0
- data/resources/mruby/mrblib/range.rb +67 -0
- data/resources/mruby/mrblib/string.rb +275 -0
- data/resources/mruby/mruby-source.gemspec +18 -0
- data/resources/mruby/src/array.c +1251 -0
- data/resources/mruby/src/backtrace.c +285 -0
- data/resources/mruby/src/class.c +2546 -0
- data/resources/mruby/src/codedump.c +477 -0
- data/resources/mruby/src/compar.c +13 -0
- data/resources/mruby/src/crc.c +39 -0
- data/resources/mruby/src/debug.c +217 -0
- data/resources/mruby/src/dump.c +1106 -0
- data/resources/mruby/src/enum.c +14 -0
- data/resources/mruby/src/error.c +513 -0
- data/resources/mruby/src/error.h +3 -0
- data/resources/mruby/src/etc.c +246 -0
- data/resources/mruby/src/fmt_fp.c +374 -0
- data/resources/mruby/src/gc.c +1835 -0
- data/resources/mruby/src/hash.c +916 -0
- data/resources/mruby/src/init.c +51 -0
- data/resources/mruby/src/kernel.c +1264 -0
- data/resources/mruby/src/load.c +706 -0
- data/resources/mruby/src/mruby_core.rake +20 -0
- data/resources/mruby/src/numeric.c +1574 -0
- data/resources/mruby/src/object.c +618 -0
- data/resources/mruby/src/opcode.h +2 -0
- data/resources/mruby/src/pool.c +209 -0
- data/resources/mruby/src/print.c +47 -0
- data/resources/mruby/src/proc.c +313 -0
- data/resources/mruby/src/range.c +446 -0
- data/resources/mruby/src/state.c +307 -0
- data/resources/mruby/src/string.c +3025 -0
- data/resources/mruby/src/symbol.c +494 -0
- data/resources/mruby/src/value_array.h +27 -0
- data/resources/mruby/src/variable.c +982 -0
- data/resources/mruby/src/version.c +17 -0
- data/resources/mruby/src/vm.c +3020 -0
- data/resources/mruby/tasks/benchmark.rake +91 -0
- data/resources/mruby/tasks/gitlab.rake +118 -0
- data/resources/mruby/tasks/libmruby.rake +24 -0
- data/resources/mruby/tasks/mrbgems.rake +98 -0
- data/resources/mruby/tasks/toolchains/android.rake +321 -0
- data/resources/mruby/tasks/toolchains/clang.rake +9 -0
- data/resources/mruby/tasks/toolchains/gcc.rake +66 -0
- data/resources/mruby/tasks/toolchains/openwrt.rake +38 -0
- data/resources/mruby/tasks/toolchains/visualcpp.rake +68 -0
- data/resources/mruby/test/assert.rb +249 -0
- data/resources/mruby/test/bintest.rb +33 -0
- data/resources/mruby/test/report.rb +4 -0
- data/resources/mruby/test/t/argumenterror.rb +16 -0
- data/resources/mruby/test/t/array.rb +394 -0
- data/resources/mruby/test/t/basicobject.rb +11 -0
- data/resources/mruby/test/t/bs_block.rb +521 -0
- data/resources/mruby/test/t/bs_literal.rb +38 -0
- data/resources/mruby/test/t/class.rb +451 -0
- data/resources/mruby/test/t/codegen.rb +197 -0
- data/resources/mruby/test/t/comparable.rb +80 -0
- data/resources/mruby/test/t/ensure.rb +54 -0
- data/resources/mruby/test/t/enumerable.rb +134 -0
- data/resources/mruby/test/t/exception.rb +422 -0
- data/resources/mruby/test/t/false.rb +31 -0
- data/resources/mruby/test/t/float.rb +209 -0
- data/resources/mruby/test/t/gc.rb +45 -0
- data/resources/mruby/test/t/hash.rb +375 -0
- data/resources/mruby/test/t/indexerror.rb +6 -0
- data/resources/mruby/test/t/integer.rb +277 -0
- data/resources/mruby/test/t/iterations.rb +61 -0
- data/resources/mruby/test/t/kernel.rb +600 -0
- data/resources/mruby/test/t/lang.rb +74 -0
- data/resources/mruby/test/t/literals.rb +337 -0
- data/resources/mruby/test/t/localjumperror.rb +13 -0
- data/resources/mruby/test/t/methods.rb +109 -0
- data/resources/mruby/test/t/module.rb +914 -0
- data/resources/mruby/test/t/nameerror.rb +28 -0
- data/resources/mruby/test/t/nil.rb +39 -0
- data/resources/mruby/test/t/nomethoderror.rb +22 -0
- data/resources/mruby/test/t/numeric.rb +43 -0
- data/resources/mruby/test/t/object.rb +11 -0
- data/resources/mruby/test/t/proc.rb +180 -0
- data/resources/mruby/test/t/range.rb +95 -0
- data/resources/mruby/test/t/rangeerror.rb +6 -0
- data/resources/mruby/test/t/regexperror.rb +4 -0
- data/resources/mruby/test/t/runtimeerror.rb +6 -0
- data/resources/mruby/test/t/standarderror.rb +6 -0
- data/resources/mruby/test/t/string.rb +728 -0
- data/resources/mruby/test/t/superclass.rb +47 -0
- data/resources/mruby/test/t/symbol.rb +30 -0
- data/resources/mruby/test/t/syntax.rb +468 -0
- data/resources/mruby/test/t/true.rb +31 -0
- data/resources/mruby/test/t/typeerror.rb +6 -0
- data/resources/mruby/test/t/unicode.rb +39 -0
- data/resources/mruby/travis_config.rb +53 -0
- metadata +806 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** backtrace.c -
|
|
3
|
+
**
|
|
4
|
+
** See Copyright Notice in mruby.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include <mruby.h>
|
|
8
|
+
#include <mruby/variable.h>
|
|
9
|
+
#include <mruby/proc.h>
|
|
10
|
+
#include <mruby/array.h>
|
|
11
|
+
#include <mruby/string.h>
|
|
12
|
+
#include <mruby/class.h>
|
|
13
|
+
#include <mruby/debug.h>
|
|
14
|
+
#include <mruby/error.h>
|
|
15
|
+
#include <mruby/numeric.h>
|
|
16
|
+
#include <mruby/data.h>
|
|
17
|
+
|
|
18
|
+
struct backtrace_location {
|
|
19
|
+
int lineno;
|
|
20
|
+
const char *filename;
|
|
21
|
+
mrb_sym method_id;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
typedef void (*each_backtrace_func)(mrb_state*, struct backtrace_location*, void*);
|
|
25
|
+
|
|
26
|
+
static const mrb_data_type bt_type = { "Backtrace", mrb_free };
|
|
27
|
+
|
|
28
|
+
static void
|
|
29
|
+
each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, mrb_code *pc0, each_backtrace_func func, void *data)
|
|
30
|
+
{
|
|
31
|
+
ptrdiff_t i, j;
|
|
32
|
+
|
|
33
|
+
if (ciidx >= mrb->c->ciend - mrb->c->cibase)
|
|
34
|
+
ciidx = 10; /* ciidx is broken... */
|
|
35
|
+
|
|
36
|
+
for (i=ciidx, j=0; i >= 0; i--,j++) {
|
|
37
|
+
struct backtrace_location loc;
|
|
38
|
+
mrb_callinfo *ci;
|
|
39
|
+
mrb_irep *irep;
|
|
40
|
+
mrb_code *pc;
|
|
41
|
+
|
|
42
|
+
ci = &mrb->c->cibase[i];
|
|
43
|
+
|
|
44
|
+
if (!ci->proc) continue;
|
|
45
|
+
if (MRB_PROC_CFUNC_P(ci->proc)) continue;
|
|
46
|
+
|
|
47
|
+
irep = ci->proc->body.irep;
|
|
48
|
+
if (!irep) continue;
|
|
49
|
+
|
|
50
|
+
if (mrb->c->cibase[i].err) {
|
|
51
|
+
pc = mrb->c->cibase[i].err;
|
|
52
|
+
}
|
|
53
|
+
else if (i+1 <= ciidx) {
|
|
54
|
+
pc = &mrb->c->cibase[i+1].pc[-1];
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
pc = pc0;
|
|
58
|
+
}
|
|
59
|
+
loc.filename = mrb_debug_get_filename(irep, pc - irep->iseq);
|
|
60
|
+
loc.lineno = mrb_debug_get_line(irep, pc - irep->iseq);
|
|
61
|
+
|
|
62
|
+
if (loc.lineno == -1) continue;
|
|
63
|
+
|
|
64
|
+
if (!loc.filename) {
|
|
65
|
+
loc.filename = "(unknown)";
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
loc.method_id = ci->mid;
|
|
69
|
+
func(mrb, &loc, data);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#ifndef MRB_DISABLE_STDIO
|
|
74
|
+
|
|
75
|
+
static void
|
|
76
|
+
print_backtrace(mrb_state *mrb, mrb_value backtrace)
|
|
77
|
+
{
|
|
78
|
+
int i;
|
|
79
|
+
mrb_int n;
|
|
80
|
+
FILE *stream = stderr;
|
|
81
|
+
|
|
82
|
+
if (!mrb_array_p(backtrace)) return;
|
|
83
|
+
|
|
84
|
+
n = RARRAY_LEN(backtrace) - 1;
|
|
85
|
+
if (n == 0) return;
|
|
86
|
+
|
|
87
|
+
fprintf(stream, "trace (most recent call last):\n");
|
|
88
|
+
for (i=0; i<n; i++) {
|
|
89
|
+
mrb_value entry = RARRAY_PTR(backtrace)[n-i-1];
|
|
90
|
+
|
|
91
|
+
if (mrb_string_p(entry)) {
|
|
92
|
+
fprintf(stream, "\t[%d] %.*s\n", i, (int)RSTRING_LEN(entry), RSTRING_PTR(entry));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static int
|
|
98
|
+
packed_bt_len(struct backtrace_location *bt, int n)
|
|
99
|
+
{
|
|
100
|
+
int len = 0;
|
|
101
|
+
int i;
|
|
102
|
+
|
|
103
|
+
for (i=0; i<n; i++) {
|
|
104
|
+
if (!bt[i].filename && !bt[i].lineno && !bt[i].method_id)
|
|
105
|
+
continue;
|
|
106
|
+
len++;
|
|
107
|
+
}
|
|
108
|
+
return len;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static void
|
|
112
|
+
print_packed_backtrace(mrb_state *mrb, mrb_value packed)
|
|
113
|
+
{
|
|
114
|
+
FILE *stream = stderr;
|
|
115
|
+
struct backtrace_location *bt;
|
|
116
|
+
int n, i;
|
|
117
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
118
|
+
|
|
119
|
+
bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, packed, &bt_type);
|
|
120
|
+
if (bt == NULL) return;
|
|
121
|
+
n = (mrb_int)RDATA(packed)->flags;
|
|
122
|
+
|
|
123
|
+
if (packed_bt_len(bt, n) == 0) return;
|
|
124
|
+
fprintf(stream, "trace (most recent call last):\n");
|
|
125
|
+
for (i = 0; i<n; i++) {
|
|
126
|
+
struct backtrace_location *entry = &bt[n-i-1];
|
|
127
|
+
if (entry->filename == NULL) continue;
|
|
128
|
+
fprintf(stream, "\t[%d] %s:%d", i, entry->filename, entry->lineno);
|
|
129
|
+
if (entry->method_id != 0) {
|
|
130
|
+
const char *method_name;
|
|
131
|
+
|
|
132
|
+
method_name = mrb_sym2name(mrb, entry->method_id);
|
|
133
|
+
fprintf(stream, ":in %s", method_name);
|
|
134
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
135
|
+
}
|
|
136
|
+
fprintf(stream, "\n");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* mrb_print_backtrace
|
|
141
|
+
|
|
142
|
+
function to retrieve backtrace information from the last exception.
|
|
143
|
+
*/
|
|
144
|
+
|
|
145
|
+
MRB_API void
|
|
146
|
+
mrb_print_backtrace(mrb_state *mrb)
|
|
147
|
+
{
|
|
148
|
+
mrb_value backtrace;
|
|
149
|
+
|
|
150
|
+
if (!mrb->exc) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
backtrace = mrb_obj_iv_get(mrb, mrb->exc, mrb_intern_lit(mrb, "backtrace"));
|
|
155
|
+
if (mrb_nil_p(backtrace)) return;
|
|
156
|
+
if (mrb_array_p(backtrace)) {
|
|
157
|
+
print_backtrace(mrb, backtrace);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
print_packed_backtrace(mrb, backtrace);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
#else
|
|
164
|
+
|
|
165
|
+
MRB_API void
|
|
166
|
+
mrb_print_backtrace(mrb_state *mrb)
|
|
167
|
+
{
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
#endif
|
|
171
|
+
|
|
172
|
+
static void
|
|
173
|
+
count_backtrace_i(mrb_state *mrb,
|
|
174
|
+
struct backtrace_location *loc,
|
|
175
|
+
void *data)
|
|
176
|
+
{
|
|
177
|
+
int *lenp = (int*)data;
|
|
178
|
+
|
|
179
|
+
if (loc->filename == NULL) return;
|
|
180
|
+
(*lenp)++;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
static void
|
|
184
|
+
pack_backtrace_i(mrb_state *mrb,
|
|
185
|
+
struct backtrace_location *loc,
|
|
186
|
+
void *data)
|
|
187
|
+
{
|
|
188
|
+
struct backtrace_location **pptr = (struct backtrace_location**)data;
|
|
189
|
+
struct backtrace_location *ptr = *pptr;
|
|
190
|
+
|
|
191
|
+
if (loc->filename == NULL) return;
|
|
192
|
+
*ptr = *loc;
|
|
193
|
+
*pptr = ptr+1;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
static mrb_value
|
|
197
|
+
packed_backtrace(mrb_state *mrb)
|
|
198
|
+
{
|
|
199
|
+
struct RData *backtrace;
|
|
200
|
+
ptrdiff_t ciidx = mrb->c->ci - mrb->c->cibase;
|
|
201
|
+
int len = 0;
|
|
202
|
+
int size;
|
|
203
|
+
void *ptr;
|
|
204
|
+
|
|
205
|
+
each_backtrace(mrb, ciidx, mrb->c->ci->pc, count_backtrace_i, &len);
|
|
206
|
+
size = len * sizeof(struct backtrace_location);
|
|
207
|
+
ptr = mrb_malloc(mrb, size);
|
|
208
|
+
if (ptr) memset(ptr, 0, size);
|
|
209
|
+
backtrace = mrb_data_object_alloc(mrb, NULL, ptr, &bt_type);
|
|
210
|
+
backtrace->flags = (unsigned int)len;
|
|
211
|
+
each_backtrace(mrb, ciidx, mrb->c->ci->pc, pack_backtrace_i, &ptr);
|
|
212
|
+
return mrb_obj_value(backtrace);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
void
|
|
216
|
+
mrb_keep_backtrace(mrb_state *mrb, mrb_value exc)
|
|
217
|
+
{
|
|
218
|
+
mrb_sym sym = mrb_intern_lit(mrb, "backtrace");
|
|
219
|
+
mrb_value backtrace;
|
|
220
|
+
int ai;
|
|
221
|
+
|
|
222
|
+
if (mrb_iv_defined(mrb, exc, sym)) return;
|
|
223
|
+
ai = mrb_gc_arena_save(mrb);
|
|
224
|
+
backtrace = packed_backtrace(mrb);
|
|
225
|
+
mrb_iv_set(mrb, exc, sym, backtrace);
|
|
226
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
mrb_value
|
|
230
|
+
mrb_unpack_backtrace(mrb_state *mrb, mrb_value backtrace)
|
|
231
|
+
{
|
|
232
|
+
struct backtrace_location *bt;
|
|
233
|
+
mrb_int n, i;
|
|
234
|
+
int ai;
|
|
235
|
+
|
|
236
|
+
if (mrb_nil_p(backtrace)) {
|
|
237
|
+
empty_backtrace:
|
|
238
|
+
return mrb_ary_new_capa(mrb, 0);
|
|
239
|
+
}
|
|
240
|
+
if (mrb_array_p(backtrace)) return backtrace;
|
|
241
|
+
bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, backtrace, &bt_type);
|
|
242
|
+
if (bt == NULL) goto empty_backtrace;
|
|
243
|
+
n = (mrb_int)RDATA(backtrace)->flags;
|
|
244
|
+
backtrace = mrb_ary_new_capa(mrb, n);
|
|
245
|
+
ai = mrb_gc_arena_save(mrb);
|
|
246
|
+
for (i = 0; i < n; i++) {
|
|
247
|
+
struct backtrace_location *entry = &bt[i];
|
|
248
|
+
mrb_value btline;
|
|
249
|
+
|
|
250
|
+
if (entry->filename == NULL) continue;
|
|
251
|
+
btline = mrb_format(mrb, "%S:%S",
|
|
252
|
+
mrb_str_new_cstr(mrb, entry->filename),
|
|
253
|
+
mrb_fixnum_value(entry->lineno));
|
|
254
|
+
if (entry->method_id != 0) {
|
|
255
|
+
mrb_str_cat_lit(mrb, btline, ":in ");
|
|
256
|
+
mrb_str_cat_cstr(mrb, btline, mrb_sym2name(mrb, entry->method_id));
|
|
257
|
+
}
|
|
258
|
+
mrb_ary_push(mrb, backtrace, btline);
|
|
259
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return backtrace;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
MRB_API mrb_value
|
|
266
|
+
mrb_exc_backtrace(mrb_state *mrb, mrb_value exc)
|
|
267
|
+
{
|
|
268
|
+
mrb_sym attr_name;
|
|
269
|
+
mrb_value backtrace;
|
|
270
|
+
|
|
271
|
+
attr_name = mrb_intern_lit(mrb, "backtrace");
|
|
272
|
+
backtrace = mrb_iv_get(mrb, exc, attr_name);
|
|
273
|
+
if (mrb_nil_p(backtrace) || mrb_array_p(backtrace)) {
|
|
274
|
+
return backtrace;
|
|
275
|
+
}
|
|
276
|
+
backtrace = mrb_unpack_backtrace(mrb, backtrace);
|
|
277
|
+
mrb_iv_set(mrb, exc, attr_name, backtrace);
|
|
278
|
+
return backtrace;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
MRB_API mrb_value
|
|
282
|
+
mrb_get_backtrace(mrb_state *mrb)
|
|
283
|
+
{
|
|
284
|
+
return mrb_unpack_backtrace(mrb, packed_backtrace(mrb));
|
|
285
|
+
}
|
|
@@ -0,0 +1,2546 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** class.c - Class class
|
|
3
|
+
**
|
|
4
|
+
** See Copyright Notice in mruby.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include <stdarg.h>
|
|
8
|
+
#include <mruby.h>
|
|
9
|
+
#include <mruby/array.h>
|
|
10
|
+
#include <mruby/class.h>
|
|
11
|
+
#include <mruby/numeric.h>
|
|
12
|
+
#include <mruby/proc.h>
|
|
13
|
+
#include <mruby/string.h>
|
|
14
|
+
#include <mruby/variable.h>
|
|
15
|
+
#include <mruby/error.h>
|
|
16
|
+
#include <mruby/data.h>
|
|
17
|
+
#include <mruby/istruct.h>
|
|
18
|
+
|
|
19
|
+
KHASH_DEFINE(mt, mrb_sym, mrb_method_t, TRUE, kh_int_hash_func, kh_int_hash_equal)
|
|
20
|
+
|
|
21
|
+
void
|
|
22
|
+
mrb_gc_mark_mt(mrb_state *mrb, struct RClass *c)
|
|
23
|
+
{
|
|
24
|
+
khiter_t k;
|
|
25
|
+
khash_t(mt) *h = c->mt;
|
|
26
|
+
|
|
27
|
+
if (!h) return;
|
|
28
|
+
for (k = kh_begin(h); k != kh_end(h); k++) {
|
|
29
|
+
if (kh_exist(h, k)) {
|
|
30
|
+
mrb_method_t m = kh_value(h, k);
|
|
31
|
+
|
|
32
|
+
if (MRB_METHOD_PROC_P(m)) {
|
|
33
|
+
struct RProc *p = MRB_METHOD_PROC(m);
|
|
34
|
+
mrb_gc_mark(mrb, (struct RBasic*)p);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
size_t
|
|
41
|
+
mrb_gc_mark_mt_size(mrb_state *mrb, struct RClass *c)
|
|
42
|
+
{
|
|
43
|
+
khash_t(mt) *h = c->mt;
|
|
44
|
+
|
|
45
|
+
if (!h) return 0;
|
|
46
|
+
return kh_size(h);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
void
|
|
50
|
+
mrb_gc_free_mt(mrb_state *mrb, struct RClass *c)
|
|
51
|
+
{
|
|
52
|
+
kh_destroy(mt, mrb, c->mt);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void
|
|
56
|
+
mrb_class_name_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id)
|
|
57
|
+
{
|
|
58
|
+
mrb_value name;
|
|
59
|
+
mrb_sym nsym = mrb_intern_lit(mrb, "__classname__");
|
|
60
|
+
|
|
61
|
+
if (mrb_obj_iv_defined(mrb, (struct RObject*)c, nsym)) return;
|
|
62
|
+
if (outer == NULL || outer == mrb->object_class) {
|
|
63
|
+
name = mrb_symbol_value(id);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
name = mrb_class_path(mrb, outer);
|
|
67
|
+
if (mrb_nil_p(name)) { /* unnamed outer class */
|
|
68
|
+
if (outer != mrb->object_class) {
|
|
69
|
+
mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),
|
|
70
|
+
mrb_obj_value(outer));
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
mrb_str_cat_cstr(mrb, name, "::");
|
|
75
|
+
mrb_str_cat_cstr(mrb, name, mrb_sym2name(mrb, id));
|
|
76
|
+
}
|
|
77
|
+
mrb_obj_iv_set(mrb, (struct RObject*)c, nsym, name);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
static void
|
|
81
|
+
setup_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id)
|
|
82
|
+
{
|
|
83
|
+
mrb_class_name_class(mrb, outer, c, id);
|
|
84
|
+
mrb_obj_iv_set(mrb, (struct RObject*)outer, id, mrb_obj_value(c));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
#define make_metaclass(mrb, c) prepare_singleton_class((mrb), (struct RBasic*)(c))
|
|
88
|
+
|
|
89
|
+
static void
|
|
90
|
+
prepare_singleton_class(mrb_state *mrb, struct RBasic *o)
|
|
91
|
+
{
|
|
92
|
+
struct RClass *sc, *c;
|
|
93
|
+
|
|
94
|
+
if (o->c->tt == MRB_TT_SCLASS) return;
|
|
95
|
+
sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class);
|
|
96
|
+
sc->flags |= MRB_FLAG_IS_INHERITED;
|
|
97
|
+
sc->mt = kh_init(mt, mrb);
|
|
98
|
+
sc->iv = 0;
|
|
99
|
+
if (o->tt == MRB_TT_CLASS) {
|
|
100
|
+
c = (struct RClass*)o;
|
|
101
|
+
if (!c->super) {
|
|
102
|
+
sc->super = mrb->class_class;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
sc->super = c->super->c;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (o->tt == MRB_TT_SCLASS) {
|
|
109
|
+
c = (struct RClass*)o;
|
|
110
|
+
while (c->super->tt == MRB_TT_ICLASS)
|
|
111
|
+
c = c->super;
|
|
112
|
+
make_metaclass(mrb, c->super);
|
|
113
|
+
sc->super = c->super->c;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
sc->super = o->c;
|
|
117
|
+
prepare_singleton_class(mrb, (struct RBasic*)sc);
|
|
118
|
+
}
|
|
119
|
+
o->c = sc;
|
|
120
|
+
mrb_field_write_barrier(mrb, (struct RBasic*)o, (struct RBasic*)sc);
|
|
121
|
+
mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)o);
|
|
122
|
+
mrb_obj_iv_set(mrb, (struct RObject*)sc, mrb_intern_lit(mrb, "__attached__"), mrb_obj_value(o));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static struct RClass*
|
|
126
|
+
class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
|
|
127
|
+
{
|
|
128
|
+
mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
|
|
129
|
+
|
|
130
|
+
mrb_check_type(mrb, c, MRB_TT_CLASS);
|
|
131
|
+
return mrb_class_ptr(c);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
static struct RClass*
|
|
135
|
+
module_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
|
|
136
|
+
{
|
|
137
|
+
mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
|
|
138
|
+
|
|
139
|
+
mrb_check_type(mrb, c, MRB_TT_MODULE);
|
|
140
|
+
return mrb_class_ptr(c);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
static mrb_bool
|
|
144
|
+
class_ptr_p(mrb_value obj)
|
|
145
|
+
{
|
|
146
|
+
switch (mrb_type(obj)) {
|
|
147
|
+
case MRB_TT_CLASS:
|
|
148
|
+
case MRB_TT_SCLASS:
|
|
149
|
+
case MRB_TT_MODULE:
|
|
150
|
+
return TRUE;
|
|
151
|
+
default:
|
|
152
|
+
return FALSE;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
static void
|
|
157
|
+
check_if_class_or_module(mrb_state *mrb, mrb_value obj)
|
|
158
|
+
{
|
|
159
|
+
if (!class_ptr_p(obj)) {
|
|
160
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_inspect(mrb, obj));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
static struct RClass*
|
|
165
|
+
define_module(mrb_state *mrb, mrb_sym name, struct RClass *outer)
|
|
166
|
+
{
|
|
167
|
+
struct RClass *m;
|
|
168
|
+
|
|
169
|
+
if (mrb_const_defined_at(mrb, mrb_obj_value(outer), name)) {
|
|
170
|
+
return module_from_sym(mrb, outer, name);
|
|
171
|
+
}
|
|
172
|
+
m = mrb_module_new(mrb);
|
|
173
|
+
setup_class(mrb, outer, m, name);
|
|
174
|
+
|
|
175
|
+
return m;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
MRB_API struct RClass*
|
|
179
|
+
mrb_define_module_id(mrb_state *mrb, mrb_sym name)
|
|
180
|
+
{
|
|
181
|
+
return define_module(mrb, name, mrb->object_class);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
MRB_API struct RClass*
|
|
185
|
+
mrb_define_module(mrb_state *mrb, const char *name)
|
|
186
|
+
{
|
|
187
|
+
return define_module(mrb, mrb_intern_cstr(mrb, name), mrb->object_class);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
MRB_API struct RClass*
|
|
191
|
+
mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
|
|
192
|
+
{
|
|
193
|
+
check_if_class_or_module(mrb, outer);
|
|
194
|
+
if (mrb_const_defined_at(mrb, outer, id)) {
|
|
195
|
+
mrb_value old = mrb_const_get(mrb, outer, id);
|
|
196
|
+
|
|
197
|
+
if (mrb_type(old) != MRB_TT_MODULE) {
|
|
198
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a module", mrb_inspect(mrb, old));
|
|
199
|
+
}
|
|
200
|
+
return mrb_class_ptr(old);
|
|
201
|
+
}
|
|
202
|
+
return define_module(mrb, id, mrb_class_ptr(outer));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
MRB_API struct RClass*
|
|
206
|
+
mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name)
|
|
207
|
+
{
|
|
208
|
+
mrb_sym id = mrb_intern_cstr(mrb, name);
|
|
209
|
+
struct RClass * c = define_module(mrb, id, outer);
|
|
210
|
+
|
|
211
|
+
setup_class(mrb, outer, c, id);
|
|
212
|
+
return c;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
static struct RClass*
|
|
216
|
+
find_origin(struct RClass *c)
|
|
217
|
+
{
|
|
218
|
+
MRB_CLASS_ORIGIN(c);
|
|
219
|
+
return c;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
static struct RClass*
|
|
223
|
+
define_class(mrb_state *mrb, mrb_sym name, struct RClass *super, struct RClass *outer)
|
|
224
|
+
{
|
|
225
|
+
struct RClass * c;
|
|
226
|
+
|
|
227
|
+
if (mrb_const_defined_at(mrb, mrb_obj_value(outer), name)) {
|
|
228
|
+
c = class_from_sym(mrb, outer, name);
|
|
229
|
+
MRB_CLASS_ORIGIN(c);
|
|
230
|
+
if (super && mrb_class_real(c->super) != super) {
|
|
231
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %S (%S not %S)",
|
|
232
|
+
mrb_sym2str(mrb, name),
|
|
233
|
+
mrb_obj_value(c->super), mrb_obj_value(super));
|
|
234
|
+
}
|
|
235
|
+
return c;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
c = mrb_class_new(mrb, super);
|
|
239
|
+
setup_class(mrb, outer, c, name);
|
|
240
|
+
|
|
241
|
+
return c;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
MRB_API struct RClass*
|
|
245
|
+
mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super)
|
|
246
|
+
{
|
|
247
|
+
if (!super) {
|
|
248
|
+
mrb_warn(mrb, "no super class for '%S', Object assumed", mrb_sym2str(mrb, name));
|
|
249
|
+
}
|
|
250
|
+
return define_class(mrb, name, super, mrb->object_class);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
MRB_API struct RClass*
|
|
254
|
+
mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
|
|
255
|
+
{
|
|
256
|
+
return mrb_define_class_id(mrb, mrb_intern_cstr(mrb, name), super);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value);
|
|
260
|
+
#ifdef MRB_METHOD_CACHE
|
|
261
|
+
static void mc_clear_all(mrb_state *mrb);
|
|
262
|
+
static void mc_clear_by_class(mrb_state *mrb, struct RClass*);
|
|
263
|
+
static void mc_clear_by_id(mrb_state *mrb, struct RClass*, mrb_sym);
|
|
264
|
+
#else
|
|
265
|
+
#define mc_clear_all(mrb)
|
|
266
|
+
#define mc_clear_by_class(mrb,c)
|
|
267
|
+
#define mc_clear_by_id(mrb,c,s)
|
|
268
|
+
#endif
|
|
269
|
+
|
|
270
|
+
static void
|
|
271
|
+
mrb_class_inherited(mrb_state *mrb, struct RClass *super, struct RClass *klass)
|
|
272
|
+
{
|
|
273
|
+
mrb_value s;
|
|
274
|
+
mrb_sym mid;
|
|
275
|
+
|
|
276
|
+
if (!super)
|
|
277
|
+
super = mrb->object_class;
|
|
278
|
+
super->flags |= MRB_FLAG_IS_INHERITED;
|
|
279
|
+
s = mrb_obj_value(super);
|
|
280
|
+
mc_clear_by_class(mrb, klass);
|
|
281
|
+
mid = mrb_intern_lit(mrb, "inherited");
|
|
282
|
+
if (!mrb_func_basic_p(mrb, s, mid, mrb_bob_init)) {
|
|
283
|
+
mrb_value c = mrb_obj_value(klass);
|
|
284
|
+
mrb_funcall_argv(mrb, s, mid, 1, &c);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
MRB_API struct RClass*
|
|
289
|
+
mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id)
|
|
290
|
+
{
|
|
291
|
+
struct RClass *s;
|
|
292
|
+
struct RClass *c;
|
|
293
|
+
|
|
294
|
+
if (!mrb_nil_p(super)) {
|
|
295
|
+
if (mrb_type(super) != MRB_TT_CLASS) {
|
|
296
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)",
|
|
297
|
+
mrb_inspect(mrb, super));
|
|
298
|
+
}
|
|
299
|
+
s = mrb_class_ptr(super);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
s = 0;
|
|
303
|
+
}
|
|
304
|
+
check_if_class_or_module(mrb, outer);
|
|
305
|
+
if (mrb_const_defined_at(mrb, outer, id)) {
|
|
306
|
+
mrb_value old = mrb_const_get(mrb, outer, id);
|
|
307
|
+
|
|
308
|
+
if (mrb_type(old) != MRB_TT_CLASS) {
|
|
309
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class", mrb_inspect(mrb, old));
|
|
310
|
+
}
|
|
311
|
+
c = mrb_class_ptr(old);
|
|
312
|
+
if (s) {
|
|
313
|
+
/* check super class */
|
|
314
|
+
if (mrb_class_real(c->super) != s) {
|
|
315
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %S", old);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return c;
|
|
319
|
+
}
|
|
320
|
+
c = define_class(mrb, id, s, mrb_class_ptr(outer));
|
|
321
|
+
mrb_class_inherited(mrb, mrb_class_real(c->super), c);
|
|
322
|
+
|
|
323
|
+
return c;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
MRB_API mrb_bool
|
|
327
|
+
mrb_class_defined(mrb_state *mrb, const char *name)
|
|
328
|
+
{
|
|
329
|
+
mrb_value sym = mrb_check_intern_cstr(mrb, name);
|
|
330
|
+
if (mrb_nil_p(sym)) {
|
|
331
|
+
return FALSE;
|
|
332
|
+
}
|
|
333
|
+
return mrb_const_defined(mrb, mrb_obj_value(mrb->object_class), mrb_symbol(sym));
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
MRB_API mrb_bool
|
|
337
|
+
mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name)
|
|
338
|
+
{
|
|
339
|
+
mrb_value sym = mrb_check_intern_cstr(mrb, name);
|
|
340
|
+
if (mrb_nil_p(sym)) {
|
|
341
|
+
return FALSE;
|
|
342
|
+
}
|
|
343
|
+
return mrb_const_defined_at(mrb, mrb_obj_value(outer), mrb_symbol(sym));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
MRB_API struct RClass*
|
|
347
|
+
mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
|
|
348
|
+
{
|
|
349
|
+
return class_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
MRB_API struct RClass*
|
|
353
|
+
mrb_class_get(mrb_state *mrb, const char *name)
|
|
354
|
+
{
|
|
355
|
+
return mrb_class_get_under(mrb, mrb->object_class, name);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
MRB_API struct RClass*
|
|
359
|
+
mrb_exc_get(mrb_state *mrb, const char *name)
|
|
360
|
+
{
|
|
361
|
+
struct RClass *exc, *e;
|
|
362
|
+
mrb_value c = mrb_const_get(mrb, mrb_obj_value(mrb->object_class),
|
|
363
|
+
mrb_intern_cstr(mrb, name));
|
|
364
|
+
|
|
365
|
+
if (mrb_type(c) != MRB_TT_CLASS) {
|
|
366
|
+
mrb_raise(mrb, mrb->eException_class, "exception corrupted");
|
|
367
|
+
}
|
|
368
|
+
exc = e = mrb_class_ptr(c);
|
|
369
|
+
|
|
370
|
+
while (e) {
|
|
371
|
+
if (e == mrb->eException_class)
|
|
372
|
+
return exc;
|
|
373
|
+
e = e->super;
|
|
374
|
+
}
|
|
375
|
+
return mrb->eException_class;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
MRB_API struct RClass*
|
|
379
|
+
mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
|
|
380
|
+
{
|
|
381
|
+
return module_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
MRB_API struct RClass*
|
|
385
|
+
mrb_module_get(mrb_state *mrb, const char *name)
|
|
386
|
+
{
|
|
387
|
+
return mrb_module_get_under(mrb, mrb->object_class, name);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/*!
|
|
391
|
+
* Defines a class under the namespace of \a outer.
|
|
392
|
+
* \param outer a class which contains the new class.
|
|
393
|
+
* \param id name of the new class
|
|
394
|
+
* \param super a class from which the new class will derive.
|
|
395
|
+
* NULL means \c Object class.
|
|
396
|
+
* \return the created class
|
|
397
|
+
* \throw TypeError if the constant name \a name is already taken but
|
|
398
|
+
* the constant is not a \c Class.
|
|
399
|
+
* \throw NameError if the class is already defined but the class can not
|
|
400
|
+
* be reopened because its superclass is not \a super.
|
|
401
|
+
* \post top-level constant named \a name refers the returned class.
|
|
402
|
+
*
|
|
403
|
+
* \note if a class named \a name is already defined and its superclass is
|
|
404
|
+
* \a super, the function just returns the defined class.
|
|
405
|
+
*/
|
|
406
|
+
MRB_API struct RClass*
|
|
407
|
+
mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
|
|
408
|
+
{
|
|
409
|
+
mrb_sym id = mrb_intern_cstr(mrb, name);
|
|
410
|
+
struct RClass * c;
|
|
411
|
+
|
|
412
|
+
#if 0
|
|
413
|
+
if (!super) {
|
|
414
|
+
mrb_warn(mrb, "no super class for '%S::%S', Object assumed",
|
|
415
|
+
mrb_obj_value(outer), mrb_sym2str(mrb, id));
|
|
416
|
+
}
|
|
417
|
+
#endif
|
|
418
|
+
c = define_class(mrb, id, super, outer);
|
|
419
|
+
setup_class(mrb, outer, c, id);
|
|
420
|
+
return c;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
MRB_API void
|
|
424
|
+
mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_t m)
|
|
425
|
+
{
|
|
426
|
+
khash_t(mt) *h;
|
|
427
|
+
khiter_t k;
|
|
428
|
+
MRB_CLASS_ORIGIN(c);
|
|
429
|
+
h = c->mt;
|
|
430
|
+
|
|
431
|
+
if (MRB_FROZEN_P(c)) {
|
|
432
|
+
if (c->tt == MRB_TT_MODULE)
|
|
433
|
+
mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen module");
|
|
434
|
+
else
|
|
435
|
+
mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen class");
|
|
436
|
+
}
|
|
437
|
+
if (!h) h = c->mt = kh_init(mt, mrb);
|
|
438
|
+
k = kh_put(mt, mrb, h, mid);
|
|
439
|
+
kh_value(h, k) = m;
|
|
440
|
+
if (MRB_METHOD_PROC_P(m) && !MRB_METHOD_UNDEF_P(m)) {
|
|
441
|
+
struct RProc *p = MRB_METHOD_PROC(m);
|
|
442
|
+
|
|
443
|
+
p->flags |= MRB_PROC_SCOPE;
|
|
444
|
+
p->c = NULL;
|
|
445
|
+
mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)p);
|
|
446
|
+
if (!MRB_PROC_ENV_P(p)) {
|
|
447
|
+
MRB_PROC_SET_TARGET_CLASS(p, c);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
mc_clear_by_id(mrb, c, mid);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
MRB_API void
|
|
454
|
+
mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec)
|
|
455
|
+
{
|
|
456
|
+
mrb_method_t m;
|
|
457
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
458
|
+
|
|
459
|
+
MRB_METHOD_FROM_FUNC(m, func);
|
|
460
|
+
mrb_define_method_raw(mrb, c, mid, m);
|
|
461
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
MRB_API void
|
|
465
|
+
mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
|
|
466
|
+
{
|
|
467
|
+
mrb_define_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/* a function to raise NotImplementedError with current method name */
|
|
471
|
+
MRB_API void
|
|
472
|
+
mrb_notimplement(mrb_state *mrb)
|
|
473
|
+
{
|
|
474
|
+
const char *str;
|
|
475
|
+
mrb_int len;
|
|
476
|
+
mrb_callinfo *ci = mrb->c->ci;
|
|
477
|
+
|
|
478
|
+
if (ci->mid) {
|
|
479
|
+
str = mrb_sym2name_len(mrb, ci->mid, &len);
|
|
480
|
+
mrb_raisef(mrb, E_NOTIMP_ERROR,
|
|
481
|
+
"%S() function is unimplemented on this machine",
|
|
482
|
+
mrb_str_new_static(mrb, str, (size_t)len));
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/* a function to be replacement of unimplemented method */
|
|
487
|
+
MRB_API mrb_value
|
|
488
|
+
mrb_notimplement_m(mrb_state *mrb, mrb_value self)
|
|
489
|
+
{
|
|
490
|
+
mrb_notimplement(mrb);
|
|
491
|
+
/* not reached */
|
|
492
|
+
return mrb_nil_value();
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
static mrb_value
|
|
496
|
+
check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)
|
|
497
|
+
{
|
|
498
|
+
mrb_value tmp;
|
|
499
|
+
|
|
500
|
+
tmp = mrb_check_convert_type(mrb, val, t, c, m);
|
|
501
|
+
if (mrb_nil_p(tmp)) {
|
|
502
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));
|
|
503
|
+
}
|
|
504
|
+
return tmp;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
static mrb_value
|
|
508
|
+
to_str(mrb_state *mrb, mrb_value val)
|
|
509
|
+
{
|
|
510
|
+
return check_type(mrb, val, MRB_TT_STRING, "String", "to_str");
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
static mrb_value
|
|
514
|
+
to_ary(mrb_state *mrb, mrb_value val)
|
|
515
|
+
{
|
|
516
|
+
return check_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
static mrb_value
|
|
520
|
+
to_hash(mrb_state *mrb, mrb_value val)
|
|
521
|
+
{
|
|
522
|
+
return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash");
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
static mrb_sym
|
|
526
|
+
to_sym(mrb_state *mrb, mrb_value ss)
|
|
527
|
+
{
|
|
528
|
+
if (mrb_type(ss) == MRB_TT_SYMBOL) {
|
|
529
|
+
return mrb_symbol(ss);
|
|
530
|
+
}
|
|
531
|
+
else if (mrb_string_p(ss)) {
|
|
532
|
+
return mrb_intern_str(mrb, to_str(mrb, ss));
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0);
|
|
536
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj);
|
|
537
|
+
/* not reached */
|
|
538
|
+
return 0;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
MRB_API mrb_int
|
|
543
|
+
mrb_get_argc(mrb_state *mrb)
|
|
544
|
+
{
|
|
545
|
+
mrb_int argc = mrb->c->ci->argc;
|
|
546
|
+
|
|
547
|
+
if (argc < 0) {
|
|
548
|
+
struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]);
|
|
549
|
+
|
|
550
|
+
argc = ARY_LEN(a);
|
|
551
|
+
}
|
|
552
|
+
return argc;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
MRB_API mrb_value*
|
|
556
|
+
mrb_get_argv(mrb_state *mrb)
|
|
557
|
+
{
|
|
558
|
+
mrb_int argc = mrb->c->ci->argc;
|
|
559
|
+
mrb_value *array_argv;
|
|
560
|
+
if (argc < 0) {
|
|
561
|
+
struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]);
|
|
562
|
+
|
|
563
|
+
array_argv = ARY_PTR(a);
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
array_argv = NULL;
|
|
567
|
+
}
|
|
568
|
+
return array_argv;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/*
|
|
572
|
+
retrieve arguments from mrb_state.
|
|
573
|
+
|
|
574
|
+
mrb_get_args(mrb, format, ...)
|
|
575
|
+
|
|
576
|
+
returns number of arguments parsed.
|
|
577
|
+
|
|
578
|
+
format specifiers:
|
|
579
|
+
|
|
580
|
+
string mruby type C type note
|
|
581
|
+
----------------------------------------------------------------------------------------------
|
|
582
|
+
o: Object [mrb_value]
|
|
583
|
+
C: class/module [mrb_value]
|
|
584
|
+
S: String [mrb_value] when ! follows, the value may be nil
|
|
585
|
+
A: Array [mrb_value] when ! follows, the value may be nil
|
|
586
|
+
H: Hash [mrb_value] when ! follows, the value may be nil
|
|
587
|
+
s: String [char*,mrb_int] Receive two arguments; s! gives (NULL,0) for nil
|
|
588
|
+
z: String [char*] NUL terminated string; z! gives NULL for nil
|
|
589
|
+
a: Array [mrb_value*,mrb_int] Receive two arguments; a! gives (NULL,0) for nil
|
|
590
|
+
f: Float [mrb_float]
|
|
591
|
+
i: Integer [mrb_int]
|
|
592
|
+
b: Boolean [mrb_bool]
|
|
593
|
+
n: Symbol [mrb_sym]
|
|
594
|
+
d: Data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified
|
|
595
|
+
I: Inline struct [void*]
|
|
596
|
+
&: Block [mrb_value]
|
|
597
|
+
*: rest argument [mrb_value*,mrb_int] The rest of the arguments as an array; *! avoid copy of the stack
|
|
598
|
+
|: optional Following arguments are optional
|
|
599
|
+
?: optional given [mrb_bool] true if preceding argument (optional) is given
|
|
600
|
+
*/
|
|
601
|
+
MRB_API mrb_int
|
|
602
|
+
mrb_get_args(mrb_state *mrb, const char *format, ...)
|
|
603
|
+
{
|
|
604
|
+
const char *fmt = format;
|
|
605
|
+
char c;
|
|
606
|
+
mrb_int i = 0;
|
|
607
|
+
va_list ap;
|
|
608
|
+
mrb_int argc = mrb_get_argc(mrb);
|
|
609
|
+
mrb_int arg_i = 0;
|
|
610
|
+
mrb_value *array_argv = mrb_get_argv(mrb);
|
|
611
|
+
mrb_bool opt = FALSE;
|
|
612
|
+
mrb_bool opt_skip = TRUE;
|
|
613
|
+
mrb_bool given = TRUE;
|
|
614
|
+
|
|
615
|
+
va_start(ap, format);
|
|
616
|
+
|
|
617
|
+
#define ARGV \
|
|
618
|
+
(array_argv ? array_argv : (mrb->c->stack + 1))
|
|
619
|
+
|
|
620
|
+
while ((c = *fmt++)) {
|
|
621
|
+
switch (c) {
|
|
622
|
+
case '|':
|
|
623
|
+
opt = TRUE;
|
|
624
|
+
break;
|
|
625
|
+
case '*':
|
|
626
|
+
opt_skip = FALSE;
|
|
627
|
+
goto check_exit;
|
|
628
|
+
case '!':
|
|
629
|
+
break;
|
|
630
|
+
case '&': case '?':
|
|
631
|
+
if (opt) opt_skip = FALSE;
|
|
632
|
+
break;
|
|
633
|
+
default:
|
|
634
|
+
break;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
check_exit:
|
|
639
|
+
opt = FALSE;
|
|
640
|
+
i = 0;
|
|
641
|
+
while ((c = *format++)) {
|
|
642
|
+
switch (c) {
|
|
643
|
+
case '|': case '*': case '&': case '?':
|
|
644
|
+
break;
|
|
645
|
+
default:
|
|
646
|
+
if (argc <= i) {
|
|
647
|
+
if (opt) {
|
|
648
|
+
given = FALSE;
|
|
649
|
+
}
|
|
650
|
+
else {
|
|
651
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
switch (c) {
|
|
658
|
+
case 'o':
|
|
659
|
+
{
|
|
660
|
+
mrb_value *p;
|
|
661
|
+
|
|
662
|
+
p = va_arg(ap, mrb_value*);
|
|
663
|
+
if (i < argc) {
|
|
664
|
+
*p = ARGV[arg_i++];
|
|
665
|
+
i++;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
break;
|
|
669
|
+
case 'C':
|
|
670
|
+
{
|
|
671
|
+
mrb_value *p;
|
|
672
|
+
|
|
673
|
+
p = va_arg(ap, mrb_value*);
|
|
674
|
+
if (i < argc) {
|
|
675
|
+
mrb_value ss;
|
|
676
|
+
|
|
677
|
+
ss = ARGV[arg_i++];
|
|
678
|
+
if (!class_ptr_p(ss)) {
|
|
679
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "%S is not class/module", ss);
|
|
680
|
+
}
|
|
681
|
+
*p = ss;
|
|
682
|
+
i++;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
break;
|
|
686
|
+
case 'S':
|
|
687
|
+
{
|
|
688
|
+
mrb_value *p;
|
|
689
|
+
|
|
690
|
+
p = va_arg(ap, mrb_value*);
|
|
691
|
+
if (*format == '!') {
|
|
692
|
+
format++;
|
|
693
|
+
if (i < argc && mrb_nil_p(ARGV[arg_i])) {
|
|
694
|
+
*p = ARGV[arg_i++];
|
|
695
|
+
i++;
|
|
696
|
+
break;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
if (i < argc) {
|
|
700
|
+
*p = to_str(mrb, ARGV[arg_i++]);
|
|
701
|
+
i++;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
break;
|
|
705
|
+
case 'A':
|
|
706
|
+
{
|
|
707
|
+
mrb_value *p;
|
|
708
|
+
|
|
709
|
+
p = va_arg(ap, mrb_value*);
|
|
710
|
+
if (*format == '!') {
|
|
711
|
+
format++;
|
|
712
|
+
if (i < argc && mrb_nil_p(ARGV[arg_i])) {
|
|
713
|
+
*p = ARGV[arg_i++];
|
|
714
|
+
i++;
|
|
715
|
+
break;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
if (i < argc) {
|
|
719
|
+
*p = to_ary(mrb, ARGV[arg_i++]);
|
|
720
|
+
i++;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
break;
|
|
724
|
+
case 'H':
|
|
725
|
+
{
|
|
726
|
+
mrb_value *p;
|
|
727
|
+
|
|
728
|
+
p = va_arg(ap, mrb_value*);
|
|
729
|
+
if (*format == '!') {
|
|
730
|
+
format++;
|
|
731
|
+
if (i < argc && mrb_nil_p(ARGV[arg_i])) {
|
|
732
|
+
*p = ARGV[arg_i++];
|
|
733
|
+
i++;
|
|
734
|
+
break;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
if (i < argc) {
|
|
738
|
+
*p = to_hash(mrb, ARGV[arg_i++]);
|
|
739
|
+
i++;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
break;
|
|
743
|
+
case 's':
|
|
744
|
+
{
|
|
745
|
+
mrb_value ss;
|
|
746
|
+
char **ps = 0;
|
|
747
|
+
mrb_int *pl = 0;
|
|
748
|
+
|
|
749
|
+
ps = va_arg(ap, char**);
|
|
750
|
+
pl = va_arg(ap, mrb_int*);
|
|
751
|
+
if (*format == '!') {
|
|
752
|
+
format++;
|
|
753
|
+
if (i < argc && mrb_nil_p(ARGV[arg_i])) {
|
|
754
|
+
*ps = NULL;
|
|
755
|
+
*pl = 0;
|
|
756
|
+
i++; arg_i++;
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
if (i < argc) {
|
|
761
|
+
ss = to_str(mrb, ARGV[arg_i++]);
|
|
762
|
+
*ps = RSTRING_PTR(ss);
|
|
763
|
+
*pl = RSTRING_LEN(ss);
|
|
764
|
+
i++;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
break;
|
|
768
|
+
case 'z':
|
|
769
|
+
{
|
|
770
|
+
mrb_value ss;
|
|
771
|
+
const char **ps;
|
|
772
|
+
|
|
773
|
+
ps = va_arg(ap, const char**);
|
|
774
|
+
if (*format == '!') {
|
|
775
|
+
format++;
|
|
776
|
+
if (i < argc && mrb_nil_p(ARGV[arg_i])) {
|
|
777
|
+
*ps = NULL;
|
|
778
|
+
i++; arg_i++;
|
|
779
|
+
break;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
if (i < argc) {
|
|
783
|
+
ss = to_str(mrb, ARGV[arg_i++]);
|
|
784
|
+
*ps = mrb_string_value_cstr(mrb, &ss);
|
|
785
|
+
i++;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
break;
|
|
789
|
+
case 'a':
|
|
790
|
+
{
|
|
791
|
+
mrb_value aa;
|
|
792
|
+
struct RArray *a;
|
|
793
|
+
mrb_value **pb;
|
|
794
|
+
mrb_int *pl;
|
|
795
|
+
|
|
796
|
+
pb = va_arg(ap, mrb_value**);
|
|
797
|
+
pl = va_arg(ap, mrb_int*);
|
|
798
|
+
if (*format == '!') {
|
|
799
|
+
format++;
|
|
800
|
+
if (i < argc && mrb_nil_p(ARGV[arg_i])) {
|
|
801
|
+
*pb = 0;
|
|
802
|
+
*pl = 0;
|
|
803
|
+
i++; arg_i++;
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
if (i < argc) {
|
|
808
|
+
aa = to_ary(mrb, ARGV[arg_i++]);
|
|
809
|
+
a = mrb_ary_ptr(aa);
|
|
810
|
+
*pb = ARY_PTR(a);
|
|
811
|
+
*pl = ARY_LEN(a);
|
|
812
|
+
i++;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
break;
|
|
816
|
+
case 'I':
|
|
817
|
+
{
|
|
818
|
+
void* *p;
|
|
819
|
+
mrb_value ss;
|
|
820
|
+
|
|
821
|
+
p = va_arg(ap, void**);
|
|
822
|
+
if (i < argc) {
|
|
823
|
+
ss = ARGV[arg_i];
|
|
824
|
+
if (mrb_type(ss) != MRB_TT_ISTRUCT)
|
|
825
|
+
{
|
|
826
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "%S is not inline struct", ss);
|
|
827
|
+
}
|
|
828
|
+
*p = mrb_istruct_ptr(ss);
|
|
829
|
+
arg_i++;
|
|
830
|
+
i++;
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
break;
|
|
834
|
+
#ifndef MRB_WITHOUT_FLOAT
|
|
835
|
+
case 'f':
|
|
836
|
+
{
|
|
837
|
+
mrb_float *p;
|
|
838
|
+
|
|
839
|
+
p = va_arg(ap, mrb_float*);
|
|
840
|
+
if (i < argc) {
|
|
841
|
+
*p = mrb_to_flo(mrb, ARGV[arg_i]);
|
|
842
|
+
arg_i++;
|
|
843
|
+
i++;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
break;
|
|
847
|
+
#endif
|
|
848
|
+
case 'i':
|
|
849
|
+
{
|
|
850
|
+
mrb_int *p;
|
|
851
|
+
|
|
852
|
+
p = va_arg(ap, mrb_int*);
|
|
853
|
+
if (i < argc) {
|
|
854
|
+
switch (mrb_type(ARGV[arg_i])) {
|
|
855
|
+
case MRB_TT_FIXNUM:
|
|
856
|
+
*p = mrb_fixnum(ARGV[arg_i]);
|
|
857
|
+
break;
|
|
858
|
+
#ifndef MRB_WITHOUT_FLOAT
|
|
859
|
+
case MRB_TT_FLOAT:
|
|
860
|
+
{
|
|
861
|
+
mrb_float f = mrb_float(ARGV[arg_i]);
|
|
862
|
+
|
|
863
|
+
if (!FIXABLE_FLOAT(f)) {
|
|
864
|
+
mrb_raise(mrb, E_RANGE_ERROR, "float too big for int");
|
|
865
|
+
}
|
|
866
|
+
*p = (mrb_int)f;
|
|
867
|
+
}
|
|
868
|
+
break;
|
|
869
|
+
#endif
|
|
870
|
+
case MRB_TT_STRING:
|
|
871
|
+
mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion of String into Integer");
|
|
872
|
+
break;
|
|
873
|
+
default:
|
|
874
|
+
*p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i]));
|
|
875
|
+
break;
|
|
876
|
+
}
|
|
877
|
+
arg_i++;
|
|
878
|
+
i++;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
break;
|
|
882
|
+
case 'b':
|
|
883
|
+
{
|
|
884
|
+
mrb_bool *boolp = va_arg(ap, mrb_bool*);
|
|
885
|
+
|
|
886
|
+
if (i < argc) {
|
|
887
|
+
mrb_value b = ARGV[arg_i++];
|
|
888
|
+
*boolp = mrb_test(b);
|
|
889
|
+
i++;
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
break;
|
|
893
|
+
case 'n':
|
|
894
|
+
{
|
|
895
|
+
mrb_sym *symp;
|
|
896
|
+
|
|
897
|
+
symp = va_arg(ap, mrb_sym*);
|
|
898
|
+
if (i < argc) {
|
|
899
|
+
mrb_value ss;
|
|
900
|
+
|
|
901
|
+
ss = ARGV[arg_i++];
|
|
902
|
+
*symp = to_sym(mrb, ss);
|
|
903
|
+
i++;
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
break;
|
|
907
|
+
case 'd':
|
|
908
|
+
{
|
|
909
|
+
void** datap;
|
|
910
|
+
struct mrb_data_type const* type;
|
|
911
|
+
|
|
912
|
+
datap = va_arg(ap, void**);
|
|
913
|
+
type = va_arg(ap, struct mrb_data_type const*);
|
|
914
|
+
if (*format == '!') {
|
|
915
|
+
format++;
|
|
916
|
+
if (i < argc && mrb_nil_p(ARGV[arg_i])) {
|
|
917
|
+
*datap = 0;
|
|
918
|
+
i++; arg_i++;
|
|
919
|
+
break;
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
if (i < argc) {
|
|
923
|
+
*datap = mrb_data_get_ptr(mrb, ARGV[arg_i++], type);
|
|
924
|
+
++i;
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
break;
|
|
928
|
+
|
|
929
|
+
case '&':
|
|
930
|
+
{
|
|
931
|
+
mrb_value *p, *bp;
|
|
932
|
+
|
|
933
|
+
p = va_arg(ap, mrb_value*);
|
|
934
|
+
if (mrb->c->ci->argc < 0) {
|
|
935
|
+
bp = mrb->c->stack + 2;
|
|
936
|
+
}
|
|
937
|
+
else {
|
|
938
|
+
bp = mrb->c->stack + mrb->c->ci->argc + 1;
|
|
939
|
+
}
|
|
940
|
+
*p = *bp;
|
|
941
|
+
}
|
|
942
|
+
break;
|
|
943
|
+
case '|':
|
|
944
|
+
if (opt_skip && i == argc) return argc;
|
|
945
|
+
opt = TRUE;
|
|
946
|
+
break;
|
|
947
|
+
case '?':
|
|
948
|
+
{
|
|
949
|
+
mrb_bool *p;
|
|
950
|
+
|
|
951
|
+
p = va_arg(ap, mrb_bool*);
|
|
952
|
+
*p = given;
|
|
953
|
+
}
|
|
954
|
+
break;
|
|
955
|
+
|
|
956
|
+
case '*':
|
|
957
|
+
{
|
|
958
|
+
mrb_value **var;
|
|
959
|
+
mrb_int *pl;
|
|
960
|
+
mrb_bool nocopy = array_argv ? TRUE : FALSE;
|
|
961
|
+
|
|
962
|
+
if (*format == '!') {
|
|
963
|
+
format++;
|
|
964
|
+
nocopy = TRUE;
|
|
965
|
+
}
|
|
966
|
+
var = va_arg(ap, mrb_value**);
|
|
967
|
+
pl = va_arg(ap, mrb_int*);
|
|
968
|
+
if (argc > i) {
|
|
969
|
+
*pl = argc-i;
|
|
970
|
+
if (*pl > 0) {
|
|
971
|
+
if (nocopy) {
|
|
972
|
+
*var = ARGV+arg_i;
|
|
973
|
+
}
|
|
974
|
+
else {
|
|
975
|
+
mrb_value args = mrb_ary_new_from_values(mrb, *pl, ARGV+arg_i);
|
|
976
|
+
RARRAY(args)->c = NULL;
|
|
977
|
+
*var = RARRAY_PTR(args);
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
i = argc;
|
|
981
|
+
arg_i += *pl;
|
|
982
|
+
}
|
|
983
|
+
else {
|
|
984
|
+
*pl = 0;
|
|
985
|
+
*var = NULL;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
break;
|
|
989
|
+
default:
|
|
990
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %S", mrb_str_new(mrb, &c, 1));
|
|
991
|
+
break;
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
#undef ARGV
|
|
996
|
+
|
|
997
|
+
if (!c && argc > i) {
|
|
998
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
|
|
999
|
+
}
|
|
1000
|
+
va_end(ap);
|
|
1001
|
+
return i;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
static struct RClass*
|
|
1005
|
+
boot_defclass(mrb_state *mrb, struct RClass *super)
|
|
1006
|
+
{
|
|
1007
|
+
struct RClass *c;
|
|
1008
|
+
|
|
1009
|
+
c = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_CLASS, mrb->class_class);
|
|
1010
|
+
if (super) {
|
|
1011
|
+
c->super = super;
|
|
1012
|
+
mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)super);
|
|
1013
|
+
}
|
|
1014
|
+
else {
|
|
1015
|
+
c->super = mrb->object_class;
|
|
1016
|
+
}
|
|
1017
|
+
c->mt = kh_init(mt, mrb);
|
|
1018
|
+
return c;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
static void
|
|
1022
|
+
boot_initmod(mrb_state *mrb, struct RClass *mod)
|
|
1023
|
+
{
|
|
1024
|
+
if (!mod->mt) {
|
|
1025
|
+
mod->mt = kh_init(mt, mrb);
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
static struct RClass*
|
|
1030
|
+
include_class_new(mrb_state *mrb, struct RClass *m, struct RClass *super)
|
|
1031
|
+
{
|
|
1032
|
+
struct RClass *ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class);
|
|
1033
|
+
if (m->tt == MRB_TT_ICLASS) {
|
|
1034
|
+
m = m->c;
|
|
1035
|
+
}
|
|
1036
|
+
MRB_CLASS_ORIGIN(m);
|
|
1037
|
+
ic->iv = m->iv;
|
|
1038
|
+
ic->mt = m->mt;
|
|
1039
|
+
ic->super = super;
|
|
1040
|
+
if (m->tt == MRB_TT_ICLASS) {
|
|
1041
|
+
ic->c = m->c;
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
ic->c = m;
|
|
1045
|
+
}
|
|
1046
|
+
return ic;
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
static int
|
|
1050
|
+
include_module_at(mrb_state *mrb, struct RClass *c, struct RClass *ins_pos, struct RClass *m, int search_super)
|
|
1051
|
+
{
|
|
1052
|
+
struct RClass *p, *ic;
|
|
1053
|
+
void *klass_mt = find_origin(c)->mt;
|
|
1054
|
+
|
|
1055
|
+
while (m) {
|
|
1056
|
+
int superclass_seen = 0;
|
|
1057
|
+
|
|
1058
|
+
if (m->flags & MRB_FLAG_IS_PREPENDED)
|
|
1059
|
+
goto skip;
|
|
1060
|
+
|
|
1061
|
+
if (klass_mt && klass_mt == m->mt)
|
|
1062
|
+
return -1;
|
|
1063
|
+
|
|
1064
|
+
p = c->super;
|
|
1065
|
+
while (p) {
|
|
1066
|
+
if (p->tt == MRB_TT_ICLASS) {
|
|
1067
|
+
if (p->mt == m->mt) {
|
|
1068
|
+
if (!superclass_seen) {
|
|
1069
|
+
ins_pos = p; /* move insert point */
|
|
1070
|
+
}
|
|
1071
|
+
goto skip;
|
|
1072
|
+
}
|
|
1073
|
+
} else if (p->tt == MRB_TT_CLASS) {
|
|
1074
|
+
if (!search_super) break;
|
|
1075
|
+
superclass_seen = 1;
|
|
1076
|
+
}
|
|
1077
|
+
p = p->super;
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
ic = include_class_new(mrb, m, ins_pos->super);
|
|
1081
|
+
m->flags |= MRB_FLAG_IS_INHERITED;
|
|
1082
|
+
ins_pos->super = ic;
|
|
1083
|
+
mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic);
|
|
1084
|
+
mc_clear_by_class(mrb, ins_pos);
|
|
1085
|
+
ins_pos = ic;
|
|
1086
|
+
skip:
|
|
1087
|
+
m = m->super;
|
|
1088
|
+
}
|
|
1089
|
+
mc_clear_all(mrb);
|
|
1090
|
+
return 0;
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
MRB_API void
|
|
1094
|
+
mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
|
|
1095
|
+
{
|
|
1096
|
+
int changed = include_module_at(mrb, c, find_origin(c), m, 1);
|
|
1097
|
+
if (changed < 0) {
|
|
1098
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic include detected");
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
MRB_API void
|
|
1103
|
+
mrb_prepend_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
|
|
1104
|
+
{
|
|
1105
|
+
struct RClass *origin;
|
|
1106
|
+
int changed = 0;
|
|
1107
|
+
|
|
1108
|
+
if (!(c->flags & MRB_FLAG_IS_PREPENDED)) {
|
|
1109
|
+
origin = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, c);
|
|
1110
|
+
origin->flags |= MRB_FLAG_IS_ORIGIN | MRB_FLAG_IS_INHERITED;
|
|
1111
|
+
origin->super = c->super;
|
|
1112
|
+
c->super = origin;
|
|
1113
|
+
origin->mt = c->mt;
|
|
1114
|
+
c->mt = kh_init(mt, mrb);
|
|
1115
|
+
mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)origin);
|
|
1116
|
+
c->flags |= MRB_FLAG_IS_PREPENDED;
|
|
1117
|
+
}
|
|
1118
|
+
changed = include_module_at(mrb, c, c, m, 0);
|
|
1119
|
+
if (changed < 0) {
|
|
1120
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic prepend detected");
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
static mrb_value
|
|
1125
|
+
mrb_mod_prepend_features(mrb_state *mrb, mrb_value mod)
|
|
1126
|
+
{
|
|
1127
|
+
mrb_value klass;
|
|
1128
|
+
|
|
1129
|
+
mrb_check_type(mrb, mod, MRB_TT_MODULE);
|
|
1130
|
+
mrb_get_args(mrb, "C", &klass);
|
|
1131
|
+
mrb_prepend_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
|
|
1132
|
+
return mod;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
static mrb_value
|
|
1136
|
+
mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
|
|
1137
|
+
{
|
|
1138
|
+
mrb_value klass;
|
|
1139
|
+
|
|
1140
|
+
mrb_check_type(mrb, mod, MRB_TT_MODULE);
|
|
1141
|
+
mrb_get_args(mrb, "C", &klass);
|
|
1142
|
+
mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
|
|
1143
|
+
return mod;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/* 15.2.2.4.28 */
|
|
1147
|
+
/*
|
|
1148
|
+
* call-seq:
|
|
1149
|
+
* mod.include?(module) -> true or false
|
|
1150
|
+
*
|
|
1151
|
+
* Returns <code>true</code> if <i>module</i> is included in
|
|
1152
|
+
* <i>mod</i> or one of <i>mod</i>'s ancestors.
|
|
1153
|
+
*
|
|
1154
|
+
* module A
|
|
1155
|
+
* end
|
|
1156
|
+
* class B
|
|
1157
|
+
* include A
|
|
1158
|
+
* end
|
|
1159
|
+
* class C < B
|
|
1160
|
+
* end
|
|
1161
|
+
* B.include?(A) #=> true
|
|
1162
|
+
* C.include?(A) #=> true
|
|
1163
|
+
* A.include?(A) #=> false
|
|
1164
|
+
*/
|
|
1165
|
+
static mrb_value
|
|
1166
|
+
mrb_mod_include_p(mrb_state *mrb, mrb_value mod)
|
|
1167
|
+
{
|
|
1168
|
+
mrb_value mod2;
|
|
1169
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
1170
|
+
|
|
1171
|
+
mrb_get_args(mrb, "C", &mod2);
|
|
1172
|
+
mrb_check_type(mrb, mod2, MRB_TT_MODULE);
|
|
1173
|
+
|
|
1174
|
+
while (c) {
|
|
1175
|
+
if (c->tt == MRB_TT_ICLASS) {
|
|
1176
|
+
if (c->c == mrb_class_ptr(mod2)) return mrb_true_value();
|
|
1177
|
+
}
|
|
1178
|
+
c = c->super;
|
|
1179
|
+
}
|
|
1180
|
+
return mrb_false_value();
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
static mrb_value
|
|
1184
|
+
mrb_mod_ancestors(mrb_state *mrb, mrb_value self)
|
|
1185
|
+
{
|
|
1186
|
+
mrb_value result;
|
|
1187
|
+
struct RClass *c = mrb_class_ptr(self);
|
|
1188
|
+
result = mrb_ary_new(mrb);
|
|
1189
|
+
while (c) {
|
|
1190
|
+
if (c->tt == MRB_TT_ICLASS) {
|
|
1191
|
+
mrb_ary_push(mrb, result, mrb_obj_value(c->c));
|
|
1192
|
+
}
|
|
1193
|
+
else if (!(c->flags & MRB_FLAG_IS_PREPENDED)) {
|
|
1194
|
+
mrb_ary_push(mrb, result, mrb_obj_value(c));
|
|
1195
|
+
}
|
|
1196
|
+
c = c->super;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
return result;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
static mrb_value
|
|
1203
|
+
mrb_mod_extend_object(mrb_state *mrb, mrb_value mod)
|
|
1204
|
+
{
|
|
1205
|
+
mrb_value obj;
|
|
1206
|
+
|
|
1207
|
+
mrb_check_type(mrb, mod, MRB_TT_MODULE);
|
|
1208
|
+
mrb_get_args(mrb, "o", &obj);
|
|
1209
|
+
mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod));
|
|
1210
|
+
return mod;
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
static mrb_value
|
|
1214
|
+
mrb_mod_included_modules(mrb_state *mrb, mrb_value self)
|
|
1215
|
+
{
|
|
1216
|
+
mrb_value result;
|
|
1217
|
+
struct RClass *c = mrb_class_ptr(self);
|
|
1218
|
+
struct RClass *origin = c;
|
|
1219
|
+
|
|
1220
|
+
MRB_CLASS_ORIGIN(origin);
|
|
1221
|
+
result = mrb_ary_new(mrb);
|
|
1222
|
+
while (c) {
|
|
1223
|
+
if (c != origin && c->tt == MRB_TT_ICLASS) {
|
|
1224
|
+
if (c->c->tt == MRB_TT_MODULE) {
|
|
1225
|
+
mrb_ary_push(mrb, result, mrb_obj_value(c->c));
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
c = c->super;
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
return result;
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
static mrb_value
|
|
1235
|
+
mrb_mod_initialize(mrb_state *mrb, mrb_value mod)
|
|
1236
|
+
{
|
|
1237
|
+
mrb_value b;
|
|
1238
|
+
struct RClass *m = mrb_class_ptr(mod);
|
|
1239
|
+
boot_initmod(mrb, m); /* bootstrap a newly initialized module */
|
|
1240
|
+
mrb_get_args(mrb, "|&", &b);
|
|
1241
|
+
if (!mrb_nil_p(b)) {
|
|
1242
|
+
mrb_yield_with_class(mrb, b, 1, &mod, mod, m);
|
|
1243
|
+
}
|
|
1244
|
+
return mod;
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
mrb_value mrb_class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int);
|
|
1248
|
+
|
|
1249
|
+
/* 15.2.2.4.33 */
|
|
1250
|
+
/*
|
|
1251
|
+
* call-seq:
|
|
1252
|
+
* mod.instance_methods(include_super=true) -> array
|
|
1253
|
+
*
|
|
1254
|
+
* Returns an array containing the names of the public and protected instance
|
|
1255
|
+
* methods in the receiver. For a module, these are the public and protected methods;
|
|
1256
|
+
* for a class, they are the instance (not singleton) methods. With no
|
|
1257
|
+
* argument, or with an argument that is <code>false</code>, the
|
|
1258
|
+
* instance methods in <i>mod</i> are returned, otherwise the methods
|
|
1259
|
+
* in <i>mod</i> and <i>mod</i>'s superclasses are returned.
|
|
1260
|
+
*
|
|
1261
|
+
* module A
|
|
1262
|
+
* def method1() end
|
|
1263
|
+
* end
|
|
1264
|
+
* class B
|
|
1265
|
+
* def method2() end
|
|
1266
|
+
* end
|
|
1267
|
+
* class C < B
|
|
1268
|
+
* def method3() end
|
|
1269
|
+
* end
|
|
1270
|
+
*
|
|
1271
|
+
* A.instance_methods #=> [:method1]
|
|
1272
|
+
* B.instance_methods(false) #=> [:method2]
|
|
1273
|
+
* C.instance_methods(false) #=> [:method3]
|
|
1274
|
+
* C.instance_methods(true).length #=> 43
|
|
1275
|
+
*/
|
|
1276
|
+
|
|
1277
|
+
static mrb_value
|
|
1278
|
+
mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod)
|
|
1279
|
+
{
|
|
1280
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
1281
|
+
mrb_bool recur = TRUE;
|
|
1282
|
+
mrb_get_args(mrb, "|b", &recur);
|
|
1283
|
+
return mrb_class_instance_method_list(mrb, recur, c, 0);
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
/* implementation of module_eval/class_eval */
|
|
1287
|
+
mrb_value mrb_mod_module_eval(mrb_state*, mrb_value);
|
|
1288
|
+
|
|
1289
|
+
static mrb_value
|
|
1290
|
+
mrb_mod_dummy_visibility(mrb_state *mrb, mrb_value mod)
|
|
1291
|
+
{
|
|
1292
|
+
return mod;
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
MRB_API mrb_value
|
|
1296
|
+
mrb_singleton_class(mrb_state *mrb, mrb_value v)
|
|
1297
|
+
{
|
|
1298
|
+
struct RBasic *obj;
|
|
1299
|
+
|
|
1300
|
+
switch (mrb_type(v)) {
|
|
1301
|
+
case MRB_TT_FALSE:
|
|
1302
|
+
if (mrb_nil_p(v))
|
|
1303
|
+
return mrb_obj_value(mrb->nil_class);
|
|
1304
|
+
return mrb_obj_value(mrb->false_class);
|
|
1305
|
+
case MRB_TT_TRUE:
|
|
1306
|
+
return mrb_obj_value(mrb->true_class);
|
|
1307
|
+
case MRB_TT_CPTR:
|
|
1308
|
+
return mrb_obj_value(mrb->object_class);
|
|
1309
|
+
case MRB_TT_SYMBOL:
|
|
1310
|
+
case MRB_TT_FIXNUM:
|
|
1311
|
+
#ifndef MRB_WITHOUT_FLOAT
|
|
1312
|
+
case MRB_TT_FLOAT:
|
|
1313
|
+
#endif
|
|
1314
|
+
mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
|
|
1315
|
+
return mrb_nil_value(); /* not reached */
|
|
1316
|
+
default:
|
|
1317
|
+
break;
|
|
1318
|
+
}
|
|
1319
|
+
obj = mrb_basic_ptr(v);
|
|
1320
|
+
prepare_singleton_class(mrb, obj);
|
|
1321
|
+
return mrb_obj_value(obj->c);
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
MRB_API void
|
|
1325
|
+
mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, mrb_aspec aspec)
|
|
1326
|
+
{
|
|
1327
|
+
prepare_singleton_class(mrb, (struct RBasic*)o);
|
|
1328
|
+
mrb_define_method_id(mrb, o->c, mrb_intern_cstr(mrb, name), func, aspec);
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
MRB_API void
|
|
1332
|
+
mrb_define_class_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
|
|
1333
|
+
{
|
|
1334
|
+
mrb_define_singleton_method(mrb, (struct RObject*)c, name, func, aspec);
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
MRB_API void
|
|
1338
|
+
mrb_define_module_function(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
|
|
1339
|
+
{
|
|
1340
|
+
mrb_define_class_method(mrb, c, name, func, aspec);
|
|
1341
|
+
mrb_define_method(mrb, c, name, func, aspec);
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
#ifdef MRB_METHOD_CACHE
|
|
1345
|
+
static void
|
|
1346
|
+
mc_clear_all(mrb_state *mrb)
|
|
1347
|
+
{
|
|
1348
|
+
struct mrb_cache_entry *mc = mrb->cache;
|
|
1349
|
+
int i;
|
|
1350
|
+
|
|
1351
|
+
for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) {
|
|
1352
|
+
mc[i].c = 0;
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
static void
|
|
1357
|
+
mc_clear_by_class(mrb_state *mrb, struct RClass *c)
|
|
1358
|
+
{
|
|
1359
|
+
struct mrb_cache_entry *mc = mrb->cache;
|
|
1360
|
+
int i;
|
|
1361
|
+
|
|
1362
|
+
if (c->flags & MRB_FLAG_IS_INHERITED) {
|
|
1363
|
+
mc_clear_all(mrb);
|
|
1364
|
+
c->flags &= ~MRB_FLAG_IS_INHERITED;
|
|
1365
|
+
return;
|
|
1366
|
+
}
|
|
1367
|
+
for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) {
|
|
1368
|
+
if (mc[i].c == c) mc[i].c = 0;
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
static void
|
|
1373
|
+
mc_clear_by_id(mrb_state *mrb, struct RClass *c, mrb_sym mid)
|
|
1374
|
+
{
|
|
1375
|
+
struct mrb_cache_entry *mc = mrb->cache;
|
|
1376
|
+
int i;
|
|
1377
|
+
|
|
1378
|
+
if (c->flags & MRB_FLAG_IS_INHERITED) {
|
|
1379
|
+
mc_clear_all(mrb);
|
|
1380
|
+
c->flags &= ~MRB_FLAG_IS_INHERITED;
|
|
1381
|
+
return;
|
|
1382
|
+
}
|
|
1383
|
+
for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) {
|
|
1384
|
+
if (mc[i].c == c || mc[i].mid == mid)
|
|
1385
|
+
mc[i].c = 0;
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
#endif
|
|
1389
|
+
|
|
1390
|
+
MRB_API mrb_method_t
|
|
1391
|
+
mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid)
|
|
1392
|
+
{
|
|
1393
|
+
khiter_t k;
|
|
1394
|
+
mrb_method_t m;
|
|
1395
|
+
struct RClass *c = *cp;
|
|
1396
|
+
#ifdef MRB_METHOD_CACHE
|
|
1397
|
+
struct RClass *oc = c;
|
|
1398
|
+
int h = kh_int_hash_func(mrb, ((intptr_t)oc) ^ mid) & (MRB_METHOD_CACHE_SIZE-1);
|
|
1399
|
+
struct mrb_cache_entry *mc = &mrb->cache[h];
|
|
1400
|
+
|
|
1401
|
+
if (mc->c == c && mc->mid == mid) {
|
|
1402
|
+
*cp = mc->c0;
|
|
1403
|
+
return mc->m;
|
|
1404
|
+
}
|
|
1405
|
+
#endif
|
|
1406
|
+
|
|
1407
|
+
while (c) {
|
|
1408
|
+
khash_t(mt) *h = c->mt;
|
|
1409
|
+
|
|
1410
|
+
if (h) {
|
|
1411
|
+
k = kh_get(mt, mrb, h, mid);
|
|
1412
|
+
if (k != kh_end(h)) {
|
|
1413
|
+
m = kh_value(h, k);
|
|
1414
|
+
if (MRB_METHOD_UNDEF_P(m)) break;
|
|
1415
|
+
*cp = c;
|
|
1416
|
+
#ifdef MRB_METHOD_CACHE
|
|
1417
|
+
mc->c = oc;
|
|
1418
|
+
mc->c0 = c;
|
|
1419
|
+
mc->mid = mid;
|
|
1420
|
+
mc->m = m;
|
|
1421
|
+
#endif
|
|
1422
|
+
return m;
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
c = c->super;
|
|
1426
|
+
}
|
|
1427
|
+
MRB_METHOD_FROM_PROC(m, NULL);
|
|
1428
|
+
return m; /* no method */
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
MRB_API mrb_method_t
|
|
1432
|
+
mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid)
|
|
1433
|
+
{
|
|
1434
|
+
mrb_method_t m;
|
|
1435
|
+
|
|
1436
|
+
m = mrb_method_search_vm(mrb, &c, mid);
|
|
1437
|
+
if (MRB_METHOD_UNDEF_P(m)) {
|
|
1438
|
+
mrb_value inspect = mrb_funcall(mrb, mrb_obj_value(c), "inspect", 0);
|
|
1439
|
+
if (mrb_string_p(inspect) && RSTRING_LEN(inspect) > 64) {
|
|
1440
|
+
inspect = mrb_any_to_s(mrb, mrb_obj_value(c));
|
|
1441
|
+
}
|
|
1442
|
+
mrb_name_error(mrb, mid, "undefined method '%S' for class %S",
|
|
1443
|
+
mrb_sym2str(mrb, mid), inspect);
|
|
1444
|
+
}
|
|
1445
|
+
return m;
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
static mrb_value
|
|
1449
|
+
attr_reader(mrb_state *mrb, mrb_value obj)
|
|
1450
|
+
{
|
|
1451
|
+
mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
|
|
1452
|
+
return mrb_iv_get(mrb, obj, to_sym(mrb, name));
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
static mrb_value
|
|
1456
|
+
mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod)
|
|
1457
|
+
{
|
|
1458
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
1459
|
+
mrb_value *argv;
|
|
1460
|
+
mrb_int argc, i;
|
|
1461
|
+
int ai;
|
|
1462
|
+
|
|
1463
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1464
|
+
ai = mrb_gc_arena_save(mrb);
|
|
1465
|
+
for (i=0; i<argc; i++) {
|
|
1466
|
+
mrb_value name, str;
|
|
1467
|
+
mrb_sym method, sym;
|
|
1468
|
+
struct RProc *p;
|
|
1469
|
+
mrb_method_t m;
|
|
1470
|
+
|
|
1471
|
+
method = to_sym(mrb, argv[i]);
|
|
1472
|
+
name = mrb_sym2str(mrb, method);
|
|
1473
|
+
str = mrb_str_new_capa(mrb, RSTRING_LEN(name)+1);
|
|
1474
|
+
mrb_str_cat_lit(mrb, str, "@");
|
|
1475
|
+
mrb_str_cat_str(mrb, str, name);
|
|
1476
|
+
sym = mrb_intern_str(mrb, str);
|
|
1477
|
+
mrb_iv_check(mrb, sym);
|
|
1478
|
+
name = mrb_symbol_value(sym);
|
|
1479
|
+
p = mrb_proc_new_cfunc_with_env(mrb, attr_reader, 1, &name);
|
|
1480
|
+
MRB_METHOD_FROM_PROC(m, p);
|
|
1481
|
+
mrb_define_method_raw(mrb, c, method, m);
|
|
1482
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1483
|
+
}
|
|
1484
|
+
return mrb_nil_value();
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
static mrb_value
|
|
1488
|
+
attr_writer(mrb_state *mrb, mrb_value obj)
|
|
1489
|
+
{
|
|
1490
|
+
mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
|
|
1491
|
+
mrb_value val;
|
|
1492
|
+
|
|
1493
|
+
mrb_get_args(mrb, "o", &val);
|
|
1494
|
+
mrb_iv_set(mrb, obj, to_sym(mrb, name), val);
|
|
1495
|
+
return val;
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
static mrb_value
|
|
1499
|
+
mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod)
|
|
1500
|
+
{
|
|
1501
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
1502
|
+
mrb_value *argv;
|
|
1503
|
+
mrb_int argc, i;
|
|
1504
|
+
int ai;
|
|
1505
|
+
|
|
1506
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1507
|
+
ai = mrb_gc_arena_save(mrb);
|
|
1508
|
+
for (i=0; i<argc; i++) {
|
|
1509
|
+
mrb_value name, str, attr;
|
|
1510
|
+
mrb_sym method, sym;
|
|
1511
|
+
struct RProc *p;
|
|
1512
|
+
mrb_method_t m;
|
|
1513
|
+
|
|
1514
|
+
method = to_sym(mrb, argv[i]);
|
|
1515
|
+
|
|
1516
|
+
/* prepare iv name (@name) */
|
|
1517
|
+
name = mrb_sym2str(mrb, method);
|
|
1518
|
+
str = mrb_str_new_capa(mrb, RSTRING_LEN(name)+1);
|
|
1519
|
+
mrb_str_cat_lit(mrb, str, "@");
|
|
1520
|
+
mrb_str_cat_str(mrb, str, name);
|
|
1521
|
+
sym = mrb_intern_str(mrb, str);
|
|
1522
|
+
mrb_iv_check(mrb, sym);
|
|
1523
|
+
attr = mrb_symbol_value(sym);
|
|
1524
|
+
|
|
1525
|
+
/* prepare method name (name=) */
|
|
1526
|
+
str = mrb_str_new_capa(mrb, RSTRING_LEN(str));
|
|
1527
|
+
mrb_str_cat_str(mrb, str, name);
|
|
1528
|
+
mrb_str_cat_lit(mrb, str, "=");
|
|
1529
|
+
method = mrb_intern_str(mrb, str);
|
|
1530
|
+
|
|
1531
|
+
p = mrb_proc_new_cfunc_with_env(mrb, attr_writer, 1, &attr);
|
|
1532
|
+
MRB_METHOD_FROM_PROC(m, p);
|
|
1533
|
+
mrb_define_method_raw(mrb, c, method, m);
|
|
1534
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
1535
|
+
}
|
|
1536
|
+
return mrb_nil_value();
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
static mrb_value
|
|
1540
|
+
mrb_instance_alloc(mrb_state *mrb, mrb_value cv)
|
|
1541
|
+
{
|
|
1542
|
+
struct RClass *c = mrb_class_ptr(cv);
|
|
1543
|
+
struct RObject *o;
|
|
1544
|
+
enum mrb_vtype ttype = MRB_INSTANCE_TT(c);
|
|
1545
|
+
|
|
1546
|
+
if (c->tt == MRB_TT_SCLASS)
|
|
1547
|
+
mrb_raise(mrb, E_TYPE_ERROR, "can't create instance of singleton class");
|
|
1548
|
+
|
|
1549
|
+
if (ttype == 0) ttype = MRB_TT_OBJECT;
|
|
1550
|
+
if (ttype <= MRB_TT_CPTR) {
|
|
1551
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %S", cv);
|
|
1552
|
+
}
|
|
1553
|
+
o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
|
|
1554
|
+
return mrb_obj_value(o);
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
/*
|
|
1558
|
+
* call-seq:
|
|
1559
|
+
* class.new(args, ...) -> obj
|
|
1560
|
+
*
|
|
1561
|
+
* Creates a new object of <i>class</i>'s class, then
|
|
1562
|
+
* invokes that object's <code>initialize</code> method,
|
|
1563
|
+
* passing it <i>args</i>. This is the method that ends
|
|
1564
|
+
* up getting called whenever an object is constructed using
|
|
1565
|
+
* `.new`.
|
|
1566
|
+
*
|
|
1567
|
+
*/
|
|
1568
|
+
|
|
1569
|
+
MRB_API mrb_value
|
|
1570
|
+
mrb_instance_new(mrb_state *mrb, mrb_value cv)
|
|
1571
|
+
{
|
|
1572
|
+
mrb_value obj, blk;
|
|
1573
|
+
mrb_value *argv;
|
|
1574
|
+
mrb_int argc;
|
|
1575
|
+
mrb_sym init;
|
|
1576
|
+
mrb_method_t m;
|
|
1577
|
+
|
|
1578
|
+
mrb_get_args(mrb, "*&", &argv, &argc, &blk);
|
|
1579
|
+
obj = mrb_instance_alloc(mrb, cv);
|
|
1580
|
+
init = mrb_intern_lit(mrb, "initialize");
|
|
1581
|
+
m = mrb_method_search(mrb, mrb_class(mrb, obj), init);
|
|
1582
|
+
if (MRB_METHOD_CFUNC_P(m)) {
|
|
1583
|
+
mrb_func_t f = MRB_METHOD_CFUNC(m);
|
|
1584
|
+
if (f != mrb_bob_init) {
|
|
1585
|
+
f(mrb, obj);
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
else {
|
|
1589
|
+
mrb_funcall_with_block(mrb, obj, init, argc, argv, blk);
|
|
1590
|
+
}
|
|
1591
|
+
|
|
1592
|
+
return obj;
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
MRB_API mrb_value
|
|
1596
|
+
mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv)
|
|
1597
|
+
{
|
|
1598
|
+
mrb_value obj;
|
|
1599
|
+
mrb_sym mid;
|
|
1600
|
+
|
|
1601
|
+
obj = mrb_instance_alloc(mrb, mrb_obj_value(c));
|
|
1602
|
+
mid = mrb_intern_lit(mrb, "initialize");
|
|
1603
|
+
if (!mrb_func_basic_p(mrb, obj, mid, mrb_bob_init)) {
|
|
1604
|
+
mrb_funcall_argv(mrb, obj, mid, argc, argv);
|
|
1605
|
+
}
|
|
1606
|
+
return obj;
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
static mrb_value
|
|
1610
|
+
mrb_class_initialize(mrb_state *mrb, mrb_value c)
|
|
1611
|
+
{
|
|
1612
|
+
mrb_value a, b;
|
|
1613
|
+
|
|
1614
|
+
mrb_get_args(mrb, "|C&", &a, &b);
|
|
1615
|
+
if (!mrb_nil_p(b)) {
|
|
1616
|
+
mrb_yield_with_class(mrb, b, 1, &c, c, mrb_class_ptr(c));
|
|
1617
|
+
}
|
|
1618
|
+
return c;
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
static mrb_value
|
|
1622
|
+
mrb_class_new_class(mrb_state *mrb, mrb_value cv)
|
|
1623
|
+
{
|
|
1624
|
+
mrb_int n;
|
|
1625
|
+
mrb_value super, blk;
|
|
1626
|
+
mrb_value new_class;
|
|
1627
|
+
mrb_sym mid;
|
|
1628
|
+
|
|
1629
|
+
n = mrb_get_args(mrb, "|C&", &super, &blk);
|
|
1630
|
+
if (n == 0) {
|
|
1631
|
+
super = mrb_obj_value(mrb->object_class);
|
|
1632
|
+
}
|
|
1633
|
+
new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super)));
|
|
1634
|
+
mid = mrb_intern_lit(mrb, "initialize");
|
|
1635
|
+
if (!mrb_func_basic_p(mrb, new_class, mid, mrb_bob_init)) {
|
|
1636
|
+
mrb_funcall_with_block(mrb, new_class, mid, n, &super, blk);
|
|
1637
|
+
}
|
|
1638
|
+
mrb_class_inherited(mrb, mrb_class_ptr(super), mrb_class_ptr(new_class));
|
|
1639
|
+
return new_class;
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
static mrb_value
|
|
1643
|
+
mrb_class_superclass(mrb_state *mrb, mrb_value klass)
|
|
1644
|
+
{
|
|
1645
|
+
struct RClass *c;
|
|
1646
|
+
|
|
1647
|
+
c = mrb_class_ptr(klass);
|
|
1648
|
+
c = find_origin(c)->super;
|
|
1649
|
+
while (c && c->tt == MRB_TT_ICLASS) {
|
|
1650
|
+
c = find_origin(c)->super;
|
|
1651
|
+
}
|
|
1652
|
+
if (!c) return mrb_nil_value();
|
|
1653
|
+
return mrb_obj_value(c);
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
static mrb_value
|
|
1657
|
+
mrb_bob_init(mrb_state *mrb, mrb_value cv)
|
|
1658
|
+
{
|
|
1659
|
+
return mrb_nil_value();
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
static mrb_value
|
|
1663
|
+
mrb_bob_not(mrb_state *mrb, mrb_value cv)
|
|
1664
|
+
{
|
|
1665
|
+
return mrb_bool_value(!mrb_test(cv));
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
/* 15.3.1.3.1 */
|
|
1669
|
+
/* 15.3.1.3.10 */
|
|
1670
|
+
/* 15.3.1.3.11 */
|
|
1671
|
+
/*
|
|
1672
|
+
* call-seq:
|
|
1673
|
+
* obj == other -> true or false
|
|
1674
|
+
* obj.equal?(other) -> true or false
|
|
1675
|
+
* obj.eql?(other) -> true or false
|
|
1676
|
+
*
|
|
1677
|
+
* Equality---At the <code>Object</code> level, <code>==</code> returns
|
|
1678
|
+
* <code>true</code> only if <i>obj</i> and <i>other</i> are the
|
|
1679
|
+
* same object. Typically, this method is overridden in descendant
|
|
1680
|
+
* classes to provide class-specific meaning.
|
|
1681
|
+
*
|
|
1682
|
+
* Unlike <code>==</code>, the <code>equal?</code> method should never be
|
|
1683
|
+
* overridden by subclasses: it is used to determine object identity
|
|
1684
|
+
* (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same
|
|
1685
|
+
* object as <code>b</code>).
|
|
1686
|
+
*
|
|
1687
|
+
* The <code>eql?</code> method returns <code>true</code> if
|
|
1688
|
+
* <i>obj</i> and <i>anObject</i> have the same value. Used by
|
|
1689
|
+
* <code>Hash</code> to test members for equality. For objects of
|
|
1690
|
+
* class <code>Object</code>, <code>eql?</code> is synonymous with
|
|
1691
|
+
* <code>==</code>. Subclasses normally continue this tradition, but
|
|
1692
|
+
* there are exceptions. <code>Numeric</code> types, for example,
|
|
1693
|
+
* perform type conversion across <code>==</code>, but not across
|
|
1694
|
+
* <code>eql?</code>, so:
|
|
1695
|
+
*
|
|
1696
|
+
* 1 == 1.0 #=> true
|
|
1697
|
+
* 1.eql? 1.0 #=> false
|
|
1698
|
+
*/
|
|
1699
|
+
mrb_value
|
|
1700
|
+
mrb_obj_equal_m(mrb_state *mrb, mrb_value self)
|
|
1701
|
+
{
|
|
1702
|
+
mrb_value arg;
|
|
1703
|
+
|
|
1704
|
+
mrb_get_args(mrb, "o", &arg);
|
|
1705
|
+
return mrb_bool_value(mrb_obj_equal(mrb, self, arg));
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1708
|
+
static mrb_value
|
|
1709
|
+
mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self)
|
|
1710
|
+
{
|
|
1711
|
+
mrb_value arg;
|
|
1712
|
+
|
|
1713
|
+
mrb_get_args(mrb, "o", &arg);
|
|
1714
|
+
return mrb_bool_value(!mrb_equal(mrb, self, arg));
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
MRB_API mrb_bool
|
|
1718
|
+
mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid)
|
|
1719
|
+
{
|
|
1720
|
+
mrb_method_t m;
|
|
1721
|
+
|
|
1722
|
+
m = mrb_method_search_vm(mrb, &c, mid);
|
|
1723
|
+
if (MRB_METHOD_UNDEF_P(m)) {
|
|
1724
|
+
return FALSE;
|
|
1725
|
+
}
|
|
1726
|
+
return TRUE;
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
MRB_API mrb_bool
|
|
1730
|
+
mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid)
|
|
1731
|
+
{
|
|
1732
|
+
return mrb_obj_respond_to(mrb, mrb_class(mrb, obj), mid);
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
MRB_API mrb_value
|
|
1736
|
+
mrb_class_path(mrb_state *mrb, struct RClass *c)
|
|
1737
|
+
{
|
|
1738
|
+
mrb_value path;
|
|
1739
|
+
mrb_sym nsym = mrb_intern_lit(mrb, "__classname__");
|
|
1740
|
+
|
|
1741
|
+
path = mrb_obj_iv_get(mrb, (struct RObject*)c, nsym);
|
|
1742
|
+
if (mrb_nil_p(path)) {
|
|
1743
|
+
/* no name (yet) */
|
|
1744
|
+
return mrb_class_find_path(mrb, c);
|
|
1745
|
+
}
|
|
1746
|
+
else if (mrb_symbol_p(path)) {
|
|
1747
|
+
/* topleve class/module */
|
|
1748
|
+
const char *str;
|
|
1749
|
+
mrb_int len;
|
|
1750
|
+
|
|
1751
|
+
str = mrb_sym2name_len(mrb, mrb_symbol(path), &len);
|
|
1752
|
+
return mrb_str_new(mrb, str, len);
|
|
1753
|
+
}
|
|
1754
|
+
return mrb_str_dup(mrb, path);
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
MRB_API struct RClass*
|
|
1758
|
+
mrb_class_real(struct RClass* cl)
|
|
1759
|
+
{
|
|
1760
|
+
if (cl == 0)
|
|
1761
|
+
return NULL;
|
|
1762
|
+
while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) {
|
|
1763
|
+
cl = cl->super;
|
|
1764
|
+
}
|
|
1765
|
+
return cl;
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
MRB_API const char*
|
|
1769
|
+
mrb_class_name(mrb_state *mrb, struct RClass* c)
|
|
1770
|
+
{
|
|
1771
|
+
mrb_value path = mrb_class_path(mrb, c);
|
|
1772
|
+
if (mrb_nil_p(path)) {
|
|
1773
|
+
path = mrb_str_new_lit(mrb, "#<Class:");
|
|
1774
|
+
mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c));
|
|
1775
|
+
mrb_str_cat_lit(mrb, path, ">");
|
|
1776
|
+
}
|
|
1777
|
+
return RSTRING_PTR(path);
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
MRB_API const char*
|
|
1781
|
+
mrb_obj_classname(mrb_state *mrb, mrb_value obj)
|
|
1782
|
+
{
|
|
1783
|
+
return mrb_class_name(mrb, mrb_obj_class(mrb, obj));
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
/*!
|
|
1787
|
+
* Ensures a class can be derived from super.
|
|
1788
|
+
*
|
|
1789
|
+
* \param super a reference to an object.
|
|
1790
|
+
* \exception TypeError if \a super is not a Class or \a super is a singleton class.
|
|
1791
|
+
*/
|
|
1792
|
+
static void
|
|
1793
|
+
mrb_check_inheritable(mrb_state *mrb, struct RClass *super)
|
|
1794
|
+
{
|
|
1795
|
+
if (super->tt != MRB_TT_CLASS) {
|
|
1796
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", mrb_obj_value(super));
|
|
1797
|
+
}
|
|
1798
|
+
if (super->tt == MRB_TT_SCLASS) {
|
|
1799
|
+
mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of singleton class");
|
|
1800
|
+
}
|
|
1801
|
+
if (super == mrb->class_class) {
|
|
1802
|
+
mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of Class");
|
|
1803
|
+
}
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
/*!
|
|
1807
|
+
* Creates a new class.
|
|
1808
|
+
* \param super a class from which the new class derives.
|
|
1809
|
+
* \exception TypeError \a super is not inheritable.
|
|
1810
|
+
* \exception TypeError \a super is the Class class.
|
|
1811
|
+
*/
|
|
1812
|
+
MRB_API struct RClass*
|
|
1813
|
+
mrb_class_new(mrb_state *mrb, struct RClass *super)
|
|
1814
|
+
{
|
|
1815
|
+
struct RClass *c;
|
|
1816
|
+
|
|
1817
|
+
if (super) {
|
|
1818
|
+
mrb_check_inheritable(mrb, super);
|
|
1819
|
+
}
|
|
1820
|
+
c = boot_defclass(mrb, super);
|
|
1821
|
+
if (super) {
|
|
1822
|
+
MRB_SET_INSTANCE_TT(c, MRB_INSTANCE_TT(super));
|
|
1823
|
+
}
|
|
1824
|
+
make_metaclass(mrb, c);
|
|
1825
|
+
|
|
1826
|
+
return c;
|
|
1827
|
+
}
|
|
1828
|
+
|
|
1829
|
+
/*!
|
|
1830
|
+
* Creates a new module.
|
|
1831
|
+
*/
|
|
1832
|
+
MRB_API struct RClass*
|
|
1833
|
+
mrb_module_new(mrb_state *mrb)
|
|
1834
|
+
{
|
|
1835
|
+
struct RClass *m = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_MODULE, mrb->module_class);
|
|
1836
|
+
boot_initmod(mrb, m);
|
|
1837
|
+
return m;
|
|
1838
|
+
}
|
|
1839
|
+
|
|
1840
|
+
/*
|
|
1841
|
+
* call-seq:
|
|
1842
|
+
* obj.class => class
|
|
1843
|
+
*
|
|
1844
|
+
* Returns the class of <i>obj</i>, now preferred over
|
|
1845
|
+
* <code>Object#type</code>, as an object's type in Ruby is only
|
|
1846
|
+
* loosely tied to that object's class. This method must always be
|
|
1847
|
+
* called with an explicit receiver, as <code>class</code> is also a
|
|
1848
|
+
* reserved word in Ruby.
|
|
1849
|
+
*
|
|
1850
|
+
* 1.class #=> Fixnum
|
|
1851
|
+
* self.class #=> Object
|
|
1852
|
+
*/
|
|
1853
|
+
|
|
1854
|
+
MRB_API struct RClass*
|
|
1855
|
+
mrb_obj_class(mrb_state *mrb, mrb_value obj)
|
|
1856
|
+
{
|
|
1857
|
+
return mrb_class_real(mrb_class(mrb, obj));
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
MRB_API void
|
|
1861
|
+
mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
|
|
1862
|
+
{
|
|
1863
|
+
mrb_method_t m = mrb_method_search(mrb, c, b);
|
|
1864
|
+
|
|
1865
|
+
mrb_define_method_raw(mrb, c, a, m);
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
/*!
|
|
1869
|
+
* Defines an alias of a method.
|
|
1870
|
+
* \param klass the class which the original method belongs to
|
|
1871
|
+
* \param name1 a new name for the method
|
|
1872
|
+
* \param name2 the original name of the method
|
|
1873
|
+
*/
|
|
1874
|
+
MRB_API void
|
|
1875
|
+
mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2)
|
|
1876
|
+
{
|
|
1877
|
+
mrb_alias_method(mrb, klass, mrb_intern_cstr(mrb, name1), mrb_intern_cstr(mrb, name2));
|
|
1878
|
+
}
|
|
1879
|
+
|
|
1880
|
+
/*
|
|
1881
|
+
* call-seq:
|
|
1882
|
+
* mod.to_s -> string
|
|
1883
|
+
*
|
|
1884
|
+
* Return a string representing this module or class. For basic
|
|
1885
|
+
* classes and modules, this is the name. For singletons, we
|
|
1886
|
+
* show information on the thing we're attached to as well.
|
|
1887
|
+
*/
|
|
1888
|
+
|
|
1889
|
+
static mrb_value
|
|
1890
|
+
mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
|
|
1891
|
+
{
|
|
1892
|
+
mrb_value str;
|
|
1893
|
+
|
|
1894
|
+
if (mrb_type(klass) == MRB_TT_SCLASS) {
|
|
1895
|
+
mrb_value v = mrb_iv_get(mrb, klass, mrb_intern_lit(mrb, "__attached__"));
|
|
1896
|
+
|
|
1897
|
+
str = mrb_str_new_lit(mrb, "#<Class:");
|
|
1898
|
+
|
|
1899
|
+
if (class_ptr_p(v)) {
|
|
1900
|
+
mrb_str_cat_str(mrb, str, mrb_inspect(mrb, v));
|
|
1901
|
+
}
|
|
1902
|
+
else {
|
|
1903
|
+
mrb_str_cat_str(mrb, str, mrb_any_to_s(mrb, v));
|
|
1904
|
+
}
|
|
1905
|
+
return mrb_str_cat_lit(mrb, str, ">");
|
|
1906
|
+
}
|
|
1907
|
+
else {
|
|
1908
|
+
struct RClass *c;
|
|
1909
|
+
mrb_value path;
|
|
1910
|
+
|
|
1911
|
+
str = mrb_str_new_capa(mrb, 32);
|
|
1912
|
+
c = mrb_class_ptr(klass);
|
|
1913
|
+
path = mrb_class_path(mrb, c);
|
|
1914
|
+
|
|
1915
|
+
if (mrb_nil_p(path)) {
|
|
1916
|
+
switch (mrb_type(klass)) {
|
|
1917
|
+
case MRB_TT_CLASS:
|
|
1918
|
+
mrb_str_cat_lit(mrb, str, "#<Class:");
|
|
1919
|
+
break;
|
|
1920
|
+
|
|
1921
|
+
case MRB_TT_MODULE:
|
|
1922
|
+
mrb_str_cat_lit(mrb, str, "#<Module:");
|
|
1923
|
+
break;
|
|
1924
|
+
|
|
1925
|
+
default:
|
|
1926
|
+
/* Shouldn't be happened? */
|
|
1927
|
+
mrb_str_cat_lit(mrb, str, "#<??????:");
|
|
1928
|
+
break;
|
|
1929
|
+
}
|
|
1930
|
+
mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, c));
|
|
1931
|
+
return mrb_str_cat_lit(mrb, str, ">");
|
|
1932
|
+
}
|
|
1933
|
+
else {
|
|
1934
|
+
return path;
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
static mrb_value
|
|
1940
|
+
mrb_mod_alias(mrb_state *mrb, mrb_value mod)
|
|
1941
|
+
{
|
|
1942
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
1943
|
+
mrb_sym new_name, old_name;
|
|
1944
|
+
|
|
1945
|
+
mrb_get_args(mrb, "nn", &new_name, &old_name);
|
|
1946
|
+
mrb_alias_method(mrb, c, new_name, old_name);
|
|
1947
|
+
return mrb_nil_value();
|
|
1948
|
+
}
|
|
1949
|
+
|
|
1950
|
+
static void
|
|
1951
|
+
undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
|
|
1952
|
+
{
|
|
1953
|
+
if (!mrb_obj_respond_to(mrb, c, a)) {
|
|
1954
|
+
mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c));
|
|
1955
|
+
}
|
|
1956
|
+
else {
|
|
1957
|
+
mrb_method_t m;
|
|
1958
|
+
|
|
1959
|
+
MRB_METHOD_FROM_PROC(m, NULL);
|
|
1960
|
+
mrb_define_method_raw(mrb, c, a, m);
|
|
1961
|
+
}
|
|
1962
|
+
}
|
|
1963
|
+
|
|
1964
|
+
MRB_API void
|
|
1965
|
+
mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name)
|
|
1966
|
+
{
|
|
1967
|
+
undef_method(mrb, c, mrb_intern_cstr(mrb, name));
|
|
1968
|
+
}
|
|
1969
|
+
|
|
1970
|
+
MRB_API void
|
|
1971
|
+
mrb_undef_class_method(mrb_state *mrb, struct RClass *c, const char *name)
|
|
1972
|
+
{
|
|
1973
|
+
mrb_undef_method(mrb, mrb_class_ptr(mrb_singleton_class(mrb, mrb_obj_value(c))), name);
|
|
1974
|
+
}
|
|
1975
|
+
|
|
1976
|
+
static mrb_value
|
|
1977
|
+
mrb_mod_undef(mrb_state *mrb, mrb_value mod)
|
|
1978
|
+
{
|
|
1979
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
1980
|
+
mrb_int argc;
|
|
1981
|
+
mrb_value *argv;
|
|
1982
|
+
|
|
1983
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1984
|
+
while (argc--) {
|
|
1985
|
+
undef_method(mrb, c, to_sym(mrb, *argv));
|
|
1986
|
+
argv++;
|
|
1987
|
+
}
|
|
1988
|
+
return mrb_nil_value();
|
|
1989
|
+
}
|
|
1990
|
+
|
|
1991
|
+
static mrb_value
|
|
1992
|
+
mod_define_method(mrb_state *mrb, mrb_value self)
|
|
1993
|
+
{
|
|
1994
|
+
struct RClass *c = mrb_class_ptr(self);
|
|
1995
|
+
struct RProc *p;
|
|
1996
|
+
mrb_method_t m;
|
|
1997
|
+
mrb_sym mid;
|
|
1998
|
+
mrb_value proc = mrb_undef_value();
|
|
1999
|
+
mrb_value blk;
|
|
2000
|
+
|
|
2001
|
+
mrb_get_args(mrb, "n|o&", &mid, &proc, &blk);
|
|
2002
|
+
switch (mrb_type(proc)) {
|
|
2003
|
+
case MRB_TT_PROC:
|
|
2004
|
+
blk = proc;
|
|
2005
|
+
break;
|
|
2006
|
+
case MRB_TT_UNDEF:
|
|
2007
|
+
/* ignored */
|
|
2008
|
+
break;
|
|
2009
|
+
default:
|
|
2010
|
+
mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected Proc)", mrb_obj_value(mrb_obj_class(mrb, proc)));
|
|
2011
|
+
break;
|
|
2012
|
+
}
|
|
2013
|
+
if (mrb_nil_p(blk)) {
|
|
2014
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
|
|
2015
|
+
}
|
|
2016
|
+
p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
|
|
2017
|
+
mrb_proc_copy(p, mrb_proc_ptr(blk));
|
|
2018
|
+
p->flags |= MRB_PROC_STRICT;
|
|
2019
|
+
MRB_METHOD_FROM_PROC(m, p);
|
|
2020
|
+
mrb_define_method_raw(mrb, c, mid, m);
|
|
2021
|
+
return mrb_symbol_value(mid);
|
|
2022
|
+
}
|
|
2023
|
+
|
|
2024
|
+
static mrb_value
|
|
2025
|
+
top_define_method(mrb_state *mrb, mrb_value self)
|
|
2026
|
+
{
|
|
2027
|
+
return mod_define_method(mrb, mrb_obj_value(mrb->object_class));
|
|
2028
|
+
}
|
|
2029
|
+
|
|
2030
|
+
static void
|
|
2031
|
+
check_cv_name_str(mrb_state *mrb, mrb_value str)
|
|
2032
|
+
{
|
|
2033
|
+
const char *s = RSTRING_PTR(str);
|
|
2034
|
+
mrb_int len = RSTRING_LEN(str);
|
|
2035
|
+
|
|
2036
|
+
if (len < 3 || !(s[0] == '@' && s[1] == '@')) {
|
|
2037
|
+
mrb_name_error(mrb, mrb_intern_str(mrb, str), "'%S' is not allowed as a class variable name", str);
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
|
|
2041
|
+
static void
|
|
2042
|
+
check_cv_name_sym(mrb_state *mrb, mrb_sym id)
|
|
2043
|
+
{
|
|
2044
|
+
check_cv_name_str(mrb, mrb_sym2str(mrb, id));
|
|
2045
|
+
}
|
|
2046
|
+
|
|
2047
|
+
/* 15.2.2.4.16 */
|
|
2048
|
+
/*
|
|
2049
|
+
* call-seq:
|
|
2050
|
+
* obj.class_variable_defined?(symbol) -> true or false
|
|
2051
|
+
*
|
|
2052
|
+
* Returns <code>true</code> if the given class variable is defined
|
|
2053
|
+
* in <i>obj</i>.
|
|
2054
|
+
*
|
|
2055
|
+
* class Fred
|
|
2056
|
+
* @@foo = 99
|
|
2057
|
+
* end
|
|
2058
|
+
* Fred.class_variable_defined?(:@@foo) #=> true
|
|
2059
|
+
* Fred.class_variable_defined?(:@@bar) #=> false
|
|
2060
|
+
*/
|
|
2061
|
+
|
|
2062
|
+
static mrb_value
|
|
2063
|
+
mrb_mod_cvar_defined(mrb_state *mrb, mrb_value mod)
|
|
2064
|
+
{
|
|
2065
|
+
mrb_sym id;
|
|
2066
|
+
|
|
2067
|
+
mrb_get_args(mrb, "n", &id);
|
|
2068
|
+
check_cv_name_sym(mrb, id);
|
|
2069
|
+
return mrb_bool_value(mrb_cv_defined(mrb, mod, id));
|
|
2070
|
+
}
|
|
2071
|
+
|
|
2072
|
+
/* 15.2.2.4.17 */
|
|
2073
|
+
/*
|
|
2074
|
+
* call-seq:
|
|
2075
|
+
* mod.class_variable_get(symbol) -> obj
|
|
2076
|
+
*
|
|
2077
|
+
* Returns the value of the given class variable (or throws a
|
|
2078
|
+
* <code>NameError</code> exception). The <code>@@</code> part of the
|
|
2079
|
+
* variable name should be included for regular class variables
|
|
2080
|
+
*
|
|
2081
|
+
* class Fred
|
|
2082
|
+
* @@foo = 99
|
|
2083
|
+
* end
|
|
2084
|
+
* Fred.class_variable_get(:@@foo) #=> 99
|
|
2085
|
+
*/
|
|
2086
|
+
|
|
2087
|
+
static mrb_value
|
|
2088
|
+
mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod)
|
|
2089
|
+
{
|
|
2090
|
+
mrb_sym id;
|
|
2091
|
+
|
|
2092
|
+
mrb_get_args(mrb, "n", &id);
|
|
2093
|
+
check_cv_name_sym(mrb, id);
|
|
2094
|
+
return mrb_cv_get(mrb, mod, id);
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
/* 15.2.2.4.18 */
|
|
2098
|
+
/*
|
|
2099
|
+
* call-seq:
|
|
2100
|
+
* obj.class_variable_set(symbol, obj) -> obj
|
|
2101
|
+
*
|
|
2102
|
+
* Sets the class variable names by <i>symbol</i> to
|
|
2103
|
+
* <i>object</i>.
|
|
2104
|
+
*
|
|
2105
|
+
* class Fred
|
|
2106
|
+
* @@foo = 99
|
|
2107
|
+
* def foo
|
|
2108
|
+
* @@foo
|
|
2109
|
+
* end
|
|
2110
|
+
* end
|
|
2111
|
+
* Fred.class_variable_set(:@@foo, 101) #=> 101
|
|
2112
|
+
* Fred.new.foo #=> 101
|
|
2113
|
+
*/
|
|
2114
|
+
|
|
2115
|
+
static mrb_value
|
|
2116
|
+
mrb_mod_cvar_set(mrb_state *mrb, mrb_value mod)
|
|
2117
|
+
{
|
|
2118
|
+
mrb_value value;
|
|
2119
|
+
mrb_sym id;
|
|
2120
|
+
|
|
2121
|
+
mrb_get_args(mrb, "no", &id, &value);
|
|
2122
|
+
check_cv_name_sym(mrb, id);
|
|
2123
|
+
mrb_cv_set(mrb, mod, id, value);
|
|
2124
|
+
return value;
|
|
2125
|
+
}
|
|
2126
|
+
|
|
2127
|
+
/* 15.2.2.4.39 */
|
|
2128
|
+
/*
|
|
2129
|
+
* call-seq:
|
|
2130
|
+
* remove_class_variable(sym) -> obj
|
|
2131
|
+
*
|
|
2132
|
+
* Removes the definition of the <i>sym</i>, returning that
|
|
2133
|
+
* constant's value.
|
|
2134
|
+
*
|
|
2135
|
+
* class Dummy
|
|
2136
|
+
* @@var = 99
|
|
2137
|
+
* puts @@var
|
|
2138
|
+
* p class_variables
|
|
2139
|
+
* remove_class_variable(:@@var)
|
|
2140
|
+
* p class_variables
|
|
2141
|
+
* end
|
|
2142
|
+
*
|
|
2143
|
+
* <em>produces:</em>
|
|
2144
|
+
*
|
|
2145
|
+
* 99
|
|
2146
|
+
* [:@@var]
|
|
2147
|
+
* []
|
|
2148
|
+
*/
|
|
2149
|
+
|
|
2150
|
+
static mrb_value
|
|
2151
|
+
mrb_mod_remove_cvar(mrb_state *mrb, mrb_value mod)
|
|
2152
|
+
{
|
|
2153
|
+
mrb_value val;
|
|
2154
|
+
mrb_sym id;
|
|
2155
|
+
|
|
2156
|
+
mrb_get_args(mrb, "n", &id);
|
|
2157
|
+
check_cv_name_sym(mrb, id);
|
|
2158
|
+
|
|
2159
|
+
val = mrb_iv_remove(mrb, mod, id);
|
|
2160
|
+
if (!mrb_undef_p(val)) return val;
|
|
2161
|
+
|
|
2162
|
+
if (mrb_cv_defined(mrb, mod, id)) {
|
|
2163
|
+
mrb_name_error(mrb, id, "cannot remove %S for %S",
|
|
2164
|
+
mrb_sym2str(mrb, id), mod);
|
|
2165
|
+
}
|
|
2166
|
+
|
|
2167
|
+
mrb_name_error(mrb, id, "class variable %S not defined for %S",
|
|
2168
|
+
mrb_sym2str(mrb, id), mod);
|
|
2169
|
+
|
|
2170
|
+
/* not reached */
|
|
2171
|
+
return mrb_nil_value();
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
/* 15.2.2.4.34 */
|
|
2175
|
+
/*
|
|
2176
|
+
* call-seq:
|
|
2177
|
+
* mod.method_defined?(symbol) -> true or false
|
|
2178
|
+
*
|
|
2179
|
+
* Returns +true+ if the named method is defined by
|
|
2180
|
+
* _mod_ (or its included modules and, if _mod_ is a class,
|
|
2181
|
+
* its ancestors). Public and protected methods are matched.
|
|
2182
|
+
*
|
|
2183
|
+
* module A
|
|
2184
|
+
* def method1() end
|
|
2185
|
+
* end
|
|
2186
|
+
* class B
|
|
2187
|
+
* def method2() end
|
|
2188
|
+
* end
|
|
2189
|
+
* class C < B
|
|
2190
|
+
* include A
|
|
2191
|
+
* def method3() end
|
|
2192
|
+
* end
|
|
2193
|
+
*
|
|
2194
|
+
* A.method_defined? :method1 #=> true
|
|
2195
|
+
* C.method_defined? "method1" #=> true
|
|
2196
|
+
* C.method_defined? "method2" #=> true
|
|
2197
|
+
* C.method_defined? "method3" #=> true
|
|
2198
|
+
* C.method_defined? "method4" #=> false
|
|
2199
|
+
*/
|
|
2200
|
+
|
|
2201
|
+
static mrb_value
|
|
2202
|
+
mrb_mod_method_defined(mrb_state *mrb, mrb_value mod)
|
|
2203
|
+
{
|
|
2204
|
+
mrb_sym id;
|
|
2205
|
+
|
|
2206
|
+
mrb_get_args(mrb, "n", &id);
|
|
2207
|
+
return mrb_bool_value(mrb_obj_respond_to(mrb, mrb_class_ptr(mod), id));
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
static void
|
|
2211
|
+
remove_method(mrb_state *mrb, mrb_value mod, mrb_sym mid)
|
|
2212
|
+
{
|
|
2213
|
+
struct RClass *c = mrb_class_ptr(mod);
|
|
2214
|
+
khash_t(mt) *h = find_origin(c)->mt;
|
|
2215
|
+
khiter_t k;
|
|
2216
|
+
|
|
2217
|
+
if (h) {
|
|
2218
|
+
k = kh_get(mt, mrb, h, mid);
|
|
2219
|
+
if (k != kh_end(h)) {
|
|
2220
|
+
kh_del(mt, mrb, h, k);
|
|
2221
|
+
mrb_funcall(mrb, mod, "method_removed", 1, mrb_symbol_value(mid));
|
|
2222
|
+
return;
|
|
2223
|
+
}
|
|
2224
|
+
}
|
|
2225
|
+
|
|
2226
|
+
mrb_name_error(mrb, mid, "method '%S' not defined in %S",
|
|
2227
|
+
mrb_sym2str(mrb, mid), mod);
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2230
|
+
/* 15.2.2.4.41 */
|
|
2231
|
+
/*
|
|
2232
|
+
* call-seq:
|
|
2233
|
+
* remove_method(symbol) -> self
|
|
2234
|
+
*
|
|
2235
|
+
* Removes the method identified by _symbol_ from the current
|
|
2236
|
+
* class. For an example, see <code>Module.undef_method</code>.
|
|
2237
|
+
*/
|
|
2238
|
+
|
|
2239
|
+
static mrb_value
|
|
2240
|
+
mrb_mod_remove_method(mrb_state *mrb, mrb_value mod)
|
|
2241
|
+
{
|
|
2242
|
+
mrb_int argc;
|
|
2243
|
+
mrb_value *argv;
|
|
2244
|
+
|
|
2245
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
2246
|
+
while (argc--) {
|
|
2247
|
+
remove_method(mrb, mod, to_sym(mrb, *argv));
|
|
2248
|
+
argv++;
|
|
2249
|
+
}
|
|
2250
|
+
return mod;
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2253
|
+
|
|
2254
|
+
|
|
2255
|
+
static void
|
|
2256
|
+
check_const_name_str(mrb_state *mrb, mrb_value str)
|
|
2257
|
+
{
|
|
2258
|
+
if (RSTRING_LEN(str) < 1 || !ISUPPER(*RSTRING_PTR(str))) {
|
|
2259
|
+
mrb_name_error(mrb, mrb_intern_str(mrb, str), "wrong constant name %S", str);
|
|
2260
|
+
}
|
|
2261
|
+
}
|
|
2262
|
+
|
|
2263
|
+
static void
|
|
2264
|
+
check_const_name_sym(mrb_state *mrb, mrb_sym id)
|
|
2265
|
+
{
|
|
2266
|
+
check_const_name_str(mrb, mrb_sym2str(mrb, id));
|
|
2267
|
+
}
|
|
2268
|
+
|
|
2269
|
+
static mrb_value
|
|
2270
|
+
const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool inherit)
|
|
2271
|
+
{
|
|
2272
|
+
if (inherit) {
|
|
2273
|
+
return mrb_bool_value(mrb_const_defined(mrb, mod, id));
|
|
2274
|
+
}
|
|
2275
|
+
return mrb_bool_value(mrb_const_defined_at(mrb, mod, id));
|
|
2276
|
+
}
|
|
2277
|
+
|
|
2278
|
+
static mrb_value
|
|
2279
|
+
mrb_mod_const_defined(mrb_state *mrb, mrb_value mod)
|
|
2280
|
+
{
|
|
2281
|
+
mrb_sym id;
|
|
2282
|
+
mrb_bool inherit = TRUE;
|
|
2283
|
+
|
|
2284
|
+
mrb_get_args(mrb, "n|b", &id, &inherit);
|
|
2285
|
+
check_const_name_sym(mrb, id);
|
|
2286
|
+
return const_defined(mrb, mod, id, inherit);
|
|
2287
|
+
}
|
|
2288
|
+
|
|
2289
|
+
static mrb_value
|
|
2290
|
+
mrb_const_get_sym(mrb_state *mrb, mrb_value mod, mrb_sym id)
|
|
2291
|
+
{
|
|
2292
|
+
check_const_name_sym(mrb, id);
|
|
2293
|
+
return mrb_const_get(mrb, mod, id);
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
static mrb_value
|
|
2297
|
+
mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
|
|
2298
|
+
{
|
|
2299
|
+
mrb_value path;
|
|
2300
|
+
mrb_sym id;
|
|
2301
|
+
char *ptr;
|
|
2302
|
+
mrb_int off, end, len;
|
|
2303
|
+
|
|
2304
|
+
mrb_get_args(mrb, "o", &path);
|
|
2305
|
+
|
|
2306
|
+
if (mrb_symbol_p(path)) {
|
|
2307
|
+
/* const get with symbol */
|
|
2308
|
+
id = mrb_symbol(path);
|
|
2309
|
+
return mrb_const_get_sym(mrb, mod, id);
|
|
2310
|
+
}
|
|
2311
|
+
|
|
2312
|
+
/* const get with class path string */
|
|
2313
|
+
path = mrb_string_type(mrb, path);
|
|
2314
|
+
ptr = RSTRING_PTR(path);
|
|
2315
|
+
len = RSTRING_LEN(path);
|
|
2316
|
+
off = 0;
|
|
2317
|
+
|
|
2318
|
+
while (off < len) {
|
|
2319
|
+
end = mrb_str_index_lit(mrb, path, "::", off);
|
|
2320
|
+
end = (end == -1) ? len : end;
|
|
2321
|
+
id = mrb_intern(mrb, ptr+off, end-off);
|
|
2322
|
+
mod = mrb_const_get_sym(mrb, mod, id);
|
|
2323
|
+
off = (end == len) ? end : end+2;
|
|
2324
|
+
}
|
|
2325
|
+
|
|
2326
|
+
return mod;
|
|
2327
|
+
}
|
|
2328
|
+
|
|
2329
|
+
static mrb_value
|
|
2330
|
+
mrb_mod_const_set(mrb_state *mrb, mrb_value mod)
|
|
2331
|
+
{
|
|
2332
|
+
mrb_sym id;
|
|
2333
|
+
mrb_value value;
|
|
2334
|
+
|
|
2335
|
+
mrb_get_args(mrb, "no", &id, &value);
|
|
2336
|
+
check_const_name_sym(mrb, id);
|
|
2337
|
+
mrb_const_set(mrb, mod, id, value);
|
|
2338
|
+
return value;
|
|
2339
|
+
}
|
|
2340
|
+
|
|
2341
|
+
static mrb_value
|
|
2342
|
+
mrb_mod_remove_const(mrb_state *mrb, mrb_value mod)
|
|
2343
|
+
{
|
|
2344
|
+
mrb_sym id;
|
|
2345
|
+
mrb_value val;
|
|
2346
|
+
|
|
2347
|
+
mrb_get_args(mrb, "n", &id);
|
|
2348
|
+
check_const_name_sym(mrb, id);
|
|
2349
|
+
val = mrb_iv_remove(mrb, mod, id);
|
|
2350
|
+
if (mrb_undef_p(val)) {
|
|
2351
|
+
mrb_name_error(mrb, id, "constant %S not defined", mrb_sym2str(mrb, id));
|
|
2352
|
+
}
|
|
2353
|
+
return val;
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2356
|
+
static mrb_value
|
|
2357
|
+
mrb_mod_const_missing(mrb_state *mrb, mrb_value mod)
|
|
2358
|
+
{
|
|
2359
|
+
mrb_sym sym;
|
|
2360
|
+
|
|
2361
|
+
mrb_get_args(mrb, "n", &sym);
|
|
2362
|
+
|
|
2363
|
+
if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) {
|
|
2364
|
+
mrb_name_error(mrb, sym, "uninitialized constant %S::%S",
|
|
2365
|
+
mod,
|
|
2366
|
+
mrb_sym2str(mrb, sym));
|
|
2367
|
+
}
|
|
2368
|
+
else {
|
|
2369
|
+
mrb_name_error(mrb, sym, "uninitialized constant %S",
|
|
2370
|
+
mrb_sym2str(mrb, sym));
|
|
2371
|
+
}
|
|
2372
|
+
/* not reached */
|
|
2373
|
+
return mrb_nil_value();
|
|
2374
|
+
}
|
|
2375
|
+
|
|
2376
|
+
static mrb_value
|
|
2377
|
+
mrb_mod_s_constants(mrb_state *mrb, mrb_value mod)
|
|
2378
|
+
{
|
|
2379
|
+
mrb_raise(mrb, E_NOTIMP_ERROR, "Module.constants not implemented");
|
|
2380
|
+
return mrb_nil_value(); /* not reached */
|
|
2381
|
+
}
|
|
2382
|
+
|
|
2383
|
+
static mrb_value
|
|
2384
|
+
mrb_mod_eqq(mrb_state *mrb, mrb_value mod)
|
|
2385
|
+
{
|
|
2386
|
+
mrb_value obj;
|
|
2387
|
+
mrb_bool eqq;
|
|
2388
|
+
|
|
2389
|
+
mrb_get_args(mrb, "o", &obj);
|
|
2390
|
+
eqq = mrb_obj_is_kind_of(mrb, obj, mrb_class_ptr(mod));
|
|
2391
|
+
|
|
2392
|
+
return mrb_bool_value(eqq);
|
|
2393
|
+
}
|
|
2394
|
+
|
|
2395
|
+
MRB_API mrb_value
|
|
2396
|
+
mrb_mod_module_function(mrb_state *mrb, mrb_value mod)
|
|
2397
|
+
{
|
|
2398
|
+
mrb_value *argv;
|
|
2399
|
+
mrb_int argc, i;
|
|
2400
|
+
mrb_sym mid;
|
|
2401
|
+
mrb_method_t m;
|
|
2402
|
+
struct RClass *rclass;
|
|
2403
|
+
int ai;
|
|
2404
|
+
|
|
2405
|
+
mrb_check_type(mrb, mod, MRB_TT_MODULE);
|
|
2406
|
+
|
|
2407
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
2408
|
+
if (argc == 0) {
|
|
2409
|
+
/* set MODFUNC SCOPE if implemented */
|
|
2410
|
+
return mod;
|
|
2411
|
+
}
|
|
2412
|
+
|
|
2413
|
+
/* set PRIVATE method visibility if implemented */
|
|
2414
|
+
/* mrb_mod_dummy_visibility(mrb, mod); */
|
|
2415
|
+
|
|
2416
|
+
for (i=0; i<argc; i++) {
|
|
2417
|
+
mrb_check_type(mrb, argv[i], MRB_TT_SYMBOL);
|
|
2418
|
+
|
|
2419
|
+
mid = mrb_symbol(argv[i]);
|
|
2420
|
+
rclass = mrb_class_ptr(mod);
|
|
2421
|
+
m = mrb_method_search(mrb, rclass, mid);
|
|
2422
|
+
|
|
2423
|
+
prepare_singleton_class(mrb, (struct RBasic*)rclass);
|
|
2424
|
+
ai = mrb_gc_arena_save(mrb);
|
|
2425
|
+
mrb_define_method_raw(mrb, rclass->c, mid, m);
|
|
2426
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
2427
|
+
}
|
|
2428
|
+
|
|
2429
|
+
return mod;
|
|
2430
|
+
}
|
|
2431
|
+
|
|
2432
|
+
/* implementation of __id__ */
|
|
2433
|
+
mrb_value mrb_obj_id_m(mrb_state *mrb, mrb_value self);
|
|
2434
|
+
/* implementation of instance_eval */
|
|
2435
|
+
mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value);
|
|
2436
|
+
/* implementation of Module.nesting */
|
|
2437
|
+
mrb_value mrb_mod_s_nesting(mrb_state*, mrb_value);
|
|
2438
|
+
|
|
2439
|
+
static mrb_value
|
|
2440
|
+
inspect_main(mrb_state *mrb, mrb_value mod)
|
|
2441
|
+
{
|
|
2442
|
+
return mrb_str_new_lit(mrb, "main");
|
|
2443
|
+
}
|
|
2444
|
+
|
|
2445
|
+
void
|
|
2446
|
+
mrb_init_class(mrb_state *mrb)
|
|
2447
|
+
{
|
|
2448
|
+
struct RClass *bob; /* BasicObject */
|
|
2449
|
+
struct RClass *obj; /* Object */
|
|
2450
|
+
struct RClass *mod; /* Module */
|
|
2451
|
+
struct RClass *cls; /* Class */
|
|
2452
|
+
|
|
2453
|
+
/* boot class hierarchy */
|
|
2454
|
+
bob = boot_defclass(mrb, 0);
|
|
2455
|
+
obj = boot_defclass(mrb, bob); mrb->object_class = obj;
|
|
2456
|
+
mod = boot_defclass(mrb, obj); mrb->module_class = mod;/* obj -> mod */
|
|
2457
|
+
cls = boot_defclass(mrb, mod); mrb->class_class = cls; /* obj -> cls */
|
|
2458
|
+
/* fix-up loose ends */
|
|
2459
|
+
bob->c = obj->c = mod->c = cls->c = cls;
|
|
2460
|
+
make_metaclass(mrb, bob);
|
|
2461
|
+
make_metaclass(mrb, obj);
|
|
2462
|
+
make_metaclass(mrb, mod);
|
|
2463
|
+
make_metaclass(mrb, cls);
|
|
2464
|
+
|
|
2465
|
+
/* name basic classes */
|
|
2466
|
+
mrb_define_const(mrb, bob, "BasicObject", mrb_obj_value(bob));
|
|
2467
|
+
mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));
|
|
2468
|
+
mrb_define_const(mrb, obj, "Object", mrb_obj_value(obj));
|
|
2469
|
+
mrb_define_const(mrb, obj, "Module", mrb_obj_value(mod));
|
|
2470
|
+
mrb_define_const(mrb, obj, "Class", mrb_obj_value(cls));
|
|
2471
|
+
|
|
2472
|
+
/* name each classes */
|
|
2473
|
+
mrb_class_name_class(mrb, NULL, bob, mrb_intern_lit(mrb, "BasicObject"));
|
|
2474
|
+
mrb_class_name_class(mrb, NULL, obj, mrb_intern_lit(mrb, "Object")); /* 15.2.1 */
|
|
2475
|
+
mrb_class_name_class(mrb, NULL, mod, mrb_intern_lit(mrb, "Module")); /* 15.2.2 */
|
|
2476
|
+
mrb_class_name_class(mrb, NULL, cls, mrb_intern_lit(mrb, "Class")); /* 15.2.3 */
|
|
2477
|
+
|
|
2478
|
+
mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class); /* 15.2.17 */
|
|
2479
|
+
MRB_SET_INSTANCE_TT(mrb->proc_class, MRB_TT_PROC);
|
|
2480
|
+
|
|
2481
|
+
MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
|
|
2482
|
+
mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE());
|
|
2483
|
+
mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE());
|
|
2484
|
+
mrb_define_method(mrb, bob, "==", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */
|
|
2485
|
+
mrb_define_method(mrb, bob, "!=", mrb_obj_not_equal_m, MRB_ARGS_REQ(1));
|
|
2486
|
+
mrb_define_method(mrb, bob, "__id__", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.3 */
|
|
2487
|
+
mrb_define_method(mrb, bob, "__send__", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.4 */
|
|
2488
|
+
mrb_define_method(mrb, bob, "instance_eval", mrb_obj_instance_eval, MRB_ARGS_ANY()); /* 15.3.1.3.18 */
|
|
2489
|
+
|
|
2490
|
+
mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1));
|
|
2491
|
+
mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */
|
|
2492
|
+
mrb_define_method(mrb, cls, "new", mrb_instance_new, MRB_ARGS_ANY()); /* 15.2.3.3.3 */
|
|
2493
|
+
mrb_define_method(mrb, cls, "initialize", mrb_class_initialize, MRB_ARGS_OPT(1)); /* 15.2.3.3.1 */
|
|
2494
|
+
mrb_define_method(mrb, cls, "inherited", mrb_bob_init, MRB_ARGS_REQ(1));
|
|
2495
|
+
|
|
2496
|
+
MRB_SET_INSTANCE_TT(mod, MRB_TT_MODULE);
|
|
2497
|
+
mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.16 */
|
|
2498
|
+
mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.17 */
|
|
2499
|
+
mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.18 */
|
|
2500
|
+
mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */
|
|
2501
|
+
mrb_define_method(mrb, mod, "extended", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */
|
|
2502
|
+
mrb_define_method(mrb, mod, "prepended", mrb_bob_init, MRB_ARGS_REQ(1));
|
|
2503
|
+
mrb_define_method(mrb, mod, "prepend_features", mrb_mod_prepend_features, MRB_ARGS_REQ(1));
|
|
2504
|
+
mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */
|
|
2505
|
+
mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, MRB_ARGS_REQ(1)); /* 15.2.2.4.10 */
|
|
2506
|
+
mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.15 */
|
|
2507
|
+
mrb_define_method(mrb, mod, "included", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */
|
|
2508
|
+
mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, MRB_ARGS_NONE()); /* 15.2.2.4.30 */
|
|
2509
|
+
mrb_define_method(mrb, mod, "initialize", mrb_mod_initialize, MRB_ARGS_NONE()); /* 15.2.2.4.31 */
|
|
2510
|
+
mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, MRB_ARGS_ANY()); /* 15.2.2.4.33 */
|
|
2511
|
+
mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */
|
|
2512
|
+
mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.35 */
|
|
2513
|
+
mrb_define_method(mrb, mod, "module_function", mrb_mod_module_function, MRB_ARGS_ANY());
|
|
2514
|
+
mrb_define_method(mrb, mod, "private", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.36 */
|
|
2515
|
+
mrb_define_method(mrb, mod, "protected", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.37 */
|
|
2516
|
+
mrb_define_method(mrb, mod, "public", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.38 */
|
|
2517
|
+
mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */
|
|
2518
|
+
mrb_define_method(mrb, mod, "remove_method", mrb_mod_remove_method, MRB_ARGS_ANY()); /* 15.2.2.4.41 */
|
|
2519
|
+
mrb_define_method(mrb, mod, "method_removed", mrb_bob_init, MRB_ARGS_REQ(1));
|
|
2520
|
+
mrb_define_method(mrb, mod, "attr_reader", mrb_mod_attr_reader, MRB_ARGS_ANY()); /* 15.2.2.4.13 */
|
|
2521
|
+
mrb_define_method(mrb, mod, "attr_writer", mrb_mod_attr_writer, MRB_ARGS_ANY()); /* 15.2.2.4.14 */
|
|
2522
|
+
mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, MRB_ARGS_NONE());
|
|
2523
|
+
mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, MRB_ARGS_NONE());
|
|
2524
|
+
mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, MRB_ARGS_ANY()); /* 15.2.2.4.8 */
|
|
2525
|
+
mrb_define_method(mrb, mod, "ancestors", mrb_mod_ancestors, MRB_ARGS_NONE()); /* 15.2.2.4.9 */
|
|
2526
|
+
mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, MRB_ARGS_ANY()); /* 15.2.2.4.41 */
|
|
2527
|
+
mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, MRB_ARGS_ARG(1,1)); /* 15.2.2.4.20 */
|
|
2528
|
+
mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */
|
|
2529
|
+
mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */
|
|
2530
|
+
mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */
|
|
2531
|
+
mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */
|
|
2532
|
+
mrb_define_method(mrb, mod, "const_missing", mrb_mod_const_missing, MRB_ARGS_REQ(1));
|
|
2533
|
+
mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_ARG(1,1));
|
|
2534
|
+
mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, MRB_ARGS_NONE()); /* 15.2.2.4.19 */
|
|
2535
|
+
mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1));
|
|
2536
|
+
mrb_define_class_method(mrb, mod, "constants", mrb_mod_s_constants, MRB_ARGS_ANY()); /* 15.2.2.3.1 */
|
|
2537
|
+
mrb_define_class_method(mrb, mod, "nesting", mrb_mod_s_nesting, MRB_ARGS_REQ(0)); /* 15.2.2.3.2 */
|
|
2538
|
+
|
|
2539
|
+
mrb_undef_method(mrb, cls, "append_features");
|
|
2540
|
+
mrb_undef_method(mrb, cls, "extend_object");
|
|
2541
|
+
|
|
2542
|
+
mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);
|
|
2543
|
+
mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());
|
|
2544
|
+
mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());
|
|
2545
|
+
mrb_define_singleton_method(mrb, mrb->top_self, "define_method", top_define_method, MRB_ARGS_ARG(1,1));
|
|
2546
|
+
}
|