[Python-checkins] bpo-39542: Convert PyType_Check() to static inline function (GH-18364)

Victor Stinner webhook-mailer at python.org
Wed Feb 5 08:24:47 EST 2020


https://github.com/python/cpython/commit/509dd90f4684e40af3105dd3e754fa4b9c1530c1
commit: 509dd90f4684e40af3105dd3e754fa4b9c1530c1
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2020-02-05T14:24:17+01:00
summary:

bpo-39542: Convert PyType_Check() to static inline function (GH-18364)

Convert PyType_HasFeature(), PyType_Check() and PyType_CheckExact()
macros to static inline functions.

files:
A Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst
M Doc/c-api/type.rst
M Include/cpython/object.h
M Include/object.h

diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst
index 41956b7dca503..f774ca35edab9 100644
--- a/Doc/c-api/type.rst
+++ b/Doc/c-api/type.rst
@@ -21,14 +21,14 @@ Type Objects
 
 .. c:function:: int PyType_Check(PyObject *o)
 
-   Return true if the object *o* is a type object, including instances of types
-   derived from the standard type object.  Return false in all other cases.
+   Return non-zero if the object *o* is a type object, including instances of
+   types derived from the standard type object.  Return 0 in all other cases.
 
 
 .. c:function:: int PyType_CheckExact(PyObject *o)
 
-   Return true if the object *o* is a type object, but not a subtype of the
-   standard type object.  Return false in all other cases.
+   Return non-zero if the object *o* is a type object, but not a subtype of the
+   standard type object.  Return 0 in all other cases.
 
 
 .. c:function:: unsigned int PyType_ClearCache()
@@ -57,8 +57,8 @@ Type Objects
 
 .. c:function:: int PyType_HasFeature(PyTypeObject *o, int feature)
 
-   Return true if the type object *o* sets the feature *feature*.  Type features
-   are denoted by single bit flags.
+   Return non-zero if the type object *o* sets the feature *feature*.
+   Type features are denoted by single bit flags.
 
 
 .. c:function:: int PyType_IS_GC(PyTypeObject *o)
diff --git a/Include/cpython/object.h b/Include/cpython/object.h
index e36f824eeb356..0b5260eda7d8a 100644
--- a/Include/cpython/object.h
+++ b/Include/cpython/object.h
@@ -341,8 +341,6 @@ PyAPI_FUNC(int)
 _PyObject_GenericSetAttrWithDict(PyObject *, PyObject *,
                                  PyObject *, PyObject *);
 
-#define PyType_HasFeature(t,f)  (((t)->tp_flags & (f)) != 0)
-
 PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *);
 
 /* Safely decref `op` and set `op` to `op2`.
diff --git a/Include/object.h b/Include/object.h
index 91855d0aa8ae1..3a20e666202d5 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -207,10 +207,6 @@ PyAPI_DATA(struct _typeobject) PySuper_Type; /* built-in 'super' */
 
 PyAPI_FUNC(unsigned long) PyType_GetFlags(struct _typeobject*);
 
-#define PyType_Check(op) \
-    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS)
-#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type)
-
 PyAPI_FUNC(int) PyType_Ready(struct _typeobject *);
 PyAPI_FUNC(PyObject *) PyType_GenericAlloc(struct _typeobject *, Py_ssize_t);
 PyAPI_FUNC(PyObject *) PyType_GenericNew(struct _typeobject *,
@@ -342,11 +338,6 @@ given type object has a specified feature.
 /* Type structure has tp_finalize member (3.4) */
 #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0)
 
-#ifdef Py_LIMITED_API
-#  define PyType_HasFeature(t,f)  ((PyType_GetFlags(t) & (f)) != 0)
-#endif
-#define PyType_FastSubclass(t,f)  PyType_HasFeature(t,f)
-
 
 /*
 The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement
@@ -600,6 +591,28 @@ times.
 #  undef Py_CPYTHON_OBJECT_H
 #endif
 
+
+static inline int
+PyType_HasFeature(PyTypeObject *type, unsigned long feature) {
+#ifdef Py_LIMITED_API
+    return ((PyType_GetFlags(type) & feature) != 0);
+#else
+    return ((type->tp_flags & feature) != 0);
+#endif
+}
+
+#define PyType_FastSubclass(type, flag) PyType_HasFeature(type, flag)
+
+static inline int _PyType_Check(PyObject *op) {
+    return PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS);
+}
+#define PyType_Check(op) _PyType_Check(_PyObject_CAST(op))
+
+static inline int _PyType_CheckExact(PyObject *op) {
+    return (Py_TYPE(op) == &PyType_Type);
+}
+#define PyType_CheckExact(op) _PyType_CheckExact(_PyObject_CAST(op))
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst b/Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst
new file mode 100644
index 0000000000000..46fb1d257e8e9
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst	
@@ -0,0 +1,2 @@
+Convert :c:func:`PyType_HasFeature`, :c:func:`PyType_Check` and
+:c:func:`PyType_CheckExact` macros to static inline functions.



More information about the Python-checkins mailing list