mirror of https://github.com/python/cpython.git
GH-127705: Move mortal decrefs to internal header and make sure _PyReftracerTrack is called
This commit is contained in:
parent
9881fc5483
commit
fd545d735d
|
@ -430,6 +430,74 @@ _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().
|
||||
|
|
|
@ -394,42 +394,6 @@ 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)
|
||||
{
|
||||
|
@ -455,28 +419,6 @@ 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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue