summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-06-17 08:33:58 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-06-17 08:39:43 +0900
commit08c385ff66ba7bca24ab30a06a925f364c7b0c84 (patch)
tree21041d6a007a63d9fcfefe43d1e53a252f726713
parent819ccd3b859427e38d0b4e5a22ec0005b68c3b31 (diff)
downloadmruby-08c385ff66ba7bca24ab30a06a925f364c7b0c84.tar.gz
mruby-08c385ff66ba7bca24ab30a06a925f364c7b0c84.zip
Mark the GC arena in `final_marking_phase`.
Arena can be modified during the marking phase.
-rw-r--r--src/gc.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/gc.c b/src/gc.c
index 799e46684..8b013b056 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -835,7 +835,7 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end)
static void
root_scan_phase(mrb_state *mrb, mrb_gc *gc)
{
- size_t i, e;
+ int i, e;
if (!is_minor_gc(gc)) {
gc->gray_list = NULL;
@@ -995,6 +995,12 @@ incremental_marking_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
static void
final_marking_phase(mrb_state *mrb, mrb_gc *gc)
{
+ int i, e;
+
+ /* mark arena */
+ for (i=0,e=gc->arena_idx; i<e; i++) {
+ mrb_gc_mark(mrb, gc->arena[i]);
+ }
mrb_gc_mark_gv(mrb);
mark_context(mrb, mrb->c);
mark_context(mrb, mrb->root_c);