do not assert is_dead() during mark phase; close #2825 ref #2996 #2769
authorYukihiro "Matz" Matsumoto <[email protected]>
Mon, 19 Oct 2015 22:22:55 +0000 (20 07:22 +0900)
committerYukihiro "Matz" Matsumoto <[email protected]>
Tue, 20 Oct 2015 08:06:54 +0000 (20 17:06 +0900)
src/gc.c

index 885368f..d55a890 100644 (file)
--- a/src/gc.c
+++ b/src/gc.c
@@ -1153,7 +1153,7 @@ mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value
   if (!is_black(obj)) return;
   if (!is_white(value)) return;
 
-  mrb_assert(!is_dead(mrb, value) && !is_dead(mrb, obj));
+  mrb_assert(mrb->gc_state == GC_STATE_MARK || (!is_dead(mrb, value) && !is_dead(mrb, obj)));
   mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_ROOT);
 
   if (is_generational(mrb) || mrb->gc_state == GC_STATE_MARK) {