webruby 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/webruby/rake/mruby.rake +1 -0
- data/modules/emscripten/AUTHORS +7 -0
- data/modules/emscripten/LICENSE +26 -0
- data/modules/emscripten/emcc +58 -20
- data/modules/emscripten/emlink.py +2 -265
- data/modules/emscripten/emscripten.py +38 -18
- data/modules/emscripten/scons-tools/emscripten.py +11 -6
- data/modules/emscripten/scons-tools/llvm.py +4 -3
- data/modules/emscripten/src/analyzer.js +32 -13
- data/modules/emscripten/src/embind/embind.js +13 -13
- data/modules/emscripten/src/embind/emval.js +8 -7
- data/modules/emscripten/src/intertyper.js +10 -0
- data/modules/emscripten/src/jsifier.js +28 -6
- data/modules/emscripten/src/library.js +2949 -1322
- data/modules/emscripten/src/library_browser.js +27 -23
- data/modules/emscripten/src/library_egl.js +7 -2
- data/modules/emscripten/src/library_gl.js +15 -2
- data/modules/emscripten/src/library_glut.js +1 -1
- data/modules/emscripten/src/library_jansson.js +1 -1
- data/modules/emscripten/src/library_openal.js +464 -132
- data/modules/emscripten/src/library_path.js +134 -0
- data/modules/emscripten/src/library_sdl.js +222 -50
- data/modules/emscripten/src/modules.js +22 -5
- data/modules/emscripten/src/parseTools.js +13 -2
- data/modules/emscripten/src/postamble.js +60 -34
- data/modules/emscripten/src/preamble.js +67 -18
- data/modules/emscripten/src/relooper/Relooper.cpp +1 -1
- data/modules/emscripten/src/runtime.js +12 -2
- data/modules/emscripten/src/settings.js +869 -826
- data/modules/emscripten/src/shell.js +63 -51
- data/modules/emscripten/src/utility.js +6 -0
- data/modules/emscripten/system/include/bsd/sys/mman.h +1 -1
- data/modules/emscripten/system/include/emscripten/bind.h +28 -28
- data/modules/emscripten/system/include/libc/math.h +8 -0
- data/modules/emscripten/system/include/libc/sys/signal.h +3 -1
- data/modules/emscripten/system/include/libc/sys/stat.h +2 -1
- data/modules/emscripten/system/include/libc/sys/types.h +4 -0
- data/modules/emscripten/system/include/libcxx/CREDITS.TXT +24 -0
- data/modules/emscripten/system/include/libcxx/__bit_reference +27 -8
- data/modules/emscripten/system/include/libcxx/__config +62 -15
- data/modules/emscripten/system/include/libcxx/__debug +5 -1
- data/modules/emscripten/system/include/libcxx/__functional_03 +24 -24
- data/modules/emscripten/system/include/libcxx/__functional_base +22 -4
- data/modules/emscripten/system/include/libcxx/__hash_table +566 -54
- data/modules/emscripten/system/include/libcxx/__locale +11 -3
- data/modules/emscripten/system/include/libcxx/__split_buffer +6 -6
- data/modules/emscripten/system/include/libcxx/__std_stream +58 -30
- data/modules/emscripten/system/include/libcxx/__tree +58 -51
- data/modules/emscripten/system/include/libcxx/__tuple +9 -9
- data/modules/emscripten/system/include/libcxx/algorithm +223 -13
- data/modules/emscripten/system/include/libcxx/array +18 -17
- data/modules/emscripten/system/include/libcxx/atomic +15 -5
- data/modules/emscripten/system/include/libcxx/cctype +2 -2
- data/modules/emscripten/system/include/libcxx/chrono +131 -36
- data/modules/emscripten/system/include/libcxx/cmath +41 -36
- data/modules/emscripten/system/include/libcxx/complex +49 -49
- data/modules/emscripten/system/include/libcxx/cstdio +2 -2
- data/modules/emscripten/system/include/libcxx/cstdlib +5 -5
- data/modules/emscripten/system/include/libcxx/cstring +2 -2
- data/modules/emscripten/system/include/libcxx/cwchar +22 -13
- data/modules/emscripten/system/include/libcxx/deque +27 -14
- data/modules/emscripten/system/include/libcxx/forward_list +36 -35
- data/modules/emscripten/system/include/libcxx/fstream +16 -0
- data/modules/emscripten/system/include/libcxx/functional +348 -23
- data/modules/emscripten/system/include/libcxx/future +66 -0
- data/modules/emscripten/system/include/libcxx/ios +27 -0
- data/modules/emscripten/system/include/libcxx/istream +2 -4
- data/modules/emscripten/system/include/libcxx/iterator +17 -9
- data/modules/emscripten/system/include/libcxx/limits +2 -2
- data/modules/emscripten/system/include/libcxx/list +165 -105
- data/modules/emscripten/system/include/libcxx/locale +154 -43
- data/modules/emscripten/system/include/libcxx/map +165 -224
- data/modules/emscripten/system/include/libcxx/memory +113 -54
- data/modules/emscripten/system/include/libcxx/random +2 -29
- data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/include/libcxx/regex +60 -15
- data/modules/emscripten/system/include/libcxx/sstream +124 -40
- data/modules/emscripten/system/include/libcxx/string +345 -182
- data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +3 -3
- data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -2
- data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +3 -3
- data/modules/emscripten/system/include/libcxx/support/win32/support.h +10 -11
- data/modules/emscripten/system/include/libcxx/thread +2 -2
- data/modules/emscripten/system/include/libcxx/tuple +134 -65
- data/modules/emscripten/system/include/libcxx/type_traits +232 -24
- data/modules/emscripten/system/include/libcxx/unordered_map +314 -161
- data/modules/emscripten/system/include/libcxx/unordered_set +160 -2
- data/modules/emscripten/system/include/libcxx/utility +225 -40
- data/modules/emscripten/system/include/libcxx/vector +52 -57
- data/modules/emscripten/system/include/net/if.h +20 -1
- data/modules/emscripten/system/include/net/netinet/in.h +69 -5
- data/modules/emscripten/system/include/netdb.h +36 -0
- data/modules/emscripten/system/include/sys/ioctl.h +55 -3
- data/modules/emscripten/system/include/sys/select.h +2 -0
- data/modules/emscripten/system/include/sys/sendfile.h +16 -0
- data/modules/emscripten/system/include/sys/socket.h +181 -35
- data/modules/emscripten/system/lib/dlmalloc.c +10 -12
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/ecvt.c +19 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/fcvt.c +25 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/gcvt.c +8 -0
- data/modules/emscripten/system/lib/libcextra.symbols +3 -0
- data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +24 -0
- data/modules/emscripten/system/lib/libcxx/debug.cpp +11 -9
- data/modules/emscripten/system/lib/libcxx/exception.cpp +9 -0
- data/modules/emscripten/system/lib/libcxx/hash.cpp +6 -0
- data/modules/emscripten/system/lib/libcxx/iostream.cpp +4 -4
- data/modules/emscripten/system/lib/libcxx/locale.cpp +91 -42
- data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +1 -1
- data/modules/emscripten/system/lib/libcxx/string.cpp +332 -491
- data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +4 -2
- data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +140 -41
- data/modules/emscripten/system/lib/libcxx/symbols +9 -256
- data/modules/emscripten/system/lib/libcxx/system_error.cpp +3 -0
- data/modules/emscripten/system/lib/libcxx/thread.cpp +16 -3
- data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +12 -2
- data/modules/emscripten/third_party/stb_image.c +4673 -0
- data/modules/emscripten/tools/asm_module.py +273 -0
- data/modules/emscripten/tools/exec_llvm.py +2 -2
- data/modules/emscripten/tools/file_packager.py +36 -16
- data/modules/emscripten/tools/find_bigfuncs.py +9 -9
- data/modules/emscripten/tools/js-optimizer.js +485 -131
- data/modules/emscripten/tools/js_optimizer.py +22 -15
- data/modules/emscripten/tools/merge_asm.py +26 -0
- data/modules/emscripten/tools/nativize_llvm.py +2 -2
- data/modules/emscripten/tools/settings_template_readonly.py +1 -1
- data/modules/emscripten/tools/shared.py +63 -20
- data/modules/emscripten/tools/split_asm.py +30 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +686 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +263 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +747 -0
- data/modules/emscripten/tools/{test-js-optimizer-asm-outline.js → test-js-optimizer-asm-outline2.js} +1 -1
- data/modules/emscripten/tools/test-js-optimizer-asm-outline3-output.js +28 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline3.js +30 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +4 -4
- data/modules/mruby/AUTHORS +1 -0
- data/modules/mruby/README.md +4 -2
- data/modules/mruby/build_config.rb +6 -6
- data/modules/mruby/doc/mrbgems/README.md +4 -4
- data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/include/mrbconf.h +3 -0
- data/modules/mruby/include/mruby/array.h +2 -2
- data/modules/mruby/include/mruby/class.h +4 -4
- data/modules/mruby/include/mruby/compile.h +1 -0
- data/modules/mruby/include/mruby/data.h +1 -1
- data/modules/mruby/include/mruby/hash.h +2 -2
- data/modules/mruby/include/mruby/irep.h +3 -2
- data/modules/mruby/include/mruby/proc.h +1 -1
- data/modules/mruby/include/mruby/range.h +1 -1
- data/modules/mruby/include/mruby/string.h +2 -2
- data/modules/mruby/include/mruby/value.h +43 -26
- data/modules/mruby/include/mruby.h +10 -2
- data/modules/mruby/minirake +2 -2
- data/modules/mruby/mrbgems/mruby-array-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +4 -1
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +32 -0
- data/modules/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +13 -5
- data/modules/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-enum-ext/test/enum.rb +10 -11
- data/modules/mruby/mrbgems/mruby-eval/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-exit/mrbgem.rake +4 -0
- data/modules/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
- data/modules/mruby/mrbgems/mruby-fiber/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +4 -2
- data/modules/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-hash-ext/test/hash.rb +5 -7
- data/modules/mruby/mrbgems/mruby-math/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +2 -2
- data/modules/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-object-ext/src/object.c +3 -3
- data/modules/mruby/mrbgems/mruby-object-ext/test/nil.rb +3 -3
- data/modules/mruby/mrbgems/mruby-object-ext/test/object.rb +1 -1
- data/modules/mruby/mrbgems/mruby-objectspace/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +36 -37
- data/modules/mruby/mrbgems/mruby-print/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.rb +8 -8
- data/modules/mruby/mrbgems/mruby-random/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-range-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-range-ext/test/range.rb +6 -6
- data/modules/mruby/mrbgems/mruby-sprintf/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-string-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +6 -6
- data/modules/mruby/mrbgems/mruby-struct/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +2 -2
- data/modules/mruby/mrbgems/mruby-time/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-time/src/time.c +2 -8
- data/modules/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +10 -10
- data/modules/mruby/mrblib/class.rb +15 -9
- data/modules/mruby/mrblib/string.rb +12 -0
- data/modules/mruby/src/array.c +4 -3
- data/modules/mruby/src/class.c +13 -8
- data/modules/mruby/src/codegen.c +9 -8
- data/modules/mruby/src/error.c +7 -5
- data/modules/mruby/src/error.h +1 -0
- data/modules/mruby/src/etc.c +1 -1
- data/modules/mruby/src/gc.c +163 -128
- data/modules/mruby/src/kernel.c +43 -15
- data/modules/mruby/src/numeric.c +9 -7
- data/modules/mruby/src/object.c +1 -1
- data/modules/mruby/src/parse.y +37 -19
- data/modules/mruby/src/range.c +10 -24
- data/modules/mruby/src/state.c +2 -6
- data/modules/mruby/src/string.c +0 -9
- data/modules/mruby/src/variable.c +2 -2
- data/modules/mruby/src/vm.c +12 -6
- data/modules/mruby/tasks/mrbgem_spec.rake +7 -0
- data/modules/mruby/tasks/mrbgems.rake +2 -1
- data/modules/mruby/tasks/mrbgems_test.rake +1 -1
- data/modules/mruby/tasks/mruby_build.rake +4 -3
- data/modules/mruby/tasks/mruby_build_commands.rake +6 -1
- data/modules/mruby/tasks/mruby_build_gem.rake +2 -2
- data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
- data/modules/mruby/test/assert.rb +2 -2
- data/modules/mruby/test/t/argumenterror.rb +3 -3
- data/modules/mruby/test/t/array.rb +55 -55
- data/modules/mruby/test/t/basicobject.rb +1 -1
- data/modules/mruby/test/t/bs_block.rb +12 -12
- data/modules/mruby/test/t/class.rb +21 -21
- data/modules/mruby/test/t/enumerable.rb +18 -18
- data/modules/mruby/test/t/exception.rb +20 -20
- data/modules/mruby/test/t/false.rb +3 -3
- data/modules/mruby/test/t/float.rb +40 -40
- data/modules/mruby/test/t/gc.rb +10 -10
- data/modules/mruby/test/t/hash.rb +41 -41
- data/modules/mruby/test/t/indexerror.rb +2 -2
- data/modules/mruby/test/t/integer.rb +41 -41
- data/modules/mruby/test/t/kernel.rb +33 -33
- data/modules/mruby/test/t/literals.rb +82 -82
- data/modules/mruby/test/t/localjumperror.rb +1 -1
- data/modules/mruby/test/t/module.rb +170 -31
- data/modules/mruby/test/t/nameerror.rb +5 -5
- data/modules/mruby/test/t/nil.rb +2 -2
- data/modules/mruby/test/t/nomethoderror.rb +1 -1
- data/modules/mruby/test/t/numeric.rb +5 -5
- data/modules/mruby/test/t/object.rb +2 -2
- data/modules/mruby/test/t/proc.rb +8 -8
- data/modules/mruby/test/t/range.rb +9 -9
- data/modules/mruby/test/t/rangeerror.rb +2 -2
- data/modules/mruby/test/t/runtimeerror.rb +1 -1
- data/modules/mruby/test/t/standarderror.rb +2 -2
- data/modules/mruby/test/t/string.rb +100 -100
- data/modules/mruby/test/t/symbol.rb +5 -5
- data/modules/mruby/test/t/syntax.rb +15 -6
- data/modules/mruby/test/t/true.rb +3 -3
- data/modules/mruby/test/t/typeerror.rb +2 -2
- data/modules/mruby/tools/mrbc/mrbc.c +10 -4
- data/modules/mruby/travis_config.rb +1 -0
- data/scripts/gen_gems_config.rb +5 -1
- metadata +19 -4
- data/modules/emscripten/tools/test-js-optimizer-asm-outline-output.js +0 -570
data/modules/mruby/src/gc.c
CHANGED
@@ -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
|
41
|
+
== Two White Types
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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
|
-
|
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
|
-
|
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
|
-
}
|
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
|
-
|
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
|
-
|
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
|
-
|
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->
|
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
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
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
|
-
|
916
|
+
mrb_assert(0);
|
889
917
|
return 0;
|
890
918
|
}
|
891
919
|
}
|
892
920
|
|
893
921
|
static void
|
894
|
-
|
922
|
+
incremental_gc_until(mrb_state *mrb, enum gc_state to_state)
|
895
923
|
{
|
896
|
-
|
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
|
-
|
948
|
+
mrb_assert(is_generational(mrb));
|
907
949
|
if (is_major_gc(mrb)) {
|
908
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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("
|
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
|
-
|
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
|
-
|
1026
|
-
|
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
|
-
|
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
|
-
|
1052
|
-
|
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->
|
1055
|
-
mrb->
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1310
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1362
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1386
|
-
|
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
|
-
|
1391
|
-
|
1392
|
-
|
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
|
-
|
1412
|
-
|
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
|
-
|
1422
|
-
|
1423
|
-
|
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
|
1440
|
-
|
1474
|
+
puts(" in mrb_full_gc");
|
1475
|
+
mrb_full_gc(mrb);
|
1441
1476
|
|
1442
|
-
|
1477
|
+
mrb_assert(mrb->gc_state == GC_STATE_NONE);
|
1443
1478
|
puts(" in GC_STATE_NONE");
|
1444
1479
|
incremental_gc(mrb, max);
|
1445
|
-
|
1480
|
+
mrb_assert(mrb->gc_state == GC_STATE_MARK);
|
1446
1481
|
puts(" in GC_STATE_MARK");
|
1447
|
-
|
1448
|
-
|
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
|
-
|
1503
|
+
mrb_assert(mrb->gray_list == NULL);
|
1469
1504
|
|
1470
1505
|
incremental_gc(mrb, max);
|
1471
|
-
|
1506
|
+
mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
|
1472
1507
|
|
1473
1508
|
incremental_gc(mrb, max);
|
1474
|
-
|
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
|
-
|
1483
|
-
|
1517
|
+
mrb_assert(mrb->live == live);
|
1518
|
+
mrb_assert(mrb->live == total-freed);
|
1484
1519
|
|
1485
1520
|
puts("test_incremental_gc(gen)");
|
1486
|
-
|
1521
|
+
incremental_gc_until(mrb, GC_STATE_SWEEP);
|
1487
1522
|
change_gen_gc_mode(mrb, TRUE);
|
1488
1523
|
|
1489
|
-
|
1490
|
-
|
1524
|
+
mrb_assert(mrb->gc_full == FALSE);
|
1525
|
+
mrb_assert(mrb->gc_state == GC_STATE_NONE);
|
1491
1526
|
|
1492
1527
|
puts(" in minor");
|
1493
|
-
|
1494
|
-
|
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
|
-
|
1498
|
-
|
1532
|
+
mrb_assert(mrb->gc_full == TRUE);
|
1533
|
+
mrb_assert(mrb->gc_state == GC_STATE_NONE);
|
1499
1534
|
|
1500
1535
|
puts(" in major");
|
1501
|
-
|
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
|
-
|
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
|
-
|
1521
|
-
|
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
|
-
|
1525
|
-
|
1559
|
+
mrb_assert(mrb->heaps->next == NULL);
|
1560
|
+
mrb_assert(mrb->heaps == mrb->free_heaps);
|
1526
1561
|
|
1527
1562
|
mrb_close(mrb);
|
1528
1563
|
}
|