bpo-38379: don't claim objects are collected when they aren't (#16658)
* bpo-38379: when a finalizer resurrects an object,
nothing is actually collected in this run of gc.
Change the stats to relect that truth.
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 2b47aba..766f8e0 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -1095,12 +1095,9 @@
validate_list(&finalizers, 0);
validate_list(&unreachable, PREV_MASK_COLLECTING);
- /* Collect statistics on collectable objects found and print
- * debugging information.
- */
- for (gc = GC_NEXT(&unreachable); gc != &unreachable; gc = GC_NEXT(gc)) {
- m++;
- if (state->debug & DEBUG_COLLECTABLE) {
+ /* Print debugging information. */
+ if (state->debug & DEBUG_COLLECTABLE) {
+ for (gc = GC_NEXT(&unreachable); gc != &unreachable; gc = GC_NEXT(gc)) {
debug_cycle("collectable", FROM_GC(gc));
}
}
@@ -1122,6 +1119,7 @@
* the reference cycles to be broken. It may also cause some objects
* in finalizers to be freed.
*/
+ m += gc_list_size(&unreachable);
delete_garbage(state, &unreachable, old);
}