diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index fba958314471360f2a52115c5161ccda3f1f3f8d..1ba5a23c86ca4fc8e3a14efd331600ce1e2c5d42 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -482,8 +482,7 @@ class GCTests(unittest.TestCase): x.x = x x.y = X('second') del x - if %d: - gc.set_debug(gc.DEBUG_UNCOLLECTABLE) + gc.set_debug(%s) """ def run_command(code): p = subprocess.Popen([sys.executable, "-c", code], @@ -494,13 +493,19 @@ class GCTests(unittest.TestCase): self.assertEqual(stdout.strip(), b"") return strip_python_stderr(stderr) - stderr = run_command(code % 0) + stderr = run_command(code % "0") self.assertIn(b"gc: 2 uncollectable objects at shutdown", stderr) self.assertNotIn(b"[<X 'first'>, <X 'second'>]", stderr) # With DEBUG_UNCOLLECTABLE, the garbage list gets printed - stderr = run_command(code % 1) + stderr = run_command(code % "gc.DEBUG_UNCOLLECTABLE") self.assertIn(b"gc: 2 uncollectable objects at shutdown", stderr) self.assertIn(b"[<X 'first'>, <X 'second'>]", stderr) + # With DEBUG_SAVEALL, no additional message should get printed + # (because gc.garbage also contains normally reclaimable cyclic + # references, and its elements get printed at runtime anyway). + stderr = run_command(code % "gc.DEBUG_SAVEALL") + self.assertNotIn(b"uncollectable objects at shutdown", stderr) + class GCTogglingTests(unittest.TestCase): def setUp(self): diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 73843272e13049b9c14670e3f74474adfb643558..a95bec773a6fb08636ad6a92c2514a85e86f549b 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1366,7 +1366,8 @@ PyGC_Collect(void) void _PyGC_Fini(void) { - if (garbage != NULL && PyList_GET_SIZE(garbage) > 0) { + if (!(debug & DEBUG_SAVEALL) + && garbage != NULL && PyList_GET_SIZE(garbage) > 0) { PySys_WriteStderr( "gc: " "%" PY_FORMAT_SIZE_T "d uncollectable objects at shutdown:\n",