mirror of https://github.com/python/cpython
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@python.org>
This commit is contained in:
parent
3cc481b9de
commit
3b52c8d66b
|
@ -1177,6 +1177,18 @@ and :c:type:`PyType_Type` effectively act as defaults.)
|
||||||
|
|
||||||
.. versionadded:: 3.10
|
.. 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
|
.. c:member:: const char* PyTypeObject.tp_doc
|
||||||
|
|
||||||
|
|
|
@ -320,6 +320,9 @@ Code can use PyType_HasFeature(type_ob, flag_value) to test whether the
|
||||||
given type object has a specified feature.
|
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 */
|
/* Set if the type object is dynamically allocated */
|
||||||
#define Py_TPFLAGS_HEAPTYPE (1UL << 9)
|
#define Py_TPFLAGS_HEAPTYPE (1UL << 9)
|
||||||
|
|
||||||
|
|
|
@ -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.
|
|
@ -3875,7 +3875,7 @@ static int
|
||||||
type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
|
type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
|
if (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) {
|
||||||
PyErr_Format(
|
PyErr_Format(
|
||||||
PyExc_TypeError,
|
PyExc_TypeError,
|
||||||
"can't set attributes of built-in/extension type '%s'",
|
"can't set attributes of built-in/extension type '%s'",
|
||||||
|
@ -6229,6 +6229,11 @@ PyType_Ready(PyTypeObject *type)
|
||||||
|
|
||||||
type->tp_flags |= Py_TPFLAGS_READYING;
|
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) {
|
if (type_ready(type) < 0) {
|
||||||
type->tp_flags &= ~Py_TPFLAGS_READYING;
|
type->tp_flags &= ~Py_TPFLAGS_READYING;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in New Issue