Skip to content

Commit fd545d7

Browse files
authored
GH-127705: Move mortal decrefs to internal header and make sure _PyReftracerTrack is called
1 parent 9881fc5 commit fd545d7

File tree

2 files changed

+68
-58
lines changed

2 files changed

+68
-58
lines changed

Include/internal/pycore_object.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,74 @@ _Py_DECREF_CODE(PyCodeObject *co)
430430
}
431431
#endif
432432

433+
#ifndef Py_GIL_DISABLED
434+
#ifdef Py_REF_DEBUG
435+
436+
static inline void Py_DECREF_MORTAL(const char *filename, int lineno, PyObject *op)
437+
{
438+
if (op->ob_refcnt <= 0) {
439+
_Py_NegativeRefcount(filename, lineno, op);
440+
}
441+
_Py_DECREF_STAT_INC();
442+
assert(!_Py_IsStaticImmortal(op));
443+
if (!_Py_IsImmortal(op)) {
444+
_Py_DECREF_DecRefTotal();
445+
}
446+
if (--op->ob_refcnt == 0) {
447+
#ifdef Py_TRACE_REFS
448+
_Py_ForgetReference(op);
449+
#endif
450+
_Py_Dealloc(op);
451+
}
452+
}
453+
#define Py_DECREF_MORTAL(op) Py_DECREF_MORTAL(__FILE__, __LINE__, _PyObject_CAST(op))
454+
455+
static inline void _Py_DECREF_MORTAL_SPECIALIZED(const char *filename, int lineno, PyObject *op, destructor destruct)
456+
{
457+
if (op->ob_refcnt <= 0) {
458+
_Py_NegativeRefcount(filename, lineno, op);
459+
}
460+
_Py_DECREF_STAT_INC();
461+
assert(!_Py_IsStaticImmortal(op));
462+
if (!_Py_IsImmortal(op)) {
463+
_Py_DECREF_DecRefTotal();
464+
}
465+
if (--op->ob_refcnt == 0) {
466+
#ifdef Py_TRACE_REFS
467+
_Py_ForgetReference(op);
468+
#endif
469+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
470+
destruct(op);
471+
}
472+
}
473+
#define Py_DECREF_MORTAL_SPECIALIZED(op, destruct) _Py_DECREF_MORTAL_SPECIALIZED(__FILE__, __LINE__, op, destruct)
474+
475+
#else
476+
477+
static inline void Py_DECREF_MORTAL(PyObject *op)
478+
{
479+
assert(!_Py_IsStaticImmortal(op));
480+
_Py_DECREF_STAT_INC();
481+
if (--op->ob_refcnt == 0) {
482+
_Py_Dealloc(op);
483+
}
484+
}
485+
#define Py_DECREF_MORTAL(op) Py_DECREF_MORTAL(_PyObject_CAST(op))
486+
487+
static inline void Py_DECREF_MORTAL_SPECIALIZED(PyObject *op, destructor destruct)
488+
{
489+
assert(!_Py_IsStaticImmortal(op));
490+
_Py_DECREF_STAT_INC();
491+
if (--op->ob_refcnt == 0) {
492+
_PyReftracerTrack(op, PyRefTracer_DESTROY);
493+
destruct(op);
494+
}
495+
}
496+
#define Py_DECREF_MORTAL_SPECIALIZED(op, destruct) Py_DECREF_MORTAL_SPECIALIZED(_PyObject_CAST(op), destruct)
497+
498+
#endif
499+
#endif
500+
433501
/* Inline functions trading binary compatibility for speed:
434502
_PyObject_Init() is the fast version of PyObject_Init(), and
435503
_PyObject_InitVar() is the fast version of PyObject_InitVar().

Include/refcount.h

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -394,42 +394,6 @@ 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)
433397

434398
static inline void Py_DECREF(const char *filename, int lineno, PyObject *op)
435399
{
@@ -455,28 +419,6 @@ static inline void Py_DECREF(const char *filename, int lineno, PyObject *op)
455419
#define Py_DECREF(op) Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
456420

457421
#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)
480422

481423
static inline Py_ALWAYS_INLINE void Py_DECREF(PyObject *op)
482424
{

0 commit comments

Comments
 (0)