From e6cf34a692347ec65a32546eb8632e1a91a1ff56 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 26 Mar 2024 14:16:58 +0100 Subject: Debug operators: Fix handling of longs exceeding long long max Use PyLong_AsUnsignedLongLong if an overflow occurs. Use hex for those large values. Task-number: PYSIDE-2652 Pick-to: 6.6 6.5 6.2 Change-Id: I9c3404cf8b01b1fcda20516c1105797fc512ed53 Reviewed-by: Christian Tismer (cherry picked from commit a0f1df9610d692b4d4ee042dcc918f792bde5792) Reviewed-by: Qt Cherry-pick Bot --- sources/pyside6/libpyside/pyside.cpp | 12 +++++++++--- sources/shiboken6/libshiboken/helper.cpp | 11 +++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp index 683a3baf9..d5e815a42 100644 --- a/sources/pyside6/libpyside/pyside.cpp +++ b/sources/pyside6/libpyside/pyside.cpp @@ -1072,9 +1072,15 @@ static void formatPyObjectValue(PyObject *obj, QDebug &debug) { if (PyType_Check(obj) != 0) debug << "type: \"" << pyTypeName(obj) << '"'; - else if (PyLong_Check(obj) != 0) - debug << PyLong_AsLongLong(obj); - else if (PyFloat_Check(obj) != 0) + else if (PyLong_Check(obj) != 0) { + const auto llv = PyLong_AsLongLong(obj); + if (PyErr_Occurred() != PyExc_OverflowError) { + debug << llv; + } else { + PyErr_Clear(); + debug << "0x" << Qt::hex << PyLong_AsUnsignedLongLong(obj) << Qt::dec; + } + } else if (PyFloat_Check(obj) != 0) debug << PyFloat_AsDouble(obj); else if (PyUnicode_Check(obj) != 0) debug << '"' << pyStringToQString(obj) << '"'; diff --git a/sources/shiboken6/libshiboken/helper.cpp b/sources/shiboken6/libshiboken/helper.cpp index 01001dec5..23663433e 100644 --- a/sources/shiboken6/libshiboken/helper.cpp +++ b/sources/shiboken6/libshiboken/helper.cpp @@ -330,8 +330,15 @@ static void formatPyObjectHelper(PyObject *obj, std::ostream &str) } formatPyTypeObject(obj->ob_type, str, false); str << ", "; - if (PyLong_Check(obj)) - str << PyLong_AsLong(obj); + if (PyLong_Check(obj)) { + const auto llv = PyLong_AsLongLong(obj); + if (PyErr_Occurred() != PyExc_OverflowError) { + str << llv; + } else { + PyErr_Clear(); + str << "0x" << std::hex << PyLong_AsUnsignedLongLong(obj) << std::dec; + } + } else if (PyFloat_Check(obj)) str << PyFloat_AsDouble(obj); else if (PyUnicode_Check(obj)) -- cgit v1.2.3