diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-10-29 12:43:07 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-29 12:43:07 (GMT) |
commit | 2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12 (patch) | |
tree | af9fe2d82f64b8cd98c0b428219de3b2cbf29676 /Include/object.h | |
parent | c0799ec973530ad2492bb1d6c7287ffc428f0348 (diff) | |
download | cpython-2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12.zip cpython-2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12.tar.gz cpython-2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12.tar.bz2 |
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().
Diffstat (limited to 'Include/object.h')
-rw-r--r-- | Include/object.h | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/Include/object.h b/Include/object.h index 7b07d7d..f9c07f7 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. |