summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_gc.py13
-rw-r--r--Modules/gcmodule.c3
2 files changed, 11 insertions, 5 deletions
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index fba9583..1ba5a23 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 7384327..a95bec7 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",