py3.10-prep: Finally support Python 3.10
authorChristian Tismer <tismer@stackless.com>
Sat, 8 May 2021 14:06:23 +0000 (16:06 +0200)
committerChristian Marillat <marillat@debian.org>
Fri, 17 Jun 2022 15:49:37 +0000 (16:49 +0100)
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)

Gbp-Pq: Name py3.10-prep-Finally-support-Python-3.10.patch

build_scripts/config.py
sources/pyside2/tests/QtWidgets/signature_test.py
sources/shiboken2/libshiboken/pep384impl.cpp
sources/shiboken2/libshiboken/pep384impl.h
sources/shiboken2/libshiboken/sbkstring.cpp
sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py

index b1b32068d7e2fccd08559d1220f4adb5f0197401..7ff155c5fe3080aa1824605920ac783810663457 100644 (file)
@@ -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
index 57fcf38741f9ab898b52e25da50a44fe3fdfd72d..cacb576d7a6d137abcc261297a15bf8b1f85aa12 100644 (file)
@@ -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)
 
index cb80425618e48747e84ac1df89e08b5b971507d2..633d9dc2ab69330cb25cb8430378926cd1f7934f 100644 (file)
@@ -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
 }
 
 /*****************************************************************************
index 7a6f57fcd03ada0a3ddff49aa6a3123ac364f76a..eb65596ccff71abb692cfc4c89467b7309cc7db8 100644 (file)
 #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
index 918aae756ae8647181d6e0bdc844be92be9e8b78..077fb531b1235eded39c533d761e8a5294adace4 100644 (file)
@@ -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();
index 6fadd19d5f55c5bd7a38ba42116861aea3a9838e..f701d83c8c0491098011e98966490d3b6a659777 100644 (file)
@@ -300,6 +300,7 @@ type_map.update({
     "zero(object)": None,
     "zero(str)": "",
     "zero(typing.Any)": None,
+    "zero(Any)": None,
     })
 
 type_map.update({