aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2017-09-28 13:10:28 +0200
committerChristian Tismer <tismer@stackless.com>2017-09-29 07:49:27 +0000
commitc7f9793ff660ed608474d0cab3b31054dbebb458 (patch)
tree3726b859a49071607f950e3f353ce9f086f57ff2
parent828c94347125180468838c77b554e0526cd34aa5 (diff)
Fix the signature of the Q*Application constructor
Q*Application had PySequence as Parameter, although only QStringList is accepted. That resulted in an implausible error message when a list of, say, Integers was given. This patch - replaces PySequence by QStringList (one more tuple layer), - fixes QCoreApplication to give the same kind of error messages, - renames the shiboken function sequenceToArgcArgv to listToArgcArgv and changes it to only allow list descendents. We also changed signature.typing in one line to display List[str] correctly. I think this belongs more to PySide-331, a fixed qApp. Task-number: PYSIDE-510 Task-number: PYSIDE-331 Change-Id: Ib256c6a2db05a3db826454e1bf1b4729d59a240b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
-rw-r--r--sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp19
-rw-r--r--sources/pyside2/PySide2/QtCore/typesystem_core_common.xml2
-rw-r--r--sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp6
-rw-r--r--sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml4
-rw-r--r--sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp6
-rw-r--r--sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml4
-rw-r--r--sources/pyside2/PySide2/support/signature/inspect.py5
-rw-r--r--sources/shiboken2/libshiboken/helper.cpp9
-rw-r--r--sources/shiboken2/libshiboken/helper.h2
-rw-r--r--sources/shiboken2/tests/samplebinding/typesystem_sample.xml6
10 files changed, 30 insertions, 33 deletions
diff --git a/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp b/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp
index 20e9c4464..fec8cf416 100644
--- a/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp
+++ b/sources/pyside2/PySide2/QtCore/glue/qcoreapplication_init.cpp
@@ -41,23 +41,18 @@
static int QCoreApplicationArgCount;
static char** QCoreApplicationArgValues;
-void QCoreApplication_constructor(PyObject* self, PyObject* args, QCoreApplicationWrapper** cptr)
+void QCoreApplication_constructor(PyObject* self, PyObject* argv, QCoreApplicationWrapper** cptr)
{
if (QCoreApplication::instance()) {
PyErr_SetString(PyExc_RuntimeError, "A QCoreApplication instance already exists.");
return;
}
- int numArgs = PyTuple_GET_SIZE(args);
- if (numArgs != 1
- || !Shiboken::sequenceToArgcArgv(PyTuple_GET_ITEM(args, 0), &QCoreApplicationArgCount, &QCoreApplicationArgValues, "PySideApp")) {
- PyErr_BadArgument();
- return;
+ PyObject *stringlist = PyTuple_GET_ITEM(argv, 0);
+ if (Shiboken::listToArgcArgv(stringlist, &QCoreApplicationArgCount, &QCoreApplicationArgValues, "PySideApp")) {
+ *cptr = new QCoreApplicationWrapper(QCoreApplicationArgCount, QCoreApplicationArgValues);
+ Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject*>(self));
+ PySide::registerCleanupFunction(&PySide::destroyQCoreApplication);
+ Py_INCREF(self);
}
-
- *cptr = new QCoreApplicationWrapper(QCoreApplicationArgCount, QCoreApplicationArgValues);
-
- Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject*>(self));
- PySide::registerCleanupFunction(&PySide::destroyQCoreApplication);
- Py_INCREF(self);
}
diff --git a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml
index f3bf41923..03991af38 100644
--- a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml
+++ b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml
@@ -3213,7 +3213,7 @@
in a more convenient form by the :meth:`~QCoreApplication.arguments()`
method.
</inject-documentation>
- <add-function signature="QCoreApplication(PySequence)">
+ <add-function signature="QCoreApplication(QStringList)">
<inject-code>
QCoreApplication_constructor(%PYSELF, args, &amp;%0);
</inject-code>
diff --git a/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp b/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp
index 60507f37a..014e409b5 100644
--- a/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp
+++ b/sources/pyside2/PySide2/QtGui/glue/qguiapplication_init.cpp
@@ -50,7 +50,7 @@ bool QGuiApplicationConstructorStart(PyObject* argv)
return false;
}
- return Shiboken::sequenceToArgcArgv(argv, &QGuiApplicationArgCount, &QGuiApplicationArgValues, "PySideApp");
+ return Shiboken::listToArgcArgv(argv, &QGuiApplicationArgCount, &QGuiApplicationArgValues, "PySideApp");
}
void QGuiApplicationConstructorEnd(PyObject* self)
@@ -61,8 +61,8 @@ void QGuiApplicationConstructorEnd(PyObject* self)
static void QGuiApplicationConstructor(PyObject* self, PyObject* argv, QGuiApplicationWrapper** cptr)
{
- if (QGuiApplicationConstructorStart(argv)) {
- // XXX do we need to support the ApplicationFlags parameter, instead of 0?
+ PyObject *stringlist = PyTuple_GET_ITEM(argv, 0);
+ if (QGuiApplicationConstructorStart(stringlist)) {
*cptr = new QGuiApplicationWrapper(QGuiApplicationArgCount, QGuiApplicationArgValues, 0);
Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject*>(self));
QGuiApplicationConstructorEnd(self);
diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml
index 7a0db8a41..0dad0b455 100644
--- a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml
+++ b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml
@@ -3233,9 +3233,9 @@
<include file-name="QLocale" location="global"/>
</extra-includes>
<modify-function signature="QGuiApplication(int&amp;,char**,int)" access="private" />
- <add-function signature="QGuiApplication(PySequence)">
+ <add-function signature="QGuiApplication(QStringList)">
<inject-code>
- QGuiApplicationConstructor(%PYSELF, %1, &amp;%0);
+ QGuiApplicationConstructor(%PYSELF, args, &amp;%0);
</inject-code>
</add-function>
<modify-function signature="exec()" rename="exec_" allow-thread="yes"/>
diff --git a/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp b/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp
index 0de34d9c5..f1f1f84a6 100644
--- a/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp
+++ b/sources/pyside2/PySide2/QtWidgets/glue/qapplication_init.cpp
@@ -51,7 +51,7 @@ bool QApplicationConstructorStart(PyObject* argv)
return false;
}
- return Shiboken::sequenceToArgcArgv(argv, &QApplicationArgCount, &QApplicationArgValues, "PySideApp");
+ return Shiboken::listToArgcArgv(argv, &QApplicationArgCount, &QApplicationArgValues, "PySideApp");
}
void QApplicationConstructorEnd(PyObject* self)
@@ -71,8 +71,8 @@ void QApplicationConstructorEnd(PyObject* self)
static void QApplicationConstructor(PyObject* self, PyObject* argv, QApplicationWrapper** cptr)
{
- if (QApplicationConstructorStart(argv)) {
- // XXX do we need to support the ApplicationFlags parameter, instead of 0?
+ PyObject *stringlist = PyTuple_GET_ITEM(argv, 0);
+ if (QApplicationConstructorStart(stringlist)) {
*cptr = new QApplicationWrapper(QApplicationArgCount, QApplicationArgValues, 0);
Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject*>(self));
QApplicationConstructorEnd(self);
diff --git a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml
index 59412699c..5de077181 100644
--- a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml
+++ b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml
@@ -3144,9 +3144,9 @@
<include file-name="QStyle" location="global"/>
</extra-includes>
<modify-function signature="QApplication(int&amp;,char**,int)" access="private" />
- <add-function signature="QApplication(PySequence)">
+ <add-function signature="QApplication(QStringList)">
<inject-code>
- QApplicationConstructor(%PYSELF, %1, &amp;%0);
+ QApplicationConstructor(%PYSELF, args, &amp;%0);
</inject-code>
</add-function>
<modify-function signature="exec()" rename="exec_" allow-thread="yes"/>
diff --git a/sources/pyside2/PySide2/support/signature/inspect.py b/sources/pyside2/PySide2/support/signature/inspect.py
index b59368229..cae96bc16 100644
--- a/sources/pyside2/PySide2/support/signature/inspect.py
+++ b/sources/pyside2/PySide2/support/signature/inspect.py
@@ -1238,9 +1238,10 @@ def getargvalues(frame):
args, varargs, varkw = getargs(frame.f_code)
return ArgInfo(args, varargs, varkw, frame.f_locals)
+# This function is changed because we use a local copy of typing
def formatannotation(annotation, base_module=None):
- if getattr(annotation, '__module__', None) == 'typing':
- return repr(annotation).replace('typing.', '')
+ if getattr(annotation, '__module__', None) == 'PySide2.support.signature.typing':
+ return repr(annotation).replace('PySide2.support.signature.typing.', '')
if isinstance(annotation, type):
if annotation.__module__ in ('builtins', base_module):
return annotation.__qualname__
diff --git a/sources/shiboken2/libshiboken/helper.cpp b/sources/shiboken2/libshiboken/helper.cpp
index 2249bf458..5792db5be 100644
--- a/sources/shiboken2/libshiboken/helper.cpp
+++ b/sources/shiboken2/libshiboken/helper.cpp
@@ -43,9 +43,10 @@
namespace Shiboken
{
-bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName)
+// PySide-510: Changed from PySequence to PyList, which is correct.
+bool listToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName)
{
- if (!PySequence_Check(argList))
+ if (!PyList_Check(argList))
return false;
if (!defaultAppName)
@@ -55,7 +56,7 @@ bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char*
Shiboken::AutoDecRef args(PySequence_Fast(argList, 0));
int numArgs = int(PySequence_Fast_GET_SIZE(argList));
for (int i = 0; i < numArgs; ++i) {
- PyObject* item = PySequence_Fast_GET_ITEM(args.object(), i);
+ PyObject* item = PyList_GET_ITEM(args.object(), i);
if (!PyBytes_Check(item) && !PyUnicode_Check(item))
return false;
}
@@ -74,7 +75,7 @@ bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char*
(*argv)[0] = strdup(appName ? Shiboken::String::toCString(appName) : defaultAppName);
} else {
for (int i = 0; i < numArgs; ++i) {
- PyObject* item = PySequence_Fast_GET_ITEM(args.object(), i);
+ PyObject* item = PyList_GET_ITEM(args.object(), i);
char* string = 0;
if (Shiboken::String::check(item)) {
string = strdup(Shiboken::String::toCString(item));
diff --git a/sources/shiboken2/libshiboken/helper.h b/sources/shiboken2/libshiboken/helper.h
index f2061b667..33d97c62c 100644
--- a/sources/shiboken2/libshiboken/helper.h
+++ b/sources/shiboken2/libshiboken/helper.h
@@ -101,7 +101,7 @@ inline PyObject* makeTuple(const A& a, const B& b, const C& c, const D& d, const
* \note The argv array is allocated using new operator and each item is allocated using malloc.
* \returns True on sucess, false otherwise.
*/
-LIBSHIBOKEN_API bool sequenceToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName = 0);
+LIBSHIBOKEN_API bool listToArgcArgv(PyObject* argList, int* argc, char*** argv, const char* defaultAppName = 0);
/**
* Convert a python sequence into a heap-allocated array of ints.
diff --git a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
index 089f835fc..65f989e7e 100644
--- a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
+++ b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
@@ -1687,7 +1687,7 @@
<inject-code class="target" position="beginning">
int argc;
char** argv;
- if (!Shiboken::sequenceToArgcArgv(%PYARG_1, &amp;argc, &amp;argv)) {
+ if (!Shiboken::listToArgcArgv(%PYARG_1, &amp;argc, &amp;argv)) {
PyErr_SetString(PyExc_TypeError, "error");
return 0;
}
@@ -1710,7 +1710,7 @@
<inject-code class="target" position="beginning">
int argc;
char** argv;
- if (!Shiboken::sequenceToArgcArgv(%PYARG_1, &amp;argc, &amp;argv)) {
+ if (!Shiboken::listToArgcArgv(%PYARG_1, &amp;argc, &amp;argv)) {
PyErr_SetString(PyExc_TypeError, "error");
return 0;
}
@@ -2402,7 +2402,7 @@
<value-type name="ValueAndVirtual" />
<object-type name="ObjectTypeByValue" />
-
+
<object-type name="TemplatePtr">
<modify-function signature="dummy(std::list&lt;std::pair&lt;BlackBox *, BlackBox *&gt; &gt; &amp;)" rename="dummy_method" />
</object-type>