webruby 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/rake/mruby.rake +1 -0
  3. data/modules/emscripten/AUTHORS +7 -0
  4. data/modules/emscripten/LICENSE +26 -0
  5. data/modules/emscripten/emcc +58 -20
  6. data/modules/emscripten/emlink.py +2 -265
  7. data/modules/emscripten/emscripten.py +38 -18
  8. data/modules/emscripten/scons-tools/emscripten.py +11 -6
  9. data/modules/emscripten/scons-tools/llvm.py +4 -3
  10. data/modules/emscripten/src/analyzer.js +32 -13
  11. data/modules/emscripten/src/embind/embind.js +13 -13
  12. data/modules/emscripten/src/embind/emval.js +8 -7
  13. data/modules/emscripten/src/intertyper.js +10 -0
  14. data/modules/emscripten/src/jsifier.js +28 -6
  15. data/modules/emscripten/src/library.js +2949 -1322
  16. data/modules/emscripten/src/library_browser.js +27 -23
  17. data/modules/emscripten/src/library_egl.js +7 -2
  18. data/modules/emscripten/src/library_gl.js +15 -2
  19. data/modules/emscripten/src/library_glut.js +1 -1
  20. data/modules/emscripten/src/library_jansson.js +1 -1
  21. data/modules/emscripten/src/library_openal.js +464 -132
  22. data/modules/emscripten/src/library_path.js +134 -0
  23. data/modules/emscripten/src/library_sdl.js +222 -50
  24. data/modules/emscripten/src/modules.js +22 -5
  25. data/modules/emscripten/src/parseTools.js +13 -2
  26. data/modules/emscripten/src/postamble.js +60 -34
  27. data/modules/emscripten/src/preamble.js +67 -18
  28. data/modules/emscripten/src/relooper/Relooper.cpp +1 -1
  29. data/modules/emscripten/src/runtime.js +12 -2
  30. data/modules/emscripten/src/settings.js +869 -826
  31. data/modules/emscripten/src/shell.js +63 -51
  32. data/modules/emscripten/src/utility.js +6 -0
  33. data/modules/emscripten/system/include/bsd/sys/mman.h +1 -1
  34. data/modules/emscripten/system/include/emscripten/bind.h +28 -28
  35. data/modules/emscripten/system/include/libc/math.h +8 -0
  36. data/modules/emscripten/system/include/libc/sys/signal.h +3 -1
  37. data/modules/emscripten/system/include/libc/sys/stat.h +2 -1
  38. data/modules/emscripten/system/include/libc/sys/types.h +4 -0
  39. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +24 -0
  40. data/modules/emscripten/system/include/libcxx/__bit_reference +27 -8
  41. data/modules/emscripten/system/include/libcxx/__config +62 -15
  42. data/modules/emscripten/system/include/libcxx/__debug +5 -1
  43. data/modules/emscripten/system/include/libcxx/__functional_03 +24 -24
  44. data/modules/emscripten/system/include/libcxx/__functional_base +22 -4
  45. data/modules/emscripten/system/include/libcxx/__hash_table +566 -54
  46. data/modules/emscripten/system/include/libcxx/__locale +11 -3
  47. data/modules/emscripten/system/include/libcxx/__split_buffer +6 -6
  48. data/modules/emscripten/system/include/libcxx/__std_stream +58 -30
  49. data/modules/emscripten/system/include/libcxx/__tree +58 -51
  50. data/modules/emscripten/system/include/libcxx/__tuple +9 -9
  51. data/modules/emscripten/system/include/libcxx/algorithm +223 -13
  52. data/modules/emscripten/system/include/libcxx/array +18 -17
  53. data/modules/emscripten/system/include/libcxx/atomic +15 -5
  54. data/modules/emscripten/system/include/libcxx/cctype +2 -2
  55. data/modules/emscripten/system/include/libcxx/chrono +131 -36
  56. data/modules/emscripten/system/include/libcxx/cmath +41 -36
  57. data/modules/emscripten/system/include/libcxx/complex +49 -49
  58. data/modules/emscripten/system/include/libcxx/cstdio +2 -2
  59. data/modules/emscripten/system/include/libcxx/cstdlib +5 -5
  60. data/modules/emscripten/system/include/libcxx/cstring +2 -2
  61. data/modules/emscripten/system/include/libcxx/cwchar +22 -13
  62. data/modules/emscripten/system/include/libcxx/deque +27 -14
  63. data/modules/emscripten/system/include/libcxx/forward_list +36 -35
  64. data/modules/emscripten/system/include/libcxx/fstream +16 -0
  65. data/modules/emscripten/system/include/libcxx/functional +348 -23
  66. data/modules/emscripten/system/include/libcxx/future +66 -0
  67. data/modules/emscripten/system/include/libcxx/ios +27 -0
  68. data/modules/emscripten/system/include/libcxx/istream +2 -4
  69. data/modules/emscripten/system/include/libcxx/iterator +17 -9
  70. data/modules/emscripten/system/include/libcxx/limits +2 -2
  71. data/modules/emscripten/system/include/libcxx/list +165 -105
  72. data/modules/emscripten/system/include/libcxx/locale +154 -43
  73. data/modules/emscripten/system/include/libcxx/map +165 -224
  74. data/modules/emscripten/system/include/libcxx/memory +113 -54
  75. data/modules/emscripten/system/include/libcxx/random +2 -29
  76. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  77. data/modules/emscripten/system/include/libcxx/regex +60 -15
  78. data/modules/emscripten/system/include/libcxx/sstream +124 -40
  79. data/modules/emscripten/system/include/libcxx/string +345 -182
  80. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +3 -3
  81. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -2
  82. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +3 -3
  83. data/modules/emscripten/system/include/libcxx/support/win32/support.h +10 -11
  84. data/modules/emscripten/system/include/libcxx/thread +2 -2
  85. data/modules/emscripten/system/include/libcxx/tuple +134 -65
  86. data/modules/emscripten/system/include/libcxx/type_traits +232 -24
  87. data/modules/emscripten/system/include/libcxx/unordered_map +314 -161
  88. data/modules/emscripten/system/include/libcxx/unordered_set +160 -2
  89. data/modules/emscripten/system/include/libcxx/utility +225 -40
  90. data/modules/emscripten/system/include/libcxx/vector +52 -57
  91. data/modules/emscripten/system/include/net/if.h +20 -1
  92. data/modules/emscripten/system/include/net/netinet/in.h +69 -5
  93. data/modules/emscripten/system/include/netdb.h +36 -0
  94. data/modules/emscripten/system/include/sys/ioctl.h +55 -3
  95. data/modules/emscripten/system/include/sys/select.h +2 -0
  96. data/modules/emscripten/system/include/sys/sendfile.h +16 -0
  97. data/modules/emscripten/system/include/sys/socket.h +181 -35
  98. data/modules/emscripten/system/lib/dlmalloc.c +10 -12
  99. data/modules/emscripten/system/lib/libc/musl/src/stdlib/ecvt.c +19 -0
  100. data/modules/emscripten/system/lib/libc/musl/src/stdlib/fcvt.c +25 -0
  101. data/modules/emscripten/system/lib/libc/musl/src/stdlib/gcvt.c +8 -0
  102. data/modules/emscripten/system/lib/libcextra.symbols +3 -0
  103. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +24 -0
  104. data/modules/emscripten/system/lib/libcxx/debug.cpp +11 -9
  105. data/modules/emscripten/system/lib/libcxx/exception.cpp +9 -0
  106. data/modules/emscripten/system/lib/libcxx/hash.cpp +6 -0
  107. data/modules/emscripten/system/lib/libcxx/iostream.cpp +4 -4
  108. data/modules/emscripten/system/lib/libcxx/locale.cpp +91 -42
  109. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  110. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +1 -1
  111. data/modules/emscripten/system/lib/libcxx/string.cpp +332 -491
  112. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +4 -2
  113. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +140 -41
  114. data/modules/emscripten/system/lib/libcxx/symbols +9 -256
  115. data/modules/emscripten/system/lib/libcxx/system_error.cpp +3 -0
  116. data/modules/emscripten/system/lib/libcxx/thread.cpp +16 -3
  117. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +12 -2
  118. data/modules/emscripten/third_party/stb_image.c +4673 -0
  119. data/modules/emscripten/tools/asm_module.py +273 -0
  120. data/modules/emscripten/tools/exec_llvm.py +2 -2
  121. data/modules/emscripten/tools/file_packager.py +36 -16
  122. data/modules/emscripten/tools/find_bigfuncs.py +9 -9
  123. data/modules/emscripten/tools/js-optimizer.js +485 -131
  124. data/modules/emscripten/tools/js_optimizer.py +22 -15
  125. data/modules/emscripten/tools/merge_asm.py +26 -0
  126. data/modules/emscripten/tools/nativize_llvm.py +2 -2
  127. data/modules/emscripten/tools/settings_template_readonly.py +1 -1
  128. data/modules/emscripten/tools/shared.py +63 -20
  129. data/modules/emscripten/tools/split_asm.py +30 -0
  130. data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +686 -0
  131. data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +263 -0
  132. data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +747 -0
  133. data/modules/emscripten/tools/{test-js-optimizer-asm-outline.js → test-js-optimizer-asm-outline2.js} +1 -1
  134. data/modules/emscripten/tools/test-js-optimizer-asm-outline3-output.js +28 -0
  135. data/modules/emscripten/tools/test-js-optimizer-asm-outline3.js +30 -0
  136. data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +4 -4
  137. data/modules/mruby/AUTHORS +1 -0
  138. data/modules/mruby/README.md +4 -2
  139. data/modules/mruby/build_config.rb +6 -6
  140. data/modules/mruby/doc/mrbgems/README.md +4 -4
  141. data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +1 -1
  142. data/modules/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +1 -1
  143. data/modules/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +1 -1
  144. data/modules/mruby/include/mrbconf.h +3 -0
  145. data/modules/mruby/include/mruby/array.h +2 -2
  146. data/modules/mruby/include/mruby/class.h +4 -4
  147. data/modules/mruby/include/mruby/compile.h +1 -0
  148. data/modules/mruby/include/mruby/data.h +1 -1
  149. data/modules/mruby/include/mruby/hash.h +2 -2
  150. data/modules/mruby/include/mruby/irep.h +3 -2
  151. data/modules/mruby/include/mruby/proc.h +1 -1
  152. data/modules/mruby/include/mruby/range.h +1 -1
  153. data/modules/mruby/include/mruby/string.h +2 -2
  154. data/modules/mruby/include/mruby/value.h +43 -26
  155. data/modules/mruby/include/mruby.h +10 -2
  156. data/modules/mruby/minirake +2 -2
  157. data/modules/mruby/mrbgems/mruby-array-ext/mrbgem.rake +1 -1
  158. data/modules/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +4 -1
  159. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +32 -0
  160. data/modules/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
  161. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +13 -5
  162. data/modules/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +1 -1
  163. data/modules/mruby/mrbgems/mruby-enum-ext/test/enum.rb +10 -11
  164. data/modules/mruby/mrbgems/mruby-eval/mrbgem.rake +1 -1
  165. data/modules/mruby/mrbgems/mruby-exit/mrbgem.rake +4 -0
  166. data/modules/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
  167. data/modules/mruby/mrbgems/mruby-fiber/mrbgem.rake +1 -1
  168. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +4 -2
  169. data/modules/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +1 -1
  170. data/modules/mruby/mrbgems/mruby-hash-ext/test/hash.rb +5 -7
  171. data/modules/mruby/mrbgems/mruby-math/mrbgem.rake +1 -1
  172. data/modules/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +1 -1
  173. data/modules/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +2 -2
  174. data/modules/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -1
  175. data/modules/mruby/mrbgems/mruby-object-ext/src/object.c +3 -3
  176. data/modules/mruby/mrbgems/mruby-object-ext/test/nil.rb +3 -3
  177. data/modules/mruby/mrbgems/mruby-object-ext/test/object.rb +1 -1
  178. data/modules/mruby/mrbgems/mruby-objectspace/mrbgem.rake +1 -1
  179. data/modules/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +36 -37
  180. data/modules/mruby/mrbgems/mruby-print/mrbgem.rake +1 -1
  181. data/modules/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +1 -1
  182. data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.rb +8 -8
  183. data/modules/mruby/mrbgems/mruby-random/mrbgem.rake +1 -1
  184. data/modules/mruby/mrbgems/mruby-range-ext/mrbgem.rake +1 -1
  185. data/modules/mruby/mrbgems/mruby-range-ext/test/range.rb +6 -6
  186. data/modules/mruby/mrbgems/mruby-sprintf/mrbgem.rake +1 -1
  187. data/modules/mruby/mrbgems/mruby-string-ext/mrbgem.rake +1 -1
  188. data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +6 -6
  189. data/modules/mruby/mrbgems/mruby-struct/mrbgem.rake +1 -1
  190. data/modules/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +1 -1
  191. data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +2 -2
  192. data/modules/mruby/mrbgems/mruby-time/mrbgem.rake +1 -1
  193. data/modules/mruby/mrbgems/mruby-time/src/time.c +2 -8
  194. data/modules/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +1 -1
  195. data/modules/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +10 -10
  196. data/modules/mruby/mrblib/class.rb +15 -9
  197. data/modules/mruby/mrblib/string.rb +12 -0
  198. data/modules/mruby/src/array.c +4 -3
  199. data/modules/mruby/src/class.c +13 -8
  200. data/modules/mruby/src/codegen.c +9 -8
  201. data/modules/mruby/src/error.c +7 -5
  202. data/modules/mruby/src/error.h +1 -0
  203. data/modules/mruby/src/etc.c +1 -1
  204. data/modules/mruby/src/gc.c +163 -128
  205. data/modules/mruby/src/kernel.c +43 -15
  206. data/modules/mruby/src/numeric.c +9 -7
  207. data/modules/mruby/src/object.c +1 -1
  208. data/modules/mruby/src/parse.y +37 -19
  209. data/modules/mruby/src/range.c +10 -24
  210. data/modules/mruby/src/state.c +2 -6
  211. data/modules/mruby/src/string.c +0 -9
  212. data/modules/mruby/src/variable.c +2 -2
  213. data/modules/mruby/src/vm.c +12 -6
  214. data/modules/mruby/tasks/mrbgem_spec.rake +7 -0
  215. data/modules/mruby/tasks/mrbgems.rake +2 -1
  216. data/modules/mruby/tasks/mrbgems_test.rake +1 -1
  217. data/modules/mruby/tasks/mruby_build.rake +4 -3
  218. data/modules/mruby/tasks/mruby_build_commands.rake +6 -1
  219. data/modules/mruby/tasks/mruby_build_gem.rake +2 -2
  220. data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
  221. data/modules/mruby/test/assert.rb +2 -2
  222. data/modules/mruby/test/t/argumenterror.rb +3 -3
  223. data/modules/mruby/test/t/array.rb +55 -55
  224. data/modules/mruby/test/t/basicobject.rb +1 -1
  225. data/modules/mruby/test/t/bs_block.rb +12 -12
  226. data/modules/mruby/test/t/class.rb +21 -21
  227. data/modules/mruby/test/t/enumerable.rb +18 -18
  228. data/modules/mruby/test/t/exception.rb +20 -20
  229. data/modules/mruby/test/t/false.rb +3 -3
  230. data/modules/mruby/test/t/float.rb +40 -40
  231. data/modules/mruby/test/t/gc.rb +10 -10
  232. data/modules/mruby/test/t/hash.rb +41 -41
  233. data/modules/mruby/test/t/indexerror.rb +2 -2
  234. data/modules/mruby/test/t/integer.rb +41 -41
  235. data/modules/mruby/test/t/kernel.rb +33 -33
  236. data/modules/mruby/test/t/literals.rb +82 -82
  237. data/modules/mruby/test/t/localjumperror.rb +1 -1
  238. data/modules/mruby/test/t/module.rb +170 -31
  239. data/modules/mruby/test/t/nameerror.rb +5 -5
  240. data/modules/mruby/test/t/nil.rb +2 -2
  241. data/modules/mruby/test/t/nomethoderror.rb +1 -1
  242. data/modules/mruby/test/t/numeric.rb +5 -5
  243. data/modules/mruby/test/t/object.rb +2 -2
  244. data/modules/mruby/test/t/proc.rb +8 -8
  245. data/modules/mruby/test/t/range.rb +9 -9
  246. data/modules/mruby/test/t/rangeerror.rb +2 -2
  247. data/modules/mruby/test/t/runtimeerror.rb +1 -1
  248. data/modules/mruby/test/t/standarderror.rb +2 -2
  249. data/modules/mruby/test/t/string.rb +100 -100
  250. data/modules/mruby/test/t/symbol.rb +5 -5
  251. data/modules/mruby/test/t/syntax.rb +15 -6
  252. data/modules/mruby/test/t/true.rb +3 -3
  253. data/modules/mruby/test/t/typeerror.rb +2 -2
  254. data/modules/mruby/tools/mrbc/mrbc.c +10 -4
  255. data/modules/mruby/travis_config.rb +1 -0
  256. data/scripts/gen_gems_config.rb +5 -1
  257. metadata +19 -4
  258. data/modules/emscripten/tools/test-js-optimizer-asm-outline-output.js +0 -570
@@ -38,18 +38,23 @@
38
38
  * Gray - Marked, But the child objects are unmarked.
39
39
  * Black - Marked, the child objects are also marked.
40
40
 
41
- == Two white part
41
+ == Two White Types
42
42
 
43
- The white has a different part of A and B.
44
- In sweep phase, the sweep target white is either A or B.
45
- The sweep target white is switched just before sweep phase.
46
- e.g. A -> B -> A -> B ...
43
+ There're two white color types in a flip-flop fassion: White-A and White-B,
44
+ which respectively represent the Current White color (the newly allocated
45
+ objects in the current GC cycle) and the Sweep Target White color (the
46
+ dead objects to be swept).
47
47
 
48
- All objects are painted white when allocated.
49
- This white is another the sweep target white.
50
- For example, if the sweep target white is A, it's B.
51
- So objects when allocated in sweep phase will be next sweep phase target.
52
- Therefore, these objects will not be released accidentally in sweep phase.
48
+ A and B will be switched just at the beginning of the next GC cycle. At
49
+ that time, all the dead objects have been swept, while the newly created
50
+ objects in the current GC cycle which finally remains White are now
51
+ regarded as dead objects. Instead of traversing all the White-A objects and
52
+ paint them as White-B, just switch the meaning of White-A and White-B would
53
+ be much cheaper.
54
+
55
+ As a result, the objects we sweep in the current GC cycle are always
56
+ left from the previous GC cycle. This allows us to sweep objects
57
+ incrementally, without the disturbance of the newly created objects.
53
58
 
54
59
  == Execution Timing
55
60
 
@@ -61,7 +66,7 @@
61
66
 
62
67
  For details, see the comments for each function.
63
68
 
64
- = Write Barrier
69
+ == Write Barrier
65
70
 
66
71
  mruby implementer, C extension library writer must write a write
67
72
  barrier when writing a pointer to an object on object's field.
@@ -70,6 +75,23 @@
70
75
  * mrb_field_write_barrier
71
76
  * mrb_write_barrier
72
77
 
78
+ == Generational Mode
79
+
80
+ mruby's GC offers an Generational Mode while re-using the tri-color GC
81
+ infrastructure. It will treat the Black objects as Old objects after each
82
+ sweep phase, instead of paint them to White. The key idea are still same as
83
+ the traditional generational GC:
84
+
85
+ * Minor GC - just traverse the Young objects (Gray objects) in the mark
86
+ phase, then only sweep the newly created objects, and leave
87
+ the Old objects live.
88
+
89
+ * Major GC - same as a full regular GC cycle.
90
+
91
+ the difference between "tranditional" generational GC is that, the major GC
92
+ in mruby is triggered incrementally in a tri-color manner.
93
+
94
+
73
95
  For details, see the comments for each function.
74
96
 
75
97
  */
@@ -138,11 +160,8 @@ gettimeofday_time(void)
138
160
  #endif
139
161
 
140
162
  #ifdef GC_DEBUG
141
- #include <assert.h>
142
- #define gc_assert(expect) assert(expect)
143
163
  #define DEBUG(x) (x)
144
164
  #else
145
- #define gc_assert(expect) ((void)0)
146
165
  #define DEBUG(x)
147
166
  #endif
148
167
 
@@ -156,7 +175,7 @@ mrb_realloc_simple(mrb_state *mrb, void *p, size_t len)
156
175
 
157
176
  p2 = (mrb->allocf)(mrb, p, len, mrb->ud);
158
177
  if (!p2 && len > 0 && mrb->heaps) {
159
- mrb_garbage_collect(mrb);
178
+ mrb_full_gc(mrb);
160
179
  p2 = (mrb->allocf)(mrb, p, len, mrb->ud);
161
180
  }
162
181
 
@@ -212,7 +231,8 @@ mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)
212
231
  if (p) {
213
232
  memset(p, 0, size);
214
233
  }
215
- } else {
234
+ }
235
+ else {
216
236
  p = NULL;
217
237
  }
218
238
 
@@ -317,8 +337,10 @@ mrb_init_heap(mrb_state *mrb)
317
337
  add_heap(mrb);
318
338
  mrb->gc_interval_ratio = DEFAULT_GC_INTERVAL_RATIO;
319
339
  mrb->gc_step_ratio = DEFAULT_GC_STEP_RATIO;
340
+ #ifndef MRB_GC_TURN_OFF_GENERATIONAL
320
341
  mrb->is_generational_gc_mode = TRUE;
321
342
  mrb->gc_full = TRUE;
343
+ #endif
322
344
 
323
345
  #ifdef GC_PROFILE
324
346
  program_invoke_time = gettimeofday_time();
@@ -370,7 +392,7 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
370
392
  static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } };
371
393
 
372
394
  #ifdef MRB_GC_STRESS
373
- mrb_garbage_collect(mrb);
395
+ mrb_full_gc(mrb);
374
396
  #endif
375
397
  if (mrb->gc_threshold < mrb->live) {
376
398
  mrb_incremental_gc(mrb);
@@ -451,7 +473,7 @@ mark_context(mrb_state *mrb, struct mrb_context *c)
451
473
  static void
452
474
  gc_mark_children(mrb_state *mrb, struct RBasic *obj)
453
475
  {
454
- gc_assert(is_gray(obj));
476
+ mrb_assert(is_gray(obj));
455
477
  paint_black(obj);
456
478
  mrb->gray_list = obj->gcnext;
457
479
  mrb_gc_mark(mrb, (struct RBasic*)obj->c);
@@ -548,7 +570,7 @@ mrb_gc_mark(mrb_state *mrb, struct RBasic *obj)
548
570
  {
549
571
  if (obj == 0) return;
550
572
  if (!is_white(obj)) return;
551
- gc_assert((obj)->tt != MRB_TT_FREE);
573
+ mrb_assert((obj)->tt != MRB_TT_FREE);
552
574
  add_gray_list(mrb, obj);
553
575
  }
554
576
 
@@ -644,7 +666,7 @@ root_scan_phase(mrb_state *mrb)
644
666
 
645
667
  if (!is_minor_gc(mrb)) {
646
668
  mrb->gray_list = NULL;
647
- mrb->variable_gray_list = NULL;
669
+ mrb->atomic_gray_list = NULL;
648
670
  }
649
671
 
650
672
  mrb_gc_mark_gv(mrb);
@@ -660,6 +682,10 @@ root_scan_phase(mrb_state *mrb)
660
682
  mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
661
683
 
662
684
  mark_context(mrb, mrb->root_c);
685
+ if (mrb->root_c != mrb->c) {
686
+ mark_context(mrb, mrb->c);
687
+ }
688
+
663
689
  /* mark irep pool */
664
690
  if (mrb->irep) {
665
691
  size_t len = mrb->irep_len;
@@ -754,6 +780,18 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
754
780
  return children;
755
781
  }
756
782
 
783
+
784
+ static void
785
+ gc_mark_gray_list(mrb_state *mrb) {
786
+ while (mrb->gray_list) {
787
+ if (is_gray(mrb->gray_list))
788
+ gc_mark_children(mrb, mrb->gray_list);
789
+ else
790
+ mrb->gray_list = mrb->gray_list->gcnext;
791
+ }
792
+ }
793
+
794
+
757
795
  static size_t
758
796
  incremental_marking_phase(mrb_state *mrb, size_t limit)
759
797
  {
@@ -770,22 +808,12 @@ static void
770
808
  final_marking_phase(mrb_state *mrb)
771
809
  {
772
810
  mark_context_stack(mrb, mrb->root_c);
773
- while (mrb->gray_list) {
774
- if (is_gray(mrb->gray_list))
775
- gc_mark_children(mrb, mrb->gray_list);
776
- else
777
- mrb->gray_list = mrb->gray_list->gcnext;
778
- }
779
- gc_assert(mrb->gray_list == NULL);
780
- mrb->gray_list = mrb->variable_gray_list;
781
- mrb->variable_gray_list = NULL;
782
- while (mrb->gray_list) {
783
- if (is_gray(mrb->gray_list))
784
- gc_mark_children(mrb, mrb->gray_list);
785
- else
786
- mrb->gray_list = mrb->gray_list->gcnext;
787
- }
788
- gc_assert(mrb->gray_list == NULL);
811
+ gc_mark_gray_list(mrb);
812
+ mrb_assert(mrb->gray_list == NULL);
813
+ mrb->gray_list = mrb->atomic_gray_list;
814
+ mrb->atomic_gray_list = NULL;
815
+ gc_mark_gray_list(mrb);
816
+ mrb_assert(mrb->gray_list == NULL);
789
817
  }
790
818
 
791
819
  static void
@@ -885,17 +913,31 @@ incremental_gc(mrb_state *mrb, size_t limit)
885
913
  }
886
914
  default:
887
915
  /* unknown state */
888
- gc_assert(0);
916
+ mrb_assert(0);
889
917
  return 0;
890
918
  }
891
919
  }
892
920
 
893
921
  static void
894
- advance_phase(mrb_state *mrb, enum gc_state to_state)
922
+ incremental_gc_until(mrb_state *mrb, enum gc_state to_state)
895
923
  {
896
- while (mrb->gc_state != to_state) {
924
+ do {
897
925
  incremental_gc(mrb, ~0);
926
+ } while (mrb->gc_state != to_state);
927
+ }
928
+
929
+ static void
930
+ incremental_gc_step(mrb_state *mrb)
931
+ {
932
+ size_t limit = 0, result = 0;
933
+ limit = (GC_STEP_SIZE/100) * mrb->gc_step_ratio;
934
+ while (result < limit) {
935
+ result += incremental_gc(mrb, limit);
936
+ if (mrb->gc_state == GC_STATE_NONE)
937
+ break;
898
938
  }
939
+
940
+ mrb->gc_threshold = mrb->live + GC_STEP_SIZE;
899
941
  }
900
942
 
901
943
  static void
@@ -903,16 +945,21 @@ clear_all_old(mrb_state *mrb)
903
945
  {
904
946
  size_t origin_mode = mrb->is_generational_gc_mode;
905
947
 
906
- gc_assert(is_generational(mrb));
948
+ mrb_assert(is_generational(mrb));
907
949
  if (is_major_gc(mrb)) {
908
- advance_phase(mrb, GC_STATE_NONE);
950
+ /* finish the half baked GC */
951
+ incremental_gc_until(mrb, GC_STATE_NONE);
909
952
  }
910
953
 
954
+ /* Sweep the dead objects, then reset all the live objects
955
+ * (including all the old objects, of course) to white. */
911
956
  mrb->is_generational_gc_mode = FALSE;
912
957
  prepare_incremental_sweep(mrb);
913
- advance_phase(mrb, GC_STATE_NONE);
914
- mrb->variable_gray_list = mrb->gray_list = NULL;
958
+ incremental_gc_until(mrb, GC_STATE_NONE);
915
959
  mrb->is_generational_gc_mode = origin_mode;
960
+
961
+ /* The gray objects has already been painted as white */
962
+ mrb->atomic_gray_list = mrb->gray_list = NULL;
916
963
  }
917
964
 
918
965
  void
@@ -924,26 +971,19 @@ mrb_incremental_gc(mrb_state *mrb)
924
971
  GC_TIME_START;
925
972
 
926
973
  if (is_minor_gc(mrb)) {
927
- do {
928
- incremental_gc(mrb, ~0);
929
- } while (mrb->gc_state != GC_STATE_NONE);
974
+ incremental_gc_until(mrb, GC_STATE_NONE);
930
975
  }
931
976
  else {
932
- size_t limit = 0, result = 0;
933
- limit = (GC_STEP_SIZE/100) * mrb->gc_step_ratio;
934
- while (result < limit) {
935
- result += incremental_gc(mrb, limit);
936
- if (mrb->gc_state == GC_STATE_NONE)
937
- break;
938
- }
977
+ incremental_gc_step(mrb);
939
978
  }
940
979
 
941
980
  if (mrb->gc_state == GC_STATE_NONE) {
942
- gc_assert(mrb->live >= mrb->gc_live_after_mark);
981
+ mrb_assert(mrb->live >= mrb->gc_live_after_mark);
943
982
  mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio;
944
983
  if (mrb->gc_threshold < GC_STEP_SIZE) {
945
984
  mrb->gc_threshold = GC_STEP_SIZE;
946
985
  }
986
+
947
987
  if (is_major_gc(mrb)) {
948
988
  mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
949
989
  mrb->gc_full = FALSE;
@@ -955,40 +995,29 @@ mrb_incremental_gc(mrb_state *mrb)
955
995
  }
956
996
  }
957
997
  }
958
- else {
959
- mrb->gc_threshold = mrb->live + GC_STEP_SIZE;
960
- }
961
-
962
998
 
963
999
  GC_TIME_STOP_AND_REPORT;
964
1000
  }
965
1001
 
1002
+ /* Perform a full gc cycle */
966
1003
  void
967
- mrb_garbage_collect(mrb_state *mrb)
1004
+ mrb_full_gc(mrb_state *mrb)
968
1005
  {
969
- size_t max_limit = ~0;
970
-
971
1006
  if (mrb->gc_disabled) return;
972
- GC_INVOKE_TIME_REPORT("mrb_garbage_collect()");
1007
+ GC_INVOKE_TIME_REPORT("mrb_full_gc()");
973
1008
  GC_TIME_START;
974
1009
 
975
- if (mrb->gc_state == GC_STATE_SWEEP) {
976
- /* finish sweep phase */
977
- while (mrb->gc_state != GC_STATE_NONE) {
978
- incremental_gc(mrb, max_limit);
979
- }
980
- }
981
-
982
- /* clean all black object as old */
983
1010
  if (is_generational(mrb)) {
1011
+ /* clear all the old objects back to young */
984
1012
  clear_all_old(mrb);
985
1013
  mrb->gc_full = TRUE;
986
1014
  }
1015
+ else if (mrb->gc_state != GC_STATE_NONE) {
1016
+ /* finish half baked GC cycle */
1017
+ incremental_gc_until(mrb, GC_STATE_NONE);
1018
+ }
987
1019
 
988
- do {
989
- incremental_gc(mrb, max_limit);
990
- } while (mrb->gc_state != GC_STATE_NONE);
991
-
1020
+ incremental_gc_until(mrb, GC_STATE_NONE);
992
1021
  mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio;
993
1022
 
994
1023
  if (is_generational(mrb)) {
@@ -999,6 +1028,12 @@ mrb_garbage_collect(mrb_state *mrb)
999
1028
  GC_TIME_STOP_AND_REPORT;
1000
1029
  }
1001
1030
 
1031
+ void
1032
+ mrb_garbage_collect(mrb_state *mrb)
1033
+ {
1034
+ mrb_full_gc(mrb);
1035
+ }
1036
+
1002
1037
  int
1003
1038
  mrb_gc_arena_save(mrb_state *mrb)
1004
1039
  {
@@ -1022,14 +1057,14 @@ mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value
1022
1057
  if (!is_black(obj)) return;
1023
1058
  if (!is_white(value)) return;
1024
1059
 
1025
- gc_assert(!is_dead(mrb, value) && !is_dead(mrb, obj));
1026
- gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE);
1060
+ mrb_assert(!is_dead(mrb, value) && !is_dead(mrb, obj));
1061
+ mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE);
1027
1062
 
1028
1063
  if (is_generational(mrb) || mrb->gc_state == GC_STATE_MARK) {
1029
1064
  add_gray_list(mrb, value);
1030
1065
  }
1031
1066
  else {
1032
- gc_assert(mrb->gc_state == GC_STATE_SWEEP);
1067
+ mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
1033
1068
  paint_partial_white(mrb, obj); /* for never write barriers */
1034
1069
  }
1035
1070
  }
@@ -1048,11 +1083,11 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj)
1048
1083
  {
1049
1084
  if (!is_black(obj)) return;
1050
1085
 
1051
- gc_assert(!is_dead(mrb, obj));
1052
- gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE);
1086
+ mrb_assert(!is_dead(mrb, obj));
1087
+ mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE);
1053
1088
  paint_gray(obj);
1054
- obj->gcnext = mrb->variable_gray_list;
1055
- mrb->variable_gray_list = obj;
1089
+ obj->gcnext = mrb->atomic_gray_list;
1090
+ mrb->atomic_gray_list = obj;
1056
1091
  }
1057
1092
 
1058
1093
  /*
@@ -1066,7 +1101,7 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj)
1066
1101
  static mrb_value
1067
1102
  gc_start(mrb_state *mrb, mrb_value obj)
1068
1103
  {
1069
- mrb_garbage_collect(mrb);
1104
+ mrb_full_gc(mrb);
1070
1105
  return mrb_nil_value();
1071
1106
  }
1072
1107
 
@@ -1186,11 +1221,11 @@ change_gen_gc_mode(mrb_state *mrb, mrb_int enable)
1186
1221
  {
1187
1222
  if (is_generational(mrb) && !enable) {
1188
1223
  clear_all_old(mrb);
1189
- gc_assert(mrb->gc_state == GC_STATE_NONE);
1224
+ mrb_assert(mrb->gc_state == GC_STATE_NONE);
1190
1225
  mrb->gc_full = FALSE;
1191
1226
  }
1192
1227
  else if (!is_generational(mrb) && enable) {
1193
- advance_phase(mrb, GC_STATE_NONE);
1228
+ incremental_gc_until(mrb, GC_STATE_NONE);
1194
1229
  mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
1195
1230
  mrb->gc_full = FALSE;
1196
1231
  }
@@ -1298,7 +1333,7 @@ test_mrb_field_write_barrier(void)
1298
1333
  mrb->gc_state = GC_STATE_MARK;
1299
1334
  mrb_field_write_barrier(mrb, obj, value);
1300
1335
 
1301
- gc_assert(is_gray(value));
1336
+ mrb_assert(is_gray(value));
1302
1337
 
1303
1338
 
1304
1339
  puts(" in GC_STATE_SWEEP");
@@ -1306,8 +1341,8 @@ test_mrb_field_write_barrier(void)
1306
1341
  mrb->gc_state = GC_STATE_SWEEP;
1307
1342
  mrb_field_write_barrier(mrb, obj, value);
1308
1343
 
1309
- gc_assert(obj->color & mrb->current_white_part);
1310
- gc_assert(value->color & mrb->current_white_part);
1344
+ mrb_assert(obj->color & mrb->current_white_part);
1345
+ mrb_assert(value->color & mrb->current_white_part);
1311
1346
 
1312
1347
 
1313
1348
  puts(" fail with black");
@@ -1316,7 +1351,7 @@ test_mrb_field_write_barrier(void)
1316
1351
  paint_partial_white(mrb,value);
1317
1352
  mrb_field_write_barrier(mrb, obj, value);
1318
1353
 
1319
- gc_assert(obj->color & mrb->current_white_part);
1354
+ mrb_assert(obj->color & mrb->current_white_part);
1320
1355
 
1321
1356
 
1322
1357
  puts(" fail with gray");
@@ -1325,7 +1360,7 @@ test_mrb_field_write_barrier(void)
1325
1360
  paint_gray(value);
1326
1361
  mrb_field_write_barrier(mrb, obj, value);
1327
1362
 
1328
- gc_assert(is_gray(value));
1363
+ mrb_assert(is_gray(value));
1329
1364
 
1330
1365
 
1331
1366
  {
@@ -1338,7 +1373,7 @@ test_mrb_field_write_barrier(void)
1338
1373
  mrb->gc_state = GC_STATE_MARK;
1339
1374
  mrb_field_write_barrier_value(mrb, obj, value);
1340
1375
 
1341
- gc_assert(is_gray(mrb_basic_ptr(value)));
1376
+ mrb_assert(is_gray(mrb_basic_ptr(value)));
1342
1377
  }
1343
1378
 
1344
1379
  mrb_close(mrb);
@@ -1358,15 +1393,15 @@ test_mrb_write_barrier(void)
1358
1393
  mrb->gc_state = GC_STATE_MARK;
1359
1394
  mrb_write_barrier(mrb, obj);
1360
1395
 
1361
- gc_assert(is_gray(obj));
1362
- gc_assert(mrb->variable_gray_list == obj);
1396
+ mrb_assert(is_gray(obj));
1397
+ mrb_assert(mrb->atomic_gray_list == obj);
1363
1398
 
1364
1399
 
1365
1400
  puts(" fail with gray");
1366
1401
  paint_gray(obj);
1367
1402
  mrb_write_barrier(mrb, obj);
1368
1403
 
1369
- gc_assert(is_gray(obj));
1404
+ mrb_assert(is_gray(obj));
1370
1405
 
1371
1406
  mrb_close(mrb);
1372
1407
  }
@@ -1379,17 +1414,17 @@ test_add_gray_list(void)
1379
1414
 
1380
1415
  puts("test_add_gray_list");
1381
1416
  change_gen_gc_mode(mrb, FALSE);
1382
- gc_assert(mrb->gray_list == NULL);
1417
+ mrb_assert(mrb->gray_list == NULL);
1383
1418
  obj1 = mrb_basic_ptr(mrb_str_new_cstr(mrb, "test"));
1384
1419
  add_gray_list(mrb, obj1);
1385
- gc_assert(mrb->gray_list == obj1);
1386
- gc_assert(is_gray(obj1));
1420
+ mrb_assert(mrb->gray_list == obj1);
1421
+ mrb_assert(is_gray(obj1));
1387
1422
 
1388
1423
  obj2 = mrb_basic_ptr(mrb_str_new_cstr(mrb, "test"));
1389
1424
  add_gray_list(mrb, obj2);
1390
- gc_assert(mrb->gray_list == obj2);
1391
- gc_assert(mrb->gray_list->gcnext == obj1);
1392
- gc_assert(is_gray(obj2));
1425
+ mrb_assert(mrb->gray_list == obj2);
1426
+ mrb_assert(mrb->gray_list->gcnext == obj1);
1427
+ mrb_assert(is_gray(obj2));
1393
1428
 
1394
1429
  mrb_close(mrb);
1395
1430
  }
@@ -1408,8 +1443,8 @@ test_gc_gray_mark(void)
1408
1443
  obj = (struct RBasic*)mrb->object_class;
1409
1444
  paint_gray(obj);
1410
1445
  gray_num = gc_gray_mark(mrb, obj);
1411
- gc_assert(is_black(obj));
1412
- gc_assert(gray_num > 1);
1446
+ mrb_assert(is_black(obj));
1447
+ mrb_assert(gray_num > 1);
1413
1448
 
1414
1449
  puts(" in MRB_TT_ARRAY");
1415
1450
  obj_v = mrb_ary_new(mrb);
@@ -1418,9 +1453,9 @@ test_gc_gray_mark(void)
1418
1453
  paint_partial_white(mrb, mrb_basic_ptr(value_v));
1419
1454
  mrb_ary_push(mrb, obj_v, value_v);
1420
1455
  gray_num = gc_gray_mark(mrb, mrb_basic_ptr(obj_v));
1421
- gc_assert(is_black(mrb_basic_ptr(obj_v)));
1422
- gc_assert(is_gray(mrb_basic_ptr(value_v)));
1423
- gc_assert(gray_num == 1);
1456
+ mrb_assert(is_black(mrb_basic_ptr(obj_v)));
1457
+ mrb_assert(is_gray(mrb_basic_ptr(value_v)));
1458
+ mrb_assert(gray_num == 1);
1424
1459
 
1425
1460
  mrb_close(mrb);
1426
1461
  }
@@ -1436,16 +1471,16 @@ test_incremental_gc(void)
1436
1471
  puts("test_incremental_gc");
1437
1472
  change_gen_gc_mode(mrb, FALSE);
1438
1473
 
1439
- puts(" in mrb_garbage_collect");
1440
- mrb_garbage_collect(mrb);
1474
+ puts(" in mrb_full_gc");
1475
+ mrb_full_gc(mrb);
1441
1476
 
1442
- gc_assert(mrb->gc_state == GC_STATE_NONE);
1477
+ mrb_assert(mrb->gc_state == GC_STATE_NONE);
1443
1478
  puts(" in GC_STATE_NONE");
1444
1479
  incremental_gc(mrb, max);
1445
- gc_assert(mrb->gc_state == GC_STATE_MARK);
1480
+ mrb_assert(mrb->gc_state == GC_STATE_MARK);
1446
1481
  puts(" in GC_STATE_MARK");
1447
- advance_phase(mrb, GC_STATE_SWEEP);
1448
- gc_assert(mrb->gc_state == GC_STATE_SWEEP);
1482
+ incremental_gc_until(mrb, GC_STATE_SWEEP);
1483
+ mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
1449
1484
 
1450
1485
  puts(" in GC_STATE_SWEEP");
1451
1486
  page = mrb->heaps;
@@ -1465,13 +1500,13 @@ test_incremental_gc(void)
1465
1500
  total += MRB_HEAP_PAGE_SIZE;
1466
1501
  }
1467
1502
 
1468
- gc_assert(mrb->gray_list == NULL);
1503
+ mrb_assert(mrb->gray_list == NULL);
1469
1504
 
1470
1505
  incremental_gc(mrb, max);
1471
- gc_assert(mrb->gc_state == GC_STATE_SWEEP);
1506
+ mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
1472
1507
 
1473
1508
  incremental_gc(mrb, max);
1474
- gc_assert(mrb->gc_state == GC_STATE_NONE);
1509
+ mrb_assert(mrb->gc_state == GC_STATE_NONE);
1475
1510
 
1476
1511
  free = (RVALUE*)mrb->heaps->freelist;
1477
1512
  while (free) {
@@ -1479,30 +1514,30 @@ test_incremental_gc(void)
1479
1514
  free = (RVALUE*)free->as.free.next;
1480
1515
  }
1481
1516
 
1482
- gc_assert(mrb->live == live);
1483
- gc_assert(mrb->live == total-freed);
1517
+ mrb_assert(mrb->live == live);
1518
+ mrb_assert(mrb->live == total-freed);
1484
1519
 
1485
1520
  puts("test_incremental_gc(gen)");
1486
- advance_phase(mrb, GC_STATE_SWEEP);
1521
+ incremental_gc_until(mrb, GC_STATE_SWEEP);
1487
1522
  change_gen_gc_mode(mrb, TRUE);
1488
1523
 
1489
- gc_assert(mrb->gc_full == FALSE);
1490
- gc_assert(mrb->gc_state == GC_STATE_NONE);
1524
+ mrb_assert(mrb->gc_full == FALSE);
1525
+ mrb_assert(mrb->gc_state == GC_STATE_NONE);
1491
1526
 
1492
1527
  puts(" in minor");
1493
- gc_assert(is_minor_gc(mrb));
1494
- gc_assert(mrb->majorgc_old_threshold > 0);
1528
+ mrb_assert(is_minor_gc(mrb));
1529
+ mrb_assert(mrb->majorgc_old_threshold > 0);
1495
1530
  mrb->majorgc_old_threshold = 0;
1496
1531
  mrb_incremental_gc(mrb);
1497
- gc_assert(mrb->gc_full == TRUE);
1498
- gc_assert(mrb->gc_state == GC_STATE_NONE);
1532
+ mrb_assert(mrb->gc_full == TRUE);
1533
+ mrb_assert(mrb->gc_state == GC_STATE_NONE);
1499
1534
 
1500
1535
  puts(" in major");
1501
- gc_assert(is_major_gc(mrb));
1536
+ mrb_assert(is_major_gc(mrb));
1502
1537
  do {
1503
1538
  mrb_incremental_gc(mrb);
1504
1539
  } while (mrb->gc_state != GC_STATE_NONE);
1505
- gc_assert(mrb->gc_full == FALSE);
1540
+ mrb_assert(mrb->gc_full == FALSE);
1506
1541
 
1507
1542
  mrb_close(mrb);
1508
1543
  }
@@ -1517,12 +1552,12 @@ test_incremental_sweep_phase(void)
1517
1552
  add_heap(mrb);
1518
1553
  mrb->sweeps = mrb->heaps;
1519
1554
 
1520
- gc_assert(mrb->heaps->next->next == NULL);
1521
- gc_assert(mrb->free_heaps->next->next == NULL);
1555
+ mrb_assert(mrb->heaps->next->next == NULL);
1556
+ mrb_assert(mrb->free_heaps->next->next == NULL);
1522
1557
  incremental_sweep_phase(mrb, MRB_HEAP_PAGE_SIZE*3);
1523
1558
 
1524
- gc_assert(mrb->heaps->next == NULL);
1525
- gc_assert(mrb->heaps == mrb->free_heaps);
1559
+ mrb_assert(mrb->heaps->next == NULL);
1560
+ mrb_assert(mrb->heaps == mrb->free_heaps);
1526
1561
 
1527
1562
  mrb_close(mrb);
1528
1563
  }