From d2edd603b3952d622fdaca11339560ece9ee6dcb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 12 Sep 2026 22:05:50 +0200 Subject: [PATCH 1/3] gh-128509: Add tests on sys._is_immortal() --- Lib/test/test_sys.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 4308de227a46ce..8984d44c65ff34 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1374,6 +1374,37 @@ def test_int_max_str_digits(self): with self.assertRaises(TypeError): sys.set_int_max_str_digits(2_048.0) + @test.support.cpython_only + def test_is_immortal(self): + is_immortal = sys._is_immortal + + # Singletons + self.assertTrue(is_immortal(None)) + self.assertTrue(is_immortal(False)) + self.assertTrue(is_immortal(True)) + self.assertTrue(is_immortal(0)) + self.assertTrue(is_immortal(b'')) + self.assertTrue(is_immortal('')) + self.assertTrue(is_immortal(b'x')) + self.assertTrue(is_immortal('x')) + self.assertTrue(is_immortal(())) + + # Static types + self.assertTrue(is_immortal(int)) + self.assertTrue(is_immortal(dict)) + + # Test some mortal objects + class PythonType: + pass + self.assertFalse(is_immortal([1, 2, 3])) + self.assertFalse(is_immortal({'key': 5})) + self.assertFalse(is_immortal(object())) + self.assertFalse(is_immortal(PythonType)) + self.assertFalse(is_immortal(2 ** 100)) + # Use encode/decode to avoid building the string as a constant + self.assertFalse(is_immortal(b'abc'.decode())) + self.assertFalse(is_immortal('abc'.encode())) + @test.support.cpython_only @test.support.force_not_colorized_test_class From 3ac1ba14658123585c2608d2d6d7f4718057a024 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 13 Sep 2026 06:58:20 +0200 Subject: [PATCH 2/3] Workaround marshal limitation --- Lib/test/test_sys.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 8984d44c65ff34..ff534eb6476c4e 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1385,7 +1385,8 @@ def test_is_immortal(self): self.assertTrue(is_immortal(0)) self.assertTrue(is_immortal(b'')) self.assertTrue(is_immortal('')) - self.assertTrue(is_immortal(b'x')) + # Use encode to get the bytes singleton + self.assertTrue(is_immortal('x'.encode())) self.assertTrue(is_immortal('x')) self.assertTrue(is_immortal(())) @@ -1401,7 +1402,7 @@ class PythonType: self.assertFalse(is_immortal(object())) self.assertFalse(is_immortal(PythonType)) self.assertFalse(is_immortal(2 ** 100)) - # Use encode/decode to avoid building the string as a constant + # Use encode/decode to get a fresh object self.assertFalse(is_immortal(b'abc'.decode())) self.assertFalse(is_immortal('abc'.encode())) From d588cc2facfe92ca5602e2099a8249452b635bda Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 13 Sep 2026 14:21:37 +0200 Subject: [PATCH 3/3] Revert marshal workaround marshal has been fixed --- Lib/test/test_sys.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index ff534eb6476c4e..da1bd381dd182e 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1385,8 +1385,7 @@ def test_is_immortal(self): self.assertTrue(is_immortal(0)) self.assertTrue(is_immortal(b'')) self.assertTrue(is_immortal('')) - # Use encode to get the bytes singleton - self.assertTrue(is_immortal('x'.encode())) + self.assertTrue(is_immortal(b'x')) self.assertTrue(is_immortal('x')) self.assertTrue(is_immortal(()))