diff options
author | Renato Filho <renato.filho@openbossa.org> | 2010-07-05 14:22:08 -0300 |
---|---|---|
committer | Renato Filho <renato.filho@openbossa.org> | 2010-07-05 17:39:21 -0300 |
commit | 82d1d827557f7f9aadbc4fe1f526ce2162f03621 (patch) | |
tree | 6cd2a1c3f2d78f3cee008f8cd755bc7f39f416ac /libpyside | |
parent | e64209b4d30253e11a22a5f2917953833880ba12 (diff) |
Implemented copy constructor to PyObjectWrapper.
Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>,
Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/signalmanager.cpp | 43 | ||||
-rw-r--r-- | libpyside/signalmanager.h | 8 |
2 files changed, 46 insertions, 5 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 1115d24dd..f1734001b 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -54,6 +54,39 @@ #define PYTHON_TYPE "PyObject" +namespace PySide { + +PyObjectWrapper::PyObjectWrapper() + :m_me(Py_None) +{ + Py_INCREF(m_me); +} + +PyObjectWrapper::PyObjectWrapper(PyObject* me) + : m_me(me) +{ + Py_INCREF(m_me); +} + +PyObjectWrapper::PyObjectWrapper(const PyObjectWrapper &other) + : m_me(other.m_me) +{ + Py_INCREF(m_me); +} + +PyObjectWrapper::~PyObjectWrapper() +{ + Py_DECREF(m_me); +} + + +PyObjectWrapper::operator PyObject*() const +{ + return m_me; +} + +}; + namespace Shiboken { template<> @@ -71,6 +104,7 @@ struct Converter<PySide::PyObjectWrapper> static PyObject* toPython(const PySide::PyObjectWrapper& obj) { + Py_INCREF(obj); return obj; } }; @@ -335,14 +369,18 @@ int PySide::SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, Shiboken::GilState gil; QList<QByteArray> paramTypes = method.parameterTypes(); PyObject* self = Shiboken::BindingManager::instance().retrieveWrapper(object); - Shiboken::AutoDecRef preparedArgs(PyTuple_New(paramTypes.count())); + PyObject* preparedArgs = NULL; + Py_ssize_t args_size = paramTypes.count(); + + if (args_size) + preparedArgs = PyTuple_New(args_size); for (int i = 0, max = paramTypes.count(); i < max; ++i) { void* data = args[i+1]; const char* dataType = paramTypes[i].constData(); PyObject* arg = Shiboken::TypeResolver::get(dataType)->toPython(data); - PyTuple_SET_ITEM(preparedArgs.object(), i, arg); + PyTuple_SET_ITEM(preparedArgs, i, arg); } QString methodName = method.signature(); @@ -358,6 +396,7 @@ int PySide::SignalManager::qt_metacall(QObject* object, QMetaObject::Call call, } else { qWarning() << "Dynamic slot" << methodName << "not found!"; } + Py_XDECREF(preparedArgs); } return -1; } diff --git a/libpyside/signalmanager.h b/libpyside/signalmanager.h index 70d7f0895..72acd1d93 100644 --- a/libpyside/signalmanager.h +++ b/libpyside/signalmanager.h @@ -50,9 +50,11 @@ namespace PySide class PYSIDE_API PyObjectWrapper { public: - PyObjectWrapper(PyObject* me) : m_me(me) { Py_INCREF(m_me); } - PyObjectWrapper() : m_me(Py_None) { Py_INCREF(m_me); } - operator PyObject*() const { return m_me; } + PyObjectWrapper(); + PyObjectWrapper(PyObject* me); + PyObjectWrapper(const PyObjectWrapper &other); + ~PyObjectWrapper(); + operator PyObject*() const; private: PyObject* m_me; }; |