PySide2 fails to build with Python 3.10 on "Py_REFCNT(ob) = 1;" in finalizeStaticStrings() of sources/shiboken2/libshiboken/sbkstring.cpp. In Python 3.10, it's no longer possible to use the Py_REFCNT() macro to set an object reference count (only use it to get an object reference count). The Py_SET_REFCNT() function must now be used instead (function available since Python 3.9).
Moreover, interned strings are now cleared at Python exit since Python 3.10. So it's unsafe to set directly a static string reference count to 1 and call Py_DECREF() on it to destroy it. Python is likely to crash in this case.
I suggest to simply use call Py_DECREF() twice on static strings in finalizeStaticStrings(): see attached patch.
I tested the patch on the Fedora Python 3.10 COPR and the package built successfully with my patch (but I did not test an application using PySide).
I chose to only change the behavior on Python 3.10 and newer, since interned strings were not cleared at exit on Python 3.9 and older.
- Py_SET_REFCNT() function: https://docs.python.org/dev/c-api/structures.html#c.Py_SET_REFCNT
- What's New in Python 3.10: Py_REFCNT() change https://docs.python.org/dev/whatsnew/3.10.html#id2
- Python 3.10 releases interned strings at exit: https://github.com/python/cpython/commit/666ecfb0957a2fa0df5e2bd03804195de74bdfbf
- Fedora downstream issue: https://bugzilla.redhat.com/show_bug.cgi?id=1902618
- Fedora fix using my patch: https://src.fedoraproject.org/rpms/python-pyside2/pull-request/7
- relates to
PYSIDE-1632 5.15 / Py3.9.6 doesnt build on windows10 msvc2019