From 738236dbd62aab5f0cf27f9ba0f2de3cb65802d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sat, 5 Feb 2011 20:35:29 +0000 Subject: [PATCH] Issue #11067: Add PyType_GetFlags, to support PyUnicode_Check in the limited ABI --- Doc/c-api/type.rst | 8 ++++++++ Include/object.h | 6 ++++++ Misc/NEWS | 3 +++ Modules/xxlimited.c | 8 +++++++- Objects/typeobject.c | 6 ++++++ PC/python3.def | 1 + PC/python32stub.def | 1 + 7 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 49dfb3f6712..b3386eaa8b5 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 690f87bd32e..99a77374953 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) diff --git a/Misc/NEWS b/Misc/NEWS index 94b6964cee8..7dbbcbb748f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 bd3f1783e67..5a6df8f2d8f 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 db7828a2fc5..e9c7591b818 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 b8f483ce3cb..d02c5856b2f 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 e5850c0dcb2..f8ac0994a0b 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