Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit fd545d7

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

File tree

Expand file treeCollapse file tree

2 files changed

+68
-58
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+68
-58
lines changed

‎Include/internal/pycore_object.h

Copy file name to clipboardExpand all lines: Include/internal/pycore_object.h
+68Lines 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

Copy file name to clipboardExpand all lines: Include/refcount.h
-58Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.