[Python-checkins] bpo-43908: Add Py_TPFLAGS_IMMUTABLETYPE flag (GH-25520)
vstinner
webhook-mailer at python.org
Wed Apr 28 13:02:51 EDT 2021
https://github.com/python/cpython/commit/3b52c8d66b25415f09478ab43f93d59a3547dc13
commit: 3b52c8d66b25415f09478ab43f93d59a3547dc13
branch: master
author: Erlend Egeberg Aasland <erlend.aasland at innova.no>
committer: vstinner <vstinner at python.org>
date: 2021-04-28T19:02:42+02:00
summary:
bpo-43908: Add Py_TPFLAGS_IMMUTABLETYPE flag (GH-25520)
Introduce Py_TPFLAGS_IMMUTABLETYPE flag for immutable type objects, and
modify PyType_Ready() to set it for static types.
Co-authored-by: Victor Stinner <vstinner at python.org>
files:
A Misc/NEWS.d/next/C API/2021-04-22-10-46-40.bpo-43908.Co3YhZ.rst
M Doc/c-api/typeobj.rst
M Include/object.h
M Objects/typeobject.c
diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
index 9efe3aac2e1c9..4c75a12194d18 100644
--- a/Doc/c-api/typeobj.rst
+++ b/Doc/c-api/typeobj.rst
@@ -1177,6 +1177,18 @@ and :c:type:`PyType_Type` effectively act as defaults.)
.. versionadded:: 3.10
+ .. data:: Py_TPFLAGS_IMMUTABLETYPE
+
+ This bit is set for type objects that are immutable: type attributes cannot be set nor deleted.
+
+ :c:func:`PyType_Ready` automatically applies this flag to static types.
+
+ **Inheritance:**
+
+ This flag is not inherited.
+
+ .. versionadded:: 3.10
+
.. c:member:: const char* PyTypeObject.tp_doc
diff --git a/Include/object.h b/Include/object.h
index 695f01564282c..d8476f9213760 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -320,6 +320,9 @@ Code can use PyType_HasFeature(type_ob, flag_value) to test whether the
given type object has a specified feature.
*/
+/* Set if the type object is immutable: type attributes cannot be set nor deleted */
+#define Py_TPFLAGS_IMMUTABLETYPE (1UL << 8)
+
/* Set if the type object is dynamically allocated */
#define Py_TPFLAGS_HEAPTYPE (1UL << 9)
diff --git a/Misc/NEWS.d/next/C API/2021-04-22-10-46-40.bpo-43908.Co3YhZ.rst b/Misc/NEWS.d/next/C API/2021-04-22-10-46-40.bpo-43908.Co3YhZ.rst
new file mode 100644
index 0000000000000..0413c20a1b6b2
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2021-04-22-10-46-40.bpo-43908.Co3YhZ.rst
@@ -0,0 +1,3 @@
+Introduce :const:`Py_TPFLAGS_IMMUTABLETYPE` flag for immutable type objects, and
+modify :c:func:`PyType_Ready` to set it for static types. Patch by
+Erlend E. Aasland.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 254d12cc97014..e1c8be4b81545 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3875,7 +3875,7 @@ static int
type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
{
int res;
- if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
+ if (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) {
PyErr_Format(
PyExc_TypeError,
"can't set attributes of built-in/extension type '%s'",
@@ -6229,6 +6229,11 @@ PyType_Ready(PyTypeObject *type)
type->tp_flags |= Py_TPFLAGS_READYING;
+ /* Historically, all static types were immutable. See bpo-43908 */
+ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
+ type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
+ }
+
if (type_ready(type) < 0) {
type->tp_flags &= ~Py_TPFLAGS_READYING;
return -1;
More information about the Python-checkins
mailing list