]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-127705: Check for immortality in refcount accounting (#131072)
authorMark Shannon <mark@hotpy.org>
Tue, 11 Mar 2025 11:53:07 +0000 (11:53 +0000)
committerGitHub <noreply@github.com>
Tue, 11 Mar 2025 11:53:07 +0000 (11:53 +0000)
Check for immortality in refcount accounting

Include/refcount.h

index 88918409d934f63e6123d057440cbfad0002cb26..e66e4aaace314057aff1e7463d040bbb1656fa8c 100644 (file)
@@ -249,7 +249,9 @@ static inline Py_ALWAYS_INLINE void Py_INCREF_MORTAL(PyObject *op)
     op->ob_refcnt++;
     _Py_INCREF_STAT_INC();
 #if defined(Py_REF_DEBUG) && !defined(Py_LIMITED_API)
-    _Py_INCREF_IncRefTotal();
+    if (!_Py_IsImmortal(op)) {
+        _Py_INCREF_IncRefTotal();
+    }
 #endif
 }
 #endif
@@ -391,7 +393,9 @@ static inline void Py_DECREF_MORTAL(const char *filename, int lineno, PyObject *
     }
     _Py_DECREF_STAT_INC();
     assert(!_Py_IsStaticImmortal(op));
-    _Py_DECREF_DecRefTotal();
+    if (!_Py_IsImmortal(op)) {
+        _Py_DECREF_DecRefTotal();
+    }
     if (--op->ob_refcnt == 0) {
         _Py_Dealloc(op);
     }
@@ -407,7 +411,9 @@ static inline void _Py_DECREF_MORTAL_SPECIALIZED(const char *filename, int linen
     }
     _Py_DECREF_STAT_INC();
     assert(!_Py_IsStaticImmortal(op));
-    _Py_DECREF_DecRefTotal();
+    if (!_Py_IsImmortal(op)) {
+        _Py_DECREF_DecRefTotal();
+    }
     if (--op->ob_refcnt == 0) {
         destruct(op);
     }