[Python-checkins] bpo-35059: Convert _Py_Dealloc() to static inline function (GH-10223)
Victor Stinner
webhook-mailer at python.org
Tue Oct 30 09:48:30 EDT 2018
https://github.com/python/cpython/commit/3c09dca4b5de9fe8c8756251d02f49cf093b88c1
commit: 3c09dca4b5de9fe8c8756251d02f49cf093b88c1
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-10-30T14:48:26+01:00
summary:
bpo-35059: Convert _Py_Dealloc() to static inline function (GH-10223)
Convert _Py_Dealloc() macro into a static inline function. Moreover,
it is now also defined as a static inline function if Py_TRACE_REFS
is defined.
files:
M Include/object.h
M Objects/object.c
diff --git a/Include/object.h b/Include/object.h
index 799c40b2caf0..10ec60051e5e 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -768,7 +768,6 @@ PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op);
/* Py_TRACE_REFS is such major surgery that we call external routines. */
PyAPI_FUNC(void) _Py_NewReference(PyObject *);
PyAPI_FUNC(void) _Py_ForgetReference(PyObject *);
-PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
PyAPI_FUNC(void) _Py_PrintReferences(FILE *);
PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *);
PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force);
@@ -790,15 +789,25 @@ static inline void _Py_ForgetReference(PyObject *op)
{
_Py_INC_TPFREES(op);
}
+#endif /* !Py_TRACE_REFS */
+
-#ifdef Py_LIMITED_API
PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
+
+#ifndef Py_LIMITED_API
+static inline void _Py_Dealloc_inline(PyObject *op)
+{
+ destructor dealloc = Py_TYPE(op)->tp_dealloc;
+#ifdef Py_TRACE_REFS
+ _Py_ForgetReference(op);
#else
-#define _Py_Dealloc(op) ( \
- _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA \
- (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op)))
+ _Py_INC_TPFREES(op);
#endif
-#endif /* !Py_TRACE_REFS */
+ (*dealloc)(op);
+}
+
+# define _Py_Dealloc(op) _Py_Dealloc_inline(op)
+#endif /* !defined(Py_LIMITED_API) */
static inline void _Py_INCREF(PyObject *op)
diff --git a/Objects/object.c b/Objects/object.c
index de9eb2cb4e2c..b72ad019c796 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -1964,14 +1964,6 @@ _Py_ForgetReference(PyObject *op)
_Py_INC_TPFREES(op);
}
-void
-_Py_Dealloc(PyObject *op)
-{
- destructor dealloc = Py_TYPE(op)->tp_dealloc;
- _Py_ForgetReference(op);
- (*dealloc)(op);
-}
-
/* Print all live objects. Because PyObject_Print is called, the
* interpreter must be in a healthy state.
*/
@@ -2265,18 +2257,20 @@ _PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
Py_FatalError("_PyObject_AssertFailed");
}
-#ifndef Py_TRACE_REFS
-/* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
- Define this here, so we can undefine the macro. */
+
#undef _Py_Dealloc
-void _Py_Dealloc(PyObject *);
+
void
_Py_Dealloc(PyObject *op)
{
- _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA
- (*Py_TYPE(op)->tp_dealloc)(op);
-}
+ destructor dealloc = Py_TYPE(op)->tp_dealloc;
+#ifdef Py_TRACE_REFS
+ _Py_ForgetReference(op);
+#else
+ _Py_INC_TPFREES(op);
#endif
+ (*dealloc)(op);
+}
#ifdef __cplusplus
}
More information about the Python-checkins
mailing list