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,1835 @@
1
+ /*
2
+ ** gc.c - garbage collector for mruby
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #include <string.h>
8
+ #include <stdlib.h>
9
+ #include <mruby.h>
10
+ #include <mruby/array.h>
11
+ #include <mruby/class.h>
12
+ #include <mruby/data.h>
13
+ #include <mruby/hash.h>
14
+ #include <mruby/proc.h>
15
+ #include <mruby/range.h>
16
+ #include <mruby/string.h>
17
+ #include <mruby/variable.h>
18
+ #include <mruby/gc.h>
19
+ #include <mruby/error.h>
20
+ #include <mruby/throw.h>
21
+
22
+ /*
23
+ = Tri-color Incremental Garbage Collection
24
+
25
+ mruby's GC is Tri-color Incremental GC with Mark & Sweep.
26
+ Algorithm details are omitted.
27
+ Instead, the implementation part is described below.
28
+
29
+ == Object's Color
30
+
31
+ Each object can be painted in three colors:
32
+
33
+ * White - Unmarked.
34
+ * Gray - Marked, But the child objects are unmarked.
35
+ * Black - Marked, the child objects are also marked.
36
+
37
+ == Two White Types
38
+
39
+ There're two white color types in a flip-flop fashion: White-A and White-B,
40
+ which respectively represent the Current White color (the newly allocated
41
+ objects in the current GC cycle) and the Sweep Target White color (the
42
+ dead objects to be swept).
43
+
44
+ A and B will be switched just at the beginning of the next GC cycle. At
45
+ that time, all the dead objects have been swept, while the newly created
46
+ objects in the current GC cycle which finally remains White are now
47
+ regarded as dead objects. Instead of traversing all the White-A objects and
48
+ painting them as White-B, just switch the meaning of White-A and White-B as
49
+ this will be much cheaper.
50
+
51
+ As a result, the objects we sweep in the current GC cycle are always
52
+ left from the previous GC cycle. This allows us to sweep objects
53
+ incrementally, without the disturbance of the newly created objects.
54
+
55
+ == Execution Timing
56
+
57
+ GC Execution Time and Each step interval are decided by live objects count.
58
+ List of Adjustment API:
59
+
60
+ * gc_interval_ratio_set
61
+ * gc_step_ratio_set
62
+
63
+ For details, see the comments for each function.
64
+
65
+ == Write Barrier
66
+
67
+ mruby implementer and C extension library writer must insert a write
68
+ barrier when updating a reference from a field of an object.
69
+ When updating a reference from a field of object A to object B,
70
+ two different types of write barrier are available:
71
+
72
+ * mrb_field_write_barrier - target B object for a mark.
73
+ * mrb_write_barrier - target A object for a mark.
74
+
75
+ == Generational Mode
76
+
77
+ mruby's GC offers an Generational Mode while re-using the tri-color GC
78
+ infrastructure. It will treat the Black objects as Old objects after each
79
+ sweep phase, instead of painting them White. The key ideas are still the same
80
+ as traditional generational GC:
81
+
82
+ * Minor GC - just traverse the Young objects (Gray objects) in the mark
83
+ phase, then only sweep the newly created objects, and leave
84
+ the Old objects live.
85
+
86
+ * Major GC - same as a full regular GC cycle.
87
+
88
+ The difference from "traditional" generational GC is, that the major GC
89
+ in mruby is triggered incrementally in a tri-color manner.
90
+
91
+
92
+ For details, see the comments for each function.
93
+
94
+ */
95
+
96
+ struct free_obj {
97
+ MRB_OBJECT_HEADER;
98
+ struct RBasic *next;
99
+ };
100
+
101
+ typedef struct {
102
+ union {
103
+ struct free_obj free;
104
+ struct RBasic basic;
105
+ struct RObject object;
106
+ struct RClass klass;
107
+ struct RString string;
108
+ struct RArray array;
109
+ struct RHash hash;
110
+ struct RRange range;
111
+ struct RData data;
112
+ struct RProc proc;
113
+ struct REnv env;
114
+ struct RException exc;
115
+ struct RBreak brk;
116
+ #ifdef MRB_WORD_BOXING
117
+ #ifndef MRB_WITHOUT_FLOAT
118
+ struct RFloat floatv;
119
+ #endif
120
+ struct RCptr cptr;
121
+ #endif
122
+ } as;
123
+ } RVALUE;
124
+
125
+ #ifdef GC_PROFILE
126
+ #include <stdio.h>
127
+ #include <sys/time.h>
128
+
129
+ static double program_invoke_time = 0;
130
+ static double gc_time = 0;
131
+ static double gc_total_time = 0;
132
+
133
+ static double
134
+ gettimeofday_time(void)
135
+ {
136
+ struct timeval tv;
137
+ gettimeofday(&tv, NULL);
138
+ return tv.tv_sec + tv.tv_usec * 1e-6;
139
+ }
140
+
141
+ #define GC_INVOKE_TIME_REPORT(with) do {\
142
+ fprintf(stderr, "%s\n", with);\
143
+ fprintf(stderr, "gc_invoke: %19.3f\n", gettimeofday_time() - program_invoke_time);\
144
+ fprintf(stderr, "is_generational: %d\n", is_generational(gc));\
145
+ fprintf(stderr, "is_major_gc: %d\n", is_major_gc(gc));\
146
+ } while(0)
147
+
148
+ #define GC_TIME_START do {\
149
+ gc_time = gettimeofday_time();\
150
+ } while(0)
151
+
152
+ #define GC_TIME_STOP_AND_REPORT do {\
153
+ gc_time = gettimeofday_time() - gc_time;\
154
+ gc_total_time += gc_time;\
155
+ fprintf(stderr, "gc_state: %d\n", gc->state);\
156
+ fprintf(stderr, "live: %zu\n", gc->live);\
157
+ fprintf(stderr, "majorgc_old_threshold: %zu\n", gc->majorgc_old_threshold);\
158
+ fprintf(stderr, "gc_threshold: %zu\n", gc->threshold);\
159
+ fprintf(stderr, "gc_time: %30.20f\n", gc_time);\
160
+ fprintf(stderr, "gc_total_time: %30.20f\n\n", gc_total_time);\
161
+ } while(0)
162
+ #else
163
+ #define GC_INVOKE_TIME_REPORT(s)
164
+ #define GC_TIME_START
165
+ #define GC_TIME_STOP_AND_REPORT
166
+ #endif
167
+
168
+ #ifdef GC_DEBUG
169
+ #define DEBUG(x) (x)
170
+ #else
171
+ #define DEBUG(x)
172
+ #endif
173
+
174
+ #ifndef MRB_HEAP_PAGE_SIZE
175
+ #define MRB_HEAP_PAGE_SIZE 1024
176
+ #endif
177
+
178
+ #define GC_STEP_SIZE 1024
179
+
180
+ /* white: 001 or 010, black: 100, gray: 000 */
181
+ #define GC_GRAY 0
182
+ #define GC_WHITE_A 1
183
+ #define GC_WHITE_B (1 << 1)
184
+ #define GC_BLACK (1 << 2)
185
+ #define GC_WHITES (GC_WHITE_A | GC_WHITE_B)
186
+ #define GC_COLOR_MASK 7
187
+
188
+ #define paint_gray(o) ((o)->color = GC_GRAY)
189
+ #define paint_black(o) ((o)->color = GC_BLACK)
190
+ #define paint_white(o) ((o)->color = GC_WHITES)
191
+ #define paint_partial_white(s, o) ((o)->color = (s)->current_white_part)
192
+ #define is_gray(o) ((o)->color == GC_GRAY)
193
+ #define is_white(o) ((o)->color & GC_WHITES)
194
+ #define is_black(o) ((o)->color & GC_BLACK)
195
+ #define flip_white_part(s) ((s)->current_white_part = other_white_part(s))
196
+ #define other_white_part(s) ((s)->current_white_part ^ GC_WHITES)
197
+ #define is_dead(s, o) (((o)->color & other_white_part(s) & GC_WHITES) || (o)->tt == MRB_TT_FREE)
198
+
199
+ #define objects(p) ((RVALUE *)p->objects)
200
+
201
+ MRB_API void*
202
+ mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
203
+ {
204
+ void *p2;
205
+
206
+ p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud);
207
+ if (!p2 && len > 0 && mrb->gc.heaps) {
208
+ mrb_full_gc(mrb);
209
+ p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud);
210
+ }
211
+
212
+ return p2;
213
+ }
214
+
215
+ MRB_API void*
216
+ mrb_realloc(mrb_state *mrb, void *p, size_t len)
217
+ {
218
+ void *p2;
219
+
220
+ p2 = mrb_realloc_simple(mrb, p, len);
221
+ if (len == 0) return p2;
222
+ if (p2 == NULL) {
223
+ if (mrb->gc.out_of_memory) {
224
+ mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
225
+ /* mrb_panic(mrb); */
226
+ }
227
+ else {
228
+ mrb->gc.out_of_memory = TRUE;
229
+ mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
230
+ }
231
+ }
232
+ else {
233
+ mrb->gc.out_of_memory = FALSE;
234
+ }
235
+
236
+ return p2;
237
+ }
238
+
239
+ MRB_API void*
240
+ mrb_malloc(mrb_state *mrb, size_t len)
241
+ {
242
+ return mrb_realloc(mrb, 0, len);
243
+ }
244
+
245
+ MRB_API void*
246
+ mrb_malloc_simple(mrb_state *mrb, size_t len)
247
+ {
248
+ return mrb_realloc_simple(mrb, 0, len);
249
+ }
250
+
251
+ MRB_API void*
252
+ mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)
253
+ {
254
+ void *p;
255
+
256
+ if (nelem > 0 && len > 0 &&
257
+ nelem <= SIZE_MAX / len) {
258
+ size_t size;
259
+ size = nelem * len;
260
+ p = mrb_malloc(mrb, size);
261
+
262
+ memset(p, 0, size);
263
+ }
264
+ else {
265
+ p = NULL;
266
+ }
267
+
268
+ return p;
269
+ }
270
+
271
+ MRB_API void
272
+ mrb_free(mrb_state *mrb, void *p)
273
+ {
274
+ (mrb->allocf)(mrb, p, 0, mrb->allocf_ud);
275
+ }
276
+
277
+ MRB_API mrb_bool
278
+ mrb_object_dead_p(mrb_state *mrb, struct RBasic *object) {
279
+ return is_dead(&mrb->gc, object);
280
+ }
281
+
282
+ static void
283
+ link_heap_page(mrb_gc *gc, mrb_heap_page *page)
284
+ {
285
+ page->next = gc->heaps;
286
+ if (gc->heaps)
287
+ gc->heaps->prev = page;
288
+ gc->heaps = page;
289
+ }
290
+
291
+ static void
292
+ unlink_heap_page(mrb_gc *gc, mrb_heap_page *page)
293
+ {
294
+ if (page->prev)
295
+ page->prev->next = page->next;
296
+ if (page->next)
297
+ page->next->prev = page->prev;
298
+ if (gc->heaps == page)
299
+ gc->heaps = page->next;
300
+ page->prev = NULL;
301
+ page->next = NULL;
302
+ }
303
+
304
+ static void
305
+ link_free_heap_page(mrb_gc *gc, mrb_heap_page *page)
306
+ {
307
+ page->free_next = gc->free_heaps;
308
+ if (gc->free_heaps) {
309
+ gc->free_heaps->free_prev = page;
310
+ }
311
+ gc->free_heaps = page;
312
+ }
313
+
314
+ static void
315
+ unlink_free_heap_page(mrb_gc *gc, mrb_heap_page *page)
316
+ {
317
+ if (page->free_prev)
318
+ page->free_prev->free_next = page->free_next;
319
+ if (page->free_next)
320
+ page->free_next->free_prev = page->free_prev;
321
+ if (gc->free_heaps == page)
322
+ gc->free_heaps = page->free_next;
323
+ page->free_prev = NULL;
324
+ page->free_next = NULL;
325
+ }
326
+
327
+ static void
328
+ add_heap(mrb_state *mrb, mrb_gc *gc)
329
+ {
330
+ mrb_heap_page *page = (mrb_heap_page *)mrb_calloc(mrb, 1, sizeof(mrb_heap_page) + MRB_HEAP_PAGE_SIZE * sizeof(RVALUE));
331
+ RVALUE *p, *e;
332
+ struct RBasic *prev = NULL;
333
+
334
+ for (p = objects(page), e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
335
+ p->as.free.tt = MRB_TT_FREE;
336
+ p->as.free.next = prev;
337
+ prev = &p->as.basic;
338
+ }
339
+ page->freelist = prev;
340
+
341
+ link_heap_page(gc, page);
342
+ link_free_heap_page(gc, page);
343
+ }
344
+
345
+ #define DEFAULT_GC_INTERVAL_RATIO 200
346
+ #define DEFAULT_GC_STEP_RATIO 200
347
+ #define DEFAULT_MAJOR_GC_INC_RATIO 200
348
+ #define is_generational(gc) ((gc)->generational)
349
+ #define is_major_gc(gc) (is_generational(gc) && (gc)->full)
350
+ #define is_minor_gc(gc) (is_generational(gc) && !(gc)->full)
351
+
352
+ void
353
+ mrb_gc_init(mrb_state *mrb, mrb_gc *gc)
354
+ {
355
+ #ifndef MRB_GC_FIXED_ARENA
356
+ gc->arena = (struct RBasic**)mrb_malloc(mrb, sizeof(struct RBasic*)*MRB_GC_ARENA_SIZE);
357
+ gc->arena_capa = MRB_GC_ARENA_SIZE;
358
+ #endif
359
+
360
+ gc->current_white_part = GC_WHITE_A;
361
+ gc->heaps = NULL;
362
+ gc->free_heaps = NULL;
363
+ add_heap(mrb, gc);
364
+ gc->interval_ratio = DEFAULT_GC_INTERVAL_RATIO;
365
+ gc->step_ratio = DEFAULT_GC_STEP_RATIO;
366
+ #ifndef MRB_GC_TURN_OFF_GENERATIONAL
367
+ gc->generational = TRUE;
368
+ gc->full = TRUE;
369
+ #endif
370
+
371
+ #ifdef GC_PROFILE
372
+ program_invoke_time = gettimeofday_time();
373
+ #endif
374
+ }
375
+
376
+ static void obj_free(mrb_state *mrb, struct RBasic *obj, int end);
377
+
378
+ void
379
+ free_heap(mrb_state *mrb, mrb_gc *gc)
380
+ {
381
+ mrb_heap_page *page = gc->heaps;
382
+ mrb_heap_page *tmp;
383
+ RVALUE *p, *e;
384
+
385
+ while (page) {
386
+ tmp = page;
387
+ page = page->next;
388
+ for (p = objects(tmp), e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
389
+ if (p->as.free.tt != MRB_TT_FREE)
390
+ obj_free(mrb, &p->as.basic, TRUE);
391
+ }
392
+ mrb_free(mrb, tmp);
393
+ }
394
+ }
395
+
396
+ void
397
+ mrb_gc_destroy(mrb_state *mrb, mrb_gc *gc)
398
+ {
399
+ free_heap(mrb, gc);
400
+ #ifndef MRB_GC_FIXED_ARENA
401
+ mrb_free(mrb, gc->arena);
402
+ #endif
403
+ }
404
+
405
+ static void
406
+ gc_protect(mrb_state *mrb, mrb_gc *gc, struct RBasic *p)
407
+ {
408
+ #ifdef MRB_GC_FIXED_ARENA
409
+ if (gc->arena_idx >= MRB_GC_ARENA_SIZE) {
410
+ /* arena overflow error */
411
+ gc->arena_idx = MRB_GC_ARENA_SIZE - 4; /* force room in arena */
412
+ mrb_exc_raise(mrb, mrb_obj_value(mrb->arena_err));
413
+ }
414
+ #else
415
+ if (gc->arena_idx >= gc->arena_capa) {
416
+ /* extend arena */
417
+ gc->arena_capa = (int)(gc->arena_capa * 3 / 2);
418
+ gc->arena = (struct RBasic**)mrb_realloc(mrb, gc->arena, sizeof(struct RBasic*)*gc->arena_capa);
419
+ }
420
+ #endif
421
+ gc->arena[gc->arena_idx++] = p;
422
+ }
423
+
424
+ /* mrb_gc_protect() leaves the object in the arena */
425
+ MRB_API void
426
+ mrb_gc_protect(mrb_state *mrb, mrb_value obj)
427
+ {
428
+ if (mrb_immediate_p(obj)) return;
429
+ gc_protect(mrb, &mrb->gc, mrb_basic_ptr(obj));
430
+ }
431
+
432
+ #define GC_ROOT_NAME "_gc_root_"
433
+
434
+ /* mrb_gc_register() keeps the object from GC.
435
+
436
+ Register your object when it's exported to C world,
437
+ without reference from Ruby world, e.g. callback
438
+ arguments. Don't forget to remove the object using
439
+ mrb_gc_unregister, otherwise your object will leak.
440
+ */
441
+
442
+ MRB_API void
443
+ mrb_gc_register(mrb_state *mrb, mrb_value obj)
444
+ {
445
+ mrb_sym root = mrb_intern_lit(mrb, GC_ROOT_NAME);
446
+ mrb_value table = mrb_gv_get(mrb, root);
447
+
448
+ if (mrb_nil_p(table) || mrb_type(table) != MRB_TT_ARRAY) {
449
+ table = mrb_ary_new(mrb);
450
+ mrb_gv_set(mrb, root, table);
451
+ }
452
+ mrb_ary_push(mrb, table, obj);
453
+ }
454
+
455
+ /* mrb_gc_unregister() removes the object from GC root. */
456
+ MRB_API void
457
+ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
458
+ {
459
+ mrb_sym root = mrb_intern_lit(mrb, GC_ROOT_NAME);
460
+ mrb_value table = mrb_gv_get(mrb, root);
461
+ struct RArray *a;
462
+ mrb_int i;
463
+
464
+ if (mrb_nil_p(table)) return;
465
+ if (mrb_type(table) != MRB_TT_ARRAY) {
466
+ mrb_gv_set(mrb, root, mrb_nil_value());
467
+ return;
468
+ }
469
+ a = mrb_ary_ptr(table);
470
+ mrb_ary_modify(mrb, a);
471
+ for (i = 0; i < ARY_LEN(a); i++) {
472
+ if (mrb_obj_eq(mrb, ARY_PTR(a)[i], obj)) {
473
+ mrb_int len = ARY_LEN(a)-1;
474
+ mrb_value *ptr = ARY_PTR(a);
475
+
476
+ ARY_SET_LEN(a, len);
477
+ memmove(&ptr[i], &ptr[i + 1], (len - i) * sizeof(mrb_value));
478
+ break;
479
+ }
480
+ }
481
+ }
482
+
483
+ MRB_API struct RBasic*
484
+ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
485
+ {
486
+ struct RBasic *p;
487
+ static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } };
488
+ mrb_gc *gc = &mrb->gc;
489
+
490
+ if (cls) {
491
+ enum mrb_vtype tt;
492
+
493
+ switch (cls->tt) {
494
+ case MRB_TT_CLASS:
495
+ case MRB_TT_SCLASS:
496
+ case MRB_TT_MODULE:
497
+ case MRB_TT_ENV:
498
+ break;
499
+ default:
500
+ mrb_raise(mrb, E_TYPE_ERROR, "allocation failure");
501
+ }
502
+ tt = MRB_INSTANCE_TT(cls);
503
+ if (tt != MRB_TT_FALSE &&
504
+ ttype != MRB_TT_SCLASS &&
505
+ ttype != MRB_TT_ICLASS &&
506
+ ttype != MRB_TT_ENV &&
507
+ ttype != tt) {
508
+ mrb_raisef(mrb, E_TYPE_ERROR, "allocation failure of %S", mrb_obj_value(cls));
509
+ }
510
+ }
511
+
512
+ #ifdef MRB_GC_STRESS
513
+ mrb_full_gc(mrb);
514
+ #endif
515
+ if (gc->threshold < gc->live) {
516
+ mrb_incremental_gc(mrb);
517
+ }
518
+ if (gc->free_heaps == NULL) {
519
+ add_heap(mrb, gc);
520
+ }
521
+
522
+ p = gc->free_heaps->freelist;
523
+ gc->free_heaps->freelist = ((struct free_obj*)p)->next;
524
+ if (gc->free_heaps->freelist == NULL) {
525
+ unlink_free_heap_page(gc, gc->free_heaps);
526
+ }
527
+
528
+ gc->live++;
529
+ gc_protect(mrb, gc, p);
530
+ *(RVALUE *)p = RVALUE_zero;
531
+ p->tt = ttype;
532
+ p->c = cls;
533
+ paint_partial_white(gc, p);
534
+ return p;
535
+ }
536
+
537
+ static inline void
538
+ add_gray_list(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
539
+ {
540
+ #ifdef MRB_GC_STRESS
541
+ if (obj->tt > MRB_TT_MAXDEFINE) {
542
+ abort();
543
+ }
544
+ #endif
545
+ paint_gray(obj);
546
+ obj->gcnext = gc->gray_list;
547
+ gc->gray_list = obj;
548
+ }
549
+
550
+ static void
551
+ mark_context_stack(mrb_state *mrb, struct mrb_context *c)
552
+ {
553
+ size_t i;
554
+ size_t e;
555
+ mrb_value nil;
556
+ mrb_int nregs;
557
+
558
+ if (c->stack == NULL) return;
559
+ e = c->stack - c->stbase;
560
+ if (c->ci) {
561
+ nregs = c->ci->argc + 2;
562
+ if (c->ci->nregs > nregs)
563
+ nregs = c->ci->nregs;
564
+ e += nregs;
565
+ }
566
+ if (c->stbase + e > c->stend) e = c->stend - c->stbase;
567
+ for (i=0; i<e; i++) {
568
+ mrb_value v = c->stbase[i];
569
+
570
+ if (!mrb_immediate_p(v)) {
571
+ mrb_gc_mark(mrb, mrb_basic_ptr(v));
572
+ }
573
+ }
574
+ e = c->stend - c->stbase;
575
+ nil = mrb_nil_value();
576
+ for (; i<e; i++) {
577
+ c->stbase[i] = nil;
578
+ }
579
+ }
580
+
581
+ static void
582
+ mark_context(mrb_state *mrb, struct mrb_context *c)
583
+ {
584
+ int i;
585
+ mrb_callinfo *ci;
586
+
587
+ start:
588
+ if (c->status == MRB_FIBER_TERMINATED) return;
589
+
590
+ /* mark VM stack */
591
+ mark_context_stack(mrb, c);
592
+
593
+ /* mark call stack */
594
+ if (c->cibase) {
595
+ for (ci = c->cibase; ci <= c->ci; ci++) {
596
+ mrb_gc_mark(mrb, (struct RBasic*)ci->env);
597
+ mrb_gc_mark(mrb, (struct RBasic*)ci->proc);
598
+ mrb_gc_mark(mrb, (struct RBasic*)ci->target_class);
599
+ }
600
+ }
601
+ /* mark ensure stack */
602
+ for (i=0; i<c->eidx; i++) {
603
+ mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]);
604
+ }
605
+ /* mark fibers */
606
+ mrb_gc_mark(mrb, (struct RBasic*)c->fib);
607
+ if (c->prev) {
608
+ c = c->prev;
609
+ goto start;
610
+ }
611
+ }
612
+
613
+ static void
614
+ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
615
+ {
616
+ mrb_assert(is_gray(obj));
617
+ paint_black(obj);
618
+ gc->gray_list = obj->gcnext;
619
+ mrb_gc_mark(mrb, (struct RBasic*)obj->c);
620
+ switch (obj->tt) {
621
+ case MRB_TT_ICLASS:
622
+ {
623
+ struct RClass *c = (struct RClass*)obj;
624
+ if (MRB_FLAG_TEST(c, MRB_FLAG_IS_ORIGIN))
625
+ mrb_gc_mark_mt(mrb, c);
626
+ mrb_gc_mark(mrb, (struct RBasic*)((struct RClass*)obj)->super);
627
+ }
628
+ break;
629
+
630
+ case MRB_TT_CLASS:
631
+ case MRB_TT_MODULE:
632
+ case MRB_TT_SCLASS:
633
+ {
634
+ struct RClass *c = (struct RClass*)obj;
635
+
636
+ mrb_gc_mark_mt(mrb, c);
637
+ mrb_gc_mark(mrb, (struct RBasic*)c->super);
638
+ }
639
+ /* fall through */
640
+
641
+ case MRB_TT_OBJECT:
642
+ case MRB_TT_DATA:
643
+ case MRB_TT_EXCEPTION:
644
+ mrb_gc_mark_iv(mrb, (struct RObject*)obj);
645
+ break;
646
+
647
+ case MRB_TT_PROC:
648
+ {
649
+ struct RProc *p = (struct RProc*)obj;
650
+
651
+ mrb_gc_mark(mrb, (struct RBasic*)p->upper);
652
+ mrb_gc_mark(mrb, (struct RBasic*)p->e.env);
653
+ }
654
+ break;
655
+
656
+ case MRB_TT_ENV:
657
+ {
658
+ struct REnv *e = (struct REnv*)obj;
659
+ mrb_int i, len;
660
+
661
+ if (MRB_ENV_STACK_SHARED_P(e) && e->cxt->fib) {
662
+ mrb_gc_mark(mrb, (struct RBasic*)e->cxt->fib);
663
+ }
664
+ len = MRB_ENV_STACK_LEN(e);
665
+ for (i=0; i<len; i++) {
666
+ mrb_gc_mark_value(mrb, e->stack[i]);
667
+ }
668
+ }
669
+ break;
670
+
671
+ case MRB_TT_FIBER:
672
+ {
673
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
674
+
675
+ if (c) mark_context(mrb, c);
676
+ }
677
+ break;
678
+
679
+ case MRB_TT_ARRAY:
680
+ {
681
+ struct RArray *a = (struct RArray*)obj;
682
+ size_t i, e;
683
+
684
+ for (i=0,e=ARY_LEN(a); i<e; i++) {
685
+ mrb_gc_mark_value(mrb, ARY_PTR(a)[i]);
686
+ }
687
+ }
688
+ break;
689
+
690
+ case MRB_TT_HASH:
691
+ mrb_gc_mark_iv(mrb, (struct RObject*)obj);
692
+ mrb_gc_mark_hash(mrb, (struct RHash*)obj);
693
+ break;
694
+
695
+ case MRB_TT_STRING:
696
+ if (RSTR_FSHARED_P(obj) && !RSTR_NOFREE_P(obj)) {
697
+ struct RString *s = (struct RString*)obj;
698
+ mrb_gc_mark(mrb, (struct RBasic*)s->as.heap.aux.fshared);
699
+ }
700
+ break;
701
+
702
+ case MRB_TT_RANGE:
703
+ {
704
+ struct RRange *r = (struct RRange*)obj;
705
+
706
+ if (r->edges) {
707
+ mrb_gc_mark_value(mrb, r->edges->beg);
708
+ mrb_gc_mark_value(mrb, r->edges->end);
709
+ }
710
+ }
711
+ break;
712
+
713
+ default:
714
+ break;
715
+ }
716
+ }
717
+
718
+ MRB_API void
719
+ mrb_gc_mark(mrb_state *mrb, struct RBasic *obj)
720
+ {
721
+ if (obj == 0) return;
722
+ if (!is_white(obj)) return;
723
+ mrb_assert((obj)->tt != MRB_TT_FREE);
724
+ add_gray_list(mrb, &mrb->gc, obj);
725
+ }
726
+
727
+ static void
728
+ obj_free(mrb_state *mrb, struct RBasic *obj, int end)
729
+ {
730
+ DEBUG(fprintf(stderr, "obj_free(%p,tt=%d)\n",obj,obj->tt));
731
+ switch (obj->tt) {
732
+ /* immediate - no mark */
733
+ case MRB_TT_TRUE:
734
+ case MRB_TT_FIXNUM:
735
+ case MRB_TT_SYMBOL:
736
+ /* cannot happen */
737
+ return;
738
+
739
+ #ifndef MRB_WITHOUT_FLOAT
740
+ case MRB_TT_FLOAT:
741
+ #ifdef MRB_WORD_BOXING
742
+ break;
743
+ #else
744
+ return;
745
+ #endif
746
+ #endif
747
+
748
+ case MRB_TT_OBJECT:
749
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
750
+ break;
751
+
752
+ case MRB_TT_EXCEPTION:
753
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
754
+ break;
755
+
756
+ case MRB_TT_CLASS:
757
+ case MRB_TT_MODULE:
758
+ case MRB_TT_SCLASS:
759
+ mrb_gc_free_mt(mrb, (struct RClass*)obj);
760
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
761
+ break;
762
+ case MRB_TT_ICLASS:
763
+ if (MRB_FLAG_TEST(obj, MRB_FLAG_IS_ORIGIN))
764
+ mrb_gc_free_mt(mrb, (struct RClass*)obj);
765
+ break;
766
+ case MRB_TT_ENV:
767
+ {
768
+ struct REnv *e = (struct REnv*)obj;
769
+
770
+ if (MRB_ENV_STACK_SHARED_P(e)) {
771
+ /* cannot be freed */
772
+ return;
773
+ }
774
+ mrb_free(mrb, e->stack);
775
+ e->stack = NULL;
776
+ }
777
+ break;
778
+
779
+ case MRB_TT_FIBER:
780
+ {
781
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
782
+
783
+ if (c && c != mrb->root_c) {
784
+ mrb_callinfo *ci = c->ci;
785
+ mrb_callinfo *ce = c->cibase;
786
+
787
+ if (!end) {
788
+ while (ce <= ci) {
789
+ struct REnv *e = ci->env;
790
+ if (e && !is_dead(&mrb->gc, e) &&
791
+ e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) {
792
+ mrb_env_unshare(mrb, e);
793
+ }
794
+ ci--;
795
+ }
796
+ }
797
+ mrb_free_context(mrb, c);
798
+ }
799
+ }
800
+ break;
801
+
802
+ case MRB_TT_ARRAY:
803
+ if (ARY_SHARED_P(obj))
804
+ mrb_ary_decref(mrb, ((struct RArray*)obj)->as.heap.aux.shared);
805
+ else if (!ARY_EMBED_P(obj))
806
+ mrb_free(mrb, ((struct RArray*)obj)->as.heap.ptr);
807
+ break;
808
+
809
+ case MRB_TT_HASH:
810
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
811
+ mrb_gc_free_hash(mrb, (struct RHash*)obj);
812
+ break;
813
+
814
+ case MRB_TT_STRING:
815
+ mrb_gc_free_str(mrb, (struct RString*)obj);
816
+ break;
817
+
818
+ case MRB_TT_PROC:
819
+ {
820
+ struct RProc *p = (struct RProc*)obj;
821
+
822
+ if (!MRB_PROC_CFUNC_P(p) && p->body.irep) {
823
+ mrb_irep *irep = p->body.irep;
824
+ if (end) {
825
+ mrb_irep_cutref(mrb, irep);
826
+ }
827
+ mrb_irep_decref(mrb, irep);
828
+ }
829
+ }
830
+ break;
831
+
832
+ case MRB_TT_RANGE:
833
+ mrb_free(mrb, ((struct RRange*)obj)->edges);
834
+ break;
835
+
836
+ case MRB_TT_DATA:
837
+ {
838
+ struct RData *d = (struct RData*)obj;
839
+ if (d->type && d->type->dfree) {
840
+ d->type->dfree(mrb, d->data);
841
+ }
842
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
843
+ }
844
+ break;
845
+
846
+ default:
847
+ break;
848
+ }
849
+ obj->tt = MRB_TT_FREE;
850
+ }
851
+
852
+ static void
853
+ root_scan_phase(mrb_state *mrb, mrb_gc *gc)
854
+ {
855
+ int i, e;
856
+
857
+ if (!is_minor_gc(gc)) {
858
+ gc->gray_list = NULL;
859
+ gc->atomic_gray_list = NULL;
860
+ }
861
+
862
+ mrb_gc_mark_gv(mrb);
863
+ /* mark arena */
864
+ for (i=0,e=gc->arena_idx; i<e; i++) {
865
+ mrb_gc_mark(mrb, gc->arena[i]);
866
+ }
867
+ /* mark class hierarchy */
868
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->object_class);
869
+
870
+ /* mark built-in classes */
871
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->class_class);
872
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->module_class);
873
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->proc_class);
874
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->string_class);
875
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->array_class);
876
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->hash_class);
877
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->range_class);
878
+
879
+ #ifndef MRB_WITHOUT_FLOAT
880
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->float_class);
881
+ #endif
882
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->fixnum_class);
883
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->true_class);
884
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->false_class);
885
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->nil_class);
886
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->symbol_class);
887
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->kernel_module);
888
+
889
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->eException_class);
890
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->eStandardError_class);
891
+
892
+ /* mark top_self */
893
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->top_self);
894
+ /* mark exception */
895
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
896
+ /* mark pre-allocated exception */
897
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->nomem_err);
898
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->stack_err);
899
+ #ifdef MRB_GC_FIXED_ARENA
900
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->arena_err);
901
+ #endif
902
+
903
+ mark_context(mrb, mrb->c);
904
+ if (mrb->root_c != mrb->c) {
905
+ mark_context(mrb, mrb->root_c);
906
+ }
907
+ }
908
+
909
+ static size_t
910
+ gc_gray_mark(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
911
+ {
912
+ size_t children = 0;
913
+
914
+ gc_mark_children(mrb, gc, obj);
915
+
916
+ switch (obj->tt) {
917
+ case MRB_TT_ICLASS:
918
+ children++;
919
+ break;
920
+
921
+ case MRB_TT_CLASS:
922
+ case MRB_TT_SCLASS:
923
+ case MRB_TT_MODULE:
924
+ {
925
+ struct RClass *c = (struct RClass*)obj;
926
+
927
+ children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
928
+ children += mrb_gc_mark_mt_size(mrb, c);
929
+ children++;
930
+ }
931
+ break;
932
+
933
+ case MRB_TT_OBJECT:
934
+ case MRB_TT_DATA:
935
+ case MRB_TT_EXCEPTION:
936
+ children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
937
+ break;
938
+
939
+ case MRB_TT_ENV:
940
+ children += (int)obj->flags;
941
+ break;
942
+
943
+ case MRB_TT_FIBER:
944
+ {
945
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
946
+ size_t i;
947
+ mrb_callinfo *ci;
948
+
949
+ if (!c) break;
950
+ /* mark stack */
951
+ i = c->stack - c->stbase;
952
+ if (c->ci) i += c->ci->nregs;
953
+ if (c->stbase + i > c->stend) i = c->stend - c->stbase;
954
+ children += i;
955
+
956
+ /* mark ensure stack */
957
+ children += c->eidx;
958
+
959
+ /* mark closure */
960
+ if (c->cibase) {
961
+ for (i=0, ci = c->cibase; ci <= c->ci; i++, ci++)
962
+ ;
963
+ }
964
+ children += i;
965
+ }
966
+ break;
967
+
968
+ case MRB_TT_ARRAY:
969
+ {
970
+ struct RArray *a = (struct RArray*)obj;
971
+ children += ARY_LEN(a);
972
+ }
973
+ break;
974
+
975
+ case MRB_TT_HASH:
976
+ children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
977
+ children += mrb_gc_mark_hash_size(mrb, (struct RHash*)obj);
978
+ break;
979
+
980
+ case MRB_TT_PROC:
981
+ case MRB_TT_RANGE:
982
+ children+=2;
983
+ break;
984
+
985
+ default:
986
+ break;
987
+ }
988
+ return children;
989
+ }
990
+
991
+
992
+ static void
993
+ gc_mark_gray_list(mrb_state *mrb, mrb_gc *gc) {
994
+ while (gc->gray_list) {
995
+ if (is_gray(gc->gray_list))
996
+ gc_mark_children(mrb, gc, gc->gray_list);
997
+ else
998
+ gc->gray_list = gc->gray_list->gcnext;
999
+ }
1000
+ }
1001
+
1002
+
1003
+ static size_t
1004
+ incremental_marking_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
1005
+ {
1006
+ size_t tried_marks = 0;
1007
+
1008
+ while (gc->gray_list && tried_marks < limit) {
1009
+ tried_marks += gc_gray_mark(mrb, gc, gc->gray_list);
1010
+ }
1011
+
1012
+ return tried_marks;
1013
+ }
1014
+
1015
+ static void
1016
+ final_marking_phase(mrb_state *mrb, mrb_gc *gc)
1017
+ {
1018
+ int i, e;
1019
+
1020
+ /* mark arena */
1021
+ for (i=0,e=gc->arena_idx; i<e; i++) {
1022
+ mrb_gc_mark(mrb, gc->arena[i]);
1023
+ }
1024
+ mrb_gc_mark_gv(mrb);
1025
+ mark_context(mrb, mrb->c);
1026
+ mark_context(mrb, mrb->root_c);
1027
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
1028
+ gc_mark_gray_list(mrb, gc);
1029
+ mrb_assert(gc->gray_list == NULL);
1030
+ gc->gray_list = gc->atomic_gray_list;
1031
+ gc->atomic_gray_list = NULL;
1032
+ gc_mark_gray_list(mrb, gc);
1033
+ mrb_assert(gc->gray_list == NULL);
1034
+ }
1035
+
1036
+ static void
1037
+ prepare_incremental_sweep(mrb_state *mrb, mrb_gc *gc)
1038
+ {
1039
+ gc->state = MRB_GC_STATE_SWEEP;
1040
+ gc->sweeps = gc->heaps;
1041
+ gc->live_after_mark = gc->live;
1042
+ }
1043
+
1044
+ static size_t
1045
+ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
1046
+ {
1047
+ mrb_heap_page *page = gc->sweeps;
1048
+ size_t tried_sweep = 0;
1049
+
1050
+ while (page && (tried_sweep < limit)) {
1051
+ RVALUE *p = objects(page);
1052
+ RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
1053
+ size_t freed = 0;
1054
+ mrb_bool dead_slot = TRUE;
1055
+ mrb_bool full = (page->freelist == NULL);
1056
+
1057
+ if (is_minor_gc(gc) && page->old) {
1058
+ /* skip a slot which doesn't contain any young object */
1059
+ p = e;
1060
+ dead_slot = FALSE;
1061
+ }
1062
+ while (p<e) {
1063
+ if (is_dead(gc, &p->as.basic)) {
1064
+ if (p->as.basic.tt != MRB_TT_FREE) {
1065
+ obj_free(mrb, &p->as.basic, FALSE);
1066
+ if (p->as.basic.tt == MRB_TT_FREE) {
1067
+ p->as.free.next = page->freelist;
1068
+ page->freelist = (struct RBasic*)p;
1069
+ freed++;
1070
+ }
1071
+ else {
1072
+ dead_slot = FALSE;
1073
+ }
1074
+ }
1075
+ }
1076
+ else {
1077
+ if (!is_generational(gc))
1078
+ paint_partial_white(gc, &p->as.basic); /* next gc target */
1079
+ dead_slot = FALSE;
1080
+ }
1081
+ p++;
1082
+ }
1083
+
1084
+ /* free dead slot */
1085
+ if (dead_slot && freed < MRB_HEAP_PAGE_SIZE) {
1086
+ mrb_heap_page *next = page->next;
1087
+
1088
+ unlink_heap_page(gc, page);
1089
+ unlink_free_heap_page(gc, page);
1090
+ mrb_free(mrb, page);
1091
+ page = next;
1092
+ }
1093
+ else {
1094
+ if (full && freed > 0) {
1095
+ link_free_heap_page(gc, page);
1096
+ }
1097
+ if (page->freelist == NULL && is_minor_gc(gc))
1098
+ page->old = TRUE;
1099
+ else
1100
+ page->old = FALSE;
1101
+ page = page->next;
1102
+ }
1103
+ tried_sweep += MRB_HEAP_PAGE_SIZE;
1104
+ gc->live -= freed;
1105
+ gc->live_after_mark -= freed;
1106
+ }
1107
+ gc->sweeps = page;
1108
+ return tried_sweep;
1109
+ }
1110
+
1111
+ static size_t
1112
+ incremental_gc(mrb_state *mrb, mrb_gc *gc, size_t limit)
1113
+ {
1114
+ switch (gc->state) {
1115
+ case MRB_GC_STATE_ROOT:
1116
+ root_scan_phase(mrb, gc);
1117
+ gc->state = MRB_GC_STATE_MARK;
1118
+ flip_white_part(gc);
1119
+ return 0;
1120
+ case MRB_GC_STATE_MARK:
1121
+ if (gc->gray_list) {
1122
+ return incremental_marking_phase(mrb, gc, limit);
1123
+ }
1124
+ else {
1125
+ final_marking_phase(mrb, gc);
1126
+ prepare_incremental_sweep(mrb, gc);
1127
+ return 0;
1128
+ }
1129
+ case MRB_GC_STATE_SWEEP: {
1130
+ size_t tried_sweep = 0;
1131
+ tried_sweep = incremental_sweep_phase(mrb, gc, limit);
1132
+ if (tried_sweep == 0)
1133
+ gc->state = MRB_GC_STATE_ROOT;
1134
+ return tried_sweep;
1135
+ }
1136
+ default:
1137
+ /* unknown state */
1138
+ mrb_assert(0);
1139
+ return 0;
1140
+ }
1141
+ }
1142
+
1143
+ static void
1144
+ incremental_gc_until(mrb_state *mrb, mrb_gc *gc, mrb_gc_state to_state)
1145
+ {
1146
+ do {
1147
+ incremental_gc(mrb, gc, SIZE_MAX);
1148
+ } while (gc->state != to_state);
1149
+ }
1150
+
1151
+ static void
1152
+ incremental_gc_step(mrb_state *mrb, mrb_gc *gc)
1153
+ {
1154
+ size_t limit = 0, result = 0;
1155
+ limit = (GC_STEP_SIZE/100) * gc->step_ratio;
1156
+ while (result < limit) {
1157
+ result += incremental_gc(mrb, gc, limit);
1158
+ if (gc->state == MRB_GC_STATE_ROOT)
1159
+ break;
1160
+ }
1161
+
1162
+ gc->threshold = gc->live + GC_STEP_SIZE;
1163
+ }
1164
+
1165
+ static void
1166
+ clear_all_old(mrb_state *mrb, mrb_gc *gc)
1167
+ {
1168
+ mrb_bool origin_mode = gc->generational;
1169
+
1170
+ mrb_assert(is_generational(gc));
1171
+ if (is_major_gc(gc)) {
1172
+ /* finish the half baked GC */
1173
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_ROOT);
1174
+ }
1175
+
1176
+ /* Sweep the dead objects, then reset all the live objects
1177
+ * (including all the old objects, of course) to white. */
1178
+ gc->generational = FALSE;
1179
+ prepare_incremental_sweep(mrb, gc);
1180
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_ROOT);
1181
+ gc->generational = origin_mode;
1182
+
1183
+ /* The gray objects have already been painted as white */
1184
+ gc->atomic_gray_list = gc->gray_list = NULL;
1185
+ }
1186
+
1187
+ MRB_API void
1188
+ mrb_incremental_gc(mrb_state *mrb)
1189
+ {
1190
+ mrb_gc *gc = &mrb->gc;
1191
+
1192
+ if (gc->disabled || gc->iterating) return;
1193
+
1194
+ GC_INVOKE_TIME_REPORT("mrb_incremental_gc()");
1195
+ GC_TIME_START;
1196
+
1197
+ if (is_minor_gc(gc)) {
1198
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_ROOT);
1199
+ }
1200
+ else {
1201
+ incremental_gc_step(mrb, gc);
1202
+ }
1203
+
1204
+ if (gc->state == MRB_GC_STATE_ROOT) {
1205
+ mrb_assert(gc->live >= gc->live_after_mark);
1206
+ gc->threshold = (gc->live_after_mark/100) * gc->interval_ratio;
1207
+ if (gc->threshold < GC_STEP_SIZE) {
1208
+ gc->threshold = GC_STEP_SIZE;
1209
+ }
1210
+
1211
+ if (is_major_gc(gc)) {
1212
+ gc->majorgc_old_threshold = gc->live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
1213
+ gc->full = FALSE;
1214
+ }
1215
+ else if (is_minor_gc(gc)) {
1216
+ if (gc->live > gc->majorgc_old_threshold) {
1217
+ clear_all_old(mrb, gc);
1218
+ gc->full = TRUE;
1219
+ }
1220
+ }
1221
+ }
1222
+
1223
+ GC_TIME_STOP_AND_REPORT;
1224
+ }
1225
+
1226
+ /* Perform a full gc cycle */
1227
+ MRB_API void
1228
+ mrb_full_gc(mrb_state *mrb)
1229
+ {
1230
+ mrb_gc *gc = &mrb->gc;
1231
+
1232
+ if (gc->disabled || gc->iterating) return;
1233
+
1234
+ GC_INVOKE_TIME_REPORT("mrb_full_gc()");
1235
+ GC_TIME_START;
1236
+
1237
+ if (is_generational(gc)) {
1238
+ /* clear all the old objects back to young */
1239
+ clear_all_old(mrb, gc);
1240
+ gc->full = TRUE;
1241
+ }
1242
+ else if (gc->state != MRB_GC_STATE_ROOT) {
1243
+ /* finish half baked GC cycle */
1244
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_ROOT);
1245
+ }
1246
+
1247
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_ROOT);
1248
+ gc->threshold = (gc->live_after_mark/100) * gc->interval_ratio;
1249
+
1250
+ if (is_generational(gc)) {
1251
+ gc->majorgc_old_threshold = gc->live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
1252
+ gc->full = FALSE;
1253
+ }
1254
+
1255
+ GC_TIME_STOP_AND_REPORT;
1256
+ }
1257
+
1258
+ MRB_API void
1259
+ mrb_garbage_collect(mrb_state *mrb)
1260
+ {
1261
+ mrb_full_gc(mrb);
1262
+ }
1263
+
1264
+ /*
1265
+ * Field write barrier
1266
+ * Paint obj(Black) -> value(White) to obj(Black) -> value(Gray).
1267
+ */
1268
+
1269
+ MRB_API void
1270
+ mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value)
1271
+ {
1272
+ mrb_gc *gc = &mrb->gc;
1273
+
1274
+ if (!is_black(obj)) return;
1275
+ if (!is_white(value)) return;
1276
+
1277
+ mrb_assert(gc->state == MRB_GC_STATE_MARK || (!is_dead(gc, value) && !is_dead(gc, obj)));
1278
+ mrb_assert(is_generational(gc) || gc->state != MRB_GC_STATE_ROOT);
1279
+
1280
+ if (is_generational(gc) || gc->state == MRB_GC_STATE_MARK) {
1281
+ add_gray_list(mrb, gc, value);
1282
+ }
1283
+ else {
1284
+ mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
1285
+ paint_partial_white(gc, obj); /* for never write barriers */
1286
+ }
1287
+ }
1288
+
1289
+ /*
1290
+ * Write barrier
1291
+ * Paint obj(Black) to obj(Gray).
1292
+ *
1293
+ * The object that is painted gray will be traversed atomically in final
1294
+ * mark phase. So you use this write barrier if it's frequency written spot.
1295
+ * e.g. Set element on Array.
1296
+ */
1297
+
1298
+ MRB_API void
1299
+ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj)
1300
+ {
1301
+ mrb_gc *gc = &mrb->gc;
1302
+
1303
+ if (!is_black(obj)) return;
1304
+
1305
+ mrb_assert(!is_dead(gc, obj));
1306
+ mrb_assert(is_generational(gc) || gc->state != MRB_GC_STATE_ROOT);
1307
+ paint_gray(obj);
1308
+ obj->gcnext = gc->atomic_gray_list;
1309
+ gc->atomic_gray_list = obj;
1310
+ }
1311
+
1312
+ /*
1313
+ * call-seq:
1314
+ * GC.start -> nil
1315
+ *
1316
+ * Initiates full garbage collection.
1317
+ *
1318
+ */
1319
+
1320
+ static mrb_value
1321
+ gc_start(mrb_state *mrb, mrb_value obj)
1322
+ {
1323
+ mrb_full_gc(mrb);
1324
+ return mrb_nil_value();
1325
+ }
1326
+
1327
+ /*
1328
+ * call-seq:
1329
+ * GC.enable -> true or false
1330
+ *
1331
+ * Enables garbage collection, returning <code>true</code> if garbage
1332
+ * collection was previously disabled.
1333
+ *
1334
+ * GC.disable #=> false
1335
+ * GC.enable #=> true
1336
+ * GC.enable #=> false
1337
+ *
1338
+ */
1339
+
1340
+ static mrb_value
1341
+ gc_enable(mrb_state *mrb, mrb_value obj)
1342
+ {
1343
+ mrb_bool old = mrb->gc.disabled;
1344
+
1345
+ mrb->gc.disabled = FALSE;
1346
+
1347
+ return mrb_bool_value(old);
1348
+ }
1349
+
1350
+ /*
1351
+ * call-seq:
1352
+ * GC.disable -> true or false
1353
+ *
1354
+ * Disables garbage collection, returning <code>true</code> if garbage
1355
+ * collection was already disabled.
1356
+ *
1357
+ * GC.disable #=> false
1358
+ * GC.disable #=> true
1359
+ *
1360
+ */
1361
+
1362
+ static mrb_value
1363
+ gc_disable(mrb_state *mrb, mrb_value obj)
1364
+ {
1365
+ mrb_bool old = mrb->gc.disabled;
1366
+
1367
+ mrb->gc.disabled = TRUE;
1368
+
1369
+ return mrb_bool_value(old);
1370
+ }
1371
+
1372
+ /*
1373
+ * call-seq:
1374
+ * GC.interval_ratio -> fixnum
1375
+ *
1376
+ * Returns ratio of GC interval. Default value is 200(%).
1377
+ *
1378
+ */
1379
+
1380
+ static mrb_value
1381
+ gc_interval_ratio_get(mrb_state *mrb, mrb_value obj)
1382
+ {
1383
+ return mrb_fixnum_value(mrb->gc.interval_ratio);
1384
+ }
1385
+
1386
+ /*
1387
+ * call-seq:
1388
+ * GC.interval_ratio = fixnum -> nil
1389
+ *
1390
+ * Updates ratio of GC interval. Default value is 200(%).
1391
+ * GC start as soon as after end all step of GC if you set 100(%).
1392
+ *
1393
+ */
1394
+
1395
+ static mrb_value
1396
+ gc_interval_ratio_set(mrb_state *mrb, mrb_value obj)
1397
+ {
1398
+ mrb_int ratio;
1399
+
1400
+ mrb_get_args(mrb, "i", &ratio);
1401
+ mrb->gc.interval_ratio = (int)ratio;
1402
+ return mrb_nil_value();
1403
+ }
1404
+
1405
+ /*
1406
+ * call-seq:
1407
+ * GC.step_ratio -> fixnum
1408
+ *
1409
+ * Returns step span ratio of Incremental GC. Default value is 200(%).
1410
+ *
1411
+ */
1412
+
1413
+ static mrb_value
1414
+ gc_step_ratio_get(mrb_state *mrb, mrb_value obj)
1415
+ {
1416
+ return mrb_fixnum_value(mrb->gc.step_ratio);
1417
+ }
1418
+
1419
+ /*
1420
+ * call-seq:
1421
+ * GC.step_ratio = fixnum -> nil
1422
+ *
1423
+ * Updates step span ratio of Incremental GC. Default value is 200(%).
1424
+ * 1 step of incrementalGC becomes long if a rate is big.
1425
+ *
1426
+ */
1427
+
1428
+ static mrb_value
1429
+ gc_step_ratio_set(mrb_state *mrb, mrb_value obj)
1430
+ {
1431
+ mrb_int ratio;
1432
+
1433
+ mrb_get_args(mrb, "i", &ratio);
1434
+ mrb->gc.step_ratio = (int)ratio;
1435
+ return mrb_nil_value();
1436
+ }
1437
+
1438
+ static void
1439
+ change_gen_gc_mode(mrb_state *mrb, mrb_gc *gc, mrb_bool enable)
1440
+ {
1441
+ if (gc->disabled || gc->iterating) {
1442
+ mrb_raise(mrb, E_RUNTIME_ERROR, "generational mode changed when GC disabled");
1443
+ return;
1444
+ }
1445
+ if (is_generational(gc) && !enable) {
1446
+ clear_all_old(mrb, gc);
1447
+ mrb_assert(gc->state == MRB_GC_STATE_ROOT);
1448
+ gc->full = FALSE;
1449
+ }
1450
+ else if (!is_generational(gc) && enable) {
1451
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_ROOT);
1452
+ gc->majorgc_old_threshold = gc->live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
1453
+ gc->full = FALSE;
1454
+ }
1455
+ gc->generational = enable;
1456
+ }
1457
+
1458
+ /*
1459
+ * call-seq:
1460
+ * GC.generational_mode -> true or false
1461
+ *
1462
+ * Returns generational or normal gc mode.
1463
+ *
1464
+ */
1465
+
1466
+ static mrb_value
1467
+ gc_generational_mode_get(mrb_state *mrb, mrb_value self)
1468
+ {
1469
+ return mrb_bool_value(mrb->gc.generational);
1470
+ }
1471
+
1472
+ /*
1473
+ * call-seq:
1474
+ * GC.generational_mode = true or false -> true or false
1475
+ *
1476
+ * Changes to generational or normal gc mode.
1477
+ *
1478
+ */
1479
+
1480
+ static mrb_value
1481
+ gc_generational_mode_set(mrb_state *mrb, mrb_value self)
1482
+ {
1483
+ mrb_bool enable;
1484
+
1485
+ mrb_get_args(mrb, "b", &enable);
1486
+ if (mrb->gc.generational != enable)
1487
+ change_gen_gc_mode(mrb, &mrb->gc, enable);
1488
+
1489
+ return mrb_bool_value(enable);
1490
+ }
1491
+
1492
+
1493
+ static void
1494
+ gc_each_objects(mrb_state *mrb, mrb_gc *gc, mrb_each_object_callback *callback, void *data)
1495
+ {
1496
+ mrb_heap_page* page;
1497
+
1498
+ page = gc->heaps;
1499
+ while (page != NULL) {
1500
+ RVALUE *p;
1501
+ int i;
1502
+
1503
+ p = objects(page);
1504
+ for (i=0; i < MRB_HEAP_PAGE_SIZE; i++) {
1505
+ if ((*callback)(mrb, &p[i].as.basic, data) == MRB_EACH_OBJ_BREAK)
1506
+ return;
1507
+ }
1508
+ page = page->next;
1509
+ }
1510
+ }
1511
+
1512
+ void
1513
+ mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
1514
+ {
1515
+ mrb_bool iterating = mrb->gc.iterating;
1516
+
1517
+ mrb_full_gc(mrb);
1518
+ mrb->gc.iterating = TRUE;
1519
+ if (iterating) {
1520
+ gc_each_objects(mrb, &mrb->gc, callback, data);
1521
+ }
1522
+ else {
1523
+ struct mrb_jmpbuf *prev_jmp = mrb->jmp;
1524
+ struct mrb_jmpbuf c_jmp;
1525
+
1526
+ MRB_TRY(&c_jmp) {
1527
+ mrb->jmp = &c_jmp;
1528
+ gc_each_objects(mrb, &mrb->gc, callback, data);
1529
+ mrb->jmp = prev_jmp;
1530
+ mrb->gc.iterating = iterating;
1531
+ } MRB_CATCH(&c_jmp) {
1532
+ mrb->gc.iterating = iterating;
1533
+ mrb->jmp = prev_jmp;
1534
+ MRB_THROW(prev_jmp);
1535
+ } MRB_END_EXC(&c_jmp);
1536
+ }
1537
+ }
1538
+
1539
+ #ifdef GC_TEST
1540
+ #ifdef GC_DEBUG
1541
+ static mrb_value gc_test(mrb_state *, mrb_value);
1542
+ #endif
1543
+ #endif
1544
+
1545
+ void
1546
+ mrb_init_gc(mrb_state *mrb)
1547
+ {
1548
+ struct RClass *gc;
1549
+
1550
+ gc = mrb_define_module(mrb, "GC");
1551
+
1552
+ mrb_define_class_method(mrb, gc, "start", gc_start, MRB_ARGS_NONE());
1553
+ mrb_define_class_method(mrb, gc, "enable", gc_enable, MRB_ARGS_NONE());
1554
+ mrb_define_class_method(mrb, gc, "disable", gc_disable, MRB_ARGS_NONE());
1555
+ mrb_define_class_method(mrb, gc, "interval_ratio", gc_interval_ratio_get, MRB_ARGS_NONE());
1556
+ mrb_define_class_method(mrb, gc, "interval_ratio=", gc_interval_ratio_set, MRB_ARGS_REQ(1));
1557
+ mrb_define_class_method(mrb, gc, "step_ratio", gc_step_ratio_get, MRB_ARGS_NONE());
1558
+ mrb_define_class_method(mrb, gc, "step_ratio=", gc_step_ratio_set, MRB_ARGS_REQ(1));
1559
+ mrb_define_class_method(mrb, gc, "generational_mode=", gc_generational_mode_set, MRB_ARGS_REQ(1));
1560
+ mrb_define_class_method(mrb, gc, "generational_mode", gc_generational_mode_get, MRB_ARGS_NONE());
1561
+ #ifdef GC_TEST
1562
+ #ifdef GC_DEBUG
1563
+ mrb_define_class_method(mrb, gc, "test", gc_test, MRB_ARGS_NONE());
1564
+ #endif
1565
+ #endif
1566
+ }
1567
+
1568
+ #ifdef GC_TEST
1569
+ #ifdef GC_DEBUG
1570
+ void
1571
+ test_mrb_field_write_barrier(void)
1572
+ {
1573
+ mrb_state *mrb = mrb_open();
1574
+ struct RBasic *obj, *value;
1575
+ mrb_gc *gc = &mrb->gc;
1576
+
1577
+ puts("test_mrb_field_write_barrier");
1578
+ gc->generational = FALSE;
1579
+ obj = mrb_basic_ptr(mrb_ary_new(mrb));
1580
+ value = mrb_basic_ptr(mrb_str_new_lit(mrb, "value"));
1581
+ paint_black(obj);
1582
+ paint_partial_white(gc, value);
1583
+
1584
+
1585
+ puts(" in MRB_GC_STATE_MARK");
1586
+ gc->state = MRB_GC_STATE_MARK;
1587
+ mrb_field_write_barrier(mrb, obj, value);
1588
+
1589
+ mrb_assert(is_gray(value));
1590
+
1591
+
1592
+ puts(" in MRB_GC_STATE_SWEEP");
1593
+ paint_partial_white(gc, value);
1594
+ gc->state = MRB_GC_STATE_SWEEP;
1595
+ mrb_field_write_barrier(mrb, obj, value);
1596
+
1597
+ mrb_assert(obj->color & gc->current_white_part);
1598
+ mrb_assert(value->color & gc->current_white_part);
1599
+
1600
+
1601
+ puts(" fail with black");
1602
+ gc->state = MRB_GC_STATE_MARK;
1603
+ paint_white(obj);
1604
+ paint_partial_white(gc, value);
1605
+ mrb_field_write_barrier(mrb, obj, value);
1606
+
1607
+ mrb_assert(obj->color & gc->current_white_part);
1608
+
1609
+
1610
+ puts(" fail with gray");
1611
+ gc->state = MRB_GC_STATE_MARK;
1612
+ paint_black(obj);
1613
+ paint_gray(value);
1614
+ mrb_field_write_barrier(mrb, obj, value);
1615
+
1616
+ mrb_assert(is_gray(value));
1617
+
1618
+
1619
+ {
1620
+ puts("test_mrb_field_write_barrier_value");
1621
+ obj = mrb_basic_ptr(mrb_ary_new(mrb));
1622
+ mrb_value value = mrb_str_new_lit(mrb, "value");
1623
+ paint_black(obj);
1624
+ paint_partial_white(gc, mrb_basic_ptr(value));
1625
+
1626
+ gc->state = MRB_GC_STATE_MARK;
1627
+ mrb_field_write_barrier_value(mrb, obj, value);
1628
+
1629
+ mrb_assert(is_gray(mrb_basic_ptr(value)));
1630
+ }
1631
+
1632
+ mrb_close(mrb);
1633
+ }
1634
+
1635
+ void
1636
+ test_mrb_write_barrier(void)
1637
+ {
1638
+ mrb_state *mrb = mrb_open();
1639
+ struct RBasic *obj;
1640
+ mrb_gc *gc = &mrb->gc;
1641
+
1642
+ puts("test_mrb_write_barrier");
1643
+ obj = mrb_basic_ptr(mrb_ary_new(mrb));
1644
+ paint_black(obj);
1645
+
1646
+ puts(" in MRB_GC_STATE_MARK");
1647
+ gc->state = MRB_GC_STATE_MARK;
1648
+ mrb_write_barrier(mrb, obj);
1649
+
1650
+ mrb_assert(is_gray(obj));
1651
+ mrb_assert(gc->atomic_gray_list == obj);
1652
+
1653
+
1654
+ puts(" fail with gray");
1655
+ paint_gray(obj);
1656
+ mrb_write_barrier(mrb, obj);
1657
+
1658
+ mrb_assert(is_gray(obj));
1659
+
1660
+ mrb_close(mrb);
1661
+ }
1662
+
1663
+ void
1664
+ test_add_gray_list(void)
1665
+ {
1666
+ mrb_state *mrb = mrb_open();
1667
+ struct RBasic *obj1, *obj2;
1668
+ mrb_gc *gc = &mrb->gc;
1669
+
1670
+ puts("test_add_gray_list");
1671
+ change_gen_gc_mode(mrb, gc, FALSE);
1672
+ mrb_assert(gc->gray_list == NULL);
1673
+ obj1 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
1674
+ add_gray_list(mrb, gc, obj1);
1675
+ mrb_assert(gc->gray_list == obj1);
1676
+ mrb_assert(is_gray(obj1));
1677
+
1678
+ obj2 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
1679
+ add_gray_list(mrb, gc, obj2);
1680
+ mrb_assert(gc->gray_list == obj2);
1681
+ mrb_assert(gc->gray_list->gcnext == obj1);
1682
+ mrb_assert(is_gray(obj2));
1683
+
1684
+ mrb_close(mrb);
1685
+ }
1686
+
1687
+ void
1688
+ test_gc_gray_mark(void)
1689
+ {
1690
+ mrb_state *mrb = mrb_open();
1691
+ mrb_value obj_v, value_v;
1692
+ struct RBasic *obj;
1693
+ size_t gray_num = 0;
1694
+ mrb_gc *gc = &mrb->gc;
1695
+
1696
+ puts("test_gc_gray_mark");
1697
+
1698
+ puts(" in MRB_TT_CLASS");
1699
+ obj = (struct RBasic*)mrb->object_class;
1700
+ paint_gray(obj);
1701
+ gray_num = gc_gray_mark(mrb, gc, obj);
1702
+ mrb_assert(is_black(obj));
1703
+ mrb_assert(gray_num > 1);
1704
+
1705
+ puts(" in MRB_TT_ARRAY");
1706
+ obj_v = mrb_ary_new(mrb);
1707
+ value_v = mrb_str_new_lit(mrb, "test");
1708
+ paint_gray(mrb_basic_ptr(obj_v));
1709
+ paint_partial_white(gc, mrb_basic_ptr(value_v));
1710
+ mrb_ary_push(mrb, obj_v, value_v);
1711
+ gray_num = gc_gray_mark(mrb, gc, mrb_basic_ptr(obj_v));
1712
+ mrb_assert(is_black(mrb_basic_ptr(obj_v)));
1713
+ mrb_assert(is_gray(mrb_basic_ptr(value_v)));
1714
+ mrb_assert(gray_num == 1);
1715
+
1716
+ mrb_close(mrb);
1717
+ }
1718
+
1719
+ void
1720
+ test_incremental_gc(void)
1721
+ {
1722
+ mrb_state *mrb = mrb_open();
1723
+ size_t max = ~0, live = 0, total = 0, freed = 0;
1724
+ RVALUE *free;
1725
+ mrb_heap_page *page;
1726
+ mrb_gc *gc = &mrb->gc;
1727
+
1728
+ puts("test_incremental_gc");
1729
+ change_gen_gc_mode(mrb, gc, FALSE);
1730
+
1731
+ puts(" in mrb_full_gc");
1732
+ mrb_full_gc(mrb);
1733
+
1734
+ mrb_assert(gc->state == MRB_GC_STATE_ROOT);
1735
+ puts(" in MRB_GC_STATE_ROOT");
1736
+ incremental_gc(mrb, gc, max);
1737
+ mrb_assert(gc->state == MRB_GC_STATE_MARK);
1738
+ puts(" in MRB_GC_STATE_MARK");
1739
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_SWEEP);
1740
+ mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
1741
+
1742
+ puts(" in MRB_GC_STATE_SWEEP");
1743
+ page = gc->heaps;
1744
+ while (page) {
1745
+ RVALUE *p = objects(page);
1746
+ RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
1747
+ while (p<e) {
1748
+ if (is_black(&p->as.basic)) {
1749
+ live++;
1750
+ }
1751
+ if (is_gray(&p->as.basic) && !is_dead(gc, &p->as.basic)) {
1752
+ printf("%p\n", &p->as.basic);
1753
+ }
1754
+ p++;
1755
+ }
1756
+ page = page->next;
1757
+ total += MRB_HEAP_PAGE_SIZE;
1758
+ }
1759
+
1760
+ mrb_assert(gc->gray_list == NULL);
1761
+
1762
+ incremental_gc(mrb, gc, max);
1763
+ mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
1764
+
1765
+ incremental_gc(mrb, gc, max);
1766
+ mrb_assert(gc->state == MRB_GC_STATE_ROOT);
1767
+
1768
+ free = (RVALUE*)gc->heaps->freelist;
1769
+ while (free) {
1770
+ freed++;
1771
+ free = (RVALUE*)free->as.free.next;
1772
+ }
1773
+
1774
+ mrb_assert(gc->live == live);
1775
+ mrb_assert(gc->live == total-freed);
1776
+
1777
+ puts("test_incremental_gc(gen)");
1778
+ incremental_gc_until(mrb, gc, MRB_GC_STATE_SWEEP);
1779
+ change_gen_gc_mode(mrb, gc, TRUE);
1780
+
1781
+ mrb_assert(gc->full == FALSE);
1782
+ mrb_assert(gc->state == MRB_GC_STATE_ROOT);
1783
+
1784
+ puts(" in minor");
1785
+ mrb_assert(is_minor_gc(gc));
1786
+ mrb_assert(gc->majorgc_old_threshold > 0);
1787
+ gc->majorgc_old_threshold = 0;
1788
+ mrb_incremental_gc(mrb);
1789
+ mrb_assert(gc->full == TRUE);
1790
+ mrb_assert(gc->state == MRB_GC_STATE_ROOT);
1791
+
1792
+ puts(" in major");
1793
+ mrb_assert(is_major_gc(gc));
1794
+ do {
1795
+ mrb_incremental_gc(mrb);
1796
+ } while (gc->state != MRB_GC_STATE_ROOT);
1797
+ mrb_assert(gc->full == FALSE);
1798
+
1799
+ mrb_close(mrb);
1800
+ }
1801
+
1802
+ void
1803
+ test_incremental_sweep_phase(void)
1804
+ {
1805
+ mrb_state *mrb = mrb_open();
1806
+ mrb_gc *gc = &mrb->gc;
1807
+
1808
+ puts("test_incremental_sweep_phase");
1809
+
1810
+ add_heap(mrb, gc);
1811
+ gc->sweeps = gc->heaps;
1812
+
1813
+ mrb_assert(gc->heaps->next->next == NULL);
1814
+ mrb_assert(gc->free_heaps->next->next == NULL);
1815
+ incremental_sweep_phase(mrb, gc, MRB_HEAP_PAGE_SIZE * 3);
1816
+
1817
+ mrb_assert(gc->heaps->next == NULL);
1818
+ mrb_assert(gc->heaps == gc->free_heaps);
1819
+
1820
+ mrb_close(mrb);
1821
+ }
1822
+
1823
+ static mrb_value
1824
+ gc_test(mrb_state *mrb, mrb_value self)
1825
+ {
1826
+ test_mrb_field_write_barrier();
1827
+ test_mrb_write_barrier();
1828
+ test_add_gray_list();
1829
+ test_gc_gray_mark();
1830
+ test_incremental_gc();
1831
+ test_incremental_sweep_phase();
1832
+ return mrb_nil_value();
1833
+ }
1834
+ #endif /* GC_DEBUG */
1835
+ #endif /* GC_TEST */