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,5 @@
1
+ MRuby::Gem::Specification.new('mruby-class-ext') do |spec|
2
+ spec.license = 'MIT'
3
+ spec.author = 'mruby developers'
4
+ spec.summary = 'class/module extension'
5
+ end
@@ -0,0 +1,68 @@
1
+ #include "mruby.h"
2
+ #include "mruby/class.h"
3
+ #include "mruby/string.h"
4
+
5
+ static mrb_value
6
+ mrb_mod_name(mrb_state *mrb, mrb_value self)
7
+ {
8
+ mrb_value name = mrb_class_path(mrb, mrb_class_ptr(self));
9
+ return mrb_nil_p(name)? name : mrb_str_dup(mrb, name);
10
+ }
11
+
12
+ static mrb_value
13
+ mrb_mod_singleton_class_p(mrb_state *mrb, mrb_value self)
14
+ {
15
+ return mrb_bool_value(mrb_type(self) == MRB_TT_SCLASS);
16
+ }
17
+
18
+ /*
19
+ * call-seq:
20
+ * module_exec(arg...) {|var...| block } -> obj
21
+ * class_exec(arg...) {|var...| block } -> obj
22
+ *
23
+ * Evaluates the given block in the context of the
24
+ * class/module. The method defined in the block will belong
25
+ * to the receiver. Any arguments passed to the method will be
26
+ * passed to the block. This can be used if the block needs to
27
+ * access instance variables.
28
+ *
29
+ * class Thing
30
+ * end
31
+ * Thing.class_exec{
32
+ * def hello() "Hello there!" end
33
+ * }
34
+ * puts Thing.new.hello()
35
+ */
36
+
37
+ static mrb_value
38
+ mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
39
+ {
40
+ const mrb_value *argv;
41
+ mrb_int argc;
42
+ mrb_value blk;
43
+
44
+ mrb_get_args(mrb, "*&", &argv, &argc, &blk);
45
+
46
+ if (mrb_nil_p(blk)) {
47
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
48
+ }
49
+
50
+ mrb->c->ci->target_class = mrb_class_ptr(self);
51
+ return mrb_yield_cont(mrb, blk, self, argc, argv);
52
+ }
53
+
54
+ void
55
+ mrb_mruby_class_ext_gem_init(mrb_state *mrb)
56
+ {
57
+ struct RClass *mod = mrb->module_class;
58
+
59
+ mrb_define_method(mrb, mod, "name", mrb_mod_name, MRB_ARGS_NONE());
60
+ mrb_define_method(mrb, mod, "singleton_class?", mrb_mod_singleton_class_p, MRB_ARGS_NONE());
61
+ mrb_define_method(mrb, mod, "module_exec", mrb_mod_module_exec, MRB_ARGS_ANY()|MRB_ARGS_BLOCK());
62
+ mrb_define_method(mrb, mod, "class_exec", mrb_mod_module_exec, MRB_ARGS_ANY()|MRB_ARGS_BLOCK());
63
+ }
64
+
65
+ void
66
+ mrb_mruby_class_ext_gem_final(mrb_state *mrb)
67
+ {
68
+ }
@@ -0,0 +1,55 @@
1
+ assert 'Module#name' do
2
+ module Outer
3
+ class Inner; end
4
+ const_set :SetInner, Class.new
5
+ end
6
+
7
+ assert_equal 'Outer', Outer.name
8
+ assert_equal 'Outer::Inner', Outer::Inner.name
9
+ assert_equal 'Outer::SetInner', Outer::SetInner.name
10
+
11
+ outer = Module.new do
12
+ const_set :SetInner, Class.new
13
+ end
14
+ Object.const_set :SetOuter, outer
15
+
16
+ assert_equal 'SetOuter', SetOuter.name
17
+ assert_equal 'SetOuter::SetInner', SetOuter::SetInner.name
18
+
19
+ mod = Module.new
20
+ cls = Class.new
21
+
22
+ assert_nil mod.name
23
+ assert_nil cls.name
24
+ end
25
+
26
+ assert 'Module#singleton_class?' do
27
+ mod = Module.new
28
+ cls = Class.new
29
+ scl = cls.singleton_class
30
+
31
+ assert_false mod.singleton_class?
32
+ assert_false cls.singleton_class?
33
+ assert_true scl.singleton_class?
34
+ end
35
+
36
+ assert 'Module#module_eval' do
37
+ mod = Module.new
38
+ mod.class_exec(1,2,3) do |a,b,c|
39
+ assert_equal([1,2,3], [a,b,c])
40
+ def hi
41
+ "hi"
42
+ end
43
+ end
44
+ cls = Class.new
45
+ cls.class_exec(42) do |x|
46
+ assert_equal(42, x)
47
+ include mod
48
+ def hello
49
+ "hello"
50
+ end
51
+ end
52
+ obj = cls.new
53
+ assert_equal("hi", obj.hi)
54
+ assert_equal("hello", obj.hello)
55
+ end
@@ -0,0 +1,5 @@
1
+ MRuby::Gem::Specification.new('mruby-compar-ext') do |spec|
2
+ spec.license = 'MIT'
3
+ spec.author = 'mruby developers'
4
+ spec.summary = 'Enumerable module extension'
5
+ end
@@ -0,0 +1,31 @@
1
+ module Comparable
2
+ ##
3
+ # Returns <i>min</i> if <i>obj</i> <code><=></code> <i>min</i> is less
4
+ # than zero, <i>max</i> if <i>obj</i> <code><=></code> <i>max</i> is
5
+ # greater than zero and <i>obj</i> otherwise.
6
+ #
7
+ # 12.clamp(0, 100) #=> 12
8
+ # 523.clamp(0, 100) #=> 100
9
+ # -3.123.clamp(0, 100) #=> 0
10
+ #
11
+ # 'd'.clamp('a', 'f') #=> 'd'
12
+ # 'z'.clamp('a', 'f') #=> 'f'
13
+ #
14
+ def clamp(min, max)
15
+ if (min <=> max) > 0
16
+ raise ArgumentError, "min argument must be smaller than max argument"
17
+ end
18
+ c = self <=> min
19
+ if c == 0
20
+ return self
21
+ elsif c < 0
22
+ return min
23
+ end
24
+ c = self <=> max
25
+ if c > 0
26
+ return max
27
+ else
28
+ return self
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ require 'tempfile'
2
+
3
+ assert('Compiling multiple files without new line in last line. #2361') do
4
+ a, b, out = Tempfile.new('a.rb'), Tempfile.new('b.rb'), Tempfile.new('out.mrb')
5
+ a.write('module A; end')
6
+ a.flush
7
+ b.write('module B; end')
8
+ b.flush
9
+ result = `#{cmd('mrbc')} -c -o #{out.path} #{a.path} #{b.path} 2>&1`
10
+ assert_equal "#{cmd('mrbc')}:#{a.path}:Syntax OK", result.chomp
11
+ assert_equal 0, $?.exitstatus
12
+ end
13
+
14
+ assert('parsing function with void argument') do
15
+ a, out = Tempfile.new('a.rb'), Tempfile.new('out.mrb')
16
+ a.write('f ()')
17
+ a.flush
18
+ result = `#{cmd('mrbc')} -c -o #{out.path} #{a.path} 2>&1`
19
+ assert_equal "#{cmd('mrbc')}:#{a.path}:Syntax OK", result.chomp
20
+ assert_equal 0, $?.exitstatus
21
+ end
22
+
23
+ assert('embedded document with invalid terminator') do
24
+ a, out = Tempfile.new('a.rb'), Tempfile.new('out.mrb')
25
+ a.write("=begin\n=endx\n")
26
+ a.flush
27
+ result = `#{cmd('mrbc')} -c -o #{out.path} #{a.path} 2>&1`
28
+ assert_equal "#{a.path}:3:0: embedded document meets end of file", result.chomp
29
+ assert_equal 1, $?.exitstatus
30
+ end
@@ -0,0 +1,3083 @@
1
+ /*
2
+ ** codegen.c - mruby code generator
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #include <ctype.h>
8
+ #include <limits.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <mruby.h>
12
+ #include <mruby/compile.h>
13
+ #include <mruby/proc.h>
14
+ #include <mruby/numeric.h>
15
+ #include <mruby/string.h>
16
+ #include <mruby/debug.h>
17
+ #include "node.h"
18
+ #include <mruby/opcode.h>
19
+ #include <mruby/re.h>
20
+ #include <mruby/throw.h>
21
+
22
+ #ifndef MRB_CODEGEN_LEVEL_MAX
23
+ #define MRB_CODEGEN_LEVEL_MAX 1024
24
+ #endif
25
+
26
+ typedef mrb_ast_node node;
27
+ typedef struct mrb_parser_state parser_state;
28
+
29
+ enum looptype {
30
+ LOOP_NORMAL,
31
+ LOOP_BLOCK,
32
+ LOOP_FOR,
33
+ LOOP_BEGIN,
34
+ LOOP_RESCUE,
35
+ };
36
+
37
+ struct loopinfo {
38
+ enum looptype type;
39
+ int pc1, pc2, pc3, acc;
40
+ int ensure_level;
41
+ struct loopinfo *prev;
42
+ };
43
+
44
+ typedef struct scope {
45
+ mrb_state *mrb;
46
+ mrb_pool *mpool;
47
+ struct mrb_jmpbuf jmp;
48
+
49
+ struct scope *prev;
50
+
51
+ node *lv;
52
+
53
+ int sp;
54
+ int pc;
55
+ int lastlabel;
56
+ int ainfo:15;
57
+ mrb_bool mscope:1;
58
+
59
+ struct loopinfo *loop;
60
+ int ensure_level;
61
+ char const *filename;
62
+ uint16_t lineno;
63
+
64
+ mrb_code *iseq;
65
+ uint16_t *lines;
66
+ int icapa;
67
+
68
+ mrb_irep *irep;
69
+ int pcapa, scapa, rcapa;
70
+
71
+ uint16_t nlocals;
72
+ uint16_t nregs;
73
+ int ai;
74
+
75
+ int debug_start_pos;
76
+ uint16_t filename_index;
77
+ parser_state* parser;
78
+
79
+ int rlev; /* recursion levels */
80
+ } codegen_scope;
81
+
82
+ static codegen_scope* scope_new(mrb_state *mrb, codegen_scope *prev, node *lv);
83
+ static void scope_finish(codegen_scope *s);
84
+ static struct loopinfo *loop_push(codegen_scope *s, enum looptype t);
85
+ static void loop_break(codegen_scope *s, node *tree);
86
+ static void loop_pop(codegen_scope *s, int val);
87
+
88
+ static void gen_assignment(codegen_scope *s, node *tree, int sp, int val);
89
+ static void gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val);
90
+
91
+ static void codegen(codegen_scope *s, node *tree, int val);
92
+ static void raise_error(codegen_scope *s, const char *msg);
93
+
94
+ static void
95
+ codegen_error(codegen_scope *s, const char *message)
96
+ {
97
+ if (!s) return;
98
+ while (s->prev) {
99
+ codegen_scope *tmp = s->prev;
100
+ mrb_free(s->mrb, s->iseq);
101
+ mrb_pool_close(s->mpool);
102
+ s = tmp;
103
+ }
104
+ #ifndef MRB_DISABLE_STDIO
105
+ if (s->filename && s->lineno) {
106
+ fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
107
+ }
108
+ else {
109
+ fprintf(stderr, "codegen error: %s\n", message);
110
+ }
111
+ #endif
112
+ MRB_THROW(&s->jmp);
113
+ }
114
+
115
+ static void*
116
+ codegen_palloc(codegen_scope *s, size_t len)
117
+ {
118
+ void *p = mrb_pool_alloc(s->mpool, len);
119
+
120
+ if (!p) codegen_error(s, "pool memory allocation");
121
+ return p;
122
+ }
123
+
124
+ static void*
125
+ codegen_malloc(codegen_scope *s, size_t len)
126
+ {
127
+ void *p = mrb_malloc_simple(s->mrb, len);
128
+
129
+ if (!p) codegen_error(s, "mrb_malloc");
130
+ return p;
131
+ }
132
+
133
+ static void*
134
+ codegen_realloc(codegen_scope *s, void *p, size_t len)
135
+ {
136
+ p = mrb_realloc_simple(s->mrb, p, len);
137
+
138
+ if (!p && len > 0) codegen_error(s, "mrb_realloc");
139
+ return p;
140
+ }
141
+
142
+ static int
143
+ new_label(codegen_scope *s)
144
+ {
145
+ s->lastlabel = s->pc;
146
+ return s->pc;
147
+ }
148
+
149
+ static inline int
150
+ genop(codegen_scope *s, mrb_code i)
151
+ {
152
+ if (s->pc == s->icapa) {
153
+ s->icapa *= 2;
154
+ s->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa);
155
+ if (s->lines) {
156
+ s->lines = (uint16_t*)codegen_realloc(s, s->lines, sizeof(short)*s->icapa);
157
+ s->irep->lines = s->lines;
158
+ }
159
+ }
160
+ s->iseq[s->pc] = i;
161
+ if (s->lines) {
162
+ s->lines[s->pc] = s->lineno;
163
+ }
164
+ return s->pc++;
165
+ }
166
+
167
+ #define NOVAL 0
168
+ #define VAL 1
169
+
170
+ static mrb_bool
171
+ no_optimize(codegen_scope *s)
172
+ {
173
+ if (s && s->parser && s->parser->no_optimize)
174
+ return TRUE;
175
+ return FALSE;
176
+ }
177
+
178
+ static int
179
+ genop_peep(codegen_scope *s, mrb_code i, int val)
180
+ {
181
+ /* peephole optimization */
182
+ if (!no_optimize(s) && s->lastlabel != s->pc && s->pc > 0) {
183
+ mrb_code i0 = s->iseq[s->pc-1];
184
+ int c1 = GET_OPCODE(i);
185
+ int c0 = GET_OPCODE(i0);
186
+
187
+ switch (c1) {
188
+ case OP_MOVE:
189
+ if (GETARG_A(i) == GETARG_B(i)) {
190
+ /* skip useless OP_MOVE */
191
+ return 0;
192
+ }
193
+ if (val) break;
194
+ switch (c0) {
195
+ case OP_MOVE:
196
+ if (GETARG_A(i) == GETARG_A(i0)) {
197
+ /* skip overriden OP_MOVE */
198
+ s->pc--;
199
+ s->iseq[s->pc] = i;
200
+ }
201
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0)) {
202
+ /* skip swapping OP_MOVE */
203
+ return 0;
204
+ }
205
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
206
+ s->pc--;
207
+ return genop_peep(s, MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_B(i0)), val);
208
+ }
209
+ break;
210
+ case OP_LOADI:
211
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
212
+ s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, GETARG_A(i), GETARG_sBx(i0));
213
+ return 0;
214
+ }
215
+ break;
216
+ case OP_ARRAY:
217
+ case OP_HASH:
218
+ case OP_RANGE:
219
+ case OP_AREF:
220
+ case OP_GETUPVAR:
221
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
222
+ s->iseq[s->pc-1] = MKOP_ABC(c0, GETARG_A(i), GETARG_B(i0), GETARG_C(i0));
223
+ return 0;
224
+ }
225
+ break;
226
+ case OP_LOADSYM:
227
+ case OP_GETGLOBAL:
228
+ case OP_GETIV:
229
+ case OP_GETCV:
230
+ case OP_GETCONST:
231
+ case OP_GETSPECIAL:
232
+ case OP_LOADL:
233
+ case OP_STRING:
234
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
235
+ s->iseq[s->pc-1] = MKOP_ABx(c0, GETARG_A(i), GETARG_Bx(i0));
236
+ return 0;
237
+ }
238
+ break;
239
+ case OP_SCLASS:
240
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
241
+ s->iseq[s->pc-1] = MKOP_AB(c0, GETARG_A(i), GETARG_B(i0));
242
+ return 0;
243
+ }
244
+ break;
245
+ case OP_LOADNIL:
246
+ case OP_LOADSELF:
247
+ case OP_LOADT:
248
+ case OP_LOADF:
249
+ case OP_OCLASS:
250
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
251
+ s->iseq[s->pc-1] = MKOP_A(c0, GETARG_A(i));
252
+ return 0;
253
+ }
254
+ break;
255
+ default:
256
+ break;
257
+ }
258
+ break;
259
+ case OP_SETIV:
260
+ case OP_SETCV:
261
+ case OP_SETCONST:
262
+ case OP_SETMCNST:
263
+ case OP_SETGLOBAL:
264
+ if (val) break;
265
+ if (c0 == OP_MOVE) {
266
+ if (GETARG_A(i) == GETARG_A(i0)) {
267
+ s->iseq[s->pc-1] = MKOP_ABx(c1, GETARG_B(i0), GETARG_Bx(i));
268
+ return 0;
269
+ }
270
+ }
271
+ break;
272
+ case OP_SETUPVAR:
273
+ if (val) break;
274
+ if (c0 == OP_MOVE) {
275
+ if (GETARG_A(i) == GETARG_A(i0)) {
276
+ s->iseq[s->pc-1] = MKOP_ABC(c1, GETARG_B(i0), GETARG_B(i), GETARG_C(i));
277
+ return 0;
278
+ }
279
+ }
280
+ break;
281
+ case OP_GETUPVAR:
282
+ if (c0 == OP_SETUPVAR) {
283
+ if (GETARG_B(i) == GETARG_B(i0) && GETARG_C(i) == GETARG_C(i0)) {
284
+ if (GETARG_A(i) == GETARG_A(i0)) {
285
+ /* just skip OP_SETUPVAR */
286
+ return 0;
287
+ }
288
+ else {
289
+ return genop(s, MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_A(i0)));
290
+ }
291
+ }
292
+ }
293
+ break;
294
+ case OP_EPOP:
295
+ if (c0 == OP_EPOP) {
296
+ s->iseq[s->pc-1] = MKOP_A(OP_EPOP, GETARG_A(i0)+GETARG_A(i));
297
+ return 0;
298
+ }
299
+ break;
300
+ case OP_POPERR:
301
+ if (c0 == OP_POPERR) {
302
+ s->iseq[s->pc-1] = MKOP_A(OP_POPERR, GETARG_A(i0)+GETARG_A(i));
303
+ return 0;
304
+ }
305
+ break;
306
+ case OP_RETURN:
307
+ switch (c0) {
308
+ case OP_RETURN:
309
+ return 0;
310
+ case OP_MOVE:
311
+ if (GETARG_A(i0) >= s->nlocals) {
312
+ s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL);
313
+ return 0;
314
+ }
315
+ break;
316
+ case OP_SETIV:
317
+ case OP_SETCV:
318
+ case OP_SETCONST:
319
+ case OP_SETMCNST:
320
+ case OP_SETUPVAR:
321
+ case OP_SETGLOBAL:
322
+ s->pc--;
323
+ genop_peep(s, i0, NOVAL);
324
+ i0 = s->iseq[s->pc-1];
325
+ return genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
326
+ #if 0
327
+ case OP_SEND:
328
+ if (GETARG_B(i) == OP_R_NORMAL && GETARG_A(i) == GETARG_A(i0)) {
329
+ s->iseq[s->pc-1] = MKOP_ABC(OP_TAILCALL, GETARG_A(i0), GETARG_B(i0), GETARG_C(i0));
330
+ return;
331
+ }
332
+ break;
333
+ #endif
334
+ default:
335
+ break;
336
+ }
337
+ break;
338
+ case OP_ADD:
339
+ case OP_SUB:
340
+ if (c0 == OP_LOADI) {
341
+ int c = GETARG_sBx(i0);
342
+
343
+ if (c1 == OP_SUB) c = -c;
344
+ if (c > 127 || c < -127) break;
345
+ if (0 <= c)
346
+ s->iseq[s->pc-1] = MKOP_ABC(OP_ADDI, GETARG_A(i), GETARG_B(i), c);
347
+ else
348
+ s->iseq[s->pc-1] = MKOP_ABC(OP_SUBI, GETARG_A(i), GETARG_B(i), -c);
349
+ return 0;
350
+ }
351
+ break;
352
+ case OP_ARYCAT:
353
+ case OP_ARYPUSH:
354
+ if (c0 == OP_MOVE && GETARG_A(i0) >= s->nlocals) {
355
+ s->iseq[s->pc-1] = MKOP_AB(c1, GETARG_A(i), GETARG_B(i0));
356
+ return 0;
357
+ }
358
+ break;
359
+ case OP_STRCAT:
360
+ if (c0 == OP_STRING) {
361
+ mrb_value v = s->irep->pool[GETARG_Bx(i0)];
362
+
363
+ if (mrb_string_p(v) && RSTRING_LEN(v) == 0) {
364
+ s->pc--;
365
+ return 0;
366
+ }
367
+ }
368
+ if (c0 == OP_LOADNIL) {
369
+ if (GETARG_B(i) == GETARG_A(i0)) {
370
+ s->pc--;
371
+ return 0;
372
+ }
373
+ }
374
+ break;
375
+ case OP_JMPIF:
376
+ case OP_JMPNOT:
377
+ if (c0 == OP_MOVE && GETARG_A(i) == GETARG_A(i0)) {
378
+ s->iseq[s->pc-1] = MKOP_AsBx(c1, GETARG_B(i0), GETARG_sBx(i));
379
+ return s->pc-1;
380
+ }
381
+ break;
382
+ default:
383
+ break;
384
+ }
385
+ }
386
+ return genop(s, i);
387
+ }
388
+
389
+ static void
390
+ scope_error(codegen_scope *s)
391
+ {
392
+ exit(EXIT_FAILURE);
393
+ }
394
+
395
+ static void
396
+ distcheck(codegen_scope *s, int diff)
397
+ {
398
+ if (diff > MAXARG_sBx || diff < -MAXARG_sBx) {
399
+ codegen_error(s, "too distant jump address");
400
+ }
401
+ }
402
+
403
+ static inline void
404
+ dispatch(codegen_scope *s, int pc)
405
+ {
406
+ int diff = s->pc - pc;
407
+ mrb_code i = s->iseq[pc];
408
+ int c = GET_OPCODE(i);
409
+
410
+ s->lastlabel = s->pc;
411
+ switch (c) {
412
+ case OP_JMP:
413
+ case OP_JMPIF:
414
+ case OP_JMPNOT:
415
+ case OP_ONERR:
416
+ break;
417
+ default:
418
+ #ifndef MRB_DISABLE_STDIO
419
+ fprintf(stderr, "bug: dispatch on non JMP op\n");
420
+ #endif
421
+ scope_error(s);
422
+ break;
423
+ }
424
+ distcheck(s, diff);
425
+ s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff);
426
+ }
427
+
428
+ static void
429
+ dispatch_linked(codegen_scope *s, int pc)
430
+ {
431
+ mrb_code i;
432
+ int pos;
433
+
434
+ if (!pc) return;
435
+ for (;;) {
436
+ i = s->iseq[pc];
437
+ pos = GETARG_sBx(i);
438
+ dispatch(s, pc);
439
+ if (!pos) break;
440
+ pc = pos;
441
+ }
442
+ }
443
+
444
+ #define nregs_update do {if (s->sp > s->nregs) s->nregs = s->sp;} while (0)
445
+ static void
446
+ push_(codegen_scope *s)
447
+ {
448
+ if (s->sp > 511) {
449
+ codegen_error(s, "too complex expression");
450
+ }
451
+ s->sp++;
452
+ nregs_update;
453
+ }
454
+
455
+ static void
456
+ push_n_(codegen_scope *s, int n)
457
+ {
458
+ if (s->sp+n > 511) {
459
+ codegen_error(s, "too complex expression");
460
+ }
461
+ s->sp+=n;
462
+ nregs_update;
463
+ }
464
+
465
+ #define push() push_(s)
466
+ #define push_n(n) push_n_(s,n)
467
+ #define pop_(s) ((s)->sp--)
468
+ #define pop() pop_(s)
469
+ #define pop_n(n) (s->sp-=(n))
470
+ #define cursp() (s->sp)
471
+
472
+ static inline int
473
+ new_lit(codegen_scope *s, mrb_value val)
474
+ {
475
+ int i;
476
+ mrb_value *pv;
477
+
478
+ switch (mrb_type(val)) {
479
+ case MRB_TT_STRING:
480
+ for (i=0; i<s->irep->plen; i++) {
481
+ mrb_int len;
482
+ pv = &s->irep->pool[i];
483
+
484
+ if (mrb_type(*pv) != MRB_TT_STRING) continue;
485
+ if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue;
486
+ if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0)
487
+ return i;
488
+ }
489
+ break;
490
+ #ifndef MRB_WITHOUT_FLOAT
491
+ case MRB_TT_FLOAT:
492
+ for (i=0; i<s->irep->plen; i++) {
493
+ pv = &s->irep->pool[i];
494
+ if (mrb_type(*pv) != MRB_TT_FLOAT) continue;
495
+ if (mrb_float(*pv) == mrb_float(val)) return i;
496
+ }
497
+ break;
498
+ #endif
499
+ case MRB_TT_FIXNUM:
500
+ for (i=0; i<s->irep->plen; i++) {
501
+ pv = &s->irep->pool[i];
502
+ if (!mrb_fixnum_p(*pv)) continue;
503
+ if (mrb_fixnum(*pv) == mrb_fixnum(val)) return i;
504
+ }
505
+ break;
506
+ default:
507
+ /* should not happen */
508
+ return 0;
509
+ }
510
+
511
+ if (s->irep->plen == s->pcapa) {
512
+ s->pcapa *= 2;
513
+ s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa);
514
+ }
515
+
516
+ pv = &s->irep->pool[s->irep->plen];
517
+ i = s->irep->plen++;
518
+
519
+ switch (mrb_type(val)) {
520
+ case MRB_TT_STRING:
521
+ *pv = mrb_str_pool(s->mrb, val);
522
+ break;
523
+
524
+ #ifndef MRB_WITHOUT_FLOAT
525
+ case MRB_TT_FLOAT:
526
+ #ifdef MRB_WORD_BOXING
527
+ *pv = mrb_float_pool(s->mrb, mrb_float(val));
528
+ break;
529
+ #endif
530
+ #endif
531
+ case MRB_TT_FIXNUM:
532
+ *pv = val;
533
+ break;
534
+
535
+ default:
536
+ /* should not happen */
537
+ break;
538
+ }
539
+ return i;
540
+ }
541
+
542
+ /* method symbols should be fit in 9 bits */
543
+ #define MAXMSYMLEN 512
544
+ /* maximum symbol numbers */
545
+ #define MAXSYMLEN 65536
546
+
547
+ static int
548
+ new_msym(codegen_scope *s, mrb_sym sym)
549
+ {
550
+ int i, len;
551
+
552
+ mrb_assert(s->irep);
553
+
554
+ len = s->irep->slen;
555
+ if (len > MAXMSYMLEN) len = MAXMSYMLEN;
556
+ for (i=0; i<len; i++) {
557
+ if (s->irep->syms[i] == sym) return i;
558
+ if (s->irep->syms[i] == 0) break;
559
+ }
560
+ if (i == MAXMSYMLEN) {
561
+ codegen_error(s, "too many symbols (max " MRB_STRINGIZE(MAXMSYMLEN) ")");
562
+ }
563
+ s->irep->syms[i] = sym;
564
+ if (i == s->irep->slen) s->irep->slen++;
565
+ return i;
566
+ }
567
+
568
+ static int
569
+ new_sym(codegen_scope *s, mrb_sym sym)
570
+ {
571
+ int i;
572
+
573
+ for (i=0; i<s->irep->slen; i++) {
574
+ if (s->irep->syms[i] == sym) return i;
575
+ }
576
+ if (s->irep->slen == MAXSYMLEN) {
577
+ codegen_error(s, "too many symbols (max " MRB_STRINGIZE(MAXSYMLEN) ")");
578
+ }
579
+
580
+ if (s->irep->slen > MAXMSYMLEN/2 && s->scapa == MAXMSYMLEN) {
581
+ s->scapa = MAXSYMLEN;
582
+ s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*MAXSYMLEN);
583
+ for (i = s->irep->slen; i < MAXMSYMLEN; i++) {
584
+ static const mrb_sym mrb_sym_zero = { 0 };
585
+ s->irep->syms[i] = mrb_sym_zero;
586
+ }
587
+ s->irep->slen = MAXMSYMLEN;
588
+ }
589
+ s->irep->syms[s->irep->slen] = sym;
590
+ return s->irep->slen++;
591
+ }
592
+
593
+ static int
594
+ node_len(node *tree)
595
+ {
596
+ int n = 0;
597
+
598
+ while (tree) {
599
+ n++;
600
+ tree = tree->cdr;
601
+ }
602
+ return n;
603
+ }
604
+
605
+ #define nsym(x) ((mrb_sym)(intptr_t)(x))
606
+ #define lv_name(lv) nsym((lv)->car)
607
+ static int
608
+ lv_idx(codegen_scope *s, mrb_sym id)
609
+ {
610
+ node *lv = s->lv;
611
+ int n = 1;
612
+
613
+ while (lv) {
614
+ if (lv_name(lv) == id) return n;
615
+ n++;
616
+ lv = lv->cdr;
617
+ }
618
+ return 0;
619
+ }
620
+
621
+ static void
622
+ for_body(codegen_scope *s, node *tree)
623
+ {
624
+ codegen_scope *prev = s;
625
+ int idx;
626
+ struct loopinfo *lp;
627
+ node *n2;
628
+ mrb_code c;
629
+
630
+ /* generate receiver */
631
+ codegen(s, tree->cdr->car, VAL);
632
+ /* generate loop-block */
633
+ s = scope_new(s->mrb, s, NULL);
634
+ if (s == NULL) {
635
+ raise_error(prev, "unexpected scope");
636
+ }
637
+
638
+ push(); /* push for a block parameter */
639
+
640
+ /* generate loop variable */
641
+ n2 = tree->car;
642
+ genop(s, MKOP_Ax(OP_ENTER, 0x40000));
643
+ if (n2->car && !n2->car->cdr && !n2->cdr) {
644
+ gen_assignment(s, n2->car->car, 1, NOVAL);
645
+ }
646
+ else {
647
+ gen_vmassignment(s, n2, 1, VAL);
648
+ }
649
+ /* construct loop */
650
+ lp = loop_push(s, LOOP_FOR);
651
+ lp->pc2 = new_label(s);
652
+
653
+ /* loop body */
654
+ codegen(s, tree->cdr->cdr->car, VAL);
655
+ pop();
656
+ if (s->pc > 0) {
657
+ c = s->iseq[s->pc-1];
658
+ if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel)
659
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
660
+ }
661
+ loop_pop(s, NOVAL);
662
+ scope_finish(s);
663
+ s = prev;
664
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK));
665
+ push();pop(); /* space for a block */
666
+ pop();
667
+ idx = new_msym(s, mrb_intern_lit(s->mrb, "each"));
668
+ genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
669
+ }
670
+
671
+ static int
672
+ lambda_body(codegen_scope *s, node *tree, int blk)
673
+ {
674
+ mrb_code c;
675
+ codegen_scope *parent = s;
676
+ s = scope_new(s->mrb, s, tree->car);
677
+ if (s == NULL) {
678
+ raise_error(parent, "unexpected scope");
679
+ }
680
+
681
+ s->mscope = !blk;
682
+
683
+ if (blk) {
684
+ struct loopinfo *lp = loop_push(s, LOOP_BLOCK);
685
+ lp->pc1 = new_label(s);
686
+ }
687
+ tree = tree->cdr;
688
+ if (tree->car) {
689
+ mrb_aspec a;
690
+ int ma, oa, ra, pa, ka, kd, ba;
691
+ int pos, i;
692
+ node *n, *opt;
693
+
694
+ ma = node_len(tree->car->car);
695
+ n = tree->car->car;
696
+ while (n) {
697
+ n = n->cdr;
698
+ }
699
+ oa = node_len(tree->car->cdr->car);
700
+ ra = tree->car->cdr->cdr->car ? 1 : 0;
701
+ pa = node_len(tree->car->cdr->cdr->cdr->car);
702
+ ka = kd = 0;
703
+ ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0;
704
+
705
+ if (ma > 0x1f || oa > 0x1f || pa > 0x1f || ka > 0x1f) {
706
+ codegen_error(s, "too many formal arguments");
707
+ }
708
+ a = ((mrb_aspec)(ma & 0x1f) << 18)
709
+ | ((mrb_aspec)(oa & 0x1f) << 13)
710
+ | ((ra & 1) << 12)
711
+ | ((pa & 0x1f) << 7)
712
+ | ((ka & 0x1f) << 2)
713
+ | ((kd & 1)<< 1)
714
+ | (ba & 1);
715
+ s->ainfo = (((ma+oa) & 0x3f) << 6) /* (12bits = 6:1:5) */
716
+ | ((ra & 1) << 5)
717
+ | (pa & 0x1f);
718
+ genop(s, MKOP_Ax(OP_ENTER, a));
719
+ pos = new_label(s);
720
+ for (i=0; i<oa; i++) {
721
+ new_label(s);
722
+ genop(s, MKOP_sBx(OP_JMP, 0));
723
+ }
724
+ if (oa > 0) {
725
+ genop(s, MKOP_sBx(OP_JMP, 0));
726
+ }
727
+ opt = tree->car->cdr->car;
728
+ i = 0;
729
+ while (opt) {
730
+ int idx;
731
+
732
+ dispatch(s, pos+i);
733
+ codegen(s, opt->car->cdr, VAL);
734
+ idx = lv_idx(s, nsym(opt->car->car));
735
+ pop();
736
+ genop_peep(s, MKOP_AB(OP_MOVE, idx, cursp()), NOVAL);
737
+ i++;
738
+ opt = opt->cdr;
739
+ }
740
+ if (oa > 0) {
741
+ dispatch(s, pos+i);
742
+ }
743
+ }
744
+ codegen(s, tree->cdr->car, VAL);
745
+ pop();
746
+ if (s->pc > 0) {
747
+ c = s->iseq[s->pc-1];
748
+ if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) {
749
+ if (s->nregs == 0) {
750
+ genop(s, MKOP_A(OP_LOADNIL, 0));
751
+ genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
752
+ }
753
+ else {
754
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
755
+ }
756
+ }
757
+ }
758
+ if (blk) {
759
+ loop_pop(s, NOVAL);
760
+ }
761
+ scope_finish(s);
762
+ return parent->irep->rlen - 1;
763
+ }
764
+
765
+ static int
766
+ scope_body(codegen_scope *s, node *tree, int val)
767
+ {
768
+ codegen_scope *scope = scope_new(s->mrb, s, tree->car);
769
+ if (scope == NULL) {
770
+ raise_error(s, "unexpected scope");
771
+ }
772
+
773
+ codegen(scope, tree->cdr, VAL);
774
+ if (!s->iseq) {
775
+ genop(scope, MKOP_A(OP_STOP, 0));
776
+ }
777
+ else if (!val) {
778
+ genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
779
+ }
780
+ else {
781
+ if (scope->nregs == 0) {
782
+ genop(scope, MKOP_A(OP_LOADNIL, 0));
783
+ genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
784
+ }
785
+ else {
786
+ genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp-1, OP_R_NORMAL), NOVAL);
787
+ }
788
+ }
789
+ scope_finish(scope);
790
+ if (!s->irep) {
791
+ /* should not happen */
792
+ return 0;
793
+ }
794
+ return s->irep->rlen - 1;
795
+ }
796
+
797
+ #define nint(x) ((int)(intptr_t)(x))
798
+ #define nchar(x) ((char)(intptr_t)(x))
799
+
800
+ static mrb_bool
801
+ nosplat(node *t)
802
+ {
803
+ while (t) {
804
+ if (nint(t->car->car) == NODE_SPLAT) return FALSE;
805
+ t = t->cdr;
806
+ }
807
+ return TRUE;
808
+ }
809
+
810
+ static mrb_sym
811
+ attrsym(codegen_scope *s, mrb_sym a)
812
+ {
813
+ const char *name;
814
+ mrb_int len;
815
+ char *name2;
816
+
817
+ name = mrb_sym2name_len(s->mrb, a, &len);
818
+ name2 = (char *)codegen_palloc(s,
819
+ (size_t)len
820
+ + 1 /* '=' */
821
+ + 1 /* '\0' */
822
+ );
823
+ mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
824
+ memcpy(name2, name, (size_t)len);
825
+ name2[len] = '=';
826
+ name2[len+1] = '\0';
827
+
828
+ return mrb_intern(s->mrb, name2, len+1);
829
+ }
830
+
831
+ #define CALL_MAXARGS 127
832
+
833
+ static int
834
+ gen_values(codegen_scope *s, node *t, int val, int extra)
835
+ {
836
+ int n = 0;
837
+ int is_splat;
838
+
839
+ while (t) {
840
+ is_splat = nint(t->car->car) == NODE_SPLAT; /* splat mode */
841
+ if (
842
+ n+extra >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */
843
+ || is_splat) {
844
+ if (val) {
845
+ if (is_splat && n == 0 && nint(t->car->cdr->car) == NODE_ARRAY) {
846
+ codegen(s, t->car->cdr, VAL);
847
+ pop();
848
+ }
849
+ else {
850
+ pop_n(n);
851
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
852
+ push();
853
+ codegen(s, t->car, VAL);
854
+ pop(); pop();
855
+ if (is_splat) {
856
+ genop_peep(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1), NOVAL);
857
+ }
858
+ else {
859
+ genop_peep(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1), NOVAL);
860
+ }
861
+ }
862
+ t = t->cdr;
863
+ while (t) {
864
+ push();
865
+ codegen(s, t->car, VAL);
866
+ pop(); pop();
867
+ if (nint(t->car->car) == NODE_SPLAT) {
868
+ genop_peep(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1), NOVAL);
869
+ }
870
+ else {
871
+ genop_peep(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1), NOVAL);
872
+ }
873
+ t = t->cdr;
874
+ }
875
+ }
876
+ else {
877
+ while (t) {
878
+ codegen(s, t->car, NOVAL);
879
+ t = t->cdr;
880
+ }
881
+ }
882
+ return -1;
883
+ }
884
+ /* normal (no splat) mode */
885
+ codegen(s, t->car, val);
886
+ n++;
887
+ t = t->cdr;
888
+ }
889
+ return n;
890
+ }
891
+
892
+ static void
893
+ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
894
+ {
895
+ mrb_sym sym = name ? name : nsym(tree->cdr->car);
896
+ int idx, skip = 0;
897
+ int n = 0, noop = 0, sendv = 0, blk = 0;
898
+
899
+ codegen(s, tree->car, VAL); /* receiver */
900
+ if (safe) {
901
+ int recv = cursp()-1;
902
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
903
+ push();
904
+ genop(s, MKOP_AB(OP_MOVE, cursp(), recv));
905
+ push_n(2); pop_n(2); /* space for one arg and a block */
906
+ pop();
907
+ idx = new_msym(s, mrb_intern_lit(s->mrb, "=="));
908
+ genop(s, MKOP_ABC(OP_EQ, cursp(), idx, 1));
909
+ skip = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));
910
+ }
911
+ idx = new_msym(s, sym);
912
+ tree = tree->cdr->cdr->car;
913
+ if (tree) {
914
+ n = gen_values(s, tree->car, VAL, sp?1:0);
915
+ if (n < 0) {
916
+ n = noop = sendv = 1;
917
+ push();
918
+ }
919
+ }
920
+ if (sp) {
921
+ if (sendv) {
922
+ pop();
923
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), sp));
924
+ push();
925
+ }
926
+ else {
927
+ genop(s, MKOP_AB(OP_MOVE, cursp(), sp));
928
+ push();
929
+ n++;
930
+ }
931
+ }
932
+ if (tree && tree->cdr) {
933
+ noop = 1;
934
+ codegen(s, tree->cdr, VAL);
935
+ pop();
936
+ }
937
+ else {
938
+ blk = cursp();
939
+ }
940
+ push();pop();
941
+ pop_n(n+1);
942
+ {
943
+ mrb_int symlen;
944
+ const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen);
945
+
946
+ if (!noop && symlen == 1 && symname[0] == '+' && n == 1) {
947
+ genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val);
948
+ }
949
+ else if (!noop && symlen == 1 && symname[0] == '-' && n == 1) {
950
+ genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val);
951
+ }
952
+ else if (!noop && symlen == 1 && symname[0] == '*' && n == 1) {
953
+ genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n));
954
+ }
955
+ else if (!noop && symlen == 1 && symname[0] == '/' && n == 1) {
956
+ genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n));
957
+ }
958
+ else if (!noop && symlen == 1 && symname[0] == '<' && n == 1) {
959
+ genop(s, MKOP_ABC(OP_LT, cursp(), idx, n));
960
+ }
961
+ else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=' && n == 1) {
962
+ genop(s, MKOP_ABC(OP_LE, cursp(), idx, n));
963
+ }
964
+ else if (!noop && symlen == 1 && symname[0] == '>' && n == 1) {
965
+ genop(s, MKOP_ABC(OP_GT, cursp(), idx, n));
966
+ }
967
+ else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=' && n == 1) {
968
+ genop(s, MKOP_ABC(OP_GE, cursp(), idx, n));
969
+ }
970
+ else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=' && n == 1) {
971
+ genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n));
972
+ }
973
+ else {
974
+ if (sendv) n = CALL_MAXARGS;
975
+ if (blk > 0) { /* no block */
976
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n));
977
+ }
978
+ else {
979
+ genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, n));
980
+ }
981
+ }
982
+ }
983
+ if (safe) {
984
+ dispatch(s, skip);
985
+ }
986
+ if (val) {
987
+ push();
988
+ }
989
+ }
990
+
991
+ static void
992
+ gen_assignment(codegen_scope *s, node *tree, int sp, int val)
993
+ {
994
+ int idx;
995
+ int type = nint(tree->car);
996
+
997
+ tree = tree->cdr;
998
+ switch (type) {
999
+ case NODE_GVAR:
1000
+ idx = new_sym(s, nsym(tree));
1001
+ genop_peep(s, MKOP_ABx(OP_SETGLOBAL, sp, idx), val);
1002
+ break;
1003
+ case NODE_LVAR:
1004
+ idx = lv_idx(s, nsym(tree));
1005
+ if (idx > 0) {
1006
+ if (idx != sp) {
1007
+ genop_peep(s, MKOP_AB(OP_MOVE, idx, sp), val);
1008
+ }
1009
+ break;
1010
+ }
1011
+ else { /* upvar */
1012
+ int lv = 0;
1013
+ codegen_scope *up = s->prev;
1014
+
1015
+ while (up) {
1016
+ idx = lv_idx(up, nsym(tree));
1017
+ if (idx > 0) {
1018
+ genop_peep(s, MKOP_ABC(OP_SETUPVAR, sp, idx, lv), val);
1019
+ break;
1020
+ }
1021
+ lv++;
1022
+ up = up->prev;
1023
+ }
1024
+ }
1025
+ break;
1026
+ case NODE_IVAR:
1027
+ idx = new_sym(s, nsym(tree));
1028
+ genop_peep(s, MKOP_ABx(OP_SETIV, sp, idx), val);
1029
+ break;
1030
+ case NODE_CVAR:
1031
+ idx = new_sym(s, nsym(tree));
1032
+ genop_peep(s, MKOP_ABx(OP_SETCV, sp, idx), val);
1033
+ break;
1034
+ case NODE_CONST:
1035
+ idx = new_sym(s, nsym(tree));
1036
+ genop_peep(s, MKOP_ABx(OP_SETCONST, sp, idx), val);
1037
+ break;
1038
+ case NODE_COLON2:
1039
+ idx = new_sym(s, nsym(tree->cdr));
1040
+ genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), NOVAL);
1041
+ push();
1042
+ codegen(s, tree->car, VAL);
1043
+ pop_n(2);
1044
+ genop_peep(s, MKOP_ABx(OP_SETMCNST, cursp(), idx), val);
1045
+ break;
1046
+
1047
+ case NODE_CALL:
1048
+ case NODE_SCALL:
1049
+ push();
1050
+ gen_call(s, tree, attrsym(s, nsym(tree->cdr->car)), sp, NOVAL,
1051
+ type == NODE_SCALL);
1052
+ pop();
1053
+ if (val) {
1054
+ genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), val);
1055
+ }
1056
+ break;
1057
+
1058
+ case NODE_MASGN:
1059
+ gen_vmassignment(s, tree->car, sp, val);
1060
+ break;
1061
+
1062
+ /* splat without assignment */
1063
+ case NODE_NIL:
1064
+ break;
1065
+
1066
+ default:
1067
+ #ifndef MRB_DISABLE_STDIO
1068
+ fprintf(stderr, "unknown lhs %d\n", type);
1069
+ #endif
1070
+ break;
1071
+ }
1072
+ if (val) push();
1073
+ }
1074
+
1075
+ static void
1076
+ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
1077
+ {
1078
+ int n = 0, post = 0;
1079
+ node *t, *p;
1080
+
1081
+ if (tree->car) { /* pre */
1082
+ t = tree->car;
1083
+ n = 0;
1084
+ while (t) {
1085
+ genop(s, MKOP_ABC(OP_AREF, cursp(), rhs, n));
1086
+ gen_assignment(s, t->car, cursp(), NOVAL);
1087
+ n++;
1088
+ t = t->cdr;
1089
+ }
1090
+ }
1091
+ t = tree->cdr;
1092
+ if (t) {
1093
+ if (t->cdr) { /* post count */
1094
+ p = t->cdr->car;
1095
+ while (p) {
1096
+ post++;
1097
+ p = p->cdr;
1098
+ }
1099
+ }
1100
+ if (val) {
1101
+ genop(s, MKOP_AB(OP_MOVE, cursp(), rhs));
1102
+ }
1103
+ else {
1104
+ pop();
1105
+ }
1106
+ push_n(post);
1107
+ pop_n(post);
1108
+ genop(s, MKOP_ABC(OP_APOST, cursp(), n, post));
1109
+ n = 1;
1110
+ if (t->car) { /* rest */
1111
+ gen_assignment(s, t->car, cursp(), NOVAL);
1112
+ }
1113
+ if (t->cdr && t->cdr->car) {
1114
+ t = t->cdr->car;
1115
+ while (t) {
1116
+ gen_assignment(s, t->car, cursp()+n, NOVAL);
1117
+ t = t->cdr;
1118
+ n++;
1119
+ }
1120
+ }
1121
+ if (!val) {
1122
+ push();
1123
+ }
1124
+ }
1125
+ }
1126
+
1127
+ static void
1128
+ gen_send_intern(codegen_scope *s)
1129
+ {
1130
+ push();pop(); /* space for a block */
1131
+ pop();
1132
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0));
1133
+ push();
1134
+ }
1135
+ static void
1136
+ gen_literal_array(codegen_scope *s, node *tree, mrb_bool sym, int val)
1137
+ {
1138
+ if (val) {
1139
+ int i = 0, j = 0;
1140
+
1141
+ while (tree) {
1142
+ switch (nint(tree->car->car)) {
1143
+ case NODE_STR:
1144
+ if ((tree->cdr == NULL) && (nint(tree->car->cdr->cdr) == 0))
1145
+ break;
1146
+ /* fall through */
1147
+ case NODE_BEGIN:
1148
+ codegen(s, tree->car, VAL);
1149
+ ++j;
1150
+ break;
1151
+
1152
+ case NODE_LITERAL_DELIM:
1153
+ if (j > 0) {
1154
+ j = 0;
1155
+ ++i;
1156
+ if (sym)
1157
+ gen_send_intern(s);
1158
+ }
1159
+ break;
1160
+ }
1161
+ if (j >= 2) {
1162
+ pop(); pop();
1163
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
1164
+ push();
1165
+ j = 1;
1166
+ }
1167
+ tree = tree->cdr;
1168
+ }
1169
+ if (j > 0) {
1170
+ ++i;
1171
+ if (sym)
1172
+ gen_send_intern(s);
1173
+ }
1174
+ pop_n(i);
1175
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), i));
1176
+ push();
1177
+ }
1178
+ else {
1179
+ while (tree) {
1180
+ switch (nint(tree->car->car)) {
1181
+ case NODE_BEGIN: case NODE_BLOCK:
1182
+ codegen(s, tree->car, NOVAL);
1183
+ }
1184
+ tree = tree->cdr;
1185
+ }
1186
+ }
1187
+ }
1188
+
1189
+ static void
1190
+ raise_error(codegen_scope *s, const char *msg)
1191
+ {
1192
+ int idx = new_lit(s, mrb_str_new_cstr(s->mrb, msg));
1193
+
1194
+ genop(s, MKOP_ABx(OP_ERR, 1, idx));
1195
+ }
1196
+
1197
+ #ifndef MRB_WITHOUT_FLOAT
1198
+ static double
1199
+ readint_float(codegen_scope *s, const char *p, int base)
1200
+ {
1201
+ const char *e = p + strlen(p);
1202
+ double f = 0;
1203
+ int n;
1204
+
1205
+ if (*p == '+') p++;
1206
+ while (p < e) {
1207
+ char c = *p;
1208
+ c = tolower((unsigned char)c);
1209
+ for (n=0; n<base; n++) {
1210
+ if (mrb_digitmap[n] == c) {
1211
+ f *= base;
1212
+ f += n;
1213
+ break;
1214
+ }
1215
+ }
1216
+ if (n == base) {
1217
+ codegen_error(s, "malformed readint input");
1218
+ }
1219
+ p++;
1220
+ }
1221
+ return f;
1222
+ }
1223
+ #endif
1224
+
1225
+ static mrb_int
1226
+ readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_bool *overflow)
1227
+ {
1228
+ const char *e = p + strlen(p);
1229
+ mrb_int result = 0;
1230
+ int n;
1231
+
1232
+ mrb_assert(base >= 2 && base <= 36);
1233
+ if (*p == '+') p++;
1234
+ while (p < e) {
1235
+ char c = *p;
1236
+ c = tolower((unsigned char)c);
1237
+ for (n=0; n<base; n++) {
1238
+ if (mrb_digitmap[n] == c) {
1239
+ break;
1240
+ }
1241
+ }
1242
+ if (n == base) {
1243
+ codegen_error(s, "malformed readint input");
1244
+ }
1245
+
1246
+ if (neg) {
1247
+ if ((MRB_INT_MIN + n)/base > result) {
1248
+ *overflow = TRUE;
1249
+ return 0;
1250
+ }
1251
+ result *= base;
1252
+ result -= n;
1253
+ }
1254
+ else {
1255
+ if ((MRB_INT_MAX - n)/base < result) {
1256
+ *overflow = TRUE;
1257
+ return 0;
1258
+ }
1259
+ result *= base;
1260
+ result += n;
1261
+ }
1262
+ p++;
1263
+ }
1264
+ *overflow = FALSE;
1265
+ return result;
1266
+ }
1267
+
1268
+ static void
1269
+ gen_retval(codegen_scope *s, node *tree)
1270
+ {
1271
+ if (nint(tree->car) == NODE_SPLAT) {
1272
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), 0));
1273
+ push();
1274
+ codegen(s, tree, VAL);
1275
+ pop(); pop();
1276
+ genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
1277
+ }
1278
+ else {
1279
+ codegen(s, tree, VAL);
1280
+ pop();
1281
+ }
1282
+ }
1283
+
1284
+ static void
1285
+ codegen(codegen_scope *s, node *tree, int val)
1286
+ {
1287
+ int nt;
1288
+ int rlev = s->rlev;
1289
+
1290
+ if (!tree) {
1291
+ if (val) {
1292
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
1293
+ push();
1294
+ }
1295
+ return;
1296
+ }
1297
+
1298
+ s->rlev++;
1299
+ if (s->rlev > MRB_CODEGEN_LEVEL_MAX) {
1300
+ codegen_error(s, "too complex expression");
1301
+ }
1302
+ if (s->irep && s->filename_index != tree->filename_index) {
1303
+ s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
1304
+ mrb_debug_info_append_file(s->mrb, s->irep, s->debug_start_pos, s->pc);
1305
+ s->debug_start_pos = s->pc;
1306
+ s->filename_index = tree->filename_index;
1307
+ s->filename = mrb_parser_get_filename(s->parser, tree->filename_index);
1308
+ }
1309
+
1310
+ nt = nint(tree->car);
1311
+ s->lineno = tree->lineno;
1312
+ tree = tree->cdr;
1313
+ switch (nt) {
1314
+ case NODE_BEGIN:
1315
+ if (val && !tree) {
1316
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
1317
+ push();
1318
+ }
1319
+ while (tree) {
1320
+ codegen(s, tree->car, tree->cdr ? NOVAL : val);
1321
+ tree = tree->cdr;
1322
+ }
1323
+ break;
1324
+
1325
+ case NODE_RESCUE:
1326
+ {
1327
+ int onerr, noexc, exend, pos1, pos2, tmp;
1328
+ struct loopinfo *lp;
1329
+
1330
+ if (tree->car == NULL) goto exit;
1331
+ onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
1332
+ lp = loop_push(s, LOOP_BEGIN);
1333
+ lp->pc1 = onerr;
1334
+ codegen(s, tree->car, VAL);
1335
+ pop();
1336
+ lp->type = LOOP_RESCUE;
1337
+ noexc = genop(s, MKOP_Bx(OP_JMP, 0));
1338
+ dispatch(s, onerr);
1339
+ tree = tree->cdr;
1340
+ exend = 0;
1341
+ pos1 = 0;
1342
+ if (tree->car) {
1343
+ node *n2 = tree->car;
1344
+ int exc = cursp();
1345
+
1346
+ genop(s, MKOP_ABC(OP_RESCUE, exc, 0, 0));
1347
+ push();
1348
+ while (n2) {
1349
+ node *n3 = n2->car;
1350
+ node *n4 = n3->car;
1351
+
1352
+ if (pos1) dispatch(s, pos1);
1353
+ pos2 = 0;
1354
+ do {
1355
+ if (n4 && n4->car && nint(n4->car->car) == NODE_SPLAT) {
1356
+ codegen(s, n4->car, VAL);
1357
+ genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
1358
+ push_n(2); pop_n(2); /* space for one arg and a block */
1359
+ pop();
1360
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
1361
+ }
1362
+ else {
1363
+ if (n4) {
1364
+ codegen(s, n4->car, VAL);
1365
+ }
1366
+ else {
1367
+ genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
1368
+ push();
1369
+ }
1370
+ pop();
1371
+ genop(s, MKOP_ABC(OP_RESCUE, exc, cursp(), 1));
1372
+ }
1373
+ distcheck(s, pos2);
1374
+ tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
1375
+ pos2 = tmp;
1376
+ if (n4) {
1377
+ n4 = n4->cdr;
1378
+ }
1379
+ } while (n4);
1380
+ pos1 = genop(s, MKOP_sBx(OP_JMP, 0));
1381
+ dispatch_linked(s, pos2);
1382
+
1383
+ pop();
1384
+ if (n3->cdr->car) {
1385
+ gen_assignment(s, n3->cdr->car, exc, NOVAL);
1386
+ }
1387
+ if (n3->cdr->cdr->car) {
1388
+ codegen(s, n3->cdr->cdr->car, val);
1389
+ if (val) pop();
1390
+ }
1391
+ distcheck(s, exend);
1392
+ tmp = genop(s, MKOP_sBx(OP_JMP, exend));
1393
+ exend = tmp;
1394
+ n2 = n2->cdr;
1395
+ push();
1396
+ }
1397
+ if (pos1) {
1398
+ dispatch(s, pos1);
1399
+ genop(s, MKOP_A(OP_RAISE, exc));
1400
+ }
1401
+ }
1402
+ pop();
1403
+ tree = tree->cdr;
1404
+ dispatch(s, noexc);
1405
+ genop(s, MKOP_A(OP_POPERR, 1));
1406
+ if (tree->car) {
1407
+ codegen(s, tree->car, val);
1408
+ }
1409
+ else if (val) {
1410
+ push();
1411
+ }
1412
+ dispatch_linked(s, exend);
1413
+ loop_pop(s, NOVAL);
1414
+ }
1415
+ break;
1416
+
1417
+ case NODE_ENSURE:
1418
+ if (!tree->cdr || !tree->cdr->cdr ||
1419
+ (nint(tree->cdr->cdr->car) == NODE_BEGIN &&
1420
+ tree->cdr->cdr->cdr)) {
1421
+ int idx;
1422
+ int epush = s->pc;
1423
+
1424
+ genop(s, MKOP_Bx(OP_EPUSH, 0));
1425
+ s->ensure_level++;
1426
+ codegen(s, tree->car, val);
1427
+ idx = scope_body(s, tree->cdr, NOVAL);
1428
+ s->iseq[epush] = MKOP_Bx(OP_EPUSH, idx);
1429
+ s->ensure_level--;
1430
+ genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL);
1431
+ }
1432
+ else { /* empty ensure ignored */
1433
+ codegen(s, tree->car, val);
1434
+ }
1435
+ break;
1436
+
1437
+ case NODE_LAMBDA:
1438
+ if (val) {
1439
+ int idx = lambda_body(s, tree, 1);
1440
+
1441
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_LAMBDA));
1442
+ push();
1443
+ }
1444
+ break;
1445
+
1446
+ case NODE_BLOCK:
1447
+ if (val) {
1448
+ int idx = lambda_body(s, tree, 1);
1449
+
1450
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_BLOCK));
1451
+ push();
1452
+ }
1453
+ break;
1454
+
1455
+ case NODE_IF:
1456
+ {
1457
+ int pos1, pos2;
1458
+ node *e = tree->cdr->cdr->car;
1459
+
1460
+ if (!tree->car) {
1461
+ codegen(s, e, val);
1462
+ goto exit;
1463
+ }
1464
+ switch (nint(tree->car->car)) {
1465
+ case NODE_TRUE:
1466
+ case NODE_INT:
1467
+ case NODE_STR:
1468
+ codegen(s, tree->cdr->car, val);
1469
+ goto exit;
1470
+ case NODE_FALSE:
1471
+ case NODE_NIL:
1472
+ codegen(s, e, val);
1473
+ goto exit;
1474
+ }
1475
+ codegen(s, tree->car, VAL);
1476
+ pop();
1477
+ pos1 = genop_peep(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0), NOVAL);
1478
+
1479
+ codegen(s, tree->cdr->car, val);
1480
+ if (e) {
1481
+ if (val) pop();
1482
+ pos2 = genop(s, MKOP_sBx(OP_JMP, 0));
1483
+ dispatch(s, pos1);
1484
+ codegen(s, e, val);
1485
+ dispatch(s, pos2);
1486
+ }
1487
+ else {
1488
+ if (val) {
1489
+ pop();
1490
+ pos2 = genop(s, MKOP_sBx(OP_JMP, 0));
1491
+ dispatch(s, pos1);
1492
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
1493
+ dispatch(s, pos2);
1494
+ push();
1495
+ }
1496
+ else {
1497
+ dispatch(s, pos1);
1498
+ }
1499
+ }
1500
+ }
1501
+ break;
1502
+
1503
+ case NODE_AND:
1504
+ {
1505
+ int pos;
1506
+
1507
+ codegen(s, tree->car, VAL);
1508
+ pop();
1509
+ pos = genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0));
1510
+ codegen(s, tree->cdr, val);
1511
+ dispatch(s, pos);
1512
+ }
1513
+ break;
1514
+
1515
+ case NODE_OR:
1516
+ {
1517
+ int pos;
1518
+
1519
+ codegen(s, tree->car, VAL);
1520
+ pop();
1521
+ pos = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));
1522
+ codegen(s, tree->cdr, val);
1523
+ dispatch(s, pos);
1524
+ }
1525
+ break;
1526
+
1527
+ case NODE_WHILE:
1528
+ {
1529
+ struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
1530
+
1531
+ lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0));
1532
+ lp->pc2 = new_label(s);
1533
+ codegen(s, tree->cdr, NOVAL);
1534
+ dispatch(s, lp->pc1);
1535
+ codegen(s, tree->car, VAL);
1536
+ pop();
1537
+ distcheck(s, lp->pc2 - s->pc);
1538
+ genop(s, MKOP_AsBx(OP_JMPIF, cursp(), lp->pc2 - s->pc));
1539
+
1540
+ loop_pop(s, val);
1541
+ }
1542
+ break;
1543
+
1544
+ case NODE_UNTIL:
1545
+ {
1546
+ struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
1547
+
1548
+ lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0));
1549
+ lp->pc2 = new_label(s);
1550
+ codegen(s, tree->cdr, NOVAL);
1551
+ dispatch(s, lp->pc1);
1552
+ codegen(s, tree->car, VAL);
1553
+ pop();
1554
+ distcheck(s, lp->pc2 - s->pc);
1555
+ genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), lp->pc2 - s->pc));
1556
+
1557
+ loop_pop(s, val);
1558
+ }
1559
+ break;
1560
+
1561
+ case NODE_FOR:
1562
+ for_body(s, tree);
1563
+ if (val) push();
1564
+ break;
1565
+
1566
+ case NODE_CASE:
1567
+ {
1568
+ int head = 0;
1569
+ int pos1, pos2, pos3, tmp;
1570
+ node *n;
1571
+
1572
+ pos3 = 0;
1573
+ if (tree->car) {
1574
+ head = cursp();
1575
+ codegen(s, tree->car, VAL);
1576
+ }
1577
+ tree = tree->cdr;
1578
+ while (tree) {
1579
+ n = tree->car->car;
1580
+ pos1 = pos2 = 0;
1581
+ while (n) {
1582
+ codegen(s, n->car, VAL);
1583
+ if (head) {
1584
+ genop(s, MKOP_AB(OP_MOVE, cursp(), head));
1585
+ push_n(2); pop_n(2); /* space for one arg and a block */
1586
+ pop();
1587
+ if (nint(n->car->car) == NODE_SPLAT) {
1588
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
1589
+ }
1590
+ else {
1591
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
1592
+ }
1593
+ }
1594
+ else {
1595
+ pop();
1596
+ }
1597
+ distcheck(s, pos2);
1598
+ tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
1599
+ pos2 = tmp;
1600
+ n = n->cdr;
1601
+ }
1602
+ if (tree->car->car) {
1603
+ pos1 = genop(s, MKOP_sBx(OP_JMP, 0));
1604
+ dispatch_linked(s, pos2);
1605
+ }
1606
+ codegen(s, tree->car->cdr, val);
1607
+ if (val) pop();
1608
+ distcheck(s, pos3);
1609
+ tmp = genop(s, MKOP_sBx(OP_JMP, pos3));
1610
+ pos3 = tmp;
1611
+ if (pos1) dispatch(s, pos1);
1612
+ tree = tree->cdr;
1613
+ }
1614
+ if (val) {
1615
+ int pos = cursp();
1616
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
1617
+ if (pos3) dispatch_linked(s, pos3);
1618
+ if (head) pop();
1619
+ if (cursp() != pos) {
1620
+ genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
1621
+ }
1622
+ push();
1623
+ }
1624
+ else {
1625
+ if (pos3) {
1626
+ dispatch_linked(s, pos3);
1627
+ }
1628
+ if (head) {
1629
+ pop();
1630
+ }
1631
+ }
1632
+ }
1633
+ break;
1634
+
1635
+ case NODE_SCOPE:
1636
+ scope_body(s, tree, NOVAL);
1637
+ break;
1638
+
1639
+ case NODE_FCALL:
1640
+ case NODE_CALL:
1641
+ gen_call(s, tree, 0, 0, val, 0);
1642
+ break;
1643
+ case NODE_SCALL:
1644
+ gen_call(s, tree, 0, 0, val, 1);
1645
+ break;
1646
+
1647
+ case NODE_DOT2:
1648
+ codegen(s, tree->car, val);
1649
+ codegen(s, tree->cdr, val);
1650
+ if (val) {
1651
+ pop(); pop();
1652
+ genop(s, MKOP_ABC(OP_RANGE, cursp(), cursp(), FALSE));
1653
+ push();
1654
+ }
1655
+ break;
1656
+
1657
+ case NODE_DOT3:
1658
+ codegen(s, tree->car, val);
1659
+ codegen(s, tree->cdr, val);
1660
+ if (val) {
1661
+ pop(); pop();
1662
+ genop(s, MKOP_ABC(OP_RANGE, cursp(), cursp(), TRUE));
1663
+ push();
1664
+ }
1665
+ break;
1666
+
1667
+ case NODE_COLON2:
1668
+ {
1669
+ int sym = new_sym(s, nsym(tree->cdr));
1670
+
1671
+ codegen(s, tree->car, VAL);
1672
+ pop();
1673
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
1674
+ if (val) push();
1675
+ }
1676
+ break;
1677
+
1678
+ case NODE_COLON3:
1679
+ {
1680
+ int sym = new_sym(s, nsym(tree));
1681
+
1682
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
1683
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
1684
+ if (val) push();
1685
+ }
1686
+ break;
1687
+
1688
+ case NODE_ARRAY:
1689
+ {
1690
+ int n;
1691
+
1692
+ n = gen_values(s, tree, val, 0);
1693
+ if (n >= 0) {
1694
+ if (val) {
1695
+ pop_n(n);
1696
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
1697
+ push();
1698
+ }
1699
+ }
1700
+ else if (val) {
1701
+ push();
1702
+ }
1703
+ }
1704
+ break;
1705
+
1706
+ case NODE_HASH:
1707
+ {
1708
+ int len = 0;
1709
+ mrb_bool update = FALSE;
1710
+
1711
+ while (tree) {
1712
+ codegen(s, tree->car->car, val);
1713
+ codegen(s, tree->car->cdr, val);
1714
+ len++;
1715
+ tree = tree->cdr;
1716
+ if (val && len == 126) {
1717
+ pop_n(len*2);
1718
+ genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len));
1719
+ if (update) {
1720
+ pop();
1721
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1));
1722
+ }
1723
+ push();
1724
+ update = TRUE;
1725
+ len = 0;
1726
+ }
1727
+ }
1728
+ if (val) {
1729
+ pop_n(len*2);
1730
+ genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len));
1731
+ if (update) {
1732
+ pop();
1733
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1));
1734
+ }
1735
+ push();
1736
+ }
1737
+ }
1738
+ break;
1739
+
1740
+ case NODE_SPLAT:
1741
+ codegen(s, tree, val);
1742
+ break;
1743
+
1744
+ case NODE_ASGN:
1745
+ codegen(s, tree->cdr, VAL);
1746
+ pop();
1747
+ gen_assignment(s, tree->car, cursp(), val);
1748
+ break;
1749
+
1750
+ case NODE_MASGN:
1751
+ {
1752
+ int len = 0, n = 0, post = 0;
1753
+ node *t = tree->cdr, *p;
1754
+ int rhs = cursp();
1755
+
1756
+ if (nint(t->car) == NODE_ARRAY && t->cdr && nosplat(t->cdr)) {
1757
+ /* fixed rhs */
1758
+ t = t->cdr;
1759
+ while (t) {
1760
+ codegen(s, t->car, VAL);
1761
+ len++;
1762
+ t = t->cdr;
1763
+ }
1764
+ tree = tree->car;
1765
+ if (tree->car) { /* pre */
1766
+ t = tree->car;
1767
+ n = 0;
1768
+ while (t) {
1769
+ if (n < len) {
1770
+ gen_assignment(s, t->car, rhs+n, NOVAL);
1771
+ n++;
1772
+ }
1773
+ else {
1774
+ genop(s, MKOP_A(OP_LOADNIL, rhs+n));
1775
+ gen_assignment(s, t->car, rhs+n, NOVAL);
1776
+ }
1777
+ t = t->cdr;
1778
+ }
1779
+ }
1780
+ t = tree->cdr;
1781
+ if (t) {
1782
+ if (t->cdr) { /* post count */
1783
+ p = t->cdr->car;
1784
+ while (p) {
1785
+ post++;
1786
+ p = p->cdr;
1787
+ }
1788
+ }
1789
+ if (t->car) { /* rest (len - pre - post) */
1790
+ int rn;
1791
+
1792
+ if (len < post + n) {
1793
+ rn = 0;
1794
+ }
1795
+ else {
1796
+ rn = len - post - n;
1797
+ }
1798
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), rhs+n, rn));
1799
+ gen_assignment(s, t->car, cursp(), NOVAL);
1800
+ n += rn;
1801
+ }
1802
+ if (t->cdr && t->cdr->car) {
1803
+ t = t->cdr->car;
1804
+ while (n<len) {
1805
+ gen_assignment(s, t->car, rhs+n, NOVAL);
1806
+ t = t->cdr;
1807
+ n++;
1808
+ }
1809
+ }
1810
+ }
1811
+ pop_n(len);
1812
+ if (val) {
1813
+ genop(s, MKOP_ABC(OP_ARRAY, rhs, rhs, len));
1814
+ push();
1815
+ }
1816
+ }
1817
+ else {
1818
+ /* variable rhs */
1819
+ codegen(s, t, VAL);
1820
+ gen_vmassignment(s, tree->car, rhs, val);
1821
+ if (!val) {
1822
+ pop();
1823
+ }
1824
+ }
1825
+ }
1826
+ break;
1827
+
1828
+ case NODE_OP_ASGN:
1829
+ {
1830
+ mrb_sym sym = nsym(tree->cdr->car);
1831
+ mrb_int len;
1832
+ const char *name = mrb_sym2name_len(s->mrb, sym, &len);
1833
+ int idx, callargs = -1, vsp = -1;
1834
+
1835
+ if ((len == 2 && name[0] == '|' && name[1] == '|') &&
1836
+ (nint(tree->car->car) == NODE_CONST ||
1837
+ nint(tree->car->car) == NODE_CVAR)) {
1838
+ int onerr, noexc, exc;
1839
+ struct loopinfo *lp;
1840
+
1841
+ onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
1842
+ lp = loop_push(s, LOOP_BEGIN);
1843
+ lp->pc1 = onerr;
1844
+ exc = cursp();
1845
+ codegen(s, tree->car, VAL);
1846
+ lp->type = LOOP_RESCUE;
1847
+ genop(s, MKOP_A(OP_POPERR, 1));
1848
+ noexc = genop(s, MKOP_Bx(OP_JMP, 0));
1849
+ dispatch(s, onerr);
1850
+ genop(s, MKOP_ABC(OP_RESCUE, exc, 0, 0));
1851
+ genop(s, MKOP_A(OP_LOADF, exc));
1852
+ dispatch(s, noexc);
1853
+ loop_pop(s, NOVAL);
1854
+ }
1855
+ else if (nint(tree->car->car) == NODE_CALL) {
1856
+ node *n = tree->car->cdr;
1857
+ int base, i, nargs = 0;
1858
+ callargs = 0;
1859
+
1860
+ if (val) {
1861
+ vsp = cursp();
1862
+ push();
1863
+ }
1864
+ codegen(s, n->car, VAL); /* receiver */
1865
+ idx = new_msym(s, nsym(n->cdr->car));
1866
+ base = cursp()-1;
1867
+ if (n->cdr->cdr->car) {
1868
+ nargs = gen_values(s, n->cdr->cdr->car->car, VAL, 1);
1869
+ if (nargs >= 0) {
1870
+ callargs = nargs;
1871
+ }
1872
+ else { /* varargs */
1873
+ push();
1874
+ nargs = 1;
1875
+ callargs = CALL_MAXARGS;
1876
+ }
1877
+ }
1878
+ /* copy receiver and arguments */
1879
+ genop(s, MKOP_AB(OP_MOVE, cursp(), base));
1880
+ for (i=0; i<nargs; i++) {
1881
+ genop(s, MKOP_AB(OP_MOVE, cursp()+i+1, base+i+1));
1882
+ }
1883
+ push_n(nargs+2);pop_n(nargs+2); /* space for receiver, arguments and a block */
1884
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
1885
+ push();
1886
+ }
1887
+ else {
1888
+ codegen(s, tree->car, VAL);
1889
+ }
1890
+ if (len == 2 &&
1891
+ ((name[0] == '|' && name[1] == '|') ||
1892
+ (name[0] == '&' && name[1] == '&'))) {
1893
+ int pos;
1894
+
1895
+ pop();
1896
+ if (val) {
1897
+ if (vsp >= 0) {
1898
+ genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
1899
+ }
1900
+ pos = genop(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0));
1901
+ }
1902
+ else {
1903
+ pos = genop_peep(s, MKOP_AsBx(name[0]=='|'?OP_JMPIF:OP_JMPNOT, cursp(), 0), NOVAL);
1904
+ }
1905
+ codegen(s, tree->cdr->cdr->car, VAL);
1906
+ pop();
1907
+ if (val && vsp >= 0) {
1908
+ genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
1909
+ }
1910
+ if (nint(tree->car->car) == NODE_CALL) {
1911
+ if (callargs == CALL_MAXARGS) {
1912
+ pop();
1913
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
1914
+ }
1915
+ else {
1916
+ pop_n(callargs);
1917
+ callargs++;
1918
+ }
1919
+ pop();
1920
+ idx = new_msym(s, attrsym(s, nsym(tree->car->cdr->cdr->car)));
1921
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
1922
+ }
1923
+ else {
1924
+ gen_assignment(s, tree->car, cursp(), val);
1925
+ }
1926
+ dispatch(s, pos);
1927
+ goto exit;
1928
+ }
1929
+ codegen(s, tree->cdr->cdr->car, VAL);
1930
+ push(); pop();
1931
+ pop(); pop();
1932
+
1933
+ idx = new_msym(s, sym);
1934
+ if (len == 1 && name[0] == '+') {
1935
+ genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, 1), val);
1936
+ }
1937
+ else if (len == 1 && name[0] == '-') {
1938
+ genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, 1), val);
1939
+ }
1940
+ else if (len == 1 && name[0] == '*') {
1941
+ genop(s, MKOP_ABC(OP_MUL, cursp(), idx, 1));
1942
+ }
1943
+ else if (len == 1 && name[0] == '/') {
1944
+ genop(s, MKOP_ABC(OP_DIV, cursp(), idx, 1));
1945
+ }
1946
+ else if (len == 1 && name[0] == '<') {
1947
+ genop(s, MKOP_ABC(OP_LT, cursp(), idx, 1));
1948
+ }
1949
+ else if (len == 2 && name[0] == '<' && name[1] == '=') {
1950
+ genop(s, MKOP_ABC(OP_LE, cursp(), idx, 1));
1951
+ }
1952
+ else if (len == 1 && name[0] == '>') {
1953
+ genop(s, MKOP_ABC(OP_GT, cursp(), idx, 1));
1954
+ }
1955
+ else if (len == 2 && name[0] == '>' && name[1] == '=') {
1956
+ genop(s, MKOP_ABC(OP_GE, cursp(), idx, 1));
1957
+ }
1958
+ else {
1959
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
1960
+ }
1961
+ if (callargs < 0) {
1962
+ gen_assignment(s, tree->car, cursp(), val);
1963
+ }
1964
+ else {
1965
+ if (val && vsp >= 0) {
1966
+ genop(s, MKOP_AB(OP_MOVE, vsp, cursp()));
1967
+ }
1968
+ if (callargs == CALL_MAXARGS) {
1969
+ pop();
1970
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
1971
+ }
1972
+ else {
1973
+ pop_n(callargs);
1974
+ callargs++;
1975
+ }
1976
+ pop();
1977
+ idx = new_msym(s, attrsym(s,nsym(tree->car->cdr->cdr->car)));
1978
+ genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
1979
+ }
1980
+ }
1981
+ break;
1982
+
1983
+ case NODE_SUPER:
1984
+ {
1985
+ codegen_scope *s2 = s;
1986
+ int lv = 0;
1987
+ int n = 0, noop = 0, sendv = 0;
1988
+
1989
+ push(); /* room for receiver */
1990
+ while (!s2->mscope) {
1991
+ lv++;
1992
+ s2 = s2->prev;
1993
+ if (!s2) break;
1994
+ }
1995
+ genop(s, MKOP_ABx(OP_ARGARY, cursp(), (lv & 0xf)));
1996
+ push(); push(); /* ARGARY pushes two values */
1997
+ pop(); pop();
1998
+ if (tree) {
1999
+ node *args = tree->car;
2000
+ if (args) {
2001
+ n = gen_values(s, args, VAL, 0);
2002
+ if (n < 0) {
2003
+ n = noop = sendv = 1;
2004
+ push();
2005
+ }
2006
+ }
2007
+ }
2008
+ if (tree && tree->cdr) {
2009
+ codegen(s, tree->cdr, VAL);
2010
+ pop();
2011
+ }
2012
+ else {
2013
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2014
+ push(); pop();
2015
+ }
2016
+ pop_n(n+1);
2017
+ if (sendv) n = CALL_MAXARGS;
2018
+ genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, n));
2019
+ if (val) push();
2020
+ }
2021
+ break;
2022
+
2023
+ case NODE_ZSUPER:
2024
+ {
2025
+ codegen_scope *s2 = s;
2026
+ int lv = 0, ainfo = 0;
2027
+
2028
+ push(); /* room for receiver */
2029
+ while (!s2->mscope) {
2030
+ lv++;
2031
+ s2 = s2->prev;
2032
+ if (!s2) break;
2033
+ }
2034
+ if (s2) ainfo = s2->ainfo;
2035
+ genop(s, MKOP_ABx(OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)));
2036
+ push(); push(); pop(); /* ARGARY pushes two values */
2037
+ if (tree && tree->cdr) {
2038
+ codegen(s, tree->cdr, VAL);
2039
+ pop();
2040
+ }
2041
+ pop(); pop();
2042
+ genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, CALL_MAXARGS));
2043
+ if (val) push();
2044
+ }
2045
+ break;
2046
+
2047
+ case NODE_RETURN:
2048
+ if (tree) {
2049
+ gen_retval(s, tree);
2050
+ }
2051
+ else {
2052
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2053
+ }
2054
+ if (s->loop) {
2055
+ genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_RETURN));
2056
+ }
2057
+ else {
2058
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
2059
+ }
2060
+ if (val) push();
2061
+ break;
2062
+
2063
+ case NODE_YIELD:
2064
+ {
2065
+ codegen_scope *s2 = s;
2066
+ int lv = 0, ainfo = 0;
2067
+ int n = 0, sendv = 0;
2068
+
2069
+ while (!s2->mscope) {
2070
+ lv++;
2071
+ s2 = s2->prev;
2072
+ if (!s2) break;
2073
+ }
2074
+ if (s2) ainfo = s2->ainfo;
2075
+ push();
2076
+ if (tree) {
2077
+ n = gen_values(s, tree, VAL, 0);
2078
+ if (n < 0) {
2079
+ n = sendv = 1;
2080
+ push();
2081
+ }
2082
+ }
2083
+ push();pop(); /* space for a block */
2084
+ pop_n(n+1);
2085
+ genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
2086
+ if (sendv) n = CALL_MAXARGS;
2087
+ genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));
2088
+ if (val) push();
2089
+ }
2090
+ break;
2091
+
2092
+ case NODE_BREAK:
2093
+ loop_break(s, tree);
2094
+ if (val) push();
2095
+ break;
2096
+
2097
+ case NODE_NEXT:
2098
+ if (!s->loop) {
2099
+ raise_error(s, "unexpected next");
2100
+ }
2101
+ else if (s->loop->type == LOOP_NORMAL) {
2102
+ if (s->ensure_level > s->loop->ensure_level) {
2103
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
2104
+ }
2105
+ codegen(s, tree, NOVAL);
2106
+ distcheck(s, s->loop->pc1 - s->pc);
2107
+ genop(s, MKOP_sBx(OP_JMP, s->loop->pc1 - s->pc));
2108
+ }
2109
+ else {
2110
+ if (tree) {
2111
+ codegen(s, tree, VAL);
2112
+ pop();
2113
+ }
2114
+ else {
2115
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2116
+ }
2117
+ genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
2118
+ }
2119
+ if (val) push();
2120
+ break;
2121
+
2122
+ case NODE_REDO:
2123
+ if (!s->loop || s->loop->type == LOOP_BEGIN || s->loop->type == LOOP_RESCUE) {
2124
+ raise_error(s, "unexpected redo");
2125
+ }
2126
+ else {
2127
+ if (s->ensure_level > s->loop->ensure_level) {
2128
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
2129
+ }
2130
+ distcheck(s, s->loop->pc2 - s->pc);
2131
+ genop(s, MKOP_sBx(OP_JMP, s->loop->pc2 - s->pc));
2132
+ }
2133
+ if (val) push();
2134
+ break;
2135
+
2136
+ case NODE_RETRY:
2137
+ {
2138
+ const char *msg = "unexpected retry";
2139
+
2140
+ if (!s->loop) {
2141
+ raise_error(s, msg);
2142
+ }
2143
+ else {
2144
+ struct loopinfo *lp = s->loop;
2145
+ int n = 0;
2146
+
2147
+ while (lp && lp->type != LOOP_RESCUE) {
2148
+ if (lp->type == LOOP_BEGIN) {
2149
+ n++;
2150
+ }
2151
+ lp = lp->prev;
2152
+ }
2153
+ if (!lp) {
2154
+ raise_error(s, msg);
2155
+ }
2156
+ else {
2157
+ if (n > 0) {
2158
+ genop_peep(s, MKOP_A(OP_POPERR, n), NOVAL);
2159
+ }
2160
+ if (s->ensure_level > lp->ensure_level) {
2161
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - lp->ensure_level), NOVAL);
2162
+ }
2163
+ distcheck(s, s->loop->pc1 - s->pc);
2164
+ genop(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc));
2165
+ }
2166
+ }
2167
+ if (val) push();
2168
+ }
2169
+ break;
2170
+
2171
+ case NODE_LVAR:
2172
+ if (val) {
2173
+ int idx = lv_idx(s, nsym(tree));
2174
+
2175
+ if (idx > 0) {
2176
+ genop_peep(s, MKOP_AB(OP_MOVE, cursp(), idx), NOVAL);
2177
+ }
2178
+ else {
2179
+ int lv = 0;
2180
+ codegen_scope *up = s->prev;
2181
+
2182
+ while (up) {
2183
+ idx = lv_idx(up, nsym(tree));
2184
+ if (idx > 0) {
2185
+ genop_peep(s, MKOP_ABC(OP_GETUPVAR, cursp(), idx, lv), VAL);
2186
+ break;
2187
+ }
2188
+ lv++;
2189
+ up = up->prev;
2190
+ }
2191
+ }
2192
+ push();
2193
+ }
2194
+ break;
2195
+
2196
+ case NODE_GVAR:
2197
+ if (val) {
2198
+ int sym = new_sym(s, nsym(tree));
2199
+
2200
+ genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
2201
+ push();
2202
+ }
2203
+ break;
2204
+
2205
+ case NODE_IVAR:
2206
+ if (val) {
2207
+ int sym = new_sym(s, nsym(tree));
2208
+
2209
+ genop(s, MKOP_ABx(OP_GETIV, cursp(), sym));
2210
+ push();
2211
+ }
2212
+ break;
2213
+
2214
+ case NODE_CVAR:
2215
+ if (val) {
2216
+ int sym = new_sym(s, nsym(tree));
2217
+
2218
+ genop(s, MKOP_ABx(OP_GETCV, cursp(), sym));
2219
+ push();
2220
+ }
2221
+ break;
2222
+
2223
+ case NODE_CONST:
2224
+ {
2225
+ int sym = new_sym(s, nsym(tree));
2226
+
2227
+ genop(s, MKOP_ABx(OP_GETCONST, cursp(), sym));
2228
+ if (val) {
2229
+ push();
2230
+ }
2231
+ }
2232
+ break;
2233
+
2234
+ case NODE_DEFINED:
2235
+ codegen(s, tree, VAL);
2236
+ break;
2237
+
2238
+ case NODE_BACK_REF:
2239
+ if (val) {
2240
+ char buf[3];
2241
+ int sym;
2242
+
2243
+ buf[0] = '$';
2244
+ buf[1] = nchar(tree);
2245
+ buf[2] = 0;
2246
+ sym = new_sym(s, mrb_intern_cstr(s->mrb, buf));
2247
+ genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
2248
+ push();
2249
+ }
2250
+ break;
2251
+
2252
+ case NODE_NTH_REF:
2253
+ if (val) {
2254
+ mrb_state *mrb = s->mrb;
2255
+ mrb_value str;
2256
+ int sym;
2257
+
2258
+ str = mrb_format(mrb, "$%S", mrb_fixnum_value(nint(tree)));
2259
+ sym = new_sym(s, mrb_intern_str(mrb, str));
2260
+ genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
2261
+ push();
2262
+ }
2263
+ break;
2264
+
2265
+ case NODE_ARG:
2266
+ /* should not happen */
2267
+ break;
2268
+
2269
+ case NODE_BLOCK_ARG:
2270
+ codegen(s, tree, VAL);
2271
+ break;
2272
+
2273
+ case NODE_INT:
2274
+ if (val) {
2275
+ char *p = (char*)tree->car;
2276
+ int base = nint(tree->cdr->car);
2277
+ mrb_int i;
2278
+ mrb_code co;
2279
+ mrb_bool overflow;
2280
+
2281
+ i = readint_mrb_int(s, p, base, FALSE, &overflow);
2282
+ #ifndef MRB_WITHOUT_FLOAT
2283
+ if (overflow) {
2284
+ double f = readint_float(s, p, base);
2285
+ int off = new_lit(s, mrb_float_value(s->mrb, f));
2286
+
2287
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
2288
+ }
2289
+ else
2290
+ #endif
2291
+ {
2292
+ if (i < MAXARG_sBx && i > -MAXARG_sBx) {
2293
+ co = MKOP_AsBx(OP_LOADI, cursp(), i);
2294
+ }
2295
+ else {
2296
+ int off = new_lit(s, mrb_fixnum_value(i));
2297
+ co = MKOP_ABx(OP_LOADL, cursp(), off);
2298
+ }
2299
+ genop(s, co);
2300
+ }
2301
+ push();
2302
+ }
2303
+ break;
2304
+
2305
+ #ifndef MRB_WITHOUT_FLOAT
2306
+ case NODE_FLOAT:
2307
+ if (val) {
2308
+ char *p = (char*)tree;
2309
+ mrb_float f = mrb_float_read(p, NULL);
2310
+ int off = new_lit(s, mrb_float_value(s->mrb, f));
2311
+
2312
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
2313
+ push();
2314
+ }
2315
+ break;
2316
+ #endif
2317
+
2318
+ case NODE_NEGATE:
2319
+ {
2320
+ nt = nint(tree->car);
2321
+ tree = tree->cdr;
2322
+ switch (nt) {
2323
+ #ifndef MRB_WITHOUT_FLOAT
2324
+ case NODE_FLOAT:
2325
+ if (val) {
2326
+ char *p = (char*)tree;
2327
+ mrb_float f = mrb_float_read(p, NULL);
2328
+ int off = new_lit(s, mrb_float_value(s->mrb, -f));
2329
+
2330
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
2331
+ push();
2332
+ }
2333
+ break;
2334
+ #endif
2335
+
2336
+ case NODE_INT:
2337
+ if (val) {
2338
+ char *p = (char*)tree->car;
2339
+ int base = nint(tree->cdr->car);
2340
+ mrb_int i;
2341
+ mrb_code co;
2342
+ mrb_bool overflow;
2343
+
2344
+ i = readint_mrb_int(s, p, base, TRUE, &overflow);
2345
+ #ifndef MRB_WITHOUT_FLOAT
2346
+ if (overflow) {
2347
+ double f = readint_float(s, p, base);
2348
+ int off = new_lit(s, mrb_float_value(s->mrb, -f));
2349
+
2350
+ genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
2351
+ }
2352
+ else {
2353
+ #endif
2354
+ if (i < MAXARG_sBx && i > -MAXARG_sBx) {
2355
+ co = MKOP_AsBx(OP_LOADI, cursp(), i);
2356
+ }
2357
+ else {
2358
+ int off = new_lit(s, mrb_fixnum_value(i));
2359
+ co = MKOP_ABx(OP_LOADL, cursp(), off);
2360
+ }
2361
+ genop(s, co);
2362
+ #ifndef MRB_WITHOUT_FLOAT
2363
+ }
2364
+ #endif
2365
+ push();
2366
+ }
2367
+ break;
2368
+
2369
+ default:
2370
+ if (val) {
2371
+ int sym = new_msym(s, mrb_intern_lit(s->mrb, "-"));
2372
+
2373
+ genop(s, MKOP_ABx(OP_LOADI, cursp(), 0));
2374
+ push();
2375
+ codegen(s, tree, VAL);
2376
+ pop(); pop();
2377
+ genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2));
2378
+ }
2379
+ else {
2380
+ codegen(s, tree, NOVAL);
2381
+ }
2382
+ break;
2383
+ }
2384
+ }
2385
+ break;
2386
+
2387
+ case NODE_STR:
2388
+ if (val) {
2389
+ char *p = (char*)tree->car;
2390
+ size_t len = (intptr_t)tree->cdr;
2391
+ int ai = mrb_gc_arena_save(s->mrb);
2392
+ int off = new_lit(s, mrb_str_new(s->mrb, p, len));
2393
+
2394
+ mrb_gc_arena_restore(s->mrb, ai);
2395
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2396
+ push();
2397
+ }
2398
+ break;
2399
+
2400
+ case NODE_HEREDOC:
2401
+ tree = ((struct mrb_parser_heredoc_info *)tree)->doc;
2402
+ /* fall through */
2403
+ case NODE_DSTR:
2404
+ if (val) {
2405
+ node *n = tree;
2406
+
2407
+ if (!n) {
2408
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2409
+ push();
2410
+ break;
2411
+ }
2412
+ codegen(s, n->car, VAL);
2413
+ n = n->cdr;
2414
+ while (n) {
2415
+ codegen(s, n->car, VAL);
2416
+ pop(); pop();
2417
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
2418
+ push();
2419
+ n = n->cdr;
2420
+ }
2421
+ }
2422
+ else {
2423
+ node *n = tree;
2424
+
2425
+ while (n) {
2426
+ if (nint(n->car->car) != NODE_STR) {
2427
+ codegen(s, n->car, NOVAL);
2428
+ }
2429
+ n = n->cdr;
2430
+ }
2431
+ }
2432
+ break;
2433
+
2434
+ case NODE_WORDS:
2435
+ gen_literal_array(s, tree, FALSE, val);
2436
+ break;
2437
+
2438
+ case NODE_SYMBOLS:
2439
+ gen_literal_array(s, tree, TRUE, val);
2440
+ break;
2441
+
2442
+ case NODE_DXSTR:
2443
+ {
2444
+ node *n;
2445
+ int ai = mrb_gc_arena_save(s->mrb);
2446
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
2447
+
2448
+ genop(s, MKOP_A(OP_LOADSELF, cursp()));
2449
+ push();
2450
+ codegen(s, tree->car, VAL);
2451
+ n = tree->cdr;
2452
+ while (n) {
2453
+ if (nint(n->car->car) == NODE_XSTR) {
2454
+ n->car->car = (struct mrb_ast_node*)(intptr_t)NODE_STR;
2455
+ mrb_assert(!n->cdr); /* must be the end */
2456
+ }
2457
+ codegen(s, n->car, VAL);
2458
+ pop(); pop();
2459
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
2460
+ push();
2461
+ n = n->cdr;
2462
+ }
2463
+ push(); /* for block */
2464
+ pop_n(3);
2465
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
2466
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
2467
+ if (val) push();
2468
+ mrb_gc_arena_restore(s->mrb, ai);
2469
+ }
2470
+ break;
2471
+
2472
+ case NODE_XSTR:
2473
+ {
2474
+ char *p = (char*)tree->car;
2475
+ size_t len = (intptr_t)tree->cdr;
2476
+ int ai = mrb_gc_arena_save(s->mrb);
2477
+ int off = new_lit(s, mrb_str_new(s->mrb, p, len));
2478
+ int sym;
2479
+
2480
+ genop(s, MKOP_A(OP_LOADSELF, cursp()));
2481
+ push();
2482
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2483
+ push(); push();
2484
+ pop_n(3);
2485
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
2486
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
2487
+ if (val) push();
2488
+ mrb_gc_arena_restore(s->mrb, ai);
2489
+ }
2490
+ break;
2491
+
2492
+ case NODE_REGX:
2493
+ if (val) {
2494
+ char *p1 = (char*)tree->car;
2495
+ char *p2 = (char*)tree->cdr->car;
2496
+ char *p3 = (char*)tree->cdr->cdr;
2497
+ int ai = mrb_gc_arena_save(s->mrb);
2498
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
2499
+ int off = new_lit(s, mrb_str_new_cstr(s->mrb, p1));
2500
+ int argc = 1;
2501
+
2502
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
2503
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
2504
+ push();
2505
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2506
+ push();
2507
+ if (p2 || p3) {
2508
+ if (p2) { /* opt */
2509
+ off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
2510
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2511
+ }
2512
+ else {
2513
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2514
+ }
2515
+ push();
2516
+ argc++;
2517
+ if (p3) { /* enc */
2518
+ off = new_lit(s, mrb_str_new(s->mrb, p3, 1));
2519
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2520
+ push();
2521
+ argc++;
2522
+ }
2523
+ }
2524
+ push(); /* space for a block */
2525
+ pop_n(argc+2);
2526
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
2527
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
2528
+ mrb_gc_arena_restore(s->mrb, ai);
2529
+ push();
2530
+ }
2531
+ break;
2532
+
2533
+ case NODE_DREGX:
2534
+ if (val) {
2535
+ node *n = tree->car;
2536
+ int ai = mrb_gc_arena_save(s->mrb);
2537
+ int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
2538
+ int argc = 1;
2539
+ int off;
2540
+ char *p;
2541
+
2542
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
2543
+ genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
2544
+ push();
2545
+ codegen(s, n->car, VAL);
2546
+ n = n->cdr;
2547
+ while (n) {
2548
+ codegen(s, n->car, VAL);
2549
+ pop(); pop();
2550
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
2551
+ push();
2552
+ n = n->cdr;
2553
+ }
2554
+ n = tree->cdr->cdr;
2555
+ if (n->car) { /* tail */
2556
+ p = (char*)n->car;
2557
+ off = new_lit(s, mrb_str_new_cstr(s->mrb, p));
2558
+ codegen(s, tree->car, VAL);
2559
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2560
+ pop();
2561
+ genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
2562
+ push();
2563
+ }
2564
+ if (n->cdr->car) { /* opt */
2565
+ char *p2 = (char*)n->cdr->car;
2566
+ off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
2567
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2568
+ push();
2569
+ argc++;
2570
+ }
2571
+ if (n->cdr->cdr) { /* enc */
2572
+ char *p2 = (char*)n->cdr->cdr;
2573
+ off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
2574
+ genop(s, MKOP_ABx(OP_STRING, cursp(), off));
2575
+ push();
2576
+ argc++;
2577
+ }
2578
+ push(); /* space for a block */
2579
+ pop_n(argc+2);
2580
+ sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
2581
+ genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
2582
+ mrb_gc_arena_restore(s->mrb, ai);
2583
+ push();
2584
+ }
2585
+ else {
2586
+ node *n = tree->car;
2587
+
2588
+ while (n) {
2589
+ if (nint(n->car->car) != NODE_STR) {
2590
+ codegen(s, n->car, NOVAL);
2591
+ }
2592
+ n = n->cdr;
2593
+ }
2594
+ }
2595
+ break;
2596
+
2597
+ case NODE_SYM:
2598
+ if (val) {
2599
+ int sym = new_sym(s, nsym(tree));
2600
+
2601
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
2602
+ push();
2603
+ }
2604
+ break;
2605
+
2606
+ case NODE_DSYM:
2607
+ codegen(s, tree, val);
2608
+ if (val) {
2609
+ gen_send_intern(s);
2610
+ }
2611
+ break;
2612
+
2613
+ case NODE_SELF:
2614
+ if (val) {
2615
+ genop(s, MKOP_A(OP_LOADSELF, cursp()));
2616
+ push();
2617
+ }
2618
+ break;
2619
+
2620
+ case NODE_NIL:
2621
+ if (val) {
2622
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2623
+ push();
2624
+ }
2625
+ break;
2626
+
2627
+ case NODE_TRUE:
2628
+ if (val) {
2629
+ genop(s, MKOP_A(OP_LOADT, cursp()));
2630
+ push();
2631
+ }
2632
+ break;
2633
+
2634
+ case NODE_FALSE:
2635
+ if (val) {
2636
+ genop(s, MKOP_A(OP_LOADF, cursp()));
2637
+ push();
2638
+ }
2639
+ break;
2640
+
2641
+ case NODE_ALIAS:
2642
+ {
2643
+ int a = new_msym(s, nsym(tree->car));
2644
+ int b = new_msym(s, nsym(tree->cdr));
2645
+ int c = new_msym(s, mrb_intern_lit(s->mrb, "alias_method"));
2646
+
2647
+ genop(s, MKOP_A(OP_TCLASS, cursp()));
2648
+ push();
2649
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), a));
2650
+ push();
2651
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), b));
2652
+ push();
2653
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2654
+ push(); /* space for a block */
2655
+ pop_n(4);
2656
+ genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2));
2657
+ if (val) {
2658
+ push();
2659
+ }
2660
+ }
2661
+ break;
2662
+
2663
+ case NODE_UNDEF:
2664
+ {
2665
+ int undef = new_msym(s, mrb_intern_lit(s->mrb, "undef_method"));
2666
+ int num = 0;
2667
+ node *t = tree;
2668
+
2669
+ genop(s, MKOP_A(OP_TCLASS, cursp()));
2670
+ push();
2671
+ while (t) {
2672
+ int symbol;
2673
+ if (num >= CALL_MAXARGS - 1) {
2674
+ pop_n(num);
2675
+ genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), num));
2676
+ while (t) {
2677
+ symbol = new_msym(s, nsym(t->car));
2678
+ push();
2679
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
2680
+ pop();
2681
+ genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
2682
+ t = t->cdr;
2683
+ }
2684
+ num = CALL_MAXARGS;
2685
+ break;
2686
+ }
2687
+ symbol = new_msym(s, nsym(t->car));
2688
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
2689
+ push();
2690
+ t = t->cdr;
2691
+ num++;
2692
+ }
2693
+ push();pop(); /* space for a block */
2694
+ pop();
2695
+ if (num < CALL_MAXARGS) {
2696
+ pop_n(num);
2697
+ }
2698
+ genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num));
2699
+ if (val) {
2700
+ push();
2701
+ }
2702
+ }
2703
+ break;
2704
+
2705
+ case NODE_CLASS:
2706
+ {
2707
+ int idx;
2708
+
2709
+ if (tree->car->car == (node*)0) {
2710
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2711
+ push();
2712
+ }
2713
+ else if (tree->car->car == (node*)1) {
2714
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
2715
+ push();
2716
+ }
2717
+ else {
2718
+ codegen(s, tree->car->car, VAL);
2719
+ }
2720
+ if (tree->cdr->car) {
2721
+ codegen(s, tree->cdr->car, VAL);
2722
+ }
2723
+ else {
2724
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2725
+ push();
2726
+ }
2727
+ pop(); pop();
2728
+ idx = new_msym(s, nsym(tree->car->cdr));
2729
+ genop(s, MKOP_AB(OP_CLASS, cursp(), idx));
2730
+ idx = scope_body(s, tree->cdr->cdr->car, val);
2731
+ genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
2732
+ if (val) {
2733
+ push();
2734
+ }
2735
+ }
2736
+ break;
2737
+
2738
+ case NODE_MODULE:
2739
+ {
2740
+ int idx;
2741
+
2742
+ if (tree->car->car == (node*)0) {
2743
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
2744
+ push();
2745
+ }
2746
+ else if (tree->car->car == (node*)1) {
2747
+ genop(s, MKOP_A(OP_OCLASS, cursp()));
2748
+ push();
2749
+ }
2750
+ else {
2751
+ codegen(s, tree->car->car, VAL);
2752
+ }
2753
+ pop();
2754
+ idx = new_msym(s, nsym(tree->car->cdr));
2755
+ genop(s, MKOP_AB(OP_MODULE, cursp(), idx));
2756
+ idx = scope_body(s, tree->cdr->car, val);
2757
+ genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
2758
+ if (val) {
2759
+ push();
2760
+ }
2761
+ }
2762
+ break;
2763
+
2764
+ case NODE_SCLASS:
2765
+ {
2766
+ int idx;
2767
+
2768
+ codegen(s, tree->car, VAL);
2769
+ pop();
2770
+ genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp()));
2771
+ idx = scope_body(s, tree->cdr->car, val);
2772
+ genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
2773
+ if (val) {
2774
+ push();
2775
+ }
2776
+ }
2777
+ break;
2778
+
2779
+ case NODE_DEF:
2780
+ {
2781
+ int sym = new_msym(s, nsym(tree->car));
2782
+ int idx = lambda_body(s, tree->cdr, 0);
2783
+
2784
+ genop(s, MKOP_A(OP_TCLASS, cursp()));
2785
+ push();
2786
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));
2787
+ push(); pop();
2788
+ pop();
2789
+ genop(s, MKOP_AB(OP_METHOD, cursp(), sym));
2790
+ if (val) {
2791
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
2792
+ push();
2793
+ }
2794
+ }
2795
+ break;
2796
+
2797
+ case NODE_SDEF:
2798
+ {
2799
+ node *recv = tree->car;
2800
+ int sym = new_msym(s, nsym(tree->cdr->car));
2801
+ int idx = lambda_body(s, tree->cdr->cdr, 0);
2802
+
2803
+ codegen(s, recv, VAL);
2804
+ pop();
2805
+ genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp()));
2806
+ push();
2807
+ genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));
2808
+ pop();
2809
+ genop(s, MKOP_AB(OP_METHOD, cursp(), sym));
2810
+ if (val) {
2811
+ genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
2812
+ push();
2813
+ }
2814
+ }
2815
+ break;
2816
+
2817
+ case NODE_POSTEXE:
2818
+ codegen(s, tree, NOVAL);
2819
+ break;
2820
+
2821
+ default:
2822
+ break;
2823
+ }
2824
+ exit:
2825
+ s->rlev = rlev;
2826
+ }
2827
+
2828
+ static void
2829
+ scope_add_irep(codegen_scope *s, mrb_irep *irep)
2830
+ {
2831
+ if (s->irep == NULL) {
2832
+ s->irep = irep;
2833
+ return;
2834
+ }
2835
+ if (s->irep->rlen == s->rcapa) {
2836
+ s->rcapa *= 2;
2837
+ s->irep->reps = (mrb_irep**)codegen_realloc(s, s->irep->reps, sizeof(mrb_irep*)*s->rcapa);
2838
+ }
2839
+ s->irep->reps[s->irep->rlen] = irep;
2840
+ s->irep->rlen++;
2841
+ }
2842
+
2843
+ static codegen_scope*
2844
+ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
2845
+ {
2846
+ static const codegen_scope codegen_scope_zero = { 0 };
2847
+ mrb_pool *pool = mrb_pool_open(mrb);
2848
+ codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
2849
+
2850
+ if (!p) return NULL;
2851
+ *p = codegen_scope_zero;
2852
+ p->mrb = mrb;
2853
+ p->mpool = pool;
2854
+ if (!prev) return p;
2855
+ p->prev = prev;
2856
+ p->ainfo = -1;
2857
+ p->mscope = 0;
2858
+
2859
+ p->irep = mrb_add_irep(mrb);
2860
+ scope_add_irep(prev, p->irep);
2861
+
2862
+ p->rcapa = 8;
2863
+ p->irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*p->rcapa);
2864
+
2865
+ p->icapa = 1024;
2866
+ p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
2867
+ p->irep->iseq = NULL;
2868
+
2869
+ p->pcapa = 32;
2870
+ p->irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
2871
+ p->irep->plen = 0;
2872
+
2873
+ p->scapa = MAXMSYMLEN;
2874
+ p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa);
2875
+ p->irep->slen = 0;
2876
+
2877
+ p->lv = lv;
2878
+ p->sp += node_len(lv)+1; /* add self */
2879
+ p->nlocals = p->sp;
2880
+ if (lv) {
2881
+ node *n = lv;
2882
+ size_t i = 0;
2883
+
2884
+ p->irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals) * (p->nlocals - 1));
2885
+ for (i=0, n=lv; n; i++,n=n->cdr) {
2886
+ p->irep->lv[i].name = lv_name(n);
2887
+ if (lv_name(n)) {
2888
+ p->irep->lv[i].r = lv_idx(p, lv_name(n));
2889
+ }
2890
+ else {
2891
+ p->irep->lv[i].r = 0;
2892
+ }
2893
+ }
2894
+ mrb_assert(i + 1 == p->nlocals);
2895
+ }
2896
+ p->ai = mrb_gc_arena_save(mrb);
2897
+
2898
+ p->filename = prev->filename;
2899
+ if (p->filename) {
2900
+ p->lines = (uint16_t*)mrb_malloc(mrb, sizeof(short)*p->icapa);
2901
+ }
2902
+ p->lineno = prev->lineno;
2903
+
2904
+ /* debug setting */
2905
+ p->debug_start_pos = 0;
2906
+ if (p->filename) {
2907
+ mrb_debug_info_alloc(mrb, p->irep);
2908
+ p->irep->filename = p->filename;
2909
+ p->irep->lines = p->lines;
2910
+ }
2911
+ else {
2912
+ p->irep->debug_info = NULL;
2913
+ }
2914
+ p->parser = prev->parser;
2915
+ p->filename_index = prev->filename_index;
2916
+
2917
+ p->rlev = prev->rlev+1;
2918
+
2919
+ return p;
2920
+ }
2921
+
2922
+ static void
2923
+ scope_finish(codegen_scope *s)
2924
+ {
2925
+ mrb_state *mrb = s->mrb;
2926
+ mrb_irep *irep = s->irep;
2927
+ size_t fname_len;
2928
+ char *fname;
2929
+
2930
+ irep->flags = 0;
2931
+ if (s->iseq) {
2932
+ irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc);
2933
+ irep->ilen = s->pc;
2934
+ if (s->lines) {
2935
+ irep->lines = (uint16_t *)codegen_realloc(s, s->lines, sizeof(uint16_t)*s->pc);
2936
+ }
2937
+ else {
2938
+ irep->lines = 0;
2939
+ }
2940
+ }
2941
+ irep->pool = (mrb_value*)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen);
2942
+ irep->syms = (mrb_sym*)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen);
2943
+ irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
2944
+ if (s->filename) {
2945
+ irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
2946
+ mrb_debug_info_append_file(mrb, irep, s->debug_start_pos, s->pc);
2947
+
2948
+ fname_len = strlen(s->filename);
2949
+ fname = (char*)codegen_malloc(s, fname_len + 1);
2950
+ memcpy(fname, s->filename, fname_len);
2951
+ fname[fname_len] = '\0';
2952
+ irep->filename = fname;
2953
+ irep->own_filename = TRUE;
2954
+ }
2955
+
2956
+ irep->nlocals = s->nlocals;
2957
+ irep->nregs = s->nregs;
2958
+
2959
+ mrb_gc_arena_restore(mrb, s->ai);
2960
+ mrb_pool_close(s->mpool);
2961
+ }
2962
+
2963
+ static struct loopinfo*
2964
+ loop_push(codegen_scope *s, enum looptype t)
2965
+ {
2966
+ struct loopinfo *p = (struct loopinfo *)codegen_palloc(s, sizeof(struct loopinfo));
2967
+
2968
+ p->type = t;
2969
+ p->pc1 = p->pc2 = p->pc3 = 0;
2970
+ p->prev = s->loop;
2971
+ p->ensure_level = s->ensure_level;
2972
+ p->acc = cursp();
2973
+ s->loop = p;
2974
+
2975
+ return p;
2976
+ }
2977
+
2978
+ static void
2979
+ loop_break(codegen_scope *s, node *tree)
2980
+ {
2981
+ if (!s->loop) {
2982
+ codegen(s, tree, NOVAL);
2983
+ raise_error(s, "unexpected break");
2984
+ }
2985
+ else {
2986
+ struct loopinfo *loop;
2987
+ int n = 0;
2988
+
2989
+ if (tree) {
2990
+ gen_retval(s, tree);
2991
+ }
2992
+
2993
+ loop = s->loop;
2994
+ while (loop) {
2995
+ if (loop->type == LOOP_BEGIN) {
2996
+ n++;
2997
+ loop = loop->prev;
2998
+ }
2999
+ else if (loop->type == LOOP_RESCUE) {
3000
+ loop = loop->prev;
3001
+ }
3002
+ else{
3003
+ break;
3004
+ }
3005
+ }
3006
+ if (!loop) {
3007
+ raise_error(s, "unexpected break");
3008
+ return;
3009
+ }
3010
+ if (n > 0) {
3011
+ genop_peep(s, MKOP_A(OP_POPERR, n), NOVAL);
3012
+ }
3013
+
3014
+ if (loop->type == LOOP_NORMAL) {
3015
+ int tmp;
3016
+
3017
+ if (s->ensure_level > s->loop->ensure_level) {
3018
+ genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
3019
+ }
3020
+ if (tree) {
3021
+ genop_peep(s, MKOP_AB(OP_MOVE, loop->acc, cursp()), NOVAL);
3022
+ }
3023
+ distcheck(s, s->loop->pc3);
3024
+ tmp = genop(s, MKOP_sBx(OP_JMP, loop->pc3));
3025
+ loop->pc3 = tmp;
3026
+ }
3027
+ else {
3028
+ if (!tree) {
3029
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
3030
+ }
3031
+ genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_BREAK));
3032
+ }
3033
+ }
3034
+ }
3035
+
3036
+ static void
3037
+ loop_pop(codegen_scope *s, int val)
3038
+ {
3039
+ if (val) {
3040
+ genop(s, MKOP_A(OP_LOADNIL, cursp()));
3041
+ }
3042
+ dispatch_linked(s, s->loop->pc3);
3043
+ s->loop = s->loop->prev;
3044
+ if (val) push();
3045
+ }
3046
+
3047
+ MRB_API struct RProc*
3048
+ mrb_generate_code(mrb_state *mrb, parser_state *p)
3049
+ {
3050
+ codegen_scope *scope = scope_new(mrb, 0, 0);
3051
+ struct RProc *proc;
3052
+ struct mrb_jmpbuf *prev_jmp = mrb->jmp;
3053
+
3054
+ if (!scope) {
3055
+ return NULL;
3056
+ }
3057
+ scope->mrb = mrb;
3058
+ scope->parser = p;
3059
+ scope->filename = p->filename;
3060
+ scope->filename_index = p->current_filename_index;
3061
+
3062
+ MRB_TRY(&scope->jmp) {
3063
+ mrb->jmp = &scope->jmp;
3064
+ /* prepare irep */
3065
+ codegen(scope, p->tree, NOVAL);
3066
+ proc = mrb_proc_new(mrb, scope->irep);
3067
+ mrb_irep_decref(mrb, scope->irep);
3068
+ mrb_pool_close(scope->mpool);
3069
+ proc->c = NULL;
3070
+ if (mrb->c->cibase && mrb->c->cibase->proc == proc->upper) {
3071
+ proc->upper = NULL;
3072
+ }
3073
+ mrb->jmp = prev_jmp;
3074
+ return proc;
3075
+ }
3076
+ MRB_CATCH(&scope->jmp) {
3077
+ mrb_irep_decref(mrb, scope->irep);
3078
+ mrb_pool_close(scope->mpool);
3079
+ mrb->jmp = prev_jmp;
3080
+ return NULL;
3081
+ }
3082
+ MRB_END_EXC(&scope->jmp);
3083
+ }