aboutsummaryrefslogtreecommitdiffstats
path: root/sources
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-04-28 14:55:48 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-04-28 19:46:53 +0200
commit882cc75ad73de727fe185d8355b6b450989d0fba (patch)
treeffc546b937eff146a9399d359d236bad903b9908 /sources
parentb0871930b2437c88ac1812e1f87a7ee428a8bf1b (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.xml1
-rw-r--r--sources/pyside6/PySide6/glue/qtcore.cpp14
-rw-r--r--sources/pyside6/libpyside/pyside.cpp25
-rw-r--r--sources/pyside6/libpyside/pysideutils.h3
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);