Index: runtime.c =================================================================== --- runtime.c (revision 12851) +++ runtime.c (working copy) @@ -2706,6 +2706,10 @@ for(gcrp = gc_root_list; gcrp != NULL; gcrp = gcrp->next) mark(&gcrp->value); + /* mark finalizer procedures: */ + for(flist = finalizer_list; flist != NULL; flist = flist->next) + mark(&flist->finalizer); + mark_system_globals(); } else { @@ -2770,7 +2774,6 @@ for(flist = finalizer_list; flist != NULL; flist = flist->next) { mark(&flist->item); - mark(&flist->finalizer); ++fcount; } @@ -2780,9 +2783,6 @@ else { j = fcount = 0; - for(flist = finalizer_list; flist != NULL; flist = flist->next) - mark(&flist->finalizer); - for(flist = finalizer_list; flist != NULL; flist = flist->next) { if(j < C_max_pending_finalizers) { if(!is_fptr(C_block_header(flist->item))) @@ -2797,7 +2797,7 @@ finalizers_checked = 1; if(pending_finalizer_count > 0 && gc_report_flag) - C_printf(C_text("[GC] finalizers pending for rescan: %d (%d live)\n"), + C_printf(C_text("[GC] finalizers pending: %d (%d live)\n"), pending_finalizer_count, live_finalizer_count); goto rescan;