py3.10-prep: reset the type cache after feature switching
authorChristian Tismer <tismer@stackless.com>
Sat, 8 May 2021 14:06:23 +0000 (16:06 +0200)
committerPeter Michael Green <plugwash@raspbian.org>
Sat, 5 Feb 2022 15:09:17 +0000 (15:09 +0000)
When using feature switching in Python 3.10, there were
funny effects where switched and un-switched versions appeared
to co-exist.

It turned out that we were hit by function caching that
is now implemented for the LOAD_ATTR opcode.

It was not known that caching would happen at all for
PySide classes because we don't use Py_TPFLAGS_VALID_VERSION_TAG.
But actually, this flag is used internally by Python to do some
optimizations, and we just have to notify the interpreter of
type changes by PyType_Modified().

(cherry picked from commit 3a2b7c6f88bba04d8b7ddb571163d23c15c36a4f)

Gbp-Pq: Name py3.10-prep-reset-the-type-cache-after-feature-switching.patch

sources/pyside2/libpyside/feature_select.cpp

index 6a21d168daf0d2d938528778ec95d4b55b29904f..3da7dde3879271bd48520f56a0a40744068d701b 100644 (file)
@@ -405,6 +405,8 @@ static inline PyObject *SelectFeatureSet(PyTypeObject *type)
             if (!SelectFeatureSetSubtype(sub_type, select_id))
                 break;
         }
+        // PYSIDE-1436: Clear all caches for the type and subtypes.
+        PyType_Modified(type);
     }
     return type->tp_dict;
 }