From 2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 29 Oct 2018 13:43:07 +0100 Subject: [PATCH] bpo-35059: Convert Py_INCREF() to static inline function (GH-10079) * Convert Py_INCREF() and Py_DECREF() macros into static inline functions. * Remove _Py_CHECK_REFCNT() macro: code moved into Py_DECREF(). --- Include/object.h | 71 ++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/Include/object.h b/Include/object.h index 7b07d7d26c..f9c07f7d13 100644 --- a/Include/object.h +++ b/Include/object.h @@ -735,11 +735,7 @@ PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); #define _Py_INC_REFTOTAL _Py_RefTotal++ #define _Py_DEC_REFTOTAL _Py_RefTotal-- #define _Py_REF_DEBUG_COMMA , -#define _Py_CHECK_REFCNT(OP) \ -{ if (((PyObject*)OP)->ob_refcnt < 0) \ - _Py_NegativeRefcount(__FILE__, __LINE__, \ - (PyObject *)(OP)); \ -} + /* Py_REF_DEBUG also controls the display of refcounts and memory block * allocations at the interactive prompt and at interpreter shutdown */ @@ -748,7 +744,6 @@ PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); #define _Py_INC_REFTOTAL #define _Py_DEC_REFTOTAL #define _Py_REF_DEBUG_COMMA -#define _Py_CHECK_REFCNT(OP) /* a semicolon */; #endif /* Py_REF_DEBUG */ #ifdef COUNT_ALLOCS @@ -780,17 +775,21 @@ PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); #else /* Without Py_TRACE_REFS, there's little enough to do that we expand code - * inline. - */ -#define _Py_NewReference(op) ( \ - (_Py_tracemalloc_config.tracing \ - ? _PyTraceMalloc_NewReference(op) \ - : 0), \ - _Py_INC_TPALLOCS(op) _Py_COUNT_ALLOCS_COMMA \ - _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ - Py_REFCNT(op) = 1) + inline. */ +static inline void _Py_NewReference(PyObject *op) +{ + if (_Py_tracemalloc_config.tracing) { + _PyTraceMalloc_NewReference(op); + } + _Py_INC_TPALLOCS(op); + _Py_INC_REFTOTAL; + Py_REFCNT(op) = 1; +} -#define _Py_ForgetReference(op) _Py_INC_TPFREES(op) +static inline void _Py_ForgetReference(PyObject *op) +{ + _Py_INC_TPFREES(op); +} #ifdef Py_LIMITED_API PyAPI_FUNC(void) _Py_Dealloc(PyObject *); @@ -801,19 +800,33 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *); #endif #endif /* !Py_TRACE_REFS */ -#define Py_INCREF(op) ( \ - _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ - ((PyObject *)(op))->ob_refcnt++) - -#define Py_DECREF(op) \ - do { \ - PyObject *_py_decref_tmp = (PyObject *)(op); \ - if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ - --(_py_decref_tmp)->ob_refcnt != 0) \ - _Py_CHECK_REFCNT(_py_decref_tmp) \ - else \ - _Py_Dealloc(_py_decref_tmp); \ - } while (0) + +static inline void _Py_INCREF(PyObject *op) +{ + _Py_INC_REFTOTAL; + op->ob_refcnt++; +} + +#define Py_INCREF(op) _Py_INCREF((PyObject *)(op)) + +static inline void _Py_DECREF(const char *filename, int lineno, + PyObject *op) +{ + _Py_DEC_REFTOTAL; + if (--op->ob_refcnt != 0) { +#ifdef Py_REF_DEBUG + if (op->ob_refcnt < 0) { + _Py_NegativeRefcount(filename, lineno, op); + } +#endif + } + else { + _Py_Dealloc(op); + } +} + +#define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, (PyObject *)(op)) + /* Safely decref `op` and set `op` to NULL, especially useful in tp_clear * and tp_dealloc implementations. -- 2.40.0