diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-28 14:55:48 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-28 19:46:53 +0200 |
commit | 882cc75ad73de727fe185d8355b6b450989d0fba (patch) | |
tree | ffc546b937eff146a9399d359d236bad903b9908 /sources | |
parent | b0871930b2437c88ac1812e1f87a7ee428a8bf1b (diff) |
libpyside: Move the UNICODE conversion into the library
Task-number: PYSIDE-1898
Change-Id: I8ed11bb3f46a5e26adf8bcb7aa3f083adde40628
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources')
-rw-r--r-- | sources/pyside6/PySide6/QtCore/typesystem_core_common.xml | 1 | ||||
-rw-r--r-- | sources/pyside6/PySide6/glue/qtcore.cpp | 14 | ||||
-rw-r--r-- | sources/pyside6/libpyside/pyside.cpp | 25 | ||||
-rw-r--r-- | sources/pyside6/libpyside/pysideutils.h | 3 |
4 files changed, 25 insertions, 18 deletions
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml index a1d93244f..e1f677841 100644 --- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml +++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml @@ -50,6 +50,7 @@ <function signature="qChecksum(QByteArrayView data, Qt::ChecksumType)"/> --> <extra-includes> + <include file-name="pysideutils.h" location="global"/> <!-- QString conversion --> <include file-name="signalmanager.h" location="global"/> </extra-includes> diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp index 916ef4ba4..b5f4f429d 100644 --- a/sources/pyside6/PySide6/glue/qtcore.cpp +++ b/sources/pyside6/PySide6/glue/qtcore.cpp @@ -1274,19 +1274,7 @@ if (PyErr_WarnEx(PyExc_DeprecationWarning, // @snippet conversion-pylong-quintptr // @snippet conversion-pyunicode -void *data = _PepUnicode_DATA(%in); -Py_ssize_t len = PyUnicode_GetLength(%in); -switch (_PepUnicode_KIND(%in)) { - case PepUnicode_1BYTE_KIND: - %out = QString::fromLatin1(reinterpret_cast<const char *>(data), len); - break; - case PepUnicode_2BYTE_KIND: - %out = QString::fromUtf16(reinterpret_cast<const char16_t *>(data), len); - break; - case PepUnicode_4BYTE_KIND: - %out = QString::fromUcs4(reinterpret_cast<const char32_t *>(data), len); - break; -} +%out = PySide::pyUnicodeToQString(%in); // @snippet conversion-pyunicode // @snippet conversion-pynone diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp index a376e2837..39b20120d 100644 --- a/sources/pyside6/libpyside/pyside.cpp +++ b/sources/pyside6/libpyside/pyside.cpp @@ -704,17 +704,32 @@ PyObject *getWrapperForQObject(QObject *cppSelf, PyTypeObject *sbk_type) return pyOut; } +QString pyUnicodeToQString(PyObject *str) +{ + Q_ASSERT(PyUnicode_Check(str) != 0); + + const void *data = _PepUnicode_DATA(str); + const Py_ssize_t len = PyUnicode_GetLength(str); + switch (_PepUnicode_KIND(str)) { + case PepUnicode_1BYTE_KIND: + return QString::fromLatin1(reinterpret_cast<const char *>(data), len); + case PepUnicode_2BYTE_KIND: + return QString::fromUtf16(reinterpret_cast<const char16_t *>(data), len); + case PepUnicode_4BYTE_KIND: + break; + } + return QString::fromUcs4(reinterpret_cast<const char32_t *>(data), len); +} + // Inspired by Shiboken::String::toCString; QString pyStringToQString(PyObject *str) { if (str == Py_None) return QString(); - if (PyUnicode_Check(str)) { - const char *unicodeBuffer = _PepUnicode_AsString(str); - if (unicodeBuffer) - return QString::fromUtf8(unicodeBuffer); - } + if (PyUnicode_Check(str) != 0) + return pyUnicodeToQString(str); + if (PyBytes_Check(str)) { const char *asciiBuffer = PyBytes_AS_STRING(str); if (asciiBuffer) diff --git a/sources/pyside6/libpyside/pysideutils.h b/sources/pyside6/libpyside/pysideutils.h index 6f5d373ec..9a2938906 100644 --- a/sources/pyside6/libpyside/pysideutils.h +++ b/sources/pyside6/libpyside/pysideutils.h @@ -57,6 +57,9 @@ namespace PySide /// \return Returns true if self object inherits from class_name, otherwise returns false PYSIDE_API bool inherits(PyTypeObject *self, const char *class_name); +/// Given A PyObject repesenting Unicode data, returns an equivalent QString. +PYSIDE_API QString pyUnicodeToQString(PyObject *str); + /// Given A PyObject repesenting ASCII or Unicode data, returns an equivalent QString. PYSIDE_API QString pyStringToQString(PyObject *str); |