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.
Files changed (763) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +22 -0
  4. data/bin/esruby +34 -0
  5. data/lib/esruby.rb +26 -0
  6. data/lib/esruby/build.rb +140 -0
  7. data/lib/esruby/build/configuration.rb +77 -0
  8. data/lib/esruby/gem.rb +5 -0
  9. data/lib/esruby/gem/specification.rb +35 -0
  10. data/resources/build_config.eruby +53 -0
  11. data/resources/cpp/esruby.cpp +64 -0
  12. data/resources/cpp/esruby.hpp +42 -0
  13. data/resources/cpp/main.cpp +9 -0
  14. data/resources/js/esruby.js +45 -0
  15. data/resources/mruby/AUTHORS +40 -0
  16. data/resources/mruby/CONTRIBUTING.md +68 -0
  17. data/resources/mruby/LEGAL +6 -0
  18. data/resources/mruby/MITL +20 -0
  19. data/resources/mruby/Makefile +17 -0
  20. data/resources/mruby/NEWS +13 -0
  21. data/resources/mruby/README.md +92 -0
  22. data/resources/mruby/Rakefile +152 -0
  23. data/resources/mruby/TODO +10 -0
  24. data/resources/mruby/appveyor.yml +38 -0
  25. data/resources/mruby/appveyor_config.rb +50 -0
  26. data/resources/mruby/benchmark/bm_ao_render.rb +314 -0
  27. data/resources/mruby/benchmark/bm_app_lc_fizzbuzz.rb +52 -0
  28. data/resources/mruby/benchmark/bm_fib.rb +7 -0
  29. data/resources/mruby/benchmark/bm_so_lists.rb +47 -0
  30. data/resources/mruby/benchmark/build_config_boxing.rb +28 -0
  31. data/resources/mruby/benchmark/build_config_cc.rb +13 -0
  32. data/resources/mruby/benchmark/plot.gpl +5 -0
  33. data/resources/mruby/bin/mirb +0 -0
  34. data/resources/mruby/bin/mrbc +0 -0
  35. data/resources/mruby/bin/mruby +0 -0
  36. data/resources/mruby/bin/mruby-strip +0 -0
  37. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/README.md +82 -0
  38. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrbgem.rake +63 -0
  39. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/regexp_pcre.rb +232 -0
  40. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/string_pcre.rb +333 -0
  41. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/132html +313 -0
  42. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/AUTHORS +45 -0
  43. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CMakeLists.txt +959 -0
  44. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/COPYING +5 -0
  45. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ChangeLog +4981 -0
  46. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CheckMan +67 -0
  47. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CleanTxt +113 -0
  48. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Detrail +35 -0
  49. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/HACKING +473 -0
  50. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/INSTALL +370 -0
  51. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/LICENCE +92 -0
  52. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.am +877 -0
  53. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.in +2917 -0
  54. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NEWS +611 -0
  55. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-AUTOTOOLS-BUILD +639 -0
  56. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-UNIX-USE +7 -0
  57. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/PrepareRelease +253 -0
  58. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/README +935 -0
  59. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunGrepTest +551 -0
  60. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest +1015 -0
  61. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest.bat +616 -0
  62. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/aclocal.m4 +1230 -0
  63. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.0 +21280 -0
  64. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.1 +21280 -0
  65. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/requests +273 -0
  66. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.0 +2421 -0
  67. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.1 +1144 -0
  68. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/COPYING-CMAKE-SCRIPTS +22 -0
  69. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindEditline.cmake +17 -0
  70. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindPackageHandleStandardArgs.cmake +58 -0
  71. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindReadline.cmake +29 -0
  72. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/compile +343 -0
  73. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config-cmake.h.in +54 -0
  74. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.guess +1552 -0
  75. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h +392 -0
  76. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.generic +392 -0
  77. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.in +343 -0
  78. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.sub +1804 -0
  79. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure +21280 -0
  80. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure.ac +1082 -0
  81. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/depcomp +708 -0
  82. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/dftables.c +212 -0
  83. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/index.html +180 -0
  84. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre-config.html +109 -0
  85. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre.html +204 -0
  86. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre16.html +383 -0
  87. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_assign_jit_stack.html +76 -0
  88. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile.html +108 -0
  89. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile2.html +112 -0
  90. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_config.html +91 -0
  91. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_named_substring.html +65 -0
  92. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_substring.html +61 -0
  93. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_dfa_exec.html +128 -0
  94. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_exec.html +110 -0
  95. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_study.html +46 -0
  96. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring.html +46 -0
  97. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring_list.html +46 -0
  98. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_fullinfo.html +108 -0
  99. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_named_substring.html +68 -0
  100. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringnumber.html +57 -0
  101. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringtable_entries.html +60 -0
  102. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring.html +64 -0
  103. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring_list.html +61 -0
  104. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_exec.html +108 -0
  105. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_alloc.html +55 -0
  106. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_free.html +48 -0
  107. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_maketables.html +48 -0
  108. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_pattern_to_host_byte_order.html +58 -0
  109. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_refcount.html +51 -0
  110. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_study.html +68 -0
  111. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_utf16_to_host_byte_order.html +57 -0
  112. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_version.html +46 -0
  113. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreapi.html +2786 -0
  114. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrebuild.html +517 -0
  115. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecallout.html +243 -0
  116. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecompat.html +216 -0
  117. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecpp.html +368 -0
  118. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcredemo.html +426 -0
  119. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcregrep.html +757 -0
  120. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrejit.html +458 -0
  121. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrelimits.html +86 -0
  122. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrematching.html +233 -0
  123. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepartial.html +474 -0
  124. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepattern.html +2953 -0
  125. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreperform.html +195 -0
  126. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreposix.html +292 -0
  127. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreprecompile.html +158 -0
  128. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresample.html +110 -0
  129. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrestack.html +225 -0
  130. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresyntax.html +521 -0
  131. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcretest.html +1082 -0
  132. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreunicode.html +270 -0
  133. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/index.html.src +180 -0
  134. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.1 +92 -0
  135. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.txt +86 -0
  136. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.3 +202 -0
  137. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.txt +9909 -0
  138. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre16.3 +390 -0
  139. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre32.3 +389 -0
  140. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_assign_jit_stack.3 +61 -0
  141. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile.3 +98 -0
  142. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile2.3 +106 -0
  143. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_config.3 +76 -0
  144. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_named_substring.3 +59 -0
  145. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_substring.3 +52 -0
  146. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_dfa_exec.3 +125 -0
  147. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_exec.3 +103 -0
  148. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_study.3 +31 -0
  149. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring.3 +31 -0
  150. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring_list.3 +31 -0
  151. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_fullinfo.3 +95 -0
  152. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_named_substring.3 +62 -0
  153. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringnumber.3 +45 -0
  154. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringtable_entries.3 +48 -0
  155. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring.3 +55 -0
  156. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring_list.3 +49 -0
  157. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_exec.3 +104 -0
  158. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_alloc.3 +45 -0
  159. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_free.3 +35 -0
  160. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_maketables.3 +33 -0
  161. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_pattern_to_host_byte_order.3 +46 -0
  162. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_refcount.3 +36 -0
  163. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_study.3 +56 -0
  164. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf16_to_host_byte_order.3 +46 -0
  165. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf32_to_host_byte_order.3 +46 -0
  166. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_version.3 +31 -0
  167. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreapi.3 +2823 -0
  168. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrebuild.3 +520 -0
  169. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecallout.3 +214 -0
  170. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecompat.3 +185 -0
  171. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecpp.3 +348 -0
  172. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.1 +679 -0
  173. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.txt +740 -0
  174. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrejit.3 +437 -0
  175. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrelimits.3 +67 -0
  176. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrematching.3 +206 -0
  177. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepartial.3 +445 -0
  178. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepattern.3 +2983 -0
  179. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreperform.3 +177 -0
  180. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreposix.3 +270 -0
  181. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreprecompile.3 +151 -0
  182. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresample.3 +99 -0
  183. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrestack.3 +215 -0
  184. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresyntax.3 +496 -0
  185. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.1 +1079 -0
  186. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.txt +1012 -0
  187. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreunicode.3 +255 -0
  188. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/perltest.txt +42 -0
  189. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/install-sh +527 -0
  190. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre.pc.in +12 -0
  191. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre16.pc.in +12 -0
  192. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre32.pc.in +12 -0
  193. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcrecpp.pc.in +12 -0
  194. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcreposix.pc.in +13 -0
  195. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ltmain.sh +9636 -0
  196. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ax_pthread.m4 +309 -0
  197. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/libtool.m4 +7844 -0
  198. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltoptions.m4 +369 -0
  199. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltsugar.m4 +123 -0
  200. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltversion.m4 +23 -0
  201. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/lt~obsolete.m4 +98 -0
  202. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/pcre_visibility.m4 +89 -0
  203. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp.bat +66 -0
  204. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_c.txt +20 -0
  205. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_l.txt +20 -0
  206. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/missing +331 -0
  207. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre-config.in +133 -0
  208. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h +653 -0
  209. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.generic +653 -0
  210. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.in +653 -0
  211. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_byte_order.c +45 -0
  212. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_chartables.c +45 -0
  213. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_compile.c +45 -0
  214. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_config.c +45 -0
  215. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_dfa_exec.c +45 -0
  216. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_exec.c +45 -0
  217. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_fullinfo.c +45 -0
  218. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_get.c +45 -0
  219. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_globals.c +45 -0
  220. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_jit_compile.c +45 -0
  221. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_maketables.c +45 -0
  222. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_newline.c +45 -0
  223. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ord2utf16.c +90 -0
  224. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_printint.c +45 -0
  225. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_refcount.c +45 -0
  226. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_string_utils.c +45 -0
  227. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_study.c +45 -0
  228. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_tables.c +45 -0
  229. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ucd.c +45 -0
  230. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_utf16_utils.c +130 -0
  231. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_valid_utf16.c +156 -0
  232. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_version.c +45 -0
  233. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_xclass.c +45 -0
  234. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_byte_order.c +45 -0
  235. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_chartables.c +45 -0
  236. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_compile.c +45 -0
  237. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_config.c +45 -0
  238. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_dfa_exec.c +45 -0
  239. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_exec.c +45 -0
  240. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_fullinfo.c +45 -0
  241. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_get.c +45 -0
  242. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_globals.c +45 -0
  243. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_jit_compile.c +45 -0
  244. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_maketables.c +45 -0
  245. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_newline.c +45 -0
  246. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ord2utf32.c +82 -0
  247. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_printint.c +45 -0
  248. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_refcount.c +45 -0
  249. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_string_utils.c +45 -0
  250. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_study.c +45 -0
  251. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_tables.c +45 -0
  252. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ucd.c +45 -0
  253. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_utf32_utils.c +141 -0
  254. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_valid_utf32.c +131 -0
  255. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_version.c +45 -0
  256. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_xclass.c +45 -0
  257. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_byte_order.c +318 -0
  258. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c +198 -0
  259. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c.dist +198 -0
  260. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_compile.c +8386 -0
  261. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_config.c +186 -0
  262. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_dfa_exec.c +3582 -0
  263. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_exec.c +7049 -0
  264. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_fullinfo.c +231 -0
  265. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_get.c +662 -0
  266. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_globals.c +84 -0
  267. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_internal.h +2744 -0
  268. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_compile.c +8560 -0
  269. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_test.c +1614 -0
  270. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_maketables.c +151 -0
  271. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_newline.c +210 -0
  272. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ord2utf8.c +94 -0
  273. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_printint.c +766 -0
  274. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_refcount.c +92 -0
  275. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.cc +199 -0
  276. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.h +172 -0
  277. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner_unittest.cc +159 -0
  278. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_string_utils.c +211 -0
  279. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.cc +43 -0
  280. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.h.in +179 -0
  281. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece_unittest.cc +150 -0
  282. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_study.c +1562 -0
  283. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_tables.c +655 -0
  284. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ucd.c +3298 -0
  285. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_valid_utf8.c +312 -0
  286. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_version.c +98 -0
  287. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_xclass.c +198 -0
  288. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.cc +922 -0
  289. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.h +710 -0
  290. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_internal.h +71 -0
  291. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_unittest.cc +1291 -0
  292. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpparg.h.in +174 -0
  293. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcredemo.c +406 -0
  294. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregexp.pas +845 -0
  295. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregrep.c +3180 -0
  296. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.c +419 -0
  297. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.h +146 -0
  298. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcretest.c +5488 -0
  299. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/perltest.pl +237 -0
  300. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfig.h +110 -0
  301. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfigInternal.h +484 -0
  302. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitExecAllocator.c +289 -0
  303. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.c +1766 -0
  304. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.h +985 -0
  305. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_Thumb2.c +2008 -0
  306. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_v5.c +2515 -0
  307. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_32.c +404 -0
  308. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_common.c +1881 -0
  309. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_32.c +269 -0
  310. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_64.c +421 -0
  311. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_common.c +2014 -0
  312. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_32.c +164 -0
  313. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_common.c +1348 -0
  314. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_32.c +547 -0
  315. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_64.c +810 -0
  316. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_common.c +2836 -0
  317. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitUtils.c +332 -0
  318. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepbinary +0 -0
  319. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepfilelist +3 -0
  320. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput +611 -0
  321. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput3 +15 -0
  322. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput8 +11 -0
  323. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputv +4 -0
  324. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputx +43 -0
  325. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greplist +7 -0
  326. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput +707 -0
  327. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput8 +12 -0
  328. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutputN +16 -1
  329. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greppatN4 +2 -0
  330. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16 +0 -0
  331. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-1 +0 -0
  332. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-2 +0 -0
  333. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-1 +0 -0
  334. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-2 +0 -0
  335. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32 +0 -0
  336. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-1 +0 -0
  337. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-2 +0 -0
  338. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-1 +0 -0
  339. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-2 +0 -0
  340. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved8 +0 -0
  341. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput1 +5306 -0
  342. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput10 +1337 -0
  343. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput11 +135 -0
  344. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput12 +89 -0
  345. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput13 +9 -0
  346. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput14 +329 -0
  347. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput15 +430 -0
  348. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput16 +35 -0
  349. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput17 +296 -0
  350. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput18 +296 -0
  351. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput19 +22 -0
  352. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput2 +3813 -0
  353. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput20 +19 -0
  354. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput21 +16 -0
  355. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput22 +13 -0
  356. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput23 +16 -0
  357. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput24 +77 -0
  358. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput25 +32 -0
  359. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput26 +80 -0
  360. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput3 +95 -0
  361. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput4 +624 -0
  362. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput5 +772 -0
  363. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput6 +1319 -0
  364. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput7 +672 -0
  365. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput8 +4801 -0
  366. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput9 +717 -0
  367. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinputEBC +121 -0
  368. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput1 +8798 -0
  369. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput10 +2726 -0
  370. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-16 +713 -0
  371. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-32 +713 -0
  372. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-8 +713 -0
  373. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput12 +181 -0
  374. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput13 +21 -0
  375. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput14 +476 -0
  376. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput15 +1269 -0
  377. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput16 +121 -0
  378. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput17 +505 -0
  379. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-16 +1022 -0
  380. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-32 +1019 -0
  381. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput19 +88 -0
  382. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput2 +12484 -0
  383. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput20 +27 -0
  384. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-16 +90 -0
  385. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-32 +90 -0
  386. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-16 +71 -0
  387. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-32 +71 -0
  388. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput23 +42 -0
  389. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput24 +145 -0
  390. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput25 +79 -0
  391. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput26 +148 -0
  392. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput3 +169 -0
  393. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput4 +1094 -0
  394. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput5 +1849 -0
  395. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput6 +2137 -0
  396. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput7 +1473 -0
  397. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput8 +8019 -0
  398. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput9 +1371 -0
  399. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutputEBC +182 -0
  400. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestinput3 +91 -0
  401. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestoutput3 +166 -0
  402. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ucp.h +197 -0
  403. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/run_test.rb +23 -0
  404. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/src/mruby_regexp_pcre.c +364 -0
  405. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/matchdata.rb +94 -0
  406. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/regexp.rb +264 -0
  407. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/string.rb +201 -0
  408. data/resources/mruby/build_config.rb +152 -0
  409. data/resources/mruby/doc/guides/compile.md +488 -0
  410. data/resources/mruby/doc/guides/debugger.md +370 -0
  411. data/resources/mruby/doc/guides/gc-arena-howto.md +177 -0
  412. data/resources/mruby/doc/guides/mrbconf.md +146 -0
  413. data/resources/mruby/doc/guides/mrbgems.md +340 -0
  414. data/resources/mruby/doc/limitations.md +187 -0
  415. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/README.md +4 -0
  416. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +23 -0
  417. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
  418. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +20 -0
  419. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
  420. data/resources/mruby/examples/mrbgems/c_extension_example/README.md +4 -0
  421. data/resources/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +23 -0
  422. data/resources/mruby/examples/mrbgems/c_extension_example/src/example.c +20 -0
  423. data/resources/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
  424. data/resources/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
  425. data/resources/mruby/examples/mrbgems/ruby_extension_example/README.md +4 -0
  426. data/resources/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +25 -0
  427. data/resources/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
  428. data/resources/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
  429. data/resources/mruby/examples/targets/build_config_ArduinoDue.rb +90 -0
  430. data/resources/mruby/examples/targets/build_config_IntelEdison.rb +69 -0
  431. data/resources/mruby/examples/targets/build_config_IntelGalileo.rb +106 -0
  432. data/resources/mruby/examples/targets/build_config_RX630.rb +81 -0
  433. data/resources/mruby/examples/targets/build_config_android_arm64-v8a.rb +26 -0
  434. data/resources/mruby/examples/targets/build_config_android_armeabi.rb +26 -0
  435. data/resources/mruby/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb +28 -0
  436. data/resources/mruby/examples/targets/build_config_chipKITMax32.rb +86 -0
  437. data/resources/mruby/include/mrbconf.h +145 -0
  438. data/resources/mruby/include/mruby.h +1280 -0
  439. data/resources/mruby/include/mruby/array.h +279 -0
  440. data/resources/mruby/include/mruby/boxing_nan.h +102 -0
  441. data/resources/mruby/include/mruby/boxing_no.h +56 -0
  442. data/resources/mruby/include/mruby/boxing_word.h +136 -0
  443. data/resources/mruby/include/mruby/class.h +94 -0
  444. data/resources/mruby/include/mruby/common.h +72 -0
  445. data/resources/mruby/include/mruby/compile.h +194 -0
  446. data/resources/mruby/include/mruby/data.h +75 -0
  447. data/resources/mruby/include/mruby/debug.h +66 -0
  448. data/resources/mruby/include/mruby/dump.h +196 -0
  449. data/resources/mruby/include/mruby/error.h +75 -0
  450. data/resources/mruby/include/mruby/gc.h +91 -0
  451. data/resources/mruby/include/mruby/hash.h +182 -0
  452. data/resources/mruby/include/mruby/irep.h +62 -0
  453. data/resources/mruby/include/mruby/istruct.h +47 -0
  454. data/resources/mruby/include/mruby/khash.h +274 -0
  455. data/resources/mruby/include/mruby/numeric.h +161 -0
  456. data/resources/mruby/include/mruby/object.h +45 -0
  457. data/resources/mruby/include/mruby/opcode.h +161 -0
  458. data/resources/mruby/include/mruby/proc.h +131 -0
  459. data/resources/mruby/include/mruby/range.h +49 -0
  460. data/resources/mruby/include/mruby/re.h +16 -0
  461. data/resources/mruby/include/mruby/string.h +440 -0
  462. data/resources/mruby/include/mruby/throw.h +55 -0
  463. data/resources/mruby/include/mruby/value.h +309 -0
  464. data/resources/mruby/include/mruby/variable.h +138 -0
  465. data/resources/mruby/include/mruby/version.h +110 -0
  466. data/resources/mruby/lib/mruby-core-ext.rb +79 -0
  467. data/resources/mruby/lib/mruby/build.rb +355 -0
  468. data/resources/mruby/lib/mruby/build/command.rb +324 -0
  469. data/resources/mruby/lib/mruby/build/load_gems.rb +122 -0
  470. data/resources/mruby/lib/mruby/gem.rb +459 -0
  471. data/resources/mruby/lib/mruby/source.rb +30 -0
  472. data/resources/mruby/minirake +484 -0
  473. data/resources/mruby/mrbgems/default.gembox +82 -0
  474. data/resources/mruby/mrbgems/full-core.gembox +9 -0
  475. data/resources/mruby/mrbgems/mruby-array-ext/mrbgem.rake +6 -0
  476. data/resources/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +935 -0
  477. data/resources/mruby/mrbgems/mruby-array-ext/src/array.c +246 -0
  478. data/resources/mruby/mrbgems/mruby-array-ext/test/array.rb +422 -0
  479. data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +286 -0
  480. data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +701 -0
  481. data/resources/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +9 -0
  482. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +505 -0
  483. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  484. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +240 -0
  485. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  486. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +78 -0
  487. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  488. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
  489. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +502 -0
  490. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +58 -0
  491. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
  492. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +759 -0
  493. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +165 -0
  494. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +16 -0
  495. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +20 -0
  496. data/resources/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +12 -0
  497. data/resources/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +33 -0
  498. data/resources/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +611 -0
  499. data/resources/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +16 -0
  500. data/resources/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +336 -0
  501. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mrbgem.rake +30 -0
  502. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config +20 -0
  503. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config.bat +42 -0
  504. data/resources/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +60 -0
  505. data/resources/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +12 -0
  506. data/resources/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +254 -0
  507. data/resources/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +73 -0
  508. data/resources/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +6 -0
  509. data/resources/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +155 -0
  510. data/resources/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
  511. data/resources/mruby/mrbgems/mruby-class-ext/src/class.c +68 -0
  512. data/resources/mruby/mrbgems/mruby-class-ext/test/module.rb +55 -0
  513. data/resources/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
  514. data/resources/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +31 -0
  515. data/resources/mruby/mrbgems/mruby-compiler/bintest/mrbc.rb +30 -0
  516. data/resources/mruby/mrbgems/mruby-compiler/core/codegen.c +3083 -0
  517. data/resources/mruby/mrbgems/mruby-compiler/core/keywords +50 -0
  518. data/resources/mruby/mrbgems/mruby-compiler/core/lex.def +211 -0
  519. data/resources/mruby/mrbgems/mruby-compiler/core/node.h +118 -0
  520. data/resources/mruby/mrbgems/mruby-compiler/core/parse.y +6661 -0
  521. data/resources/mruby/mrbgems/mruby-compiler/mrbgem.rake +40 -0
  522. data/resources/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
  523. data/resources/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +813 -0
  524. data/resources/mruby/mrbgems/mruby-enum-ext/test/enum.rb +185 -0
  525. data/resources/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  526. data/resources/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +178 -0
  527. data/resources/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +53 -0
  528. data/resources/mruby/mrbgems/mruby-enumerator/mrbgem.rake +7 -0
  529. data/resources/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +645 -0
  530. data/resources/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +546 -0
  531. data/resources/mruby/mrbgems/mruby-error/mrbgem.rake +10 -0
  532. data/resources/mruby/mrbgems/mruby-error/src/exception.c +100 -0
  533. data/resources/mruby/mrbgems/mruby-error/test/exception.c +59 -0
  534. data/resources/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
  535. data/resources/mruby/mrbgems/mruby-eval/mrbgem.rake +7 -0
  536. data/resources/mruby/mrbgems/mruby-eval/src/eval.c +346 -0
  537. data/resources/mruby/mrbgems/mruby-eval/test/eval.rb +101 -0
  538. data/resources/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
  539. data/resources/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
  540. data/resources/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
  541. data/resources/mruby/mrbgems/mruby-fiber/src/fiber.c +420 -0
  542. data/resources/mruby/mrbgems/mruby-fiber/test/fiber.rb +208 -0
  543. data/resources/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +8 -0
  544. data/resources/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +502 -0
  545. data/resources/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +128 -0
  546. data/resources/mruby/mrbgems/mruby-hash-ext/test/hash.rb +300 -0
  547. data/resources/mruby/mrbgems/mruby-inline-struct/mrbgem.rake +5 -0
  548. data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.c +83 -0
  549. data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.rb +151 -0
  550. data/resources/mruby/mrbgems/mruby-io/README.md +193 -0
  551. data/resources/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +38 -0
  552. data/resources/mruby/mrbgems/mruby-io/mrbgem.rake +17 -0
  553. data/resources/mruby/mrbgems/mruby-io/mrblib/file.rb +208 -0
  554. data/resources/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +29 -0
  555. data/resources/mruby/mrbgems/mruby-io/mrblib/io.rb +387 -0
  556. data/resources/mruby/mrbgems/mruby-io/mrblib/kernel.rb +15 -0
  557. data/resources/mruby/mrbgems/mruby-io/run_test.rb +26 -0
  558. data/resources/mruby/mrbgems/mruby-io/src/file.c +489 -0
  559. data/resources/mruby/mrbgems/mruby-io/src/file_test.c +381 -0
  560. data/resources/mruby/mrbgems/mruby-io/src/io.c +1320 -0
  561. data/resources/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +20 -0
  562. data/resources/mruby/mrbgems/mruby-io/test/file.rb +197 -0
  563. data/resources/mruby/mrbgems/mruby-io/test/file_test.rb +117 -0
  564. data/resources/mruby/mrbgems/mruby-io/test/gc_filedes.sh +4 -0
  565. data/resources/mruby/mrbgems/mruby-io/test/io.rb +642 -0
  566. data/resources/mruby/mrbgems/mruby-io/test/mruby_io_test.c +256 -0
  567. data/resources/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  568. data/resources/mruby/mrbgems/mruby-kernel-ext/mrblib/kernel.rb +13 -0
  569. data/resources/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +264 -0
  570. data/resources/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +86 -0
  571. data/resources/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
  572. data/resources/mruby/mrbgems/mruby-math/src/math.c +783 -0
  573. data/resources/mruby/mrbgems/mruby-math/test/math.rb +152 -0
  574. data/resources/mruby/mrbgems/mruby-method/README.md +59 -0
  575. data/resources/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
  576. data/resources/mruby/mrbgems/mruby-method/mrblib/kernel.rb +9 -0
  577. data/resources/mruby/mrbgems/mruby-method/mrblib/method.rb +20 -0
  578. data/resources/mruby/mrbgems/mruby-method/mrblib/unbound_method.rb +9 -0
  579. data/resources/mruby/mrbgems/mruby-method/src/method.c +418 -0
  580. data/resources/mruby/mrbgems/mruby-method/test/method.rb +425 -0
  581. data/resources/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
  582. data/resources/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +25 -0
  583. data/resources/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +102 -0
  584. data/resources/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +28 -0
  585. data/resources/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
  586. data/resources/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +19 -0
  587. data/resources/mruby/mrbgems/mruby-object-ext/src/object.c +112 -0
  588. data/resources/mruby/mrbgems/mruby-object-ext/test/nil.rb +11 -0
  589. data/resources/mruby/mrbgems/mruby-object-ext/test/object.rb +53 -0
  590. data/resources/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
  591. data/resources/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +187 -0
  592. data/resources/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
  593. data/resources/mruby/mrbgems/mruby-pack/README.md +70 -0
  594. data/resources/mruby/mrbgems/mruby-pack/mrbgem.rake +7 -0
  595. data/resources/mruby/mrbgems/mruby-pack/packtest.rb +157 -0
  596. data/resources/mruby/mrbgems/mruby-pack/run_test.rb +26 -0
  597. data/resources/mruby/mrbgems/mruby-pack/src/pack.c +1281 -0
  598. data/resources/mruby/mrbgems/mruby-pack/test/pack.rb +165 -0
  599. data/resources/mruby/mrbgems/mruby-print/mrbgem.rake +5 -0
  600. data/resources/mruby/mrbgems/mruby-print/mrblib/print.rb +64 -0
  601. data/resources/mruby/mrbgems/mruby-print/src/print.c +64 -0
  602. data/resources/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
  603. data/resources/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +42 -0
  604. data/resources/mruby/mrbgems/mruby-proc-ext/src/proc.c +173 -0
  605. data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
  606. data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.rb +96 -0
  607. data/resources/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
  608. data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.c +224 -0
  609. data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.h +80 -0
  610. data/resources/mruby/mrbgems/mruby-random/src/random.c +349 -0
  611. data/resources/mruby/mrbgems/mruby-random/src/random.h +12 -0
  612. data/resources/mruby/mrbgems/mruby-random/test/random.rb +88 -0
  613. data/resources/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
  614. data/resources/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +31 -0
  615. data/resources/mruby/mrbgems/mruby-range-ext/src/range.c +176 -0
  616. data/resources/mruby/mrbgems/mruby-range-ext/test/range.rb +32 -0
  617. data/resources/mruby/mrbgems/mruby-socket/README.md +55 -0
  618. data/resources/mruby/mrbgems/mruby-socket/mrbgem.rake +17 -0
  619. data/resources/mruby/mrbgems/mruby-socket/mrblib/socket.rb +621 -0
  620. data/resources/mruby/mrbgems/mruby-socket/run_test.rb +28 -0
  621. data/resources/mruby/mrbgems/mruby-socket/src/const.cstub +453 -0
  622. data/resources/mruby/mrbgems/mruby-socket/src/const.def +163 -0
  623. data/resources/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
  624. data/resources/mruby/mrbgems/mruby-socket/src/socket.c +928 -0
  625. data/resources/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
  626. data/resources/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
  627. data/resources/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
  628. data/resources/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
  629. data/resources/mruby/mrbgems/mruby-socket/test/sockettest.c +46 -0
  630. data/resources/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
  631. data/resources/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
  632. data/resources/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
  633. data/resources/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
  634. data/resources/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +9 -0
  635. data/resources/mruby/mrbgems/mruby-sprintf/src/kernel.c +30 -0
  636. data/resources/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1126 -0
  637. data/resources/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +110 -0
  638. data/resources/mruby/mrbgems/mruby-string-ext/mrbgem.rake +6 -0
  639. data/resources/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +368 -0
  640. data/resources/mruby/mrbgems/mruby-string-ext/src/string.c +804 -0
  641. data/resources/mruby/mrbgems/mruby-string-ext/test/string.rb +682 -0
  642. data/resources/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
  643. data/resources/mruby/mrbgems/mruby-struct/mrblib/struct.rb +103 -0
  644. data/resources/mruby/mrbgems/mruby-struct/src/struct.c +726 -0
  645. data/resources/mruby/mrbgems/mruby-struct/test/struct.rb +205 -0
  646. data/resources/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
  647. data/resources/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +78 -0
  648. data/resources/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +64 -0
  649. data/resources/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +48 -0
  650. data/resources/mruby/mrbgems/mruby-test/README.md +7 -0
  651. data/resources/mruby/mrbgems/mruby-test/driver.c +175 -0
  652. data/resources/mruby/mrbgems/mruby-test/init_mrbtest.c +38 -0
  653. data/resources/mruby/mrbgems/mruby-test/mrbgem.rake +191 -0
  654. data/resources/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
  655. data/resources/mruby/mrbgems/mruby-time/mrblib/time.rb +9 -0
  656. data/resources/mruby/mrbgems/mruby-time/src/time.c +869 -0
  657. data/resources/mruby/mrbgems/mruby-time/test/time.rb +228 -0
  658. data/resources/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
  659. data/resources/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +11 -0
  660. data/resources/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +24 -0
  661. data/resources/mruby/mrblib/00class.rb +29 -0
  662. data/resources/mruby/mrblib/10error.rb +59 -0
  663. data/resources/mruby/mrblib/array.rb +243 -0
  664. data/resources/mruby/mrblib/compar.rb +84 -0
  665. data/resources/mruby/mrblib/enum.rb +348 -0
  666. data/resources/mruby/mrblib/float.rb +9 -0
  667. data/resources/mruby/mrblib/hash.rb +358 -0
  668. data/resources/mruby/mrblib/init_mrblib.c +11 -0
  669. data/resources/mruby/mrblib/kernel.rb +50 -0
  670. data/resources/mruby/mrblib/mrblib.rake +21 -0
  671. data/resources/mruby/mrblib/numeric.rb +163 -0
  672. data/resources/mruby/mrblib/range.rb +67 -0
  673. data/resources/mruby/mrblib/string.rb +275 -0
  674. data/resources/mruby/mruby-source.gemspec +18 -0
  675. data/resources/mruby/src/array.c +1251 -0
  676. data/resources/mruby/src/backtrace.c +285 -0
  677. data/resources/mruby/src/class.c +2546 -0
  678. data/resources/mruby/src/codedump.c +477 -0
  679. data/resources/mruby/src/compar.c +13 -0
  680. data/resources/mruby/src/crc.c +39 -0
  681. data/resources/mruby/src/debug.c +217 -0
  682. data/resources/mruby/src/dump.c +1106 -0
  683. data/resources/mruby/src/enum.c +14 -0
  684. data/resources/mruby/src/error.c +513 -0
  685. data/resources/mruby/src/error.h +3 -0
  686. data/resources/mruby/src/etc.c +246 -0
  687. data/resources/mruby/src/fmt_fp.c +374 -0
  688. data/resources/mruby/src/gc.c +1835 -0
  689. data/resources/mruby/src/hash.c +916 -0
  690. data/resources/mruby/src/init.c +51 -0
  691. data/resources/mruby/src/kernel.c +1264 -0
  692. data/resources/mruby/src/load.c +706 -0
  693. data/resources/mruby/src/mruby_core.rake +20 -0
  694. data/resources/mruby/src/numeric.c +1574 -0
  695. data/resources/mruby/src/object.c +618 -0
  696. data/resources/mruby/src/opcode.h +2 -0
  697. data/resources/mruby/src/pool.c +209 -0
  698. data/resources/mruby/src/print.c +47 -0
  699. data/resources/mruby/src/proc.c +313 -0
  700. data/resources/mruby/src/range.c +446 -0
  701. data/resources/mruby/src/state.c +307 -0
  702. data/resources/mruby/src/string.c +3025 -0
  703. data/resources/mruby/src/symbol.c +494 -0
  704. data/resources/mruby/src/value_array.h +27 -0
  705. data/resources/mruby/src/variable.c +982 -0
  706. data/resources/mruby/src/version.c +17 -0
  707. data/resources/mruby/src/vm.c +3020 -0
  708. data/resources/mruby/tasks/benchmark.rake +91 -0
  709. data/resources/mruby/tasks/gitlab.rake +118 -0
  710. data/resources/mruby/tasks/libmruby.rake +24 -0
  711. data/resources/mruby/tasks/mrbgems.rake +98 -0
  712. data/resources/mruby/tasks/toolchains/android.rake +321 -0
  713. data/resources/mruby/tasks/toolchains/clang.rake +9 -0
  714. data/resources/mruby/tasks/toolchains/gcc.rake +66 -0
  715. data/resources/mruby/tasks/toolchains/openwrt.rake +38 -0
  716. data/resources/mruby/tasks/toolchains/visualcpp.rake +68 -0
  717. data/resources/mruby/test/assert.rb +249 -0
  718. data/resources/mruby/test/bintest.rb +33 -0
  719. data/resources/mruby/test/report.rb +4 -0
  720. data/resources/mruby/test/t/argumenterror.rb +16 -0
  721. data/resources/mruby/test/t/array.rb +394 -0
  722. data/resources/mruby/test/t/basicobject.rb +11 -0
  723. data/resources/mruby/test/t/bs_block.rb +521 -0
  724. data/resources/mruby/test/t/bs_literal.rb +38 -0
  725. data/resources/mruby/test/t/class.rb +451 -0
  726. data/resources/mruby/test/t/codegen.rb +197 -0
  727. data/resources/mruby/test/t/comparable.rb +80 -0
  728. data/resources/mruby/test/t/ensure.rb +54 -0
  729. data/resources/mruby/test/t/enumerable.rb +134 -0
  730. data/resources/mruby/test/t/exception.rb +422 -0
  731. data/resources/mruby/test/t/false.rb +31 -0
  732. data/resources/mruby/test/t/float.rb +209 -0
  733. data/resources/mruby/test/t/gc.rb +45 -0
  734. data/resources/mruby/test/t/hash.rb +375 -0
  735. data/resources/mruby/test/t/indexerror.rb +6 -0
  736. data/resources/mruby/test/t/integer.rb +277 -0
  737. data/resources/mruby/test/t/iterations.rb +61 -0
  738. data/resources/mruby/test/t/kernel.rb +600 -0
  739. data/resources/mruby/test/t/lang.rb +74 -0
  740. data/resources/mruby/test/t/literals.rb +337 -0
  741. data/resources/mruby/test/t/localjumperror.rb +13 -0
  742. data/resources/mruby/test/t/methods.rb +109 -0
  743. data/resources/mruby/test/t/module.rb +914 -0
  744. data/resources/mruby/test/t/nameerror.rb +28 -0
  745. data/resources/mruby/test/t/nil.rb +39 -0
  746. data/resources/mruby/test/t/nomethoderror.rb +22 -0
  747. data/resources/mruby/test/t/numeric.rb +43 -0
  748. data/resources/mruby/test/t/object.rb +11 -0
  749. data/resources/mruby/test/t/proc.rb +180 -0
  750. data/resources/mruby/test/t/range.rb +95 -0
  751. data/resources/mruby/test/t/rangeerror.rb +6 -0
  752. data/resources/mruby/test/t/regexperror.rb +4 -0
  753. data/resources/mruby/test/t/runtimeerror.rb +6 -0
  754. data/resources/mruby/test/t/standarderror.rb +6 -0
  755. data/resources/mruby/test/t/string.rb +728 -0
  756. data/resources/mruby/test/t/superclass.rb +47 -0
  757. data/resources/mruby/test/t/symbol.rb +30 -0
  758. data/resources/mruby/test/t/syntax.rb +468 -0
  759. data/resources/mruby/test/t/true.rb +31 -0
  760. data/resources/mruby/test/t/typeerror.rb +6 -0
  761. data/resources/mruby/test/t/unicode.rb +39 -0
  762. data/resources/mruby/travis_config.rb +53 -0
  763. 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
+ }