summaryrefslogtreecommitdiffstats
path: root/Include/object.h
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-10-29 12:43:07 (GMT)
committerGitHub <noreply@github.com>2018-10-29 12:43:07 (GMT)
commit2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12 (patch)
treeaf9fe2d82f64b8cd98c0b428219de3b2cbf29676 /Include/object.h
parentc0799ec973530ad2492bb1d6c7287ffc428f0348 (diff)
downloadcpython-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.h71
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.