@@ -229,6 +229,13 @@ _PyType_CheckConsistency(PyTypeObject *type)
229
229
CHECK (type -> tp_traverse != NULL );
230
230
}
231
231
232
+ if (_PyType_HasFeature (type , Py_TPFLAGS_VALID_VERSION_TAG )) {
233
+ CHECK (type -> tp_version_tag != 0 );
234
+ }
235
+ else {
236
+ CHECK (type -> tp_version_tag == 0 );
237
+ }
238
+
232
239
if (type -> tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION ) {
233
240
CHECK (type -> tp_new == NULL );
234
241
CHECK (PyDict_Contains (type -> tp_dict , & _Py_ID (__new__ )) == 0 );
@@ -4469,8 +4476,6 @@ _PyStaticType_Dealloc(PyTypeObject *type)
4469
4476
}
4470
4477
4471
4478
type -> tp_flags &= ~Py_TPFLAGS_READY ;
4472
- type -> tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG ;
4473
- type -> tp_version_tag = 0 ;
4474
4479
4475
4480
if (type -> tp_flags & _Py_TPFLAGS_STATIC_BUILTIN ) {
4476
4481
_PyStaticType_ClearWeakRefs (type );
@@ -6971,6 +6976,12 @@ PyType_Ready(PyTypeObject *type)
6971
6976
type -> tp_flags |= Py_TPFLAGS_IMMUTABLETYPE ;
6972
6977
}
6973
6978
6979
+ /* All immutable types must have a static valid version tag */
6980
+ if (type -> tp_flags & Py_TPFLAGS_IMMUTABLETYPE ) {
6981
+ type -> tp_version_tag = next_version_tag ++ ;
6982
+ type -> tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG ;
6983
+ }
6984
+
6974
6985
if (type_ready (type ) < 0 ) {
6975
6986
type -> tp_flags &= ~Py_TPFLAGS_READYING ;
6976
6987
return -1 ;
0 commit comments