aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-07-05 14:22:08 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-07-05 17:39:21 -0300
commit82d1d827557f7f9aadbc4fe1f526ce2162f03621 (patch)
tree6cd2a1c3f2d78f3cee008f8cd755bc7f39f416ac /libpyside
parente64209b4d30253e11a22a5f2917953833880ba12 (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.cpp43
-rw-r--r--libpyside/signalmanager.h8
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;
};