]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-47164: Add _PyCFunctionObject_CAST() macr (GH-32190)
authorVictor Stinner <vstinner@python.org>
Thu, 31 Mar 2022 08:03:13 +0000 (10:03 +0200)
committerGitHub <noreply@github.com>
Thu, 31 Mar 2022 08:03:13 +0000 (10:03 +0200)
Add _PyCFunctionObject_CAST() and _PyCMethodObject_CAST() macros to
make macros casting their argument easier to read, but also to check
the type of their input in debug mode: assert(PyCFunction_Check(func)
and assert(PyCMethod_Check(func).

Reformat also PyCFunction_XXX() macros for readability.

Include/cpython/methodobject.h

index 7ecbfe3b5e2fe87d9482bd56f72b69fce37d6c26..46d177793fc4cc9685b14a3ddecc6d8f8af22271 100644 (file)
@@ -7,18 +7,23 @@ PyAPI_DATA(PyTypeObject) PyCMethod_Type;
 #define PyCMethod_CheckExact(op) Py_IS_TYPE(op, &PyCMethod_Type)
 #define PyCMethod_Check(op) PyObject_TypeCheck(op, &PyCMethod_Type)
 
+#define _PyCFunctionObject_CAST(func) \
+    (assert(PyCFunction_Check(func)), (PyCFunctionObject *)(func))
+#define _PyCMethodObject_CAST(func) \
+    (assert(PyCMethod_Check(func)), (PyCMethodObject *)(func))
+
 /* Macros for direct access to these values. Type checks are *not*
    done, so use with care. */
 #define PyCFunction_GET_FUNCTION(func) \
-        (((PyCFunctionObject *)func) -> m_ml -> ml_meth)
+    (_PyCFunctionObject_CAST(func)->m_ml->ml_meth)
 #define PyCFunction_GET_SELF(func) \
-        (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \
-         NULL : ((PyCFunctionObject *)func) -> m_self)
+    (_PyCFunctionObject_CAST(func)->m_ml->ml_flags & METH_STATIC ? \
+     NULL : _PyCFunctionObject_CAST(func)->m_self)
 #define PyCFunction_GET_FLAGS(func) \
-        (((PyCFunctionObject *)func) -> m_ml -> ml_flags)
+    (_PyCFunctionObject_CAST(func)->m_ml->ml_flags)
 #define PyCFunction_GET_CLASS(func) \
-    (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_METHOD ? \
-         ((PyCMethodObject *)func) -> mm_class : NULL)
+    (_PyCFunctionObject_CAST(func)->m_ml->ml_flags & METH_METHOD ? \
+     _PyCMethodObject_CAST(func)->mm_class : NULL)
 
 typedef struct {
     PyObject_HEAD