diff options
-rw-r--r-- | Doc/c-api/type.rst | 8 | ||||
-rw-r--r-- | Include/object.h | 6 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/xxlimited.c | 8 | ||||
-rw-r--r-- | Objects/typeobject.c | 6 | ||||
-rw-r--r-- | PC/python3.def | 1 | ||||
-rw-r--r-- | PC/python32stub.def | 1 |
7 files changed, 32 insertions, 1 deletions
diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 49dfb3f671..b3386eaa8b 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -35,6 +35,14 @@ Type Objects Clear the internal lookup cache. Return the current version tag. +.. c:function:: long PyType_GetFlags(PyTypeObject* type) + + Return the :attr:`tp_flags` member of *type*. This function is primarily + meant for use with `Py_LIMITED_API`; the individual flag bits are + guaranteed to be stable across Python releases, but access to + :attr:`tp_flags` itself is not part of the limited API. + + .. versionadded:: 3.2 .. c:function:: void PyType_Modified(PyTypeObject *type) diff --git a/Include/object.h b/Include/object.h index 690f87bd32..99a7737495 100644 --- a/Include/object.h +++ b/Include/object.h @@ -437,6 +437,8 @@ PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ +PyAPI_FUNC(long) PyType_GetFlags(PyTypeObject*); + #define PyType_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) #define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) @@ -589,7 +591,11 @@ given type object has a specified feature. Py_TPFLAGS_HAVE_VERSION_TAG | \ 0) +#ifdef Py_LIMITED_API +#define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0) +#else #define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) +#endif #define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) @@ -10,6 +10,9 @@ What's New in Python 3.2? Core and Builtins ----------------- +- Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check + in the limited ABI. + - Issue #11118: Fix bogus export of None in python3.dll. Library diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index bd3f1783e6..5a6df8f2d8 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -50,8 +50,14 @@ Xxo_dealloc(XxoObject *self) static PyObject * Xxo_demo(XxoObject *self, PyObject *args) { - if (!PyArg_ParseTuple(args, ":demo")) + PyObject *o = NULL; + if (!PyArg_ParseTuple(args, "|O:demo", &o)) return NULL; + /* Test availability of fast type checks */ + if (o != NULL && PyUnicode_Check(o)) { + Py_INCREF(o); + return o; + } Py_INCREF(Py_None); return Py_None; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index db7828a2fc..e9c7591b81 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1904,6 +1904,12 @@ type_init(PyObject *cls, PyObject *args, PyObject *kwds) return res; } +long +PyType_GetFlags(PyTypeObject *type) +{ + return type->tp_flags; +} + static PyObject * type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) { diff --git a/PC/python3.def b/PC/python3.def index b8f483ce3c..d02c5856b2 100644 --- a/PC/python3.def +++ b/PC/python3.def @@ -513,6 +513,7 @@ EXPORTS PyType_FromSpec=python32.PyType_FromSpec
PyType_GenericAlloc=python32.PyType_GenericAlloc
PyType_GenericNew=python32.PyType_GenericNew
+ PyType_GetFlags=python32.PyType_GetFlags
PyType_IsSubtype=python32.PyType_IsSubtype
PyType_Modified=python32.PyType_Modified
PyType_Ready=python32.PyType_Ready
diff --git a/PC/python32stub.def b/PC/python32stub.def index e5850c0dcb..f8ac0994a0 100644 --- a/PC/python32stub.def +++ b/PC/python32stub.def @@ -513,6 +513,7 @@ PyType_ClearCache PyType_FromSpec
PyType_GenericAlloc
PyType_GenericNew
+PyType_GetFlags
PyType_IsSubtype
PyType_Modified
PyType_Ready
|