diff options
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r-- | libpyside/signalmanager.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index b24d0b97e..b7b9b3d93 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -323,11 +323,13 @@ int SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, int id, PyObject* pp_name = 0; QMetaProperty mp; PyObject* pySelf = 0; + int methodCount = metaObject->methodCount(); + int propertyCount = metaObject->propertyCount(); if (call != QMetaObject::InvokeMetaMethod) { mp = metaObject->property(id); if (!mp.isValid()) - return id - metaObject->methodCount(); + return id - methodCount; Shiboken::GilState gil; pySelf = (PyObject*)Shiboken::BindingManager::instance().retrieveWrapper(object); @@ -337,7 +339,7 @@ int SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, int id, if (!pp) { qWarning("Invalid property: %s.", mp.name()); Py_XDECREF(pp_name); - return id - metaObject->methodCount(); + return id - methodCount; } } @@ -362,10 +364,13 @@ int SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, int id, qWarning("Unsupported meta invocation type."); } + // WARNING Isn't safe to call any metaObject and/or object methods beyond this point + // because the object can be deleted inside the called slot. + if (call == QMetaObject::InvokeMetaMethod) - id = id - metaObject->methodCount(); + id = id - methodCount; else - id = id - metaObject->propertyCount(); + id = id - propertyCount; if (pp || pp_name) { Shiboken::GilState gil; |