@@ -394,6 +394,42 @@ static inline void Py_DECREF(PyObject *op)
394394#define Py_DECREF (op ) Py_DECREF(_PyObject_CAST(op))
395395
396396#elif defined(Py_REF_DEBUG )
397+ static inline void Py_DECREF_MORTAL (const char * filename , int lineno , PyObject * op )
398+ {
399+ if (op -> ob_refcnt <= 0 ) {
400+ _Py_NegativeRefcount (filename , lineno , op );
401+ }
402+ _Py_DECREF_STAT_INC ();
403+ assert (!_Py_IsStaticImmortal (op ));
404+ if (!_Py_IsImmortal (op )) {
405+ _Py_DECREF_DecRefTotal ();
406+ }
407+ if (-- op -> ob_refcnt == 0 ) {
408+ _Py_Dealloc (op );
409+ }
410+ }
411+ #define Py_DECREF_MORTAL (op ) Py_DECREF_MORTAL(__FILE__, __LINE__, _PyObject_CAST(op))
412+
413+
414+
415+ static inline void _Py_DECREF_MORTAL_SPECIALIZED (const char * filename , int lineno , PyObject * op , destructor destruct )
416+ {
417+ if (op -> ob_refcnt <= 0 ) {
418+ _Py_NegativeRefcount (filename , lineno , op );
419+ }
420+ _Py_DECREF_STAT_INC ();
421+ assert (!_Py_IsStaticImmortal (op ));
422+ if (!_Py_IsImmortal (op )) {
423+ _Py_DECREF_DecRefTotal ();
424+ }
425+ if (-- op -> ob_refcnt == 0 ) {
426+ #ifdef Py_TRACE_REFS
427+ _Py_ForgetReference (op );
428+ #endif
429+ destruct (op );
430+ }
431+ }
432+ #define Py_DECREF_MORTAL_SPECIALIZED (op , destruct ) _Py_DECREF_MORTAL_SPECIALIZED(__FILE__, __LINE__, op, destruct)
397433
398434static inline void Py_DECREF (const char * filename , int lineno , PyObject * op )
399435{
@@ -419,6 +455,28 @@ static inline void Py_DECREF(const char *filename, int lineno, PyObject *op)
419455#define Py_DECREF (op ) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
420456
421457#else
458+ static inline void Py_DECREF_MORTAL (PyObject * op )
459+ {
460+ assert (!_Py_IsStaticImmortal (op ));
461+ _Py_DECREF_STAT_INC ();
462+ if (-- op -> ob_refcnt == 0 ) {
463+ _Py_Dealloc (op );
464+ }
465+ }
466+ #define Py_DECREF_MORTAL (op ) Py_DECREF_MORTAL(_PyObject_CAST(op))
467+
468+ static inline void Py_DECREF_MORTAL_SPECIALIZED (PyObject * op , destructor destruct )
469+ {
470+ assert (!_Py_IsStaticImmortal (op ));
471+ _Py_DECREF_STAT_INC ();
472+ if (-- op -> ob_refcnt == 0 ) {
473+ #ifdef Py_TRACE_REFS
474+ _Py_ForgetReference (op );
475+ #endif
476+ destruct (op );
477+ }
478+ }
479+ #define Py_DECREF_MORTAL_SPECIALIZED (op , destruct ) Py_DECREF_MORTAL_SPECIALIZED(_PyObject_CAST(op), destruct)
422480
423481static inline Py_ALWAYS_INLINE void Py_DECREF (PyObject * op )
424482{
0 commit comments