support Python 3.9
authorChristian Tismer <tismer@stackless.com>
Thu, 18 Jun 2020 12:11:14 +0000 (14:11 +0200)
committerDmitry Shachnev <mitya57@debian.org>
Mon, 19 Oct 2020 18:50:57 +0000 (19:50 +0100)
Thanks Cristian for adding cosmetic changes which should already
have been applied in Python 3.8 or earlier.

(cherry picked from commit 401f4ff22833f2be900d9a6d8887e7dae7b07011)

Gbp-Pq: Name python3.9.patch

build_scripts/config.py
build_scripts/wheel_override.py
sources/pyside2/libpyside/pysidesignal.cpp
sources/shiboken2/libshiboken/basewrapper.cpp
sources/shiboken2/libshiboken/pep384impl.cpp
sources/shiboken2/libshiboken/pep384impl.h
sources/shiboken2/libshiboken/threadstatesaver.cpp
sources/shiboken2/tests/samplebinding/pointerprimitivetype_test.py

index 4ec2af3de8a1efbb2a8045a04ea5b09afa8ce9ad..29bed2e88b8200fe9fb390efc6812536efb5326e 100644 (file)
@@ -92,6 +92,7 @@ class Config(object):
             'Programming Language :: Python :: 3.6',
             'Programming Language :: Python :: 3.7',
             'Programming Language :: Python :: 3.8',
+            'Programming Language :: Python :: 3.9',
         ]
 
         self.setup_script_dir = None
@@ -134,7 +135,7 @@ class Config(object):
         setup_kwargs['zip_safe'] = False
         setup_kwargs['cmdclass'] = cmd_class_dict
         setup_kwargs['version'] = package_version
-        setup_kwargs['python_requires'] = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <3.9"
+        setup_kwargs['python_requires'] = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <3.10"
 
 
         if quiet:
index 03c9c92ab87021ade8a7c7c332a59c47c0ecf4eb..2982874295691a369af146be8284c6e7f89fe519 100644 (file)
@@ -89,7 +89,7 @@ class PysideBuildWheel(_bdist_wheel):
         # create a properly named package.
         limited_api_enabled = OPTION["LIMITED_API"] and sys.version_info[0] >= 3
         if limited_api_enabled:
-            self.py_limited_api = "cp35.cp36.cp37.cp38"
+            self.py_limited_api = "cp35.cp36.cp37.cp38.cp39"
 
         _bdist_wheel.finalize_options(self)
 
index 39ed1a6bc9adcc0685bfb481cffe08870ebd0e83..b2ef835f65d8a074c1f2a1f2e7dfb32c618bb3a3 100644 (file)
@@ -361,7 +361,7 @@ PyObject *signalInstanceConnect(PyObject *self, PyObject *args, PyObject *kwds)
 
         if (isMethod || isFunction) {
             PyObject *function = isMethod ? PyMethod_GET_FUNCTION(slot) : slot;
-            PyCodeObject *objCode = reinterpret_cast<PyCodeObject *>(PyFunction_GET_CODE(function));
+            auto *objCode = reinterpret_cast<PepCodeObject *>(PyFunction_GET_CODE(function));
             useSelf = isMethod;
             slotArgs = PepCode_GET_FLAGS(objCode) & CO_VARARGS ? -1 : PepCode_GET_ARGCOUNT(objCode);
             if (useSelf)
@@ -568,7 +568,11 @@ PyObject *signalCall(PyObject *self, PyObject *args, PyObject *kw)
     Shiboken::AutoDecRef homonymousMethod(getDescriptor(signal->homonymousMethod, 0, 0));
     if (PyCFunction_Check(homonymousMethod)
             && (PyCFunction_GET_FLAGS(homonymousMethod.object()) & METH_STATIC)) {
+#if PY_VERSION_HEX >=  0x03090000
+        return PyObject_Call(homonymousMethod, args, kw);
+#else
         return PyCFunction_Call(homonymousMethod, args, kw);
+#endif
     }
 
     // Assumes homonymousMethod is not a static method.
@@ -586,7 +590,11 @@ PyObject *signalInstanceCall(PyObject *self, PyObject *args, PyObject *kw)
 
     descrgetfunc getDescriptor = Py_TYPE(PySideSignal->d->homonymousMethod)->tp_descr_get;
     Shiboken::AutoDecRef homonymousMethod(getDescriptor(PySideSignal->d->homonymousMethod, PySideSignal->d->source, 0));
+#if PY_VERSION_HEX >=  0x03090000
+        return PyObject_Call(homonymousMethod, args, kw);
+#else
     return PyCFunction_Call(homonymousMethod, args, kw);
+#endif
 }
 
 static PyObject *metaSignalCheck(PyObject * /* klass */, PyObject *arg)
@@ -928,7 +936,7 @@ QString getCallbackSignature(const char *signal, QObject *receiver, PyObject *ca
 
     if (isMethod || isFunction) {
         PyObject *function = isMethod ? PyMethod_GET_FUNCTION(callback) : callback;
-        auto objCode = reinterpret_cast<PyCodeObject *>(PyFunction_GET_CODE(function));
+        auto objCode = reinterpret_cast<PepCodeObject *>(PyFunction_GET_CODE(function));
         functionName = Shiboken::String::toCString(PepFunction_GetName(function));
         useSelf = isMethod;
         numArgs = PepCode_GET_FLAGS(objCode) & CO_VARARGS ? -1 : PepCode_GET_ARGCOUNT(objCode);
index 443d25cdfb46d1d48f1d16eae17a7f76f3769f5a..570b1ecd1842d720991a40c2845b2fdb1e467094 100644 (file)
@@ -775,7 +775,9 @@ void init()
 
     Conversions::init();
 
+#if PY_VERSION_HEX < 0x03070000
     PyEval_InitThreads();
+#endif
 
     //Init private data
     Pep384_Init();
index f07cac61314c15dc9c553ca7b65a216f711f075c..1821e0bb202bb4322886131b2ca9f30fbf6039b1 100644 (file)
@@ -307,9 +307,9 @@ Pep_GetVerboseFlag()
 #ifdef Py_LIMITED_API
 
 int
-PepCode_Get(PyCodeObject *co, const char *name)
+PepCode_Get(PepCodeObject *co, const char *name)
 {
-    PyObject *ob = (PyObject *)co;
+    PyObject *ob = reinterpret_cast<PyObject *>(co);
     PyObject *ob_ret;
     int ret = -1;
 
index 541b0e77564265bed4c01fb037f9aef53cd0dd1f..3d000dd314080bc1f457b20a68dd7ee95fc18e56 100644 (file)
@@ -327,7 +327,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 <  0x0308FFFF)
+                                             PY_VERSION_HEX <  0x0309FFFF)
 #if !PYTHON_BUFFER_VERSION_COMPATIBLE
 # error Please check the buffer compatibility for this python version!
 #endif
@@ -411,23 +411,27 @@ LIBSHIBOKEN_API PyObject *PyMethod_Self(PyObject *);
 /* Bytecode object */
 
 // we have to grab the code object from python
-typedef struct _code PyCodeObject;
+typedef struct _code PepCodeObject;
 
-LIBSHIBOKEN_API int PepCode_Get(PyCodeObject *co, const char *name);
+LIBSHIBOKEN_API int PepCode_Get(PepCodeObject *co, const char *name);
 
-#define PepCode_GET_FLAGS(o)         PepCode_Get(o, "co_flags")
-#define PepCode_GET_ARGCOUNT(o)      PepCode_Get(o, "co_argcount")
+#  define PepCode_GET_FLAGS(o)         PepCode_Get(o, "co_flags")
+#  define PepCode_GET_ARGCOUNT(o)      PepCode_Get(o, "co_argcount")
 
 /* Masks for co_flags above */
-#define CO_OPTIMIZED    0x0001
-#define CO_NEWLOCALS    0x0002
-#define CO_VARARGS      0x0004
-#define CO_VARKEYWORDS  0x0008
-#define CO_NESTED       0x0010
-#define CO_GENERATOR    0x0020
+#  define CO_OPTIMIZED    0x0001
+#  define CO_NEWLOCALS    0x0002
+#  define CO_VARARGS      0x0004
+#  define CO_VARKEYWORDS  0x0008
+#  define CO_NESTED       0x0010
+#  define CO_GENERATOR    0x0020
+
 #else
-#define PepCode_GET_FLAGS(o)         ((o)->co_flags)
-#define PepCode_GET_ARGCOUNT(o)      ((o)->co_argcount)
+
+#  define PepCodeObject                PyCodeObject
+#  define PepCode_GET_FLAGS(o)         ((o)->co_flags)
+#  define PepCode_GET_ARGCOUNT(o)      ((o)->co_argcount)
+
 #endif
 
 /*****************************************************************************
index 0d19528f97304645be3ed061345585fd6088dbb5..085535fd7f304023453b0cf246376e65c7eafd61 100644 (file)
@@ -51,7 +51,11 @@ ThreadStateSaver::~ThreadStateSaver()
 
 void ThreadStateSaver::save()
 {
+#if PY_VERSION_HEX >=  0x0309000
+    if (Py_IsInitialized())
+#else
     if (PyEval_ThreadsInitialized())
+#endif
         m_threadState = PyEval_SaveThread();
 }
 
index 532f2226cbca77df79934f5ddbb4f9f7bdc6a1da..9ce641f61f8865a6b0563b625a349a9acb578c66 100644 (file)
@@ -70,10 +70,7 @@ class PointerPrimitiveTypeTest(unittest.TestCase):
         self.assertTrue(found)
         ann = sig.parameters["data"].annotation
         self.assertEqual(ann.__args__, (int,))
-        # un-specify this class (forget "int") by setting the _special
-        # flag, so we can check using issubclass (undocumented feature).
-        ann._special = True
-        self.assertTrue(issubclass(ann, typing.Iterable))
+        self.assertTrue(issubclass(ann.__origin__, typing.Iterable))
 
     def testReturnVarSignature(self):
         # signature="getMargins(int*,int*,int*,int*)const">