diff options
author | Christian Tismer <tismer@stackless.com> | 2017-09-28 13:10:28 +0200 |
---|---|---|
committer | Christian Tismer <tismer@stackless.com> | 2017-09-29 07:49:27 +0000 |
commit | c7f9793ff660ed608474d0cab3b31054dbebb458 (patch) | |
tree | 3726b859a49071607f950e3f353ce9f086f57ff2 /sources | |
parent | 828c94347125180468838c77b554e0526cd34aa5 (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>
Diffstat (limited to 'sources')
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, &%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&,char**,int)" access="private" /> - <add-function signature="QGuiApplication(PySequence)"> + <add-function signature="QGuiApplication(QStringList)"> <inject-code> - QGuiApplicationConstructor(%PYSELF, %1, &%0); + QGuiApplicationConstructor(%PYSELF, args, &%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&,char**,int)" access="private" /> - <add-function signature="QApplication(PySequence)"> + <add-function signature="QApplication(QStringList)"> <inject-code> - QApplicationConstructor(%PYSELF, %1, &%0); + QApplicationConstructor(%PYSELF, args, &%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, &argc, &argv)) { + if (!Shiboken::listToArgcArgv(%PYARG_1, &argc, &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, &argc, &argv)) { + if (!Shiboken::listToArgcArgv(%PYARG_1, &argc, &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<std::pair<BlackBox *, BlackBox *> > &)" rename="dummy_method" /> </object-type> |