aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2020-12-23 13:28:16 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-01-04 12:50:35 +0000
commitdbcfbecf596704efaa25d028bfcad09f73c185d3 (patch)
tree7c075ea52f6531a04bef2b1cc835aacccf1ffe81
parent07492b53208e3bed26de0348ff5578ccea5293cc (diff)
qApp: fix flag handling in Python 3.8+ and a Python 3.9 issue
This is an old problem that was solved for Python 2.7. From Python 3.8 on, the behavior is the same with Python 3. The fix finally was to extend a Python 2.7 patch to Python 3 as well. See the Jira issue for details. Other little changes: This patch includes also a small patch that was mentioned as necessary for Python 3.9: Python issue 40217. I have seen no effect of this change yet but applied the patch, anyway. When searching for a solution of this problem, a lot of time was spent debugging qapp_macro.cpp, although it was error-free. As a side effect for better understanding, the variables were renamed to more common style. These more independent changes could have got their own check-in, but the complication of a pick-to and the small code size wasn't worth the effort. Change-Id: I7638f1a711315b4678af6b7389265b905c6404a1 Fixes: PYSIDE-1447 Reviewed-by: Dmitry Shachnev <mitya57@gmail.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> (cherry picked from commit c1f776570adbe4f9aa21aa818a82f5ebd1258a76) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/shiboken6/libshiboken/basewrapper.cpp14
-rw-r--r--sources/shiboken6/libshiboken/qapp_macro.cpp28
2 files changed, 27 insertions, 15 deletions
diff --git a/sources/shiboken6/libshiboken/basewrapper.cpp b/sources/shiboken6/libshiboken/basewrapper.cpp
index ba224eaf8..fd38ec3ac 100644
--- a/sources/shiboken6/libshiboken/basewrapper.cpp
+++ b/sources/shiboken6/libshiboken/basewrapper.cpp
@@ -206,6 +206,11 @@ static int SbkObject_traverse(PyObject *self, visitproc visit, void *arg)
if (sbkSelf->ob_dict)
Py_VISIT(sbkSelf->ob_dict);
+
+#if PY_VERSION_HEX >= 0x03090000
+ // This was not needed before Python 3.9 (Python issue 35810 and 40217)
+ Py_VISIT(Py_TYPE(self));
+#endif
return 0;
}
@@ -643,6 +648,15 @@ PyObject *SbkQAppTpNew(PyTypeObject *subtype, PyObject *, PyObject *)
// PYSIDE-560:
// We avoid to use this in Python 3, because we have a hard time to get
// write access to these flags
+
+ // PYSIDE-1447:
+ // Since Python 3.8, we have the same weird flags handling in Python 3.8
+ // as well. The singleton Python is no longer needed and we could remove
+ // the whole special handling, maybe in another checkin.
+ if (PyType_HasFeature(subtype, Py_TPFLAGS_HAVE_GC)) {
+ subtype->tp_flags &= ~Py_TPFLAGS_HAVE_GC;
+ subtype->tp_free = PyObject_Del;
+ }
auto self = reinterpret_cast<SbkObject *>(MakeQAppWrapper(subtype));
return self == nullptr ? nullptr : _setupNew(self, subtype);
}
diff --git a/sources/shiboken6/libshiboken/qapp_macro.cpp b/sources/shiboken6/libshiboken/qapp_macro.cpp
index 3ef3a51c6..03a8d0496 100644
--- a/sources/shiboken6/libshiboken/qapp_macro.cpp
+++ b/sources/shiboken6/libshiboken/qapp_macro.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt for Python.
@@ -54,38 +54,36 @@ extern "C"
// This variable is also able to destroy the app by qApp.shutdown().
//
-static PyObject *qApp_var = nullptr;
-static PyObject *qApp_content = nullptr;
+static PyObject *qApp_name = nullptr;
+static PyObject *qApp_last = nullptr;
-static PyObject *
-monitor_qApp_var(PyObject *qApp)
+static PyObject *monitor_qApp_var(PyObject *qApp_curr)
{
static bool init_done;
static PyObject *builtins = PyEval_GetBuiltins();
if (!init_done) {
- qApp_var = Py_BuildValue("s", "qApp");
- if (qApp_var == nullptr)
+ qApp_name = Py_BuildValue("s", "qApp");
+ if (qApp_name == nullptr)
return nullptr;
// This is a borrowed reference
Py_INCREF(builtins);
init_done = true;
}
- if (PyDict_SetItem(builtins, qApp_var, qApp) < 0)
+ if (PyDict_SetItem(builtins, qApp_name, qApp_curr) < 0)
return nullptr;
- qApp_content = qApp;
- Py_INCREF(qApp);
- return qApp;
+ qApp_last = qApp_curr;
+ Py_INCREF(qApp_curr);
+ return qApp_curr;
}
-PyObject *
-MakeQAppWrapper(PyTypeObject *type)
+PyObject *MakeQAppWrapper(PyTypeObject *type)
{
if (type == nullptr)
type = Py_TYPE(Py_None);
- if (!(type == Py_TYPE(Py_None) || Py_TYPE(qApp_content) == Py_TYPE(Py_None))) {
- const char *res_name = PepType_GetNameStr(Py_TYPE(qApp_content));
+ if (!(type == Py_TYPE(Py_None) || Py_TYPE(qApp_last) == Py_TYPE(Py_None))) {
+ const char *res_name = PepType_GetNameStr(Py_TYPE(qApp_last));
const char *type_name = PepType_GetNameStr(type);
PyErr_Format(PyExc_RuntimeError, "Please destroy the %s singleton before"
" creating a new %s instance.", res_name, type_name);