[neon/qt/pyside2/Neon/release] debian: Backport upstream patches for Python 3.10 support.

Dmitry Shachnev null at kde.org
Wed Oct 19 14:56:29 BST 2022


Git commit c029fda4da4ad9a588b0047c66069ce5cad61824 by Dmitry Shachnev, on behalf of Dmitry Shachnev.
Committed on 15/11/2021 at 12:41.
Pushed by jriddell into branch 'Neon/release'.

Backport upstream patches for Python 3.10 support.

Closes: #999369.

M  +2    -0    debian/changelog
A  +139  -0    debian/patches/py3.10-prep-Finally-support-Python-3.10.patch
A  +51   -0    debian/patches/py3.10-prep-Fix-a-very-old-refcounting-error-in-time_test.patch
A  +51   -0    debian/patches/py3.10-prep-Fix-parser.py-for-changed-typing-module.patch
A  +35   -0    debian/patches/py3.10-prep-reset-the-type-cache-after-feature-switching.patch
M  +4    -0    debian/patches/series

https://invent.kde.org/neon/qt/pyside2/commit/c029fda4da4ad9a588b0047c66069ce5cad61824

diff --git a/debian/changelog b/debian/changelog
index acb5819b..43eb8fd9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,7 @@
 pyside2 (5.15.2-2) UNRELEASED; urgency=medium
 
+  [ Dmitry Shachnev ]
+  * Backport upstream patches for Python 3.10 support (closes: #999369).
 
  -- Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>  Mon, 15 Nov 2021 15:40:37 +0300
 
diff --git a/debian/patches/py3.10-prep-Finally-support-Python-3.10.patch b/debian/patches/py3.10-prep-Finally-support-Python-3.10.patch
new file mode 100644
index 00000000..a96abf10
--- /dev/null
+++ b/debian/patches/py3.10-prep-Finally-support-Python-3.10.patch
@@ -0,0 +1,139 @@
+From: Christian Tismer <tismer at stackless.com>
+Date: Sat, 8 May 2021 16:06:23 +0200
+Subject: py3.10-prep: Finally support Python 3.10
+
+After the major problems are solved in
+    py3.10-prep: re-implement zip import
+    py3.10-prep: reset the type cache after feature switching
+    py3.10-prep: Fix parser.py for changed typing module
+
+, there are only some minor changes left to do. One thing
+is still not clear:
+
+* Unsolved: In time_test.py, the last two tests work but
+crash at shutdown.
+It is not yet clear if this is a PySide or Python error.
+
+This will crash Python 3.10 if not solved until the release.
+
+(cherry picked from commit 81e9cff884d6b03cdf64a5dd6ec6564d99177e0c)
+---
+ build_scripts/config.py                                     |  1 +
+ sources/pyside2/tests/QtWidgets/signature_test.py           |  5 +++--
+ sources/shiboken2/libshiboken/pep384impl.cpp                | 13 ++++++-------
+ sources/shiboken2/libshiboken/pep384impl.h                  |  7 ++++++-
+ sources/shiboken2/libshiboken/sbkstring.cpp                 |  2 +-
+ .../files.dir/shibokensupport/signature/mapping.py          |  1 +
+ 6 files changed, 18 insertions(+), 11 deletions(-)
+
+diff --git a/build_scripts/config.py b/build_scripts/config.py
+index b1b3206..7ff155c 100644
+--- a/build_scripts/config.py
++++ b/build_scripts/config.py
+@@ -93,6 +93,7 @@ class Config(object):
+             'Programming Language :: Python :: 3.7',
+             'Programming Language :: Python :: 3.8',
+             'Programming Language :: Python :: 3.9',
++            'Programming Language :: Python :: 3.10',
+         ]
+ 
+         self.setup_script_dir = None
+diff --git a/sources/pyside2/tests/QtWidgets/signature_test.py b/sources/pyside2/tests/QtWidgets/signature_test.py
+index 57fcf38..cacb576 100644
+--- a/sources/pyside2/tests/QtWidgets/signature_test.py
++++ b/sources/pyside2/tests/QtWidgets/signature_test.py
+@@ -65,8 +65,9 @@ class PySideSignatureTest(unittest.TestCase):
+         for thing in obj.__signature__:
+             self.assertEqual(type(thing), inspect.Signature)
+         sm = PySide2.QtWidgets.QApplication.__dict__["palette"]
+-        self.assertFalse(callable(sm))
+-        self.assertEqual(sm.__func__, obj)
++        # PYSIDE-1436: staticmethod is a callable since Python 3.10
++        # Instead of checking callable(sm), we check the type:
++        self.assertEqual(type(sm), staticmethod)
+         self.assertTrue(hasattr(sm, "__signature__") and
+                         sm.__signature__ is not None)
+ 
+diff --git a/sources/shiboken2/libshiboken/pep384impl.cpp b/sources/shiboken2/libshiboken/pep384impl.cpp
+index cb80425..633d9dc 100644
+--- a/sources/shiboken2/libshiboken/pep384impl.cpp
++++ b/sources/shiboken2/libshiboken/pep384impl.cpp
+@@ -751,14 +751,14 @@ _Pep_PrivateMangle(PyObject *self, PyObject *name)
+ #endif // IS_PY2
+     Shiboken::AutoDecRef privateobj(PyObject_GetAttr(
+         reinterpret_cast<PyObject *>(Py_TYPE(self)), Shiboken::PyMagicName::name()));
+-#ifndef Py_LIMITED_API
+-    return _Py_Mangle(privateobj, name);
+-#else
+-    // For some reason, _Py_Mangle is not in the Limited API. Why?
+-    size_t plen = PyUnicode_GET_LENGTH(privateobj);
++
++    // PYSIDE-1436: _Py_Mangle is no longer exposed; implement it always.
++    // The rest of this function is our own implementation of _Py_Mangle.
++    // Please compare the original function in compile.c .
++    size_t plen = PyUnicode_GET_LENGTH(privateobj.object());
+     /* Strip leading underscores from class name */
+     size_t ipriv = 0;
+-    while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
++    while (PyUnicode_READ_CHAR(privateobj.object(), ipriv) == '_')
+         ipriv++;
+     if (ipriv == plen) {
+         Py_INCREF(name);
+@@ -787,7 +787,6 @@ _Pep_PrivateMangle(PyObject *self, PyObject *name)
+     if (amount > big_stack)
+         free(resbuf);
+     return result;
+-#endif // else Py_LIMITED_API
+ }
+ 
+ /*****************************************************************************
+diff --git a/sources/shiboken2/libshiboken/pep384impl.h b/sources/shiboken2/libshiboken/pep384impl.h
+index 7a6f57f..eb65596 100644
+--- a/sources/shiboken2/libshiboken/pep384impl.h
++++ b/sources/shiboken2/libshiboken/pep384impl.h
+@@ -40,6 +40,11 @@
+ #ifndef PEP384IMPL_H
+ #define PEP384IMPL_H
+ 
++// PYSIDE-1436: Adapt to Python 3.10
++#if PY_VERSION_HEX < 0x030900A4
++#  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)
++#endif
++
+ extern "C"
+ {
+ 
+@@ -327,7 +332,7 @@ LIBSHIBOKEN_API PyObject *PyRun_String(const char *, int, PyObject *, PyObject *
+ // But this is no problem as we check it's validity for every version.
+ 
+ #define PYTHON_BUFFER_VERSION_COMPATIBLE    (PY_VERSION_HEX >= 0x03030000 && \
+-                                             PY_VERSION_HEX <  0x0309FFFF)
++                                             PY_VERSION_HEX <  0x030AFFFF)
+ #if !PYTHON_BUFFER_VERSION_COMPATIBLE
+ # error Please check the buffer compatibility for this python version!
+ #endif
+diff --git a/sources/shiboken2/libshiboken/sbkstring.cpp b/sources/shiboken2/libshiboken/sbkstring.cpp
+index 918aae7..077fb53 100644
+--- a/sources/shiboken2/libshiboken/sbkstring.cpp
++++ b/sources/shiboken2/libshiboken/sbkstring.cpp
+@@ -247,7 +247,7 @@ static void finalizeStaticStrings()
+ {
+     auto &set = staticStrings();
+     for (PyObject *ob : set) {
+-        Py_REFCNT(ob) = 1;
++        Py_SET_REFCNT(ob, 1);
+         Py_DECREF(ob);
+     }
+     set.clear();
+diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
+index 6fadd19..f701d83 100644
+--- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
++++ b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py
+@@ -300,6 +300,7 @@ type_map.update({
+     "zero(object)": None,
+     "zero(str)": "",
+     "zero(typing.Any)": None,
++    "zero(Any)": None,
+     })
+ 
+ type_map.update({
diff --git a/debian/patches/py3.10-prep-Fix-a-very-old-refcounting-error-in-time_test.patch b/debian/patches/py3.10-prep-Fix-a-very-old-refcounting-error-in-time_test.patch
new file mode 100644
index 00000000..8eddad76
--- /dev/null
+++ b/debian/patches/py3.10-prep-Fix-a-very-old-refcounting-error-in-time_test.patch
@@ -0,0 +1,51 @@
+From: Christian Tismer <tismer at stackless.com>
+Date: Fri, 20 Aug 2021 18:18:57 +0200
+Subject: py3.10-prep: Fix a very old refcounting error in time_test.py
+
+Since 2012-03-08, there was a refcounting error in
+the typesystem_sample.xml file at <value-type name="Time">.
+The boolean function results were not refcounted.
+
+(Commit 7b731d702c64d172e192aa1876e4a6fade6c38d7)
+
+This bug was hard to find because nobody expects a failure in the
+testing code, and the error shows up at the very end in the
+finalization code, totally unrelated to the error location.
+
+In order to find it, the setting `PYTHONMALLOC=malloc` was needed,
+because otherwise we got a Python memory dump but no traceback.
+Then, Python was modified and code was inserted in the various
+involved `code_dealloc`, `tupledealloc` and `object_dealloc`
+functions that printed the involved refcounts and types before
+performing the actual deallocation.
+
+This bug actually was of no harm since only the wrong test was
+involved. It was very misleading because there were quite some
+changes to the `datetime` module in Python 3.10. But the bug
+was nothing but a dormant refcounting error.
+
+(cherry picked from commit 2af6ac20de365116b52b65c6c34cfd6c536c23df)
+---
+ sources/shiboken2/tests/samplebinding/typesystem_sample.xml | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
+index 595afb9..70fabcf 100644
+--- a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
++++ b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
+@@ -1953,6 +1953,7 @@
+                     %PYARG_0 = Py_False;
+                 else
+                     %PYARG_0 = Py_True;
++                Py_INCREF(%PYARG_0);
+             }
+           </inject-code>
+         </add-function>
+@@ -1970,6 +1971,7 @@
+                     %PYARG_0 = Py_True;
+                 else
+                     %PYARG_0 = Py_False;
++                Py_INCREF(%PYARG_0);
+             }
+           </inject-code>
+         </add-function>
diff --git a/debian/patches/py3.10-prep-Fix-parser.py-for-changed-typing-module.patch b/debian/patches/py3.10-prep-Fix-parser.py-for-changed-typing-module.patch
new file mode 100644
index 00000000..c6ea7546
--- /dev/null
+++ b/debian/patches/py3.10-prep-Fix-parser.py-for-changed-typing-module.patch
@@ -0,0 +1,51 @@
+From: Christian Tismer <tismer at stackless.com>
+Date: Sat, 8 May 2021 16:06:23 +0200
+Subject: py3.10-prep: Fix parser.py for changed typing module
+
+The typing module has subtle changes that are not even
+documented: Typing types now have a __name__ attribute.
+That confused the parser of the pyi generator because
+suddenly stingizing
+
+    Callable[..., Optional[str]]
+
+resulted in
+
+    Callable[..., Optional]
+
+because of special rules that return the generic name
+of a typing type, which was very unexpected. Finding this bug
+took a lot of debugging of the recursive `_resolve_type`
+function.
+
+(cherry picked from commit 2530cb3f165ac02b8f7132e3f5ab4f7f6896dbd9)
+---
+ .../shibokenmodule/files.dir/shibokensupport/signature/parser.py     | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/parser.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/parser.py
+index 20c791c..1a29df5 100644
+--- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/parser.py
++++ b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/parser.py
+@@ -43,10 +43,11 @@ import sys
+ import re
+ import warnings
+ import types
++import typing
+ import keyword
+ import functools
+ from shibokensupport.signature.mapping import (type_map, update_mapping,
+-    namespace, typing, _NotCalled, ResultVariable, ArrayLikeVariable)
++    namespace, _NotCalled, ResultVariable, ArrayLikeVariable)
+ from shibokensupport.signature.lib.tool import (SimpleNamespace,
+     build_brace_pattern)
+ 
+@@ -222,7 +223,7 @@ def _resolve_arraytype(thing, line):
+ def to_string(thing):
+     if isinstance(thing, str):
+         return thing
+-    if hasattr(thing, "__name__"):
++    if hasattr(thing, "__name__") and thing.__module__ != "typing":
+         dot = "." in str(thing)
+         name = get_name(thing)
+         return thing.__module__ + "." + name if dot else name
diff --git a/debian/patches/py3.10-prep-reset-the-type-cache-after-feature-switching.patch b/debian/patches/py3.10-prep-reset-the-type-cache-after-feature-switching.patch
new file mode 100644
index 00000000..cb858ffd
--- /dev/null
+++ b/debian/patches/py3.10-prep-reset-the-type-cache-after-feature-switching.patch
@@ -0,0 +1,35 @@
+From: Christian Tismer <tismer at stackless.com>
+Date: Sat, 8 May 2021 16:06:23 +0200
+Subject: py3.10-prep: reset the type cache after feature switching
+
+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)
+---
+ sources/pyside2/libpyside/feature_select.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sources/pyside2/libpyside/feature_select.cpp b/sources/pyside2/libpyside/feature_select.cpp
+index 6a21d16..3da7dde 100644
+--- a/sources/pyside2/libpyside/feature_select.cpp
++++ b/sources/pyside2/libpyside/feature_select.cpp
+@@ -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;
+ }
diff --git a/debian/patches/series b/debian/patches/series
index 74fc5939..d32aaca9 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,3 +3,7 @@ fix-spelling-errors.patch
 blacklist-failing-tests.patch
 fix-reuse-build.patch
 qApp-fix-flag-handling.patch
+py3.10-prep-reset-the-type-cache-after-feature-switching.patch
+py3.10-prep-Fix-parser.py-for-changed-typing-module.patch
+py3.10-prep-Finally-support-Python-3.10.patch
+py3.10-prep-Fix-a-very-old-refcounting-error-in-time_test.patch



More information about the Neon-commits mailing list