From b47c8b738ae3e400ec02269fae9857222218e9d5 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 6 Jun 2023 07:29:41 +0900 Subject: [PATCH] gc.c (clear_all_old): fix a generational GC bug This issue was caused by 375d22b that introduced a serious mark leakage in the generational GC mode. --- src/gc.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/gc.c b/src/gc.c index 4b6efdc39..83d64486f 100644 --- a/src/gc.c +++ b/src/gc.c @@ -1240,14 +1240,12 @@ clear_all_old(mrb_state *mrb, mrb_gc *gc) /* finish the half baked GC */ incremental_gc_finish(mrb, gc); } - else { - /* Sweep the dead objects, then reset all the live objects - * (including all the old objects, of course) to white. */ - gc->generational = FALSE; - prepare_incremental_sweep(mrb, gc); - incremental_gc_finish(mrb, gc); - gc->generational = TRUE; - } + /* Sweep the dead objects, then reset all the live objects + * (including all the old objects, of course) to white. */ + gc->generational = FALSE; + prepare_incremental_sweep(mrb, gc); + incremental_gc_finish(mrb, gc); + gc->generational = TRUE; /* The gray objects have already been painted as white */ gc->atomic_gray_list = gc->gray_list = NULL; }