aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_capi/test_object.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_capi/test_object.py')
-rw-r--r--Lib/test/test_capi/test_object.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/Lib/test/test_capi/test_object.py b/Lib/test/test_capi/test_object.py
index 3e8fd91b9a6..d4056727d07 100644
--- a/Lib/test/test_capi/test_object.py
+++ b/Lib/test/test_capi/test_object.py
@@ -1,4 +1,5 @@
import enum
+import sys
import textwrap
import unittest
from test import support
@@ -173,6 +174,16 @@ class EnableDeferredRefcountingTest(unittest.TestCase):
self.assertTrue(_testinternalcapi.has_deferred_refcount(silly_list))
+class IsUniquelyReferencedTest(unittest.TestCase):
+ """Test PyUnstable_Object_IsUniquelyReferenced"""
+ def test_is_uniquely_referenced(self):
+ self.assertTrue(_testcapi.is_uniquely_referenced(object()))
+ self.assertTrue(_testcapi.is_uniquely_referenced([]))
+ # Immortals
+ self.assertFalse(_testcapi.is_uniquely_referenced(()))
+ self.assertFalse(_testcapi.is_uniquely_referenced(42))
+ # CRASHES is_uniquely_referenced(NULL)
+
class CAPITest(unittest.TestCase):
def check_negative_refcount(self, code):
# bpo-35059: Check that Py_DECREF() reports the correct filename
@@ -210,6 +221,7 @@ class CAPITest(unittest.TestCase):
"""
self.check_negative_refcount(code)
+ @support.requires_resource('cpu')
def test_decref_delayed(self):
# gh-130519: Test that _PyObject_XDecRefDelayed() and QSBR code path
# handles destructors that are possibly re-entrant or trigger a GC.
@@ -223,5 +235,17 @@ class CAPITest(unittest.TestCase):
obj = MyObj()
_testinternalcapi.incref_decref_delayed(obj)
+ def test_is_unique_temporary(self):
+ self.assertTrue(_testcapi.pyobject_is_unique_temporary(object()))
+ obj = object()
+ self.assertFalse(_testcapi.pyobject_is_unique_temporary(obj))
+
+ def func(x):
+ # This relies on the LOAD_FAST_BORROW optimization (gh-130704)
+ self.assertEqual(sys.getrefcount(x), 1)
+ self.assertFalse(_testcapi.pyobject_is_unique_temporary(x))
+
+ func(object())
+
if __name__ == "__main__":
unittest.main()