]> granicus.if.org Git - python/commitdiff
bpo-35059: Convert _Py_Dealloc() to static inline function (GH-10223)
authorVictor Stinner <vstinner@redhat.com>
Tue, 30 Oct 2018 13:48:26 +0000 (14:48 +0100)
committerGitHub <noreply@github.com>
Tue, 30 Oct 2018 13:48:26 +0000 (14:48 +0100)
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.

Include/object.h
Objects/object.c

index 799c40b2caf04dc5f160ad6be06586bcb779cfb5..10ec60051e5e8e67c133cbfd3cce5f2f6f17b45c 100644 (file)
@@ -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)
index de9eb2cb4e2cda952aa98f9ce760ed3b3fdd7875..b72ad019c796f2e7e1ea28a2a25a5ce09bd1aaea 100644 (file)
@@ -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
 }