aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6')
-rw-r--r--sources/pyside6/PySide6/QtCore/typesystem_core_common.xml1
-rw-r--r--sources/pyside6/PySide6/glue/qtcore.cpp6
-rw-r--r--sources/pyside6/libpyside/pyside.cpp13
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp7
-rw-r--r--sources/pyside6/libpyside/signalmanager.cpp11
-rw-r--r--sources/pyside6/libpysideqml/pysideqmlmetacallerror.cpp15
-rw-r--r--sources/pyside6/libpysideremoteobjects/pysiderephandler.cpp13
7 files changed, 26 insertions, 40 deletions
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
index e0d711313..207844c56 100644
--- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
+++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
@@ -17,6 +17,7 @@
<include file-name="pysidemetatype.h" location="global"/>
<include file-name="pysideutils.h" location="global"/> <!-- QString conversion -->
<include file-name="signalmanager.h" location="global"/>
+ <include file-name="sbkerrors.h" location="global"/>
<!-- QtCoreHelper::QGenericReturnArgumentHolder -->
<include file-name="qtcorehelper.h" location="local"/>
</extra-includes>
diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp
index 689946652..78a25f0a1 100644
--- a/sources/pyside6/PySide6/glue/qtcore.cpp
+++ b/sources/pyside6/PySide6/glue/qtcore.cpp
@@ -433,10 +433,7 @@ static PyObject *qtmsghandler = nullptr;
static void msgHandlerCallback(QtMsgType type, const QMessageLogContext &ctx, const QString &msg)
{
Shiboken::GilState state;
- PyObject *excType{};
- PyObject *excValue{};
- PyObject *excTraceback{};
- PyErr_Fetch(&excType, &excValue, &excTraceback);
+ Shiboken::Errors::Stash errorStash;
Shiboken::AutoDecRef arglist(PyTuple_New(3));
PyTuple_SetItem(arglist, 0, %CONVERTTOPYTHON[QtMsgType](type));
PyTuple_SetItem(arglist, 1, %CONVERTTOPYTHON[QMessageLogContext &](ctx));
@@ -444,7 +441,6 @@ static void msgHandlerCallback(QtMsgType type, const QMessageLogContext &ctx, co
const char *data = array.constData();
PyTuple_SetItem(arglist, 2, %CONVERTTOPYTHON[const char *](data));
Shiboken::AutoDecRef ret(PyObject_CallObject(qtmsghandler, arglist));
- PyErr_Restore(excType, excValue, excTraceback);
}
// @snippet qt-messagehandler
diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp
index 195c000dc..261b2fe77 100644
--- a/sources/pyside6/libpyside/pyside.cpp
+++ b/sources/pyside6/libpyside/pyside.cpp
@@ -30,6 +30,7 @@
#include <gilstate.h>
#include <helper.h>
#include <sbkconverter.h>
+#include <sbkerrors.h>
#include <sbkstring.h>
#include <sbkstaticstrings.h>
#include <sbkfeature_base.h>
@@ -595,10 +596,7 @@ PyObject *getHiddenDataFromQObject(QObject *cppSelf, PyObject *self, PyObject *n
// Search on metaobject (avoid internal attributes started with '__')
if (!attr) {
- PyObject *type{};
- PyObject *value{};
- PyObject *traceback{};
- PyErr_Fetch(&type, &value, &traceback); // This was omitted for a loong time.
+ Shiboken::Errors::Stash errorStash;
int flags = currentSelectId(Py_TYPE(self));
int snake_flag = flags & 0x01;
@@ -623,8 +621,10 @@ PyObject *getHiddenDataFromQObject(QObject *cppSelf, PyObject *self, PyObject *n
if (res) {
AutoDecRef elemName(PyObject_GetAttr(res, PySideMagicName::name()));
// Note: This comparison works because of interned strings.
- if (elemName == name)
+ if (elemName == name) {
+ errorStash.release();
return res;
+ }
Py_DECREF(res);
}
PyErr_Clear();
@@ -655,6 +655,7 @@ PyObject *getHiddenDataFromQObject(QObject *cppSelf, PyObject *self, PyObject *n
} else if (auto *func = MetaFunction::newObject(cppSelf, i)) {
auto *result = reinterpret_cast<PyObject *>(func);
PyObject_SetAttr(self, name, result);
+ errorStash.release();
return result;
}
}
@@ -663,10 +664,10 @@ PyObject *getHiddenDataFromQObject(QObject *cppSelf, PyObject *self, PyObject *n
auto *pySignal = reinterpret_cast<PyObject *>(
Signal::newObjectFromMethod(cppSelf, self, signalList));
PyObject_SetAttr(self, name, pySignal);
+ errorStash.release();
return pySignal;
}
}
- PyErr_Restore(type, value, traceback);
}
return attr;
}
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp
index 5058e3517..a4d1b66b5 100644
--- a/sources/pyside6/libpyside/pysidesignal.cpp
+++ b/sources/pyside6/libpyside/pysidesignal.cpp
@@ -16,6 +16,7 @@
#include <pep384ext.h>
#include <sbkconverter.h>
#include <sbkenum.h>
+#include <sbkerrors.h>
#include <sbkstaticstrings.h>
#include <sbkstring.h>
#include <sbktypefactory.h>
@@ -667,13 +668,9 @@ static PyObject *signalInstanceGetItem(PyObject *self, PyObject *key)
static inline void warnDisconnectFailed(PyObject *aSlot, const QByteArray &signature)
{
if (PyErr_Occurred() != nullptr) { // avoid "%S" invoking str() when an error is set.
- PyObject *exc{};
- PyObject *inst{};
- PyObject *tb{};
- PyErr_Fetch(&exc, &inst, &tb);
+ Shiboken::Errors::Stash errorStash;
PyErr_WarnFormat(PyExc_RuntimeWarning, 0, "Failed to disconnect (%s) from signal \"%s\".",
Py_TYPE(aSlot)->tp_name, signature.constData());
- PyErr_Restore(exc, inst, tb);
} else {
PyErr_WarnFormat(PyExc_RuntimeWarning, 0, "Failed to disconnect (%S) from signal \"%s\".",
aSlot, signature.constData());
diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp
index 342737c1b..933edd318 100644
--- a/sources/pyside6/libpyside/signalmanager.cpp
+++ b/sources/pyside6/libpyside/signalmanager.cpp
@@ -347,20 +347,15 @@ int SignalManagerPrivate::qtPropertyMetacall(QObject *object,
if (PyErr_Occurred()) {
// PYSIDE-2160: An unknown type was reported. Indicated by StopIteration.
if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
- PyObject *excType{};
- PyObject *excValue{};
- PyObject *excTraceback{};
- PyErr_Fetch(&excType, &excValue, &excTraceback);
+ Shiboken::Errors::Stash errorStash;
bool ign = call == QMetaObject::WriteProperty;
PyErr_WarnFormat(PyExc_RuntimeWarning, 0,
ign ? "Unknown property type '%s' of QObject '%s' used in fset"
: "Unknown property type '%s' of QObject '%s' used in fget with %R",
- pp->d->typeName.constData(), metaObject->className(), excValue);
+ pp->d->typeName.constData(), metaObject->className(), errorStash.getException());
if (PyErr_Occurred())
Shiboken::Errors::storeErrorOrPrint();
- Py_DECREF(excType);
- Py_DECREF(excValue);
- Py_XDECREF(excTraceback);
+ errorStash.release();
return result;
}
diff --git a/sources/pyside6/libpysideqml/pysideqmlmetacallerror.cpp b/sources/pyside6/libpysideqml/pysideqmlmetacallerror.cpp
index a3d2664c4..4e0afa3b2 100644
--- a/sources/pyside6/libpysideqml/pysideqmlmetacallerror.cpp
+++ b/sources/pyside6/libpysideqml/pysideqmlmetacallerror.cpp
@@ -5,6 +5,7 @@
#include <sbkpython.h>
#include <sbkstring.h>
+#include <sbkerrors.h>
#include <autodecref.h>
// Remove deprecated MACRO of copysign for MSVC #86286
@@ -40,17 +41,17 @@ std::optional<int> qmlMetaCallErrorHandler(QObject *object)
if (engine->currentStackFrame == nullptr)
return {};
- PyObject *errType{};
- PyObject *errValue{};
- PyObject *errTraceback{};
- PyErr_Fetch(&errType, &errValue, &errTraceback);
+ Shiboken::Errors::Stash errorStash;
+ PyObject *errValue = errorStash.getException();
// PYSIDE-464: The error is only valid before PyErr_Restore,
// PYSIDE-464: therefore we take local copies.
Shiboken::AutoDecRef objStr(PyObject_Str(errValue));
const QString errString = QString::fromUtf8(Shiboken::String::toCString(objStr));
- const bool isSyntaxError = errType == PyExc_SyntaxError;
- const bool isTypeError = errType == PyExc_TypeError;
- PyErr_Restore(errType, errValue, errTraceback);
+ const bool isSyntaxError = errValue != nullptr
+ && PyErr_GivenExceptionMatches(errValue, PyExc_SyntaxError);
+ const bool isTypeError = errValue != nullptr
+ && PyErr_GivenExceptionMatches(errValue, PyExc_TypeError);
+ errorStash.restore();
PyErr_Print(); // Note: PyErr_Print clears the error.
diff --git a/sources/pyside6/libpysideremoteobjects/pysiderephandler.cpp b/sources/pyside6/libpysideremoteobjects/pysiderephandler.cpp
index bfe085456..aa59c329f 100644
--- a/sources/pyside6/libpysideremoteobjects/pysiderephandler.cpp
+++ b/sources/pyside6/libpysideremoteobjects/pysiderephandler.cpp
@@ -7,6 +7,7 @@
#include "pysidedynamiccommon_p.h"
#include <pep384ext.h>
+#include <sbkerrors.h>
#include <sbkstring.h>
#include <sbktypefactory.h>
#include <signature.h>
@@ -372,17 +373,11 @@ bool instantiateFromDefaultValue(QVariant &variant, const QString &defaultValue)
PyObject *pyResult = PyRun_String(code.c_str(), Py_eval_input, pyLocals, pyLocals);
if (!pyResult) {
- PyObject *ptype = nullptr;
- PyObject *pvalue = nullptr;
- PyObject *ptraceback = nullptr;
- PyErr_Fetch(&ptype, &pvalue, &ptraceback);
- PyErr_NormalizeException(&ptype, &pvalue, &ptraceback);
+ Shiboken::Errors::Stash errorStash;
PyErr_Format(PyExc_TypeError,
"Failed to generate default value. Error: %s. Problematic code: %s",
- Shiboken::String::toCString(PyObject_Str(pvalue)), code.c_str());
- Py_XDECREF(ptype);
- Py_XDECREF(pvalue);
- Py_XDECREF(ptraceback);
+ Shiboken::String::toCString(PyObject_Str(errorStash.getException())), code.c_str());
+ errorStash.release();
Py_DECREF(pyLocals);
return false;
}