From 0f5437cf3046bcb124a4383e0d3b6e563ec8eb95 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 20 Mar 2025 13:21:46 +0100 Subject: [PATCH] Revert "GH-127705: Move mortal decrefs to internal header and make sure _PyReftracerTrack is called" This broke Py_TRACE_REFS builds. This reverts commit fd545d735d5f9c048f99767c700f72853a9b7acd. --- Include/internal/pycore_object.h | 68 -------------------------------- Include/refcount.h | 58 +++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 68 deletions(-) diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 08cbfe46b0daff..ef3f1b6d208fee 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -431,74 +431,6 @@ _Py_DECREF_CODE(PyCodeObject *co) } #endif -#ifndef Py_GIL_DISABLED -#ifdef Py_REF_DEBUG - -static inline void Py_DECREF_MORTAL(const char *filename, int lineno, PyObject *op) -{ - if (op->ob_refcnt <= 0) { - _Py_NegativeRefcount(filename, lineno, op); - } - _Py_DECREF_STAT_INC(); - assert(!_Py_IsStaticImmortal(op)); - if (!_Py_IsImmortal(op)) { - _Py_DECREF_DecRefTotal(); - } - if (--op->ob_refcnt == 0) { -#ifdef Py_TRACE_REFS - _Py_ForgetReference(op); -#endif - _Py_Dealloc(op); - } -} -#define Py_DECREF_MORTAL(op) Py_DECREF_MORTAL(__FILE__, __LINE__, _PyObject_CAST(op)) - -static inline void _Py_DECREF_MORTAL_SPECIALIZED(const char *filename, int lineno, PyObject *op, destructor destruct) -{ - if (op->ob_refcnt <= 0) { - _Py_NegativeRefcount(filename, lineno, op); - } - _Py_DECREF_STAT_INC(); - assert(!_Py_IsStaticImmortal(op)); - if (!_Py_IsImmortal(op)) { - _Py_DECREF_DecRefTotal(); - } - if (--op->ob_refcnt == 0) { -#ifdef Py_TRACE_REFS - _Py_ForgetReference(op); -#endif - _PyReftracerTrack(op, PyRefTracer_DESTROY); - destruct(op); - } -} -#define Py_DECREF_MORTAL_SPECIALIZED(op, destruct) _Py_DECREF_MORTAL_SPECIALIZED(__FILE__, __LINE__, op, destruct) - -#else - -static inline void Py_DECREF_MORTAL(PyObject *op) -{ - assert(!_Py_IsStaticImmortal(op)); - _Py_DECREF_STAT_INC(); - if (--op->ob_refcnt == 0) { - _Py_Dealloc(op); - } -} -#define Py_DECREF_MORTAL(op) Py_DECREF_MORTAL(_PyObject_CAST(op)) - -static inline void Py_DECREF_MORTAL_SPECIALIZED(PyObject *op, destructor destruct) -{ - assert(!_Py_IsStaticImmortal(op)); - _Py_DECREF_STAT_INC(); - if (--op->ob_refcnt == 0) { - _PyReftracerTrack(op, PyRefTracer_DESTROY); - destruct(op); - } -} -#define Py_DECREF_MORTAL_SPECIALIZED(op, destruct) Py_DECREF_MORTAL_SPECIALIZED(_PyObject_CAST(op), destruct) - -#endif -#endif - /* Inline functions trading binary compatibility for speed: _PyObject_Init() is the fast version of PyObject_Init(), and _PyObject_InitVar() is the fast version of PyObject_InitVar(). diff --git a/Include/refcount.h b/Include/refcount.h index 177bbdaf0c5977..417d91bfa0da92 100644 --- a/Include/refcount.h +++ b/Include/refcount.h @@ -394,6 +394,42 @@ static inline void Py_DECREF(PyObject *op) #define Py_DECREF(op) Py_DECREF(_PyObject_CAST(op)) #elif defined(Py_REF_DEBUG) +static inline void Py_DECREF_MORTAL(const char *filename, int lineno, PyObject *op) +{ + if (op->ob_refcnt <= 0) { + _Py_NegativeRefcount(filename, lineno, op); + } + _Py_DECREF_STAT_INC(); + assert(!_Py_IsStaticImmortal(op)); + if (!_Py_IsImmortal(op)) { + _Py_DECREF_DecRefTotal(); + } + if (--op->ob_refcnt == 0) { + _Py_Dealloc(op); + } +} +#define Py_DECREF_MORTAL(op) Py_DECREF_MORTAL(__FILE__, __LINE__, _PyObject_CAST(op)) + + + +static inline void _Py_DECREF_MORTAL_SPECIALIZED(const char *filename, int lineno, PyObject *op, destructor destruct) +{ + if (op->ob_refcnt <= 0) { + _Py_NegativeRefcount(filename, lineno, op); + } + _Py_DECREF_STAT_INC(); + assert(!_Py_IsStaticImmortal(op)); + if (!_Py_IsImmortal(op)) { + _Py_DECREF_DecRefTotal(); + } + if (--op->ob_refcnt == 0) { +#ifdef Py_TRACE_REFS + _Py_ForgetReference(op); +#endif + destruct(op); + } +} +#define Py_DECREF_MORTAL_SPECIALIZED(op, destruct) _Py_DECREF_MORTAL_SPECIALIZED(__FILE__, __LINE__, op, destruct) static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) { @@ -419,6 +455,28 @@ static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) #define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) #else +static inline void Py_DECREF_MORTAL(PyObject *op) +{ + assert(!_Py_IsStaticImmortal(op)); + _Py_DECREF_STAT_INC(); + if (--op->ob_refcnt == 0) { + _Py_Dealloc(op); + } +} +#define Py_DECREF_MORTAL(op) Py_DECREF_MORTAL(_PyObject_CAST(op)) + +static inline void Py_DECREF_MORTAL_SPECIALIZED(PyObject *op, destructor destruct) +{ + assert(!_Py_IsStaticImmortal(op)); + _Py_DECREF_STAT_INC(); + if (--op->ob_refcnt == 0) { +#ifdef Py_TRACE_REFS + _Py_ForgetReference(op); +#endif + destruct(op); + } +} +#define Py_DECREF_MORTAL_SPECIALIZED(op, destruct) Py_DECREF_MORTAL_SPECIALIZED(_PyObject_CAST(op), destruct) static inline Py_ALWAYS_INLINE void Py_DECREF(PyObject *op) { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy