enclave 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (739) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +182 -0
  3. data/Rakefile +30 -0
  4. data/ext/enclave/enclave.c +390 -0
  5. data/ext/enclave/extconf.rb +33 -0
  6. data/ext/enclave/mruby/Makefile +63 -0
  7. data/ext/enclave/mruby/Rakefile +102 -0
  8. data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
  9. data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
  10. data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
  11. data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
  12. data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
  13. data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
  14. data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
  15. data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
  16. data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
  17. data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
  18. data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
  19. data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
  20. data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
  21. data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
  22. data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
  23. data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
  24. data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
  25. data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
  26. data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
  27. data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
  28. data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
  29. data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
  30. data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
  31. data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
  32. data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
  33. data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
  34. data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
  35. data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
  36. data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
  37. data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
  38. data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
  39. data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
  40. data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
  41. data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
  42. data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
  43. data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
  44. data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
  45. data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
  46. data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
  47. data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
  48. data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
  49. data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
  50. data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
  51. data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
  52. data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
  53. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
  54. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
  55. data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
  56. data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
  57. data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
  58. data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
  59. data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
  60. data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
  61. data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
  62. data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
  63. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
  64. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
  65. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
  66. data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
  67. data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
  68. data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
  69. data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
  70. data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
  71. data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
  72. data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
  73. data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
  74. data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
  75. data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
  76. data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
  77. data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
  78. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
  79. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
  80. data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
  81. data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
  82. data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
  83. data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
  84. data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
  85. data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
  86. data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
  87. data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
  88. data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
  89. data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
  90. data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
  91. data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
  92. data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
  93. data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
  94. data/ext/enclave/mruby/build_config/RX630.rb +63 -0
  95. data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
  96. data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
  97. data/ext/enclave/mruby/build_config/bench.rb +11 -0
  98. data/ext/enclave/mruby/build_config/boxing.rb +19 -0
  99. data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
  100. data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
  101. data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
  102. data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
  103. data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
  104. data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
  105. data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
  106. data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
  107. data/ext/enclave/mruby/build_config/default.rb +83 -0
  108. data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
  109. data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
  110. data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
  111. data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
  112. data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
  113. data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
  114. data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
  115. data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
  116. data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
  117. data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
  118. data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
  119. data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
  120. data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
  121. data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
  122. data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
  123. data/ext/enclave/mruby/build_config/minimal.rb +4 -0
  124. data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
  125. data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
  126. data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
  127. data/ext/enclave/mruby/build_config/no-float.rb +17 -0
  128. data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
  129. data/ext/enclave/mruby/build_config/serenity.rb +26 -0
  130. data/ext/enclave/mruby/build_config.rb +9 -0
  131. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
  132. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
  133. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
  134. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
  135. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
  136. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
  137. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
  138. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
  139. data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
  140. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
  141. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
  142. data/ext/enclave/mruby/include/mrbconf.h +230 -0
  143. data/ext/enclave/mruby/include/mruby/array.h +303 -0
  144. data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
  145. data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
  146. data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
  147. data/ext/enclave/mruby/include/mruby/class.h +157 -0
  148. data/ext/enclave/mruby/include/mruby/common.h +127 -0
  149. data/ext/enclave/mruby/include/mruby/compile.h +187 -0
  150. data/ext/enclave/mruby/include/mruby/data.h +76 -0
  151. data/ext/enclave/mruby/include/mruby/debug.h +75 -0
  152. data/ext/enclave/mruby/include/mruby/dump.h +159 -0
  153. data/ext/enclave/mruby/include/mruby/endian.h +44 -0
  154. data/ext/enclave/mruby/include/mruby/error.h +168 -0
  155. data/ext/enclave/mruby/include/mruby/gc.h +77 -0
  156. data/ext/enclave/mruby/include/mruby/hash.h +234 -0
  157. data/ext/enclave/mruby/include/mruby/internal.h +278 -0
  158. data/ext/enclave/mruby/include/mruby/irep.h +142 -0
  159. data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
  160. data/ext/enclave/mruby/include/mruby/khash.h +455 -0
  161. data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
  162. data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
  163. data/ext/enclave/mruby/include/mruby/object.h +44 -0
  164. data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
  165. data/ext/enclave/mruby/include/mruby/ops.h +133 -0
  166. data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
  167. data/ext/enclave/mruby/include/mruby/presym.h +65 -0
  168. data/ext/enclave/mruby/include/mruby/proc.h +184 -0
  169. data/ext/enclave/mruby/include/mruby/range.h +77 -0
  170. data/ext/enclave/mruby/include/mruby/re.h +16 -0
  171. data/ext/enclave/mruby/include/mruby/string.h +428 -0
  172. data/ext/enclave/mruby/include/mruby/throw.h +81 -0
  173. data/ext/enclave/mruby/include/mruby/value.h +471 -0
  174. data/ext/enclave/mruby/include/mruby/variable.h +108 -0
  175. data/ext/enclave/mruby/include/mruby/version.h +143 -0
  176. data/ext/enclave/mruby/include/mruby.h +1632 -0
  177. data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
  178. data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
  179. data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
  180. data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
  181. data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
  182. data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
  183. data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
  184. data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
  185. data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
  186. data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
  187. data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
  188. data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
  189. data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
  190. data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
  191. data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
  192. data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
  193. data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
  194. data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
  195. data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
  196. data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
  197. data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
  198. data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
  199. data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
  200. data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
  201. data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
  202. data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
  203. data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
  204. data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
  205. data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
  206. data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
  207. data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
  208. data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
  209. data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
  210. data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
  211. data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
  212. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
  213. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
  214. data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
  215. data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
  216. data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
  217. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
  218. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
  219. data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
  220. data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
  221. data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
  222. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
  223. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
  224. data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
  225. data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
  226. data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
  227. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
  228. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
  229. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
  230. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
  231. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
  232. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
  233. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
  234. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
  235. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  236. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
  237. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  238. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
  239. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  240. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
  241. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
  242. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
  243. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
  244. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
  245. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
  246. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
  247. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
  248. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
  249. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
  250. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
  251. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
  252. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
  253. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
  254. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
  255. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
  256. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
  257. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
  258. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
  259. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
  260. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
  261. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
  262. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
  263. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
  264. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
  265. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
  266. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
  267. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
  268. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
  269. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
  270. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
  271. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
  272. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
  273. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
  274. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
  275. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
  276. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
  277. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
  278. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
  279. data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
  280. data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
  281. data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
  282. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
  283. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
  284. data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
  285. data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
  286. data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
  287. data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
  288. data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
  289. data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
  290. data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
  291. data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
  292. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
  293. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
  294. data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
  295. data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
  296. data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
  297. data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
  298. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
  299. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
  300. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
  301. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
  302. data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
  303. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
  304. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
  305. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
  306. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
  307. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
  308. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
  309. data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
  310. data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
  311. data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
  312. data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
  313. data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
  314. data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
  315. data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
  316. data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
  317. data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
  318. data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
  319. data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
  320. data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
  321. data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
  322. data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
  323. data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
  324. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
  325. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
  326. data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
  327. data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
  328. data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
  329. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
  330. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
  331. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
  332. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
  333. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
  334. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
  335. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
  336. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
  337. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
  338. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
  339. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
  340. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  341. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
  342. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
  343. data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
  344. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
  345. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
  346. data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
  347. data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
  348. data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
  349. data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
  350. data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
  351. data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
  352. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
  353. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
  354. data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
  355. data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
  356. data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
  357. data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
  358. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
  359. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
  360. data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
  361. data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
  362. data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
  363. data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
  364. data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
  365. data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
  366. data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
  367. data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
  368. data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
  369. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
  370. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
  371. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
  372. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
  373. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
  374. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
  375. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
  376. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
  377. data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
  378. data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
  379. data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
  380. data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
  381. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
  382. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
  383. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
  384. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
  385. data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
  386. data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
  387. data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
  388. data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
  389. data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
  390. data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
  391. data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
  392. data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
  393. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
  394. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  395. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
  396. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
  397. data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
  398. data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
  399. data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
  400. data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
  401. data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
  402. data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
  403. data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
  404. data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
  405. data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
  406. data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
  407. data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
  408. data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
  409. data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
  410. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
  411. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
  412. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
  413. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
  414. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
  415. data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
  416. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
  417. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
  418. data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
  419. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
  420. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
  421. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
  422. data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
  423. data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
  424. data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
  425. data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
  426. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
  427. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
  428. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
  429. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
  430. data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
  431. data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
  432. data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
  433. data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
  434. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
  435. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
  436. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
  437. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
  438. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
  439. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
  440. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
  441. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
  442. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
  443. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
  444. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
  445. data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
  446. data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
  447. data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
  448. data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
  449. data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
  450. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
  451. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
  452. data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
  453. data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
  454. data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
  455. data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
  456. data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
  457. data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
  458. data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
  459. data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
  460. data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
  461. data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
  462. data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
  463. data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
  464. data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
  465. data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
  466. data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
  467. data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
  468. data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
  469. data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
  470. data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
  471. data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
  472. data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
  473. data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
  474. data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
  475. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
  476. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
  477. data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
  478. data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
  479. data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
  480. data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
  481. data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
  482. data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
  483. data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
  484. data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
  485. data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
  486. data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
  487. data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
  488. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
  489. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
  490. data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
  491. data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
  492. data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
  493. data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
  494. data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
  495. data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
  496. data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
  497. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
  498. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
  499. data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
  500. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
  501. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
  502. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
  503. data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
  504. data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
  505. data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
  506. data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
  507. data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
  508. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
  509. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
  510. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
  511. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
  512. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
  513. data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
  514. data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
  515. data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
  516. data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
  517. data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
  518. data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
  519. data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
  520. data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
  521. data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
  522. data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
  523. data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
  524. data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
  525. data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
  526. data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
  527. data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
  528. data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
  529. data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
  530. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
  531. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
  532. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
  533. data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
  534. data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
  535. data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
  536. data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
  537. data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
  538. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
  539. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
  540. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
  541. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
  542. data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
  543. data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
  544. data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
  545. data/ext/enclave/mruby/mrblib/10error.rb +23 -0
  546. data/ext/enclave/mruby/mrblib/array.rb +102 -0
  547. data/ext/enclave/mruby/mrblib/compar.rb +102 -0
  548. data/ext/enclave/mruby/mrblib/enum.rb +358 -0
  549. data/ext/enclave/mruby/mrblib/hash.rb +276 -0
  550. data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
  551. data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
  552. data/ext/enclave/mruby/mrblib/range.rb +98 -0
  553. data/ext/enclave/mruby/mrblib/string.rb +173 -0
  554. data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
  555. data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
  556. data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
  557. data/ext/enclave/mruby/src/allocf.c +37 -0
  558. data/ext/enclave/mruby/src/array.c +2302 -0
  559. data/ext/enclave/mruby/src/backtrace.c +294 -0
  560. data/ext/enclave/mruby/src/cdump.c +498 -0
  561. data/ext/enclave/mruby/src/class.c +4394 -0
  562. data/ext/enclave/mruby/src/codedump.c +693 -0
  563. data/ext/enclave/mruby/src/debug.c +290 -0
  564. data/ext/enclave/mruby/src/dump.c +998 -0
  565. data/ext/enclave/mruby/src/enum.c +30 -0
  566. data/ext/enclave/mruby/src/error.c +937 -0
  567. data/ext/enclave/mruby/src/etc.c +421 -0
  568. data/ext/enclave/mruby/src/fmt_fp.c +372 -0
  569. data/ext/enclave/mruby/src/gc.c +1610 -0
  570. data/ext/enclave/mruby/src/hash.c +2355 -0
  571. data/ext/enclave/mruby/src/init.c +50 -0
  572. data/ext/enclave/mruby/src/kernel.c +718 -0
  573. data/ext/enclave/mruby/src/load.c +760 -0
  574. data/ext/enclave/mruby/src/mempool.c +225 -0
  575. data/ext/enclave/mruby/src/numeric.c +2420 -0
  576. data/ext/enclave/mruby/src/numops.c +112 -0
  577. data/ext/enclave/mruby/src/object.c +883 -0
  578. data/ext/enclave/mruby/src/print.c +136 -0
  579. data/ext/enclave/mruby/src/proc.c +572 -0
  580. data/ext/enclave/mruby/src/range.c +597 -0
  581. data/ext/enclave/mruby/src/readfloat.c +228 -0
  582. data/ext/enclave/mruby/src/readint.c +27 -0
  583. data/ext/enclave/mruby/src/readnum.c +43 -0
  584. data/ext/enclave/mruby/src/state.c +247 -0
  585. data/ext/enclave/mruby/src/string.c +3577 -0
  586. data/ext/enclave/mruby/src/symbol.c +1023 -0
  587. data/ext/enclave/mruby/src/value_array.h +28 -0
  588. data/ext/enclave/mruby/src/variable.c +1475 -0
  589. data/ext/enclave/mruby/src/version.c +17 -0
  590. data/ext/enclave/mruby/src/vm.c +3696 -0
  591. data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
  592. data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
  593. data/ext/enclave/mruby/tasks/bin.rake +23 -0
  594. data/ext/enclave/mruby/tasks/core.rake +12 -0
  595. data/ext/enclave/mruby/tasks/doc.rake +118 -0
  596. data/ext/enclave/mruby/tasks/install.rake +40 -0
  597. data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
  598. data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
  599. data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
  600. data/ext/enclave/mruby/tasks/presym.rake +57 -0
  601. data/ext/enclave/mruby/tasks/test.rake +84 -0
  602. data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
  603. data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
  604. data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
  605. data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
  606. data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
  607. data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
  608. data/ext/enclave/mruby/test/assert.rb +404 -0
  609. data/ext/enclave/mruby/test/bintest.rb +55 -0
  610. data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
  611. data/ext/enclave/mruby/test/t/array.rb +478 -0
  612. data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
  613. data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
  614. data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
  615. data/ext/enclave/mruby/test/t/class.rb +505 -0
  616. data/ext/enclave/mruby/test/t/codegen.rb +196 -0
  617. data/ext/enclave/mruby/test/t/comparable.rb +79 -0
  618. data/ext/enclave/mruby/test/t/ensure.rb +36 -0
  619. data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
  620. data/ext/enclave/mruby/test/t/exception.rb +425 -0
  621. data/ext/enclave/mruby/test/t/false.rb +31 -0
  622. data/ext/enclave/mruby/test/t/float.rb +296 -0
  623. data/ext/enclave/mruby/test/t/gc.rb +45 -0
  624. data/ext/enclave/mruby/test/t/hash.rb +976 -0
  625. data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
  626. data/ext/enclave/mruby/test/t/integer.rb +247 -0
  627. data/ext/enclave/mruby/test/t/iterations.rb +61 -0
  628. data/ext/enclave/mruby/test/t/kernel.rb +462 -0
  629. data/ext/enclave/mruby/test/t/lang.rb +74 -0
  630. data/ext/enclave/mruby/test/t/literals.rb +386 -0
  631. data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
  632. data/ext/enclave/mruby/test/t/methods.rb +138 -0
  633. data/ext/enclave/mruby/test/t/module.rb +931 -0
  634. data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
  635. data/ext/enclave/mruby/test/t/nil.rb +39 -0
  636. data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
  637. data/ext/enclave/mruby/test/t/numeric.rb +114 -0
  638. data/ext/enclave/mruby/test/t/object.rb +10 -0
  639. data/ext/enclave/mruby/test/t/proc.rb +198 -0
  640. data/ext/enclave/mruby/test/t/range.rb +194 -0
  641. data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
  642. data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
  643. data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
  644. data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
  645. data/ext/enclave/mruby/test/t/string.rb +981 -0
  646. data/ext/enclave/mruby/test/t/superclass.rb +46 -0
  647. data/ext/enclave/mruby/test/t/symbol.rb +30 -0
  648. data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
  649. data/ext/enclave/mruby/test/t/true.rb +31 -0
  650. data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
  651. data/ext/enclave/mruby/test/t/unicode.rb +39 -0
  652. data/ext/enclave/mruby/test/t/vformat.rb +57 -0
  653. data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
  654. data/ext/enclave/mruby/tools/lrama/MIT +21 -0
  655. data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
  656. data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
  657. data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
  658. data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
  659. data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
  660. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
  661. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
  662. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
  663. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
  664. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
  665. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
  666. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
  667. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
  668. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
  669. data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
  670. data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
  671. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
  672. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
  673. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
  674. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
  675. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
  676. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
  677. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
  678. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
  679. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
  680. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
  681. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
  682. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
  683. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
  684. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
  685. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
  686. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
  687. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
  688. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
  689. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
  690. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
  691. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
  692. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
  693. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
  694. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
  695. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
  696. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
  697. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
  698. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
  699. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
  700. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
  701. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
  702. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
  703. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
  704. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
  705. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
  706. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
  707. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
  708. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
  709. data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
  710. data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
  711. data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
  712. data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
  713. data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
  714. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
  715. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
  716. data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
  717. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
  718. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
  719. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
  720. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
  721. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
  722. data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
  723. data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
  724. data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
  725. data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
  726. data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
  727. data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
  728. data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
  729. data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
  730. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
  731. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
  732. data/ext/enclave/sandbox_build_config.rb +15 -0
  733. data/ext/enclave/sandbox_core.c +722 -0
  734. data/ext/enclave/sandbox_core.h +87 -0
  735. data/lib/enclave/result.rb +29 -0
  736. data/lib/enclave/tool.rb +38 -0
  737. data/lib/enclave/version.rb +3 -0
  738. data/lib/enclave.rb +73 -0
  739. metadata +819 -0
@@ -0,0 +1,1610 @@
1
+ /*
2
+ ** gc.c - garbage collector for mruby
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #include <string.h>
8
+ #ifdef MRB_USE_MALLOC_TRIM
9
+ #include <malloc.h>
10
+ #endif
11
+ #include <mruby.h>
12
+ #include <mruby/array.h>
13
+ #include <mruby/class.h>
14
+ #include <mruby/data.h>
15
+ #include <mruby/istruct.h>
16
+ #include <mruby/hash.h>
17
+ #include <mruby/proc.h>
18
+ #include <mruby/range.h>
19
+ #include <mruby/string.h>
20
+ #include <mruby/variable.h>
21
+ #include <mruby/gc.h>
22
+ #include <mruby/error.h>
23
+ #include <mruby/throw.h>
24
+ #include <mruby/internal.h>
25
+ #include <mruby/presym.h>
26
+
27
+ #ifdef MRB_GC_STRESS
28
+ #include <stdlib.h>
29
+ #endif
30
+
31
+ #ifdef MRB_USE_TASK_SCHEDULER
32
+ /* Forward declaration - actual implementation in task.c */
33
+ void mrb_task_mark_all(mrb_state *mrb);
34
+ #endif
35
+
36
+ /*
37
+ = Tri-color Incremental Garbage Collection
38
+
39
+ mruby's GC is Tri-color Incremental GC with Mark & Sweep.
40
+ Algorithm details are omitted.
41
+ Instead, the implementation part is described below.
42
+
43
+ == Object's Color
44
+
45
+ Each object can be painted in three colors:
46
+
47
+ * White - Unmarked.
48
+ * Gray - Marked, But the child objects are unmarked.
49
+ * Black - Marked, the child objects are also marked.
50
+
51
+ Extra color
52
+
53
+ * Red - Static (ROM object) no need to be collected.
54
+ - All child objects should be Red as well.
55
+
56
+ == Two White Types
57
+
58
+ There are two white color types in a flip-flop fashion: White-A and White-B,
59
+ which respectively represent the Current White color (the newly allocated
60
+ objects in the current GC cycle) and the Sweep Target White color (the
61
+ dead objects to be swept).
62
+
63
+ A and B will be switched just at the beginning of the next GC cycle. At
64
+ that time, all the dead objects have been swept, while the newly created
65
+ objects in the current GC cycle which finally remains White are now
66
+ regarded as dead objects. Instead of traversing all the White-A objects and
67
+ painting them as White-B, just switch the meaning of White-A and White-B as
68
+ this will be much cheaper.
69
+
70
+ As a result, the objects we sweep in the current GC cycle are always
71
+ left from the previous GC cycle. This allows us to sweep objects
72
+ incrementally, without the disturbance of the newly created objects.
73
+
74
+ == Execution Timing
75
+
76
+ GC Execution Time and Each step interval are decided by live objects count.
77
+ List of Adjustment API:
78
+
79
+ * gc_interval_ratio_set
80
+ * gc_step_ratio_set
81
+
82
+ For details, see the comments for each function.
83
+
84
+ == Write Barrier
85
+
86
+ mruby implementer and C extension library writer must insert a write
87
+ barrier when updating a reference from a field of an object.
88
+ When updating a reference from a field of object A to object B,
89
+ two different types of write barrier are available:
90
+
91
+ * mrb_field_write_barrier - target B object for a mark.
92
+ * mrb_write_barrier - target A object for a mark.
93
+
94
+ == Generational Mode
95
+
96
+ mruby's GC offers an Generational Mode while reusing the tri-color GC
97
+ infrastructure. It will treat the Black objects as Old objects after each
98
+ sweep phase, instead of painting them White. The key ideas are still the same
99
+ as traditional generational GC:
100
+
101
+ * Minor GC - just traverse the Young objects (Gray objects) in the mark
102
+ phase, then only sweep the newly created objects, and leave
103
+ the Old objects live.
104
+
105
+ * Major GC - same as a full regular GC cycle.
106
+
107
+ The difference from "traditional" generational GC is, that the major GC
108
+ in mruby is triggered incrementally in a tri-color manner.
109
+
110
+
111
+ For details, see the comments for each function.
112
+
113
+ */
114
+
115
+ typedef struct RVALUE RVALUE;
116
+
117
+ struct free_obj {
118
+ MRB_OBJECT_HEADER;
119
+ RVALUE *next;
120
+ };
121
+
122
+ struct RVALUE_initializer {
123
+ MRB_OBJECT_HEADER;
124
+ char padding[sizeof(void*) * 3];
125
+ };
126
+
127
+ struct RVALUE {
128
+ union {
129
+ struct RVALUE_initializer init; /* must be first member to ensure initialization */
130
+ struct free_obj free;
131
+ struct RBasic basic;
132
+ struct RObject object;
133
+ struct RClass klass;
134
+ struct RString string;
135
+ struct RArray array;
136
+ struct RHash hash;
137
+ struct RRange range;
138
+ struct RData data;
139
+ struct RIStruct istruct;
140
+ struct RProc proc;
141
+ struct REnv env;
142
+ struct RFiber fiber;
143
+ struct RException exc;
144
+ struct RBreak brk;
145
+ } as;
146
+ };
147
+
148
+ #ifdef GC_DEBUG
149
+ #define DEBUG(x) (x)
150
+ #else
151
+ #define DEBUG(x)
152
+ #endif
153
+
154
+ #ifndef MRB_HEAP_PAGE_SIZE
155
+ #define MRB_HEAP_PAGE_SIZE 1024
156
+ #endif
157
+
158
+ typedef struct mrb_heap_page {
159
+ RVALUE *freelist;
160
+ struct mrb_heap_page *next;
161
+ struct mrb_heap_page *free_next;
162
+ mrb_bool old:1;
163
+ RVALUE objects[MRB_HEAP_PAGE_SIZE];
164
+ } mrb_heap_page;
165
+
166
+ #define GC_STEP_SIZE 1024
167
+
168
+ /* white: 001 or 010, black: 100, gray: 000, red:111 */
169
+ #define GC_GRAY 0
170
+ #define GC_WHITE_A 1
171
+ #define GC_WHITE_B 2
172
+ #define GC_BLACK 4
173
+ #define GC_RED MRB_GC_RED
174
+ #define GC_WHITES (GC_WHITE_A | GC_WHITE_B)
175
+ #define GC_COLOR_MASK 7
176
+ mrb_static_assert(MRB_GC_RED <= GC_COLOR_MASK);
177
+
178
+ #define paint_gray(o) ((o)->gc_color = GC_GRAY)
179
+ #define paint_black(o) ((o)->gc_color = GC_BLACK)
180
+ #define paint_white(o) ((o)->gc_color = GC_WHITES)
181
+ #define paint_partial_white(s, o) ((o)->gc_color = (s)->current_white_part)
182
+ #define is_gray(o) ((o)->gc_color == GC_GRAY)
183
+ #define is_white(o) ((o)->gc_color & GC_WHITES)
184
+ #define is_black(o) ((o)->gc_color == GC_BLACK)
185
+ #define is_red(o) ((o)->gc_color == GC_RED)
186
+ #define flip_white_part(s) ((s)->current_white_part = other_white_part(s))
187
+ #define other_white_part(s) ((s)->current_white_part ^ GC_WHITES)
188
+ #define is_dead(s, o) (((o)->gc_color & other_white_part(s) & GC_WHITES) || (o)->tt == MRB_TT_FREE)
189
+
190
+ mrb_noreturn void mrb_raise_nomemory(mrb_state *mrb);
191
+
192
+ MRB_API void*
193
+ mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
194
+ {
195
+ void *p2;
196
+
197
+ #if defined(MRB_GC_STRESS) && defined(MRB_DEBUG)
198
+ if (mrb->gc.state != MRB_GC_STATE_SWEEP) {
199
+ mrb_full_gc(mrb);
200
+ }
201
+ #endif
202
+ p2 = mrb_basic_alloc_func(p, len);
203
+ if (!p2 && len > 0 && mrb->gc.heaps && mrb->gc.state != MRB_GC_STATE_SWEEP) {
204
+ mrb_full_gc(mrb);
205
+ p2 = mrb_basic_alloc_func(p, len);
206
+ }
207
+
208
+ return p2;
209
+ }
210
+
211
+ MRB_API void*
212
+ mrb_realloc(mrb_state *mrb, void *p, size_t len)
213
+ {
214
+ void *p2;
215
+
216
+ p2 = mrb_realloc_simple(mrb, p, len);
217
+ if (len == 0) return p2;
218
+ if (p2 == NULL) {
219
+ mrb->gc.out_of_memory = TRUE;
220
+ mrb_raise_nomemory(mrb);
221
+ }
222
+ else {
223
+ mrb->gc.out_of_memory = FALSE;
224
+ }
225
+
226
+ return p2;
227
+ }
228
+
229
+ MRB_API void*
230
+ mrb_malloc(mrb_state *mrb, size_t len)
231
+ {
232
+ return mrb_realloc(mrb, 0, len);
233
+ }
234
+
235
+ MRB_API void*
236
+ mrb_malloc_simple(mrb_state *mrb, size_t len)
237
+ {
238
+ return mrb_realloc_simple(mrb, 0, len);
239
+ }
240
+
241
+ MRB_API void*
242
+ mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)
243
+ {
244
+ void *p;
245
+
246
+ if (nelem == 0 || len == 0) {
247
+ p = NULL;
248
+ }
249
+ else if (nelem <= SIZE_MAX / len) {
250
+ size_t size = nelem * len;
251
+ p = mrb_malloc(mrb, size);
252
+
253
+ memset(p, 0, size);
254
+ }
255
+ else {
256
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "memory allocation overflow");
257
+ }
258
+
259
+ return p;
260
+ }
261
+
262
+ MRB_API void
263
+ mrb_free(mrb_state *mrb, void *p)
264
+ {
265
+ mrb_basic_alloc_func(p, 0);
266
+ }
267
+
268
+ MRB_API void*
269
+ mrb_temp_alloc(mrb_state *mrb, size_t size)
270
+ {
271
+ struct RString *s;
272
+ s = MRB_OBJ_ALLOC(mrb, MRB_TT_STRING, NULL);
273
+ return s->as.heap.ptr = (char*)mrb_malloc(mrb, size);
274
+ }
275
+
276
+ static mrb_bool
277
+ heap_p(mrb_gc *gc, const struct RBasic *object)
278
+ {
279
+ mrb_heap_page* page;
280
+
281
+ page = gc->heaps;
282
+ while (page) {
283
+ RVALUE *p;
284
+
285
+ p = page->objects;
286
+ if ((uintptr_t)object - (uintptr_t)p <= (MRB_HEAP_PAGE_SIZE - 1) * sizeof(RVALUE)) {
287
+ return TRUE;
288
+ }
289
+ page = page->next;
290
+ }
291
+ return FALSE;
292
+ }
293
+
294
+ MRB_API mrb_bool
295
+ mrb_object_dead_p(mrb_state *mrb, struct RBasic *object)
296
+ {
297
+ mrb_gc *gc = &mrb->gc;
298
+ if (!heap_p(gc, object)) return TRUE;
299
+ return is_dead(gc, object);
300
+ }
301
+
302
+ static void
303
+ add_heap(mrb_state *mrb, mrb_gc *gc)
304
+ {
305
+ mrb_heap_page *page = (mrb_heap_page*)mrb_calloc(mrb, 1, sizeof(mrb_heap_page));
306
+ RVALUE *p, *e;
307
+ RVALUE *prev = NULL;
308
+
309
+ for (p = page->objects, e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
310
+ p->as.free.tt = MRB_TT_FREE;
311
+ p->as.free.next = prev;
312
+ prev = p;
313
+ }
314
+ page->freelist = prev;
315
+
316
+ page->next = gc->heaps;
317
+ gc->heaps = page;
318
+
319
+ page->free_next = gc->free_heaps;
320
+ gc->free_heaps = page;
321
+ }
322
+
323
+ #define DEFAULT_GC_INTERVAL_RATIO 200
324
+ #define DEFAULT_GC_STEP_RATIO 200
325
+ #define MAJOR_GC_INC_RATIO 120
326
+ #define MAJOR_GC_TOOMANY 10000
327
+ #define is_generational(gc) ((gc)->generational)
328
+ #define is_major_gc(gc) (is_generational(gc) && (gc)->full)
329
+ #define is_minor_gc(gc) (is_generational(gc) && !(gc)->full)
330
+
331
+ void
332
+ mrb_gc_init(mrb_state *mrb, mrb_gc *gc)
333
+ {
334
+ #ifndef MRB_GC_FIXED_ARENA
335
+ gc->arena = (struct RBasic**)mrb_malloc(mrb, sizeof(struct RBasic*)*MRB_GC_ARENA_SIZE);
336
+ gc->arena_capa = MRB_GC_ARENA_SIZE;
337
+ #endif
338
+
339
+ gc->current_white_part = GC_WHITE_A;
340
+ gc->heaps = NULL;
341
+ gc->free_heaps = NULL;
342
+ add_heap(mrb, gc);
343
+ gc->interval_ratio = DEFAULT_GC_INTERVAL_RATIO;
344
+ gc->step_ratio = DEFAULT_GC_STEP_RATIO;
345
+ #ifndef MRB_GC_TURN_OFF_GENERATIONAL
346
+ gc->generational = TRUE;
347
+ gc->full = TRUE;
348
+ #endif
349
+ }
350
+
351
+ static void obj_free(mrb_state *mrb, struct RBasic *obj, mrb_bool end);
352
+
353
+ static void
354
+ free_heap(mrb_state *mrb, mrb_gc *gc)
355
+ {
356
+ mrb_heap_page *page = gc->heaps;
357
+ mrb_heap_page *tmp;
358
+ RVALUE *p, *e;
359
+
360
+ while (page) {
361
+ tmp = page;
362
+ page = page->next;
363
+ for (p = tmp->objects, e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
364
+ if (p->as.free.tt != MRB_TT_FREE)
365
+ obj_free(mrb, &p->as.basic, TRUE);
366
+ }
367
+ mrb_free(mrb, tmp);
368
+ }
369
+ }
370
+
371
+ void
372
+ mrb_gc_destroy(mrb_state *mrb, mrb_gc *gc)
373
+ {
374
+ free_heap(mrb, gc);
375
+ #ifndef MRB_GC_FIXED_ARENA
376
+ mrb_free(mrb, gc->arena);
377
+ #endif
378
+ }
379
+
380
+ static void
381
+ gc_arena_keep(mrb_state *mrb, mrb_gc *gc)
382
+ {
383
+ #ifdef MRB_GC_FIXED_ARENA
384
+ if (gc->arena_idx >= MRB_GC_ARENA_SIZE) {
385
+ /* arena overflow error */
386
+ gc->arena_idx = MRB_GC_ARENA_SIZE - 4; /* force room in arena */
387
+ mrb_exc_raise(mrb, mrb_obj_value(mrb->arena_err));
388
+ }
389
+ #else
390
+ if (gc->arena_idx >= gc->arena_capa) {
391
+ /* extend arena */
392
+ int newcapa = gc->arena_capa * 3 / 2;
393
+ gc->arena = (struct RBasic**)mrb_realloc(mrb, gc->arena, sizeof(struct RBasic*)*newcapa);
394
+ gc->arena_capa = newcapa;
395
+ }
396
+ #endif
397
+ }
398
+
399
+ static inline void
400
+ gc_protect(mrb_state *mrb, mrb_gc *gc, struct RBasic *p)
401
+ {
402
+ #ifdef MRB_GC_FIXED_ARENA
403
+ mrb_assert(gc->arena_idx < MRB_GC_ARENA_SIZE);
404
+ #else
405
+ mrb_assert(gc->arena_idx < gc->arena_capa);
406
+ #endif
407
+ gc->arena[gc->arena_idx++] = p;
408
+ }
409
+
410
+ /* mrb_gc_protect() leaves the object in the arena */
411
+ MRB_API void
412
+ mrb_gc_protect(mrb_state *mrb, mrb_value obj)
413
+ {
414
+ if (mrb_immediate_p(obj)) return;
415
+ struct RBasic *p = mrb_basic_ptr(obj);
416
+ if (is_red(p)) return;
417
+ gc_arena_keep(mrb, &mrb->gc);
418
+ gc_protect(mrb, &mrb->gc, p);
419
+ }
420
+
421
+ #define GC_ROOT_SYM MRB_SYM(_gc_root_)
422
+
423
+ /* mrb_gc_register() keeps the object from GC.
424
+
425
+ Register your object when it's exported to C world,
426
+ without reference from Ruby world, e.g. callback
427
+ arguments. Don't forget to remove the object using
428
+ mrb_gc_unregister, otherwise your object will leak.
429
+ */
430
+
431
+ MRB_API void
432
+ mrb_gc_register(mrb_state *mrb, mrb_value obj)
433
+ {
434
+ if (mrb_immediate_p(obj)) return;
435
+ mrb_value table = mrb_gv_get(mrb, GC_ROOT_SYM);
436
+ int ai = mrb_gc_arena_save(mrb);
437
+ mrb_gc_protect(mrb, obj);
438
+ if (!mrb_array_p(table)) {
439
+ table = mrb_ary_new(mrb);
440
+ mrb_obj_ptr(table)->c = NULL; /* hide from ObjectSpace.each_object */
441
+ mrb_gv_set(mrb, GC_ROOT_SYM, table);
442
+ }
443
+ mrb_ary_push(mrb, table, obj);
444
+ mrb_gc_arena_restore(mrb, ai);
445
+ }
446
+
447
+ /* mrb_gc_unregister() removes the object from GC root. */
448
+ MRB_API void
449
+ mrb_gc_unregister(mrb_state *mrb, mrb_value obj)
450
+ {
451
+ if (mrb_immediate_p(obj)) return;
452
+ mrb_value table = mrb_gv_get(mrb, GC_ROOT_SYM);
453
+ if (!mrb_array_p(table)) return;
454
+ struct RArray *a = mrb_ary_ptr(table);
455
+ mrb_ary_modify(mrb, a);
456
+ mrb_int len = ARY_LEN(a)-1;
457
+ mrb_value *ptr = ARY_PTR(a);
458
+ for (mrb_int i = 0; i <= len; i++) {
459
+ if (mrb_ptr(ptr[i]) == mrb_ptr(obj)) {
460
+ ARY_SET_LEN(a, len);
461
+ memmove(&ptr[i], &ptr[i + 1], (len - i) * sizeof(mrb_value));
462
+ break;
463
+ }
464
+ }
465
+ }
466
+
467
+ MRB_API struct RBasic*
468
+ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
469
+ {
470
+ static const RVALUE RVALUE_zero = { { { NULL, MRB_TT_FALSE } } };
471
+ mrb_gc *gc = &mrb->gc;
472
+
473
+ if (cls) {
474
+ enum mrb_vtype tt;
475
+
476
+ switch (cls->tt) {
477
+ case MRB_TT_CLASS:
478
+ case MRB_TT_SCLASS:
479
+ case MRB_TT_MODULE:
480
+ case MRB_TT_ENV:
481
+ break;
482
+ default:
483
+ mrb_raise(mrb, E_TYPE_ERROR, "allocation failure");
484
+ }
485
+ tt = MRB_INSTANCE_TT(cls);
486
+ if (ttype != MRB_TT_SCLASS &&
487
+ ttype != MRB_TT_ICLASS &&
488
+ ttype != MRB_TT_ENV &&
489
+ ttype != MRB_TT_BIGINT &&
490
+ ttype != tt &&
491
+ !(cls == mrb->object_class && (ttype == MRB_TT_CPTR || ttype == MRB_TT_CDATA || ttype == MRB_TT_ISTRUCT))) {
492
+ mrb_raisef(mrb, E_TYPE_ERROR, "allocation failure of %C", cls);
493
+ }
494
+ }
495
+ if (ttype <= MRB_TT_FREE) {
496
+ mrb_raisef(mrb, E_TYPE_ERROR, "allocation failure of %C (type %d)", cls, (int)ttype);
497
+ }
498
+
499
+ #ifdef MRB_GC_STRESS
500
+ mrb_full_gc(mrb);
501
+ #endif
502
+ if (gc->threshold < gc->live) {
503
+ mrb_incremental_gc(mrb);
504
+ }
505
+ gc_arena_keep(mrb, gc);
506
+ if (gc->free_heaps == NULL) {
507
+ add_heap(mrb, gc);
508
+ }
509
+
510
+ RVALUE *p = gc->free_heaps->freelist;
511
+ gc->free_heaps->freelist = p->as.free.next;
512
+ if (gc->free_heaps->freelist == NULL) {
513
+ gc->free_heaps = gc->free_heaps->free_next;
514
+ }
515
+
516
+ gc->live++;
517
+ gc_protect(mrb, gc, &p->as.basic);
518
+ *p = RVALUE_zero;
519
+ p->as.basic.tt = ttype;
520
+ p->as.basic.c = cls;
521
+ paint_partial_white(gc, &p->as.basic);
522
+ return &p->as.basic;
523
+ }
524
+
525
+ static inline void
526
+ add_gray_list(mrb_gc *gc, struct RBasic *obj)
527
+ {
528
+ #ifdef MRB_GC_STRESS
529
+ if (obj->tt > MRB_TT_MAXDEFINE) {
530
+ abort();
531
+ }
532
+ #endif
533
+ paint_gray(obj);
534
+ if (gc->gray_stack_top < MRB_GRAY_STACK_SIZE) {
535
+ gc->gray_stack[gc->gray_stack_top++] = obj;
536
+ }
537
+ else {
538
+ gc->gray_overflow = TRUE;
539
+ }
540
+ }
541
+
542
+ static void
543
+ mark_context_stack(mrb_state *mrb, struct mrb_context *c)
544
+ {
545
+ size_t i, e;
546
+
547
+ if (c->stbase == NULL) return;
548
+ if (c->ci) {
549
+ e = (c->ci->stack ? c->ci->stack - c->stbase : 0);
550
+ e += mrb_ci_nregs(c->ci);
551
+ }
552
+ else {
553
+ e = 0;
554
+ }
555
+ if (c->stbase + e > c->stend) e = c->stend - c->stbase;
556
+ for (i=0; i<e; i++) {
557
+ mrb_value v = c->stbase[i];
558
+
559
+ if (!mrb_immediate_p(v)) {
560
+ mrb_gc_mark(mrb, mrb_basic_ptr(v));
561
+ }
562
+ }
563
+ e = c->stend - c->stbase;
564
+ for (; i<e; i++) {
565
+ SET_NIL_VALUE(c->stbase[i]);
566
+ }
567
+ }
568
+
569
+ static void
570
+ mark_context(mrb_state *mrb, struct mrb_context *c)
571
+ {
572
+ mrb_callinfo *ci;
573
+
574
+ start:
575
+ if (c->status == MRB_FIBER_TERMINATED) return;
576
+
577
+ /* mark VM stack */
578
+ mark_context_stack(mrb, c);
579
+
580
+ /* mark call stack */
581
+ if (c->cibase) {
582
+ for (ci = c->cibase; ci <= c->ci; ci++) {
583
+ mrb_gc_mark(mrb, (struct RBasic*)ci->proc);
584
+ mrb_gc_mark(mrb, (struct RBasic*)ci->u.target_class);
585
+ }
586
+ }
587
+ /* mark fibers */
588
+ mrb_gc_mark(mrb, (struct RBasic*)c->fib);
589
+ if (c->prev) {
590
+ c = c->prev;
591
+ goto start;
592
+ }
593
+ }
594
+
595
+ static size_t
596
+ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj)
597
+ {
598
+ size_t children = 0;
599
+
600
+ mrb_assert(is_gray(obj));
601
+ paint_black(obj);
602
+ mrb_gc_mark(mrb, (struct RBasic*)obj->c);
603
+ switch (obj->tt) {
604
+ case MRB_TT_ICLASS:
605
+ {
606
+ struct RClass *c = (struct RClass*)obj;
607
+ if (MRB_FLAG_TEST(c, MRB_FL_CLASS_IS_ORIGIN)) {
608
+ children += mrb_gc_mark_mt(mrb, c);
609
+ }
610
+ mrb_gc_mark(mrb, (struct RBasic*)((struct RClass*)obj)->super);
611
+ children++;
612
+ }
613
+ break;
614
+
615
+ case MRB_TT_CLASS:
616
+ case MRB_TT_MODULE:
617
+ case MRB_TT_SCLASS:
618
+ {
619
+ struct RClass *c = (struct RClass*)obj;
620
+
621
+ mrb_gc_mark_mt(mrb, c);
622
+ mrb_gc_mark(mrb, (struct RBasic*)c->super);
623
+ children += mrb_gc_mark_mt(mrb, c);
624
+ children++;
625
+ }
626
+ /* fall through */
627
+
628
+ case MRB_TT_OBJECT:
629
+ case MRB_TT_CDATA:
630
+ children += mrb_gc_mark_iv(mrb, (struct RObject*)obj);
631
+ break;
632
+
633
+ case MRB_TT_PROC:
634
+ {
635
+ struct RProc *p = (struct RProc*)obj;
636
+
637
+ mrb_gc_mark(mrb, (struct RBasic*)p->upper);
638
+ mrb_gc_mark(mrb, (struct RBasic*)p->e.env);
639
+ children+=2;
640
+ }
641
+ break;
642
+
643
+ case MRB_TT_ENV:
644
+ {
645
+ struct REnv *e = (struct REnv*)obj;
646
+
647
+ // The data stack must always be protected from GC regardless of the MRB_ENV_CLOSE flag.
648
+ // This is because the data stack is not protected if the fiber is GC'd.
649
+ mrb_int len = MRB_ENV_LEN(e);
650
+ for (mrb_int i=0; i<len; i++) {
651
+ mrb_gc_mark_value(mrb, e->stack[i]);
652
+ }
653
+ children += len;
654
+ }
655
+ break;
656
+
657
+ case MRB_TT_FIBER:
658
+ {
659
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
660
+
661
+ if (!c || c->status == MRB_FIBER_TERMINATED) break;
662
+ mark_context(mrb, c);
663
+ if (!c->ci) break;
664
+
665
+ /* mark stack */
666
+ size_t i = c->ci->stack - c->stbase;
667
+ i += mrb_ci_nregs(c->ci);
668
+ if (c->stbase + i > c->stend) i = c->stend - c->stbase;
669
+ children += i;
670
+
671
+ /* mark closure */
672
+ if (c->cibase) {
673
+ children += c->ci - c->cibase + 1;
674
+ }
675
+ }
676
+ break;
677
+
678
+ case MRB_TT_STRUCT:
679
+ case MRB_TT_ARRAY:
680
+ {
681
+ struct RArray *a = (struct RArray*)obj;
682
+ size_t len = ARY_LEN(a);
683
+ mrb_value *p = ARY_PTR(a);
684
+
685
+ for (size_t i=0; i<len; i++) {
686
+ mrb_gc_mark_value(mrb, p[i]);
687
+ }
688
+ children += len;
689
+ }
690
+ break;
691
+
692
+ case MRB_TT_HASH:
693
+ children += mrb_gc_mark_iv(mrb, (struct RObject*)obj);
694
+ children += mrb_gc_mark_hash(mrb, (struct RHash*)obj);
695
+ break;
696
+
697
+ case MRB_TT_STRING:
698
+ if (RSTR_FSHARED_P(obj)) {
699
+ struct RString *s = (struct RString*)obj;
700
+ mrb_gc_mark(mrb, (struct RBasic*)s->as.heap.aux.fshared);
701
+ }
702
+ break;
703
+
704
+ case MRB_TT_RANGE:
705
+ children += mrb_gc_mark_range(mrb, (struct RRange*)obj);
706
+ break;
707
+
708
+ case MRB_TT_BREAK:
709
+ {
710
+ struct RBreak *brk = (struct RBreak*)obj;
711
+ mrb_gc_mark_value(mrb, mrb_break_value_get(brk));
712
+ children++;
713
+ }
714
+ break;
715
+
716
+ case MRB_TT_EXCEPTION:
717
+ children += mrb_gc_mark_iv(mrb, (struct RObject*)obj);
718
+ if (((struct RException*)obj)->mesg) {
719
+ mrb_gc_mark(mrb, (struct RBasic*)((struct RException*)obj)->mesg);
720
+ children++;
721
+ }
722
+ if (((struct RException*)obj)->backtrace) {
723
+ mrb_gc_mark(mrb, (struct RBasic*)((struct RException*)obj)->backtrace);
724
+ children++;
725
+ }
726
+ break;
727
+
728
+ case MRB_TT_BACKTRACE:
729
+ children += ((struct RBacktrace*)obj)->len;
730
+ break;
731
+
732
+ #if defined(MRB_USE_RATIONAL) && defined(MRB_USE_BIGINT)
733
+ case MRB_TT_RATIONAL:
734
+ children += mrb_rational_mark(mrb, obj);
735
+ break;
736
+ #endif
737
+ #ifdef MRB_USE_SET
738
+ case MRB_TT_SET:
739
+ children += mrb_gc_mark_set(mrb, obj);
740
+ break;
741
+ #endif
742
+
743
+ default:
744
+ break;
745
+ }
746
+ return children;
747
+ }
748
+
749
+ MRB_API void
750
+ mrb_gc_mark(mrb_state *mrb, struct RBasic *obj)
751
+ {
752
+ if (obj == 0) return;
753
+ if (!is_white(obj)) return;
754
+ if (is_red(obj)) return;
755
+ mrb_assert((obj)->tt != MRB_TT_FREE);
756
+ add_gray_list(&mrb->gc, obj);
757
+ }
758
+
759
+ static void
760
+ obj_free(mrb_state *mrb, struct RBasic *obj, mrb_bool end)
761
+ {
762
+ DEBUG(fprintf(stderr, "obj_free(%p,tt=%d)\n",obj,obj->tt));
763
+ switch (obj->tt) {
764
+ case MRB_TT_OBJECT:
765
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
766
+ break;
767
+
768
+ case MRB_TT_EXCEPTION:
769
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
770
+ break;
771
+
772
+ case MRB_TT_CLASS:
773
+ case MRB_TT_MODULE:
774
+ case MRB_TT_SCLASS:
775
+ mrb_gc_free_mt(mrb, (struct RClass*)obj);
776
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
777
+ if (!end)
778
+ mrb_mc_clear_by_class(mrb, (struct RClass*)obj);
779
+ break;
780
+ case MRB_TT_ICLASS:
781
+ if (MRB_FLAG_TEST(obj, MRB_FL_CLASS_IS_ORIGIN))
782
+ mrb_gc_free_mt(mrb, (struct RClass*)obj);
783
+ if (!end)
784
+ mrb_mc_clear_by_class(mrb, (struct RClass*)obj);
785
+ break;
786
+ case MRB_TT_ENV:
787
+ {
788
+ struct REnv *e = (struct REnv*)obj;
789
+
790
+ if (!MRB_ENV_ONSTACK_P(e)) {
791
+ mrb_free(mrb, e->stack);
792
+ }
793
+ }
794
+ break;
795
+
796
+ case MRB_TT_FIBER:
797
+ {
798
+ struct mrb_context *c = ((struct RFiber*)obj)->cxt;
799
+
800
+ if (c && c != mrb->root_c) {
801
+ if (!end && c->status != MRB_FIBER_TERMINATED) {
802
+ mrb_callinfo *ci = c->ci;
803
+ mrb_callinfo *ce = c->cibase;
804
+
805
+ while (ce <= ci) {
806
+ struct REnv *e = ci->u.env;
807
+ if (e && heap_p(&mrb->gc, (struct RBasic*)e) && !is_dead(&mrb->gc, (struct RBasic*)e) &&
808
+ e->tt == MRB_TT_ENV && MRB_ENV_ONSTACK_P(e)) {
809
+ mrb_env_unshare(mrb, e, TRUE);
810
+ }
811
+ ci--;
812
+ }
813
+ }
814
+ mrb_free_context(mrb, c);
815
+ }
816
+ }
817
+ break;
818
+
819
+ case MRB_TT_STRUCT:
820
+ case MRB_TT_ARRAY:
821
+ if (ARY_SHARED_P(obj))
822
+ mrb_ary_decref(mrb, ((struct RArray*)obj)->as.heap.aux.shared);
823
+ else if (!ARY_EMBED_P(obj))
824
+ mrb_free(mrb, ((struct RArray*)obj)->as.heap.ptr);
825
+ break;
826
+
827
+ case MRB_TT_HASH:
828
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
829
+ mrb_gc_free_hash(mrb, (struct RHash*)obj);
830
+ break;
831
+
832
+ case MRB_TT_STRING:
833
+ mrb_gc_free_str(mrb, (struct RString*)obj);
834
+ break;
835
+
836
+ case MRB_TT_PROC:
837
+ {
838
+ struct RProc *p = (struct RProc*)obj;
839
+
840
+ if (!MRB_PROC_CFUNC_P(p) && !MRB_PROC_ALIAS_P(p) && p->body.irep) {
841
+ mrb_irep *irep = (mrb_irep*)p->body.irep;
842
+ if (end) {
843
+ mrb_irep_cutref(mrb, irep);
844
+ }
845
+ mrb_irep_decref(mrb, irep);
846
+ }
847
+ }
848
+ break;
849
+
850
+ case MRB_TT_RANGE:
851
+ mrb_gc_free_range(mrb, ((struct RRange*)obj));
852
+ break;
853
+
854
+ #ifdef MRB_USE_SET
855
+ case MRB_TT_SET:
856
+ mrb_gc_free_set(mrb, obj);
857
+ break;
858
+ #endif
859
+
860
+ case MRB_TT_CDATA:
861
+ {
862
+ struct RData *d = (struct RData*)obj;
863
+ if (d->type && d->type->dfree) {
864
+ d->type->dfree(mrb, d->data);
865
+ }
866
+ mrb_gc_free_iv(mrb, (struct RObject*)obj);
867
+ }
868
+ break;
869
+
870
+ #if defined(MRB_USE_RATIONAL) && defined(MRB_INT64) && defined(MRB_32BIT)
871
+ case MRB_TT_RATIONAL:
872
+ {
873
+ struct RData *o = (struct RData*)obj;
874
+ mrb_free(mrb, o->iv);
875
+ }
876
+ break;
877
+ #endif
878
+
879
+ #if defined(MRB_USE_COMPLEX) && defined(MRB_32BIT) && !defined(MRB_USE_FLOAT32)
880
+ case MRB_TT_COMPLEX:
881
+ {
882
+ struct RData *o = (struct RData*)obj;
883
+ mrb_free(mrb, o->iv);
884
+ }
885
+ break;
886
+ #endif
887
+
888
+ #ifdef MRB_USE_BIGINT
889
+ case MRB_TT_BIGINT:
890
+ mrb_gc_free_bint(mrb, obj);
891
+ break;
892
+ #endif
893
+
894
+ case MRB_TT_BACKTRACE:
895
+ {
896
+ struct RBacktrace *bt = (struct RBacktrace*)obj;
897
+ for (size_t i = 0; i < bt->len; i++) {
898
+ const mrb_irep *irep = bt->locations[i].irep;
899
+ if (irep == NULL) continue;
900
+ mrb_irep_decref(mrb, (mrb_irep*)irep);
901
+ }
902
+ mrb_free(mrb, bt->locations);
903
+ }
904
+
905
+ default:
906
+ break;
907
+ }
908
+ #if defined(MRB_GC_STRESS) && defined(MRB_DEBUG)
909
+ memset(obj, -1, sizeof(RVALUE));
910
+ paint_white(obj);
911
+ #endif
912
+ obj->tt = MRB_TT_FREE;
913
+ }
914
+
915
+ static void
916
+ root_scan_phase(mrb_state *mrb, mrb_gc *gc)
917
+ {
918
+ int i, e;
919
+
920
+ if (!is_minor_gc(gc)) {
921
+ gc->gray_stack_top = 0;
922
+ gc->gray_overflow = FALSE;
923
+ }
924
+
925
+ mrb_gc_mark_gv(mrb);
926
+ /* mark arena */
927
+ for (i=0,e=gc->arena_idx; i<e; i++) {
928
+ mrb_gc_mark(mrb, gc->arena[i]);
929
+ }
930
+ /* mark class hierarchy */
931
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->object_class);
932
+
933
+ /* mark built-in classes */
934
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->class_class);
935
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->module_class);
936
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->proc_class);
937
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->string_class);
938
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->array_class);
939
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->hash_class);
940
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->range_class);
941
+
942
+ #ifndef MRB_NO_FLOAT
943
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->float_class);
944
+ #endif
945
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->integer_class);
946
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->true_class);
947
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->false_class);
948
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->nil_class);
949
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->symbol_class);
950
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->kernel_module);
951
+
952
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->eException_class);
953
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->eStandardError_class);
954
+
955
+ /* mark top_self */
956
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->top_self);
957
+ /* mark exception */
958
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
959
+
960
+ mark_context(mrb, mrb->c);
961
+ if (mrb->root_c != mrb->c) {
962
+ mark_context(mrb, mrb->root_c);
963
+ }
964
+
965
+ #ifdef MRB_USE_TASK_SCHEDULER
966
+ /* mark tasks - calls into task.c to mark all task queues */
967
+ mrb_task_mark_all(mrb);
968
+ #endif
969
+ }
970
+
971
+ static void
972
+ gc_gray_rescan(mrb_state *mrb, mrb_gc *gc)
973
+ {
974
+ mrb_heap_page *page = gc->heaps;
975
+
976
+ gc->gray_overflow = FALSE;
977
+ while (page) {
978
+ RVALUE *p = page->objects;
979
+ RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
980
+ for (; p < e; p++) {
981
+ if (is_gray(&p->as.basic) && p->as.basic.tt != MRB_TT_FREE) {
982
+ if (gc->gray_stack_top >= MRB_GRAY_STACK_SIZE) {
983
+ gc->gray_overflow = TRUE;
984
+ return;
985
+ }
986
+ gc->gray_stack[gc->gray_stack_top++] = &p->as.basic;
987
+ }
988
+ }
989
+ page = page->next;
990
+ }
991
+ }
992
+
993
+ static void
994
+ gc_mark_gray_list(mrb_state *mrb, mrb_gc *gc) {
995
+ for (;;) {
996
+ while (gc->gray_stack_top > 0) {
997
+ struct RBasic *obj = gc->gray_stack[--gc->gray_stack_top];
998
+ gc_mark_children(mrb, gc, obj);
999
+ }
1000
+ if (!gc->gray_overflow) break;
1001
+ gc_gray_rescan(mrb, gc);
1002
+ }
1003
+ }
1004
+
1005
+ static size_t
1006
+ incremental_marking_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
1007
+ {
1008
+ size_t tried_marks = 0;
1009
+
1010
+ while (tried_marks < limit) {
1011
+ if (gc->gray_stack_top > 0) {
1012
+ struct RBasic *obj = gc->gray_stack[--gc->gray_stack_top];
1013
+ tried_marks += gc_mark_children(mrb, gc, obj);
1014
+ }
1015
+ else if (gc->gray_overflow) {
1016
+ gc_gray_rescan(mrb, gc);
1017
+ if (gc->gray_stack_top == 0) break;
1018
+ }
1019
+ else {
1020
+ break;
1021
+ }
1022
+ }
1023
+
1024
+ return tried_marks;
1025
+ }
1026
+
1027
+ static void
1028
+ clear_error_object(mrb_state *mrb, struct RObject *obj)
1029
+ {
1030
+ if (obj == 0) return;
1031
+ if (!is_white(obj)) return;
1032
+ paint_black(obj);
1033
+ mrb_gc_mark(mrb, (struct RBasic*)obj->c);
1034
+ mrb_gc_free_iv(mrb, obj);
1035
+ struct RException *err = (struct RException*)obj;
1036
+ err->iv = NULL;
1037
+ err->mesg = NULL;
1038
+ err->backtrace = NULL;
1039
+ }
1040
+
1041
+ static void
1042
+ final_marking_phase(mrb_state *mrb, mrb_gc *gc)
1043
+ {
1044
+ int i, e;
1045
+
1046
+ /* mark arena */
1047
+ for (i=0,e=gc->arena_idx; i<e; i++) {
1048
+ mrb_gc_mark(mrb, gc->arena[i]);
1049
+ }
1050
+ mrb_gc_mark_gv(mrb);
1051
+ mark_context(mrb, mrb->c);
1052
+ if (mrb->c != mrb->root_c) {
1053
+ mark_context(mrb, mrb->root_c);
1054
+ }
1055
+ mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
1056
+
1057
+ /* mark pre-allocated exception */
1058
+ clear_error_object(mrb, mrb->nomem_err);
1059
+ clear_error_object(mrb, mrb->stack_err);
1060
+ #ifdef MRB_GC_FIXED_ARENA
1061
+ clear_error_object(mrb, mrb->arena_err);
1062
+ #endif
1063
+
1064
+ gc_mark_gray_list(mrb, gc);
1065
+ }
1066
+
1067
+ static void
1068
+ prepare_incremental_sweep(mrb_state *mrb, mrb_gc *gc)
1069
+ {
1070
+ // mrb_assert(gc->gray_stack_top == 0);
1071
+ gc->state = MRB_GC_STATE_SWEEP;
1072
+ gc->sweeps = NULL;
1073
+ gc->live_after_mark = gc->live;
1074
+ }
1075
+
1076
+ static size_t
1077
+ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
1078
+ {
1079
+ mrb_heap_page *prev = gc->sweeps;
1080
+ mrb_heap_page *page = prev ? prev->next : gc->heaps;
1081
+ size_t tried_sweep = 0;
1082
+
1083
+ while (page && (tried_sweep < limit)) {
1084
+ RVALUE *p = page->objects;
1085
+ RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
1086
+ size_t freed = 0;
1087
+ mrb_bool dead_slot = TRUE;
1088
+
1089
+ if (is_minor_gc(gc) && page->old) {
1090
+ /* skip a slot which doesn't contain any young object */
1091
+ p = e;
1092
+ dead_slot = FALSE;
1093
+ }
1094
+ while (p<e) {
1095
+ if (is_dead(gc, &p->as.basic)) {
1096
+ if (p->as.basic.tt != MRB_TT_FREE) {
1097
+ obj_free(mrb, &p->as.basic, FALSE);
1098
+ if (p->as.basic.tt == MRB_TT_FREE) {
1099
+ p->as.free.next = page->freelist;
1100
+ page->freelist = p;
1101
+ freed++;
1102
+ }
1103
+ else {
1104
+ dead_slot = FALSE;
1105
+ }
1106
+ }
1107
+ }
1108
+ else {
1109
+ if (!is_generational(gc))
1110
+ paint_partial_white(gc, &p->as.basic); /* next gc target */
1111
+ dead_slot = FALSE;
1112
+ }
1113
+ p++;
1114
+ }
1115
+
1116
+ /* free dead slot */
1117
+ if (dead_slot) {
1118
+ mrb_heap_page *next = page->next;
1119
+
1120
+ if (prev) prev->next = next;
1121
+ if (gc->heaps == page)
1122
+ gc->heaps = page->next;
1123
+
1124
+ mrb_free(mrb, page);
1125
+ page = next;
1126
+ }
1127
+ else {
1128
+ if (page->freelist == NULL && is_minor_gc(gc))
1129
+ page->old = TRUE;
1130
+ else
1131
+ page->old = FALSE;
1132
+ prev = page;
1133
+ page = page->next;
1134
+ }
1135
+ tried_sweep += MRB_HEAP_PAGE_SIZE;
1136
+ gc->live -= freed;
1137
+ gc->live_after_mark -= freed;
1138
+ }
1139
+ gc->sweeps = prev;
1140
+
1141
+ /* rebuild free_heaps link */
1142
+ gc->free_heaps = NULL;
1143
+ for (mrb_heap_page *p = gc->heaps; p; p=p->next) {
1144
+ if (p->freelist) {
1145
+ p->free_next = gc->free_heaps;
1146
+ gc->free_heaps = p;
1147
+ }
1148
+ }
1149
+
1150
+ return tried_sweep;
1151
+ }
1152
+
1153
+ static size_t
1154
+ incremental_gc(mrb_state *mrb, mrb_gc *gc, size_t limit)
1155
+ {
1156
+ switch (gc->state) {
1157
+ case MRB_GC_STATE_ROOT:
1158
+ root_scan_phase(mrb, gc);
1159
+ gc->state = MRB_GC_STATE_MARK;
1160
+ flip_white_part(gc);
1161
+ return 0;
1162
+ case MRB_GC_STATE_MARK:
1163
+ if (gc->gray_stack_top > 0 || gc->gray_overflow) {
1164
+ return incremental_marking_phase(mrb, gc, limit);
1165
+ }
1166
+ else {
1167
+ final_marking_phase(mrb, gc);
1168
+ prepare_incremental_sweep(mrb, gc);
1169
+ return 0;
1170
+ }
1171
+ case MRB_GC_STATE_SWEEP: {
1172
+ size_t tried_sweep = 0;
1173
+ tried_sweep = incremental_sweep_phase(mrb, gc, limit);
1174
+ if (tried_sweep == 0)
1175
+ gc->state = MRB_GC_STATE_ROOT;
1176
+ return tried_sweep;
1177
+ }
1178
+ default:
1179
+ /* unknown state */
1180
+ mrb_assert(0);
1181
+ return 0;
1182
+ }
1183
+ }
1184
+
1185
+ static void
1186
+ incremental_gc_finish(mrb_state *mrb, mrb_gc *gc)
1187
+ {
1188
+ do {
1189
+ incremental_gc(mrb, gc, SIZE_MAX);
1190
+ } while (gc->state != MRB_GC_STATE_ROOT);
1191
+ }
1192
+
1193
+ static void
1194
+ incremental_gc_step(mrb_state *mrb, mrb_gc *gc)
1195
+ {
1196
+ size_t limit = 0, result = 0;
1197
+ limit = (GC_STEP_SIZE/100) * gc->step_ratio;
1198
+ while (result < limit) {
1199
+ result += incremental_gc(mrb, gc, limit);
1200
+ if (gc->state == MRB_GC_STATE_ROOT)
1201
+ break;
1202
+ }
1203
+
1204
+ gc->threshold = gc->live + GC_STEP_SIZE;
1205
+ }
1206
+
1207
+ static void
1208
+ clear_all_old(mrb_state *mrb, mrb_gc *gc)
1209
+ {
1210
+ mrb_assert(is_generational(gc));
1211
+ if (gc->full) {
1212
+ /* finish the half baked GC */
1213
+ incremental_gc_finish(mrb, gc);
1214
+ }
1215
+ /* Sweep the dead objects, then reset all the live objects
1216
+ * (including all the old objects, of course) to white. */
1217
+ gc->generational = FALSE;
1218
+ prepare_incremental_sweep(mrb, gc);
1219
+ incremental_gc_finish(mrb, gc);
1220
+ gc->generational = TRUE;
1221
+ /* The gray objects have already been painted as white */
1222
+ gc->gray_stack_top = 0;
1223
+ gc->gray_overflow = FALSE;
1224
+ }
1225
+
1226
+ MRB_API void
1227
+ mrb_incremental_gc(mrb_state *mrb)
1228
+ {
1229
+ mrb_gc *gc = &mrb->gc;
1230
+
1231
+ if (gc->disabled || gc->iterating) return;
1232
+
1233
+ if (is_minor_gc(gc)) {
1234
+ incremental_gc_finish(mrb, gc);
1235
+ }
1236
+ else {
1237
+ incremental_gc_step(mrb, gc);
1238
+ }
1239
+
1240
+ if (gc->state == MRB_GC_STATE_ROOT) {
1241
+ mrb_assert(gc->live >= gc->live_after_mark);
1242
+ gc->threshold = (gc->live_after_mark/100) * gc->interval_ratio;
1243
+ if (gc->threshold < GC_STEP_SIZE) {
1244
+ gc->threshold = GC_STEP_SIZE;
1245
+ }
1246
+
1247
+ if (is_major_gc(gc)) {
1248
+ size_t threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO;
1249
+
1250
+ gc->full = FALSE;
1251
+ if (threshold < MAJOR_GC_TOOMANY) {
1252
+ gc->oldgen_threshold = threshold;
1253
+ }
1254
+ else {
1255
+ /* too many objects allocated during incremental GC, */
1256
+ /* instead of increasing threshold, invoke full GC. */
1257
+ mrb_full_gc(mrb);
1258
+ }
1259
+ }
1260
+ else if (is_minor_gc(gc) && gc->live > gc->oldgen_threshold) {
1261
+ clear_all_old(mrb, gc);
1262
+ gc->full = TRUE;
1263
+ }
1264
+ }
1265
+ }
1266
+
1267
+ /* Perform a full gc cycle */
1268
+ MRB_API void
1269
+ mrb_full_gc(mrb_state *mrb)
1270
+ {
1271
+ mrb_gc *gc = &mrb->gc;
1272
+
1273
+ if (!mrb->c) return;
1274
+ if (gc->disabled || gc->iterating) return;
1275
+
1276
+ if (is_generational(gc)) {
1277
+ /* clear all the old objects back to young */
1278
+ clear_all_old(mrb, gc);
1279
+ gc->full = TRUE;
1280
+ }
1281
+ else if (gc->state != MRB_GC_STATE_ROOT) {
1282
+ /* finish half baked GC cycle */
1283
+ incremental_gc_finish(mrb, gc);
1284
+ }
1285
+
1286
+ incremental_gc_finish(mrb, gc);
1287
+ gc->threshold = (gc->live_after_mark/100) * gc->interval_ratio;
1288
+
1289
+ if (is_generational(gc)) {
1290
+ gc->oldgen_threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO;
1291
+ gc->full = FALSE;
1292
+ }
1293
+
1294
+ #ifdef MRB_USE_MALLOC_TRIM
1295
+ malloc_trim(0);
1296
+ #endif
1297
+ }
1298
+
1299
+ MRB_API void
1300
+ mrb_garbage_collect(mrb_state *mrb)
1301
+ {
1302
+ mrb_full_gc(mrb);
1303
+ }
1304
+
1305
+ /*
1306
+ * Field write barrier
1307
+ * Paint obj(Black) -> value(White) to obj(Black) -> value(Gray).
1308
+ */
1309
+
1310
+ MRB_API void
1311
+ mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value)
1312
+ {
1313
+ mrb_gc *gc = &mrb->gc;
1314
+
1315
+ if (!value) return;
1316
+ if (!is_black(obj)) return;
1317
+ if (!is_white(value)) return;
1318
+ if (is_red(value)) return;
1319
+
1320
+ mrb_assert(gc->state == MRB_GC_STATE_MARK || (!is_dead(gc, value) && !is_dead(gc, obj)));
1321
+ mrb_assert(is_generational(gc) || gc->state != MRB_GC_STATE_ROOT);
1322
+
1323
+ if (is_generational(gc) || gc->state == MRB_GC_STATE_MARK) {
1324
+ add_gray_list(gc, value);
1325
+ }
1326
+ else {
1327
+ mrb_assert(gc->state == MRB_GC_STATE_SWEEP);
1328
+ paint_partial_white(gc, obj); /* for never write barriers */
1329
+ }
1330
+ }
1331
+
1332
+ /*
1333
+ * Write barrier
1334
+ * Paint obj(Black) to obj(Gray).
1335
+ *
1336
+ * The object that is painted gray will be traversed atomically in final
1337
+ * mark phase. So you use this write barrier if it's frequency written spot.
1338
+ * e.g. Set element on Array.
1339
+ */
1340
+
1341
+ MRB_API void
1342
+ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj)
1343
+ {
1344
+ mrb_gc *gc = &mrb->gc;
1345
+
1346
+ if (!is_black(obj)) return;
1347
+
1348
+ mrb_assert(!is_dead(gc, obj));
1349
+ mrb_assert(is_generational(gc) || gc->state != MRB_GC_STATE_ROOT);
1350
+ paint_gray(obj);
1351
+ if (gc->gray_stack_top < MRB_GRAY_STACK_SIZE) {
1352
+ gc->gray_stack[gc->gray_stack_top++] = obj;
1353
+ }
1354
+ else {
1355
+ gc->gray_overflow = TRUE;
1356
+ }
1357
+ }
1358
+
1359
+ /*
1360
+ * call-seq:
1361
+ * GC.start -> nil
1362
+ *
1363
+ * Initiates full garbage collection.
1364
+ *
1365
+ */
1366
+
1367
+ static mrb_value
1368
+ gc_start(mrb_state *mrb, mrb_value obj)
1369
+ {
1370
+ mrb_full_gc(mrb);
1371
+ return mrb_nil_value();
1372
+ }
1373
+
1374
+ /*
1375
+ * call-seq:
1376
+ * GC.enable -> true or false
1377
+ *
1378
+ * Enables garbage collection, returning `true` if garbage
1379
+ * collection was previously disabled.
1380
+ *
1381
+ * GC.disable #=> false
1382
+ * GC.enable #=> true
1383
+ * GC.enable #=> false
1384
+ *
1385
+ */
1386
+
1387
+ static mrb_value
1388
+ gc_enable(mrb_state *mrb, mrb_value obj)
1389
+ {
1390
+ mrb_bool old = mrb->gc.disabled;
1391
+
1392
+ mrb->gc.disabled = FALSE;
1393
+
1394
+ return mrb_bool_value(old);
1395
+ }
1396
+
1397
+ /*
1398
+ * call-seq:
1399
+ * GC.disable -> true or false
1400
+ *
1401
+ * Disables garbage collection, returning `true` if garbage
1402
+ * collection was already disabled.
1403
+ *
1404
+ * GC.disable #=> false
1405
+ * GC.disable #=> true
1406
+ *
1407
+ */
1408
+
1409
+ static mrb_value
1410
+ gc_disable(mrb_state *mrb, mrb_value obj)
1411
+ {
1412
+ mrb_bool old = mrb->gc.disabled;
1413
+
1414
+ mrb->gc.disabled = TRUE;
1415
+
1416
+ return mrb_bool_value(old);
1417
+ }
1418
+
1419
+ /*
1420
+ * call-seq:
1421
+ * GC.interval_ratio -> int
1422
+ *
1423
+ * Returns ratio of GC interval. Default value is 200(%).
1424
+ *
1425
+ */
1426
+
1427
+ static mrb_value
1428
+ gc_interval_ratio_get(mrb_state *mrb, mrb_value obj)
1429
+ {
1430
+ return mrb_int_value(mrb, mrb->gc.interval_ratio);
1431
+ }
1432
+
1433
+ /*
1434
+ * call-seq:
1435
+ * GC.interval_ratio = int -> nil
1436
+ *
1437
+ * Updates ratio of GC interval. Default value is 200(%).
1438
+ * GC start as soon as after end all step of GC if you set 100(%).
1439
+ *
1440
+ */
1441
+
1442
+ static mrb_value
1443
+ gc_interval_ratio_set(mrb_state *mrb, mrb_value obj)
1444
+ {
1445
+ mrb_int ratio;
1446
+
1447
+ mrb_get_args(mrb, "i", &ratio);
1448
+ mrb->gc.interval_ratio = (int)ratio;
1449
+ return mrb_nil_value();
1450
+ }
1451
+
1452
+ /*
1453
+ * call-seq:
1454
+ * GC.step_ratio -> int
1455
+ *
1456
+ * Returns step span ratio of Incremental GC. Default value is 200(%).
1457
+ *
1458
+ */
1459
+
1460
+ static mrb_value
1461
+ gc_step_ratio_get(mrb_state *mrb, mrb_value obj)
1462
+ {
1463
+ return mrb_int_value(mrb, mrb->gc.step_ratio);
1464
+ }
1465
+
1466
+ /*
1467
+ * call-seq:
1468
+ * GC.step_ratio = int -> nil
1469
+ *
1470
+ * Updates step span ratio of Incremental GC. Default value is 200(%).
1471
+ * 1 step of incrementalGC becomes long if a rate is big.
1472
+ *
1473
+ */
1474
+
1475
+ static mrb_value
1476
+ gc_step_ratio_set(mrb_state *mrb, mrb_value obj)
1477
+ {
1478
+ mrb_int ratio;
1479
+
1480
+ mrb_get_args(mrb, "i", &ratio);
1481
+ mrb->gc.step_ratio = (int)ratio;
1482
+ return mrb_nil_value();
1483
+ }
1484
+
1485
+ static void
1486
+ change_gen_gc_mode(mrb_state *mrb, mrb_gc *gc, mrb_bool enable)
1487
+ {
1488
+ if (gc->disabled || gc->iterating) {
1489
+ mrb_raise(mrb, E_RUNTIME_ERROR, "generational mode changed when GC disabled");
1490
+ return;
1491
+ }
1492
+ if (is_generational(gc) && !enable) {
1493
+ clear_all_old(mrb, gc);
1494
+ mrb_assert(gc->state == MRB_GC_STATE_ROOT);
1495
+ gc->full = FALSE;
1496
+ }
1497
+ else if (!is_generational(gc) && enable) {
1498
+ incremental_gc_finish(mrb, gc);
1499
+ gc->oldgen_threshold = gc->live_after_mark/100 * MAJOR_GC_INC_RATIO;
1500
+ gc->full = FALSE;
1501
+ }
1502
+ gc->generational = enable;
1503
+ }
1504
+
1505
+ /*
1506
+ * call-seq:
1507
+ * GC.generational_mode -> true or false
1508
+ *
1509
+ * Returns generational or normal gc mode.
1510
+ *
1511
+ */
1512
+
1513
+ static mrb_value
1514
+ gc_generational_mode_get(mrb_state *mrb, mrb_value self)
1515
+ {
1516
+ return mrb_bool_value(mrb->gc.generational);
1517
+ }
1518
+
1519
+ /*
1520
+ * call-seq:
1521
+ * GC.generational_mode = true or false -> true or false
1522
+ *
1523
+ * Changes to generational or normal gc mode.
1524
+ *
1525
+ */
1526
+
1527
+ static mrb_value
1528
+ gc_generational_mode_set(mrb_state *mrb, mrb_value self)
1529
+ {
1530
+ mrb_bool enable;
1531
+
1532
+ mrb_get_args(mrb, "b", &enable);
1533
+ if (mrb->gc.generational != enable)
1534
+ change_gen_gc_mode(mrb, &mrb->gc, enable);
1535
+
1536
+ return mrb_bool_value(enable);
1537
+ }
1538
+
1539
+
1540
+ static void
1541
+ gc_each_objects(mrb_state *mrb, mrb_gc *gc, mrb_each_object_callback *callback, void *data)
1542
+ {
1543
+ mrb_heap_page* page;
1544
+
1545
+ page = gc->heaps;
1546
+ while (page != NULL) {
1547
+ RVALUE *p;
1548
+
1549
+ p = page->objects;
1550
+ for (int i=0; i < MRB_HEAP_PAGE_SIZE; i++) {
1551
+ if ((*callback)(mrb, &p[i].as.basic, data) == MRB_EACH_OBJ_BREAK)
1552
+ return;
1553
+ }
1554
+ page = page->next;
1555
+ }
1556
+ }
1557
+
1558
+ void
1559
+ mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
1560
+ {
1561
+ mrb_bool iterating = mrb->gc.iterating;
1562
+
1563
+ mrb_full_gc(mrb);
1564
+ mrb->gc.iterating = TRUE;
1565
+ if (iterating) {
1566
+ gc_each_objects(mrb, &mrb->gc, callback, data);
1567
+ }
1568
+ else {
1569
+ struct mrb_jmpbuf *prev_jmp = mrb->jmp;
1570
+ struct mrb_jmpbuf c_jmp;
1571
+
1572
+ MRB_TRY(&c_jmp) {
1573
+ mrb->jmp = &c_jmp;
1574
+ gc_each_objects(mrb, &mrb->gc, callback, data);
1575
+ mrb->jmp = prev_jmp;
1576
+ mrb->gc.iterating = iterating;
1577
+ } MRB_CATCH(&c_jmp) {
1578
+ mrb->gc.iterating = iterating;
1579
+ mrb->jmp = prev_jmp;
1580
+ MRB_THROW(prev_jmp);
1581
+ } MRB_END_EXC(&c_jmp);
1582
+ }
1583
+ }
1584
+
1585
+ size_t
1586
+ mrb_objspace_page_slot_size(void)
1587
+ {
1588
+ return sizeof(RVALUE);
1589
+ }
1590
+
1591
+
1592
+ void
1593
+ mrb_init_gc(mrb_state *mrb)
1594
+ {
1595
+ struct RClass *gc;
1596
+
1597
+ mrb_static_assert_object_size(RVALUE);
1598
+
1599
+ gc = mrb_define_module_id(mrb, MRB_SYM(GC));
1600
+
1601
+ mrb_define_class_method_id(mrb, gc, MRB_SYM(start), gc_start, MRB_ARGS_NONE());
1602
+ mrb_define_class_method_id(mrb, gc, MRB_SYM(enable), gc_enable, MRB_ARGS_NONE());
1603
+ mrb_define_class_method_id(mrb, gc, MRB_SYM(disable), gc_disable, MRB_ARGS_NONE());
1604
+ mrb_define_class_method_id(mrb, gc, MRB_SYM(interval_ratio), gc_interval_ratio_get, MRB_ARGS_NONE());
1605
+ mrb_define_class_method_id(mrb, gc, MRB_SYM_E(interval_ratio), gc_interval_ratio_set, MRB_ARGS_REQ(1));
1606
+ mrb_define_class_method_id(mrb, gc, MRB_SYM(step_ratio), gc_step_ratio_get, MRB_ARGS_NONE());
1607
+ mrb_define_class_method_id(mrb, gc, MRB_SYM_E(step_ratio), gc_step_ratio_set, MRB_ARGS_REQ(1));
1608
+ mrb_define_class_method_id(mrb, gc, MRB_SYM_E(generational_mode), gc_generational_mode_set, MRB_ARGS_REQ(1));
1609
+ mrb_define_class_method_id(mrb, gc, MRB_SYM(generational_mode), gc_generational_mode_get, MRB_ARGS_NONE());
1610
+ }