Fixed bug on dynamic metaobject creation.
Reviewer: Luciano Wolf <luciano.wolf@openbossa.org>,
Marcelo Lira <marcelo.lira@openbossa.org>
This commit is contained in:
parent
cafb38dafd
commit
43ec657766
2 changed files with 29 additions and 10 deletions
|
|
@ -153,6 +153,7 @@ void DynamicQMetaObject::addSlot(const char* slot, const char* type)
|
||||||
if (i != m_slots.end())
|
if (i != m_slots.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
//search for a empty space
|
//search for a empty space
|
||||||
MethodData blank;
|
MethodData blank;
|
||||||
i = qFind(m_slots.begin(), m_slots.end(), blank);
|
i = qFind(m_slots.begin(), m_slots.end(), blank);
|
||||||
|
|
@ -193,7 +194,9 @@ DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyObject* pyObj, PyTypeObj
|
||||||
PyObject *attr = PyObject_GetAttr(pyObj, key);
|
PyObject *attr = PyObject_GetAttr(pyObj, key);
|
||||||
SignalInstanceData *data = reinterpret_cast<SignalInstanceData*>(attr);
|
SignalInstanceData *data = reinterpret_cast<SignalInstanceData*>(attr);
|
||||||
while(data) {
|
while(data) {
|
||||||
mo->addSignal(data->signature);
|
int index = base->indexOfSignal(data->signature);
|
||||||
|
if (index == -1)
|
||||||
|
mo->addSignal(data->signature);
|
||||||
data = reinterpret_cast<SignalInstanceData*>(data->next);
|
data = reinterpret_cast<SignalInstanceData*>(data->next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -209,7 +212,9 @@ DynamicQMetaObject* DynamicQMetaObject::createBasedOn(PyObject* pyObj, PyTypeObj
|
||||||
QString sig(PyString_AsString(signature));
|
QString sig(PyString_AsString(signature));
|
||||||
//slot the slot type and signature
|
//slot the slot type and signature
|
||||||
QStringList slotInfo = sig.split(" ", QString::SkipEmptyParts);
|
QStringList slotInfo = sig.split(" ", QString::SkipEmptyParts);
|
||||||
mo->addSlot(slotInfo[1].toAscii(), slotInfo[0].toAscii());
|
int index = base->indexOfSlot(slotInfo[0].toAscii());
|
||||||
|
if (index == -1)
|
||||||
|
mo->addSlot(slotInfo[1].toAscii(), slotInfo[0].toAscii());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@
|
||||||
#include "signalmanager.h"
|
#include "signalmanager.h"
|
||||||
|
|
||||||
#define SIGNAL_CLASS_NAME "signal"
|
#define SIGNAL_CLASS_NAME "signal"
|
||||||
|
#define QT_SIGNAL_SENTINEL "2"
|
||||||
|
|
||||||
namespace PySide
|
namespace PySide
|
||||||
{
|
{
|
||||||
|
|
@ -71,6 +72,7 @@ static char* signal_get_type_name(PyObject*);
|
||||||
static void signal_append_signature(SignalData*, char*);
|
static void signal_append_signature(SignalData*, char*);
|
||||||
static void signal_instance_initialize(PyObject*, PyObject*, SignalData*, PyObject *, int);
|
static void signal_instance_initialize(PyObject*, PyObject*, SignalData*, PyObject *, int);
|
||||||
static char* signal_parse_signature(PyObject*);
|
static char* signal_parse_signature(PyObject*);
|
||||||
|
static PyObject* signal_build_qt_compatible(const char*);
|
||||||
|
|
||||||
PyTypeObject Signal_Type = {
|
PyTypeObject Signal_Type = {
|
||||||
PyObject_HEAD_INIT(0)
|
PyObject_HEAD_INIT(0)
|
||||||
|
|
@ -254,7 +256,7 @@ char* signal_get_type_name(PyObject* type)
|
||||||
char* signal_build_signature(const char *name, const char *signature)
|
char* signal_build_signature(const char *name, const char *signature)
|
||||||
{
|
{
|
||||||
QString signal;
|
QString signal;
|
||||||
signal.sprintf("2%s(%s)", name, signature);
|
signal.sprintf("%s(%s)", name, signature);
|
||||||
return strdup(QMetaObject::normalizedSignature(signal.toAscii()));
|
return strdup(QMetaObject::normalizedSignature(signal.toAscii()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -404,12 +406,13 @@ PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds
|
||||||
while(targetWalk && !match) {
|
while(targetWalk && !match) {
|
||||||
if (QMetaObject::checkConnectArgs(sourceWalk->signature, targetWalk->signature)) {
|
if (QMetaObject::checkConnectArgs(sourceWalk->signature, targetWalk->signature)) {
|
||||||
PyList_Append(pyArgs, sourceWalk->source);
|
PyList_Append(pyArgs, sourceWalk->source);
|
||||||
Shiboken::AutoDecRef sourceSignature(PyString_FromString(sourceWalk->signature));
|
Shiboken::AutoDecRef sourceSignature(signal_build_qt_compatible(sourceWalk->signature));
|
||||||
PyList_Append(pyArgs, sourceSignature);
|
PyList_Append(pyArgs, sourceSignature);
|
||||||
|
|
||||||
PyList_Append(pyArgs, targetWalk->source);
|
PyList_Append(pyArgs, targetWalk->source);
|
||||||
Shiboken::AutoDecRef targetSignature(PyString_FromString(targetWalk->signature));
|
Shiboken::AutoDecRef targetSignature(signal_build_qt_compatible(targetWalk->signature));
|
||||||
PyList_Append(pyArgs, targetSignature);
|
PyList_Append(pyArgs, targetSignature);
|
||||||
|
|
||||||
match = true;
|
match = true;
|
||||||
}
|
}
|
||||||
targetWalk = reinterpret_cast<SignalInstanceData*>(targetWalk->next);
|
targetWalk = reinterpret_cast<SignalInstanceData*>(targetWalk->next);
|
||||||
|
|
@ -419,7 +422,7 @@ PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds
|
||||||
} else {
|
} else {
|
||||||
//try the first signature
|
//try the first signature
|
||||||
PyList_Append(pyArgs, source->source);
|
PyList_Append(pyArgs, source->source);
|
||||||
Shiboken::AutoDecRef signature(PyString_FromString(source->signature));
|
Shiboken::AutoDecRef signature(signal_build_qt_compatible(source->signature));
|
||||||
PyList_Append(pyArgs, signature);
|
PyList_Append(pyArgs, signature);
|
||||||
|
|
||||||
PyList_Append(pyArgs, slot);
|
PyList_Append(pyArgs, slot);
|
||||||
|
|
@ -454,18 +457,18 @@ PyObject* signal_instance_disconnect(PyObject* self, PyObject* args)
|
||||||
SignalInstanceData *target = reinterpret_cast<SignalInstanceData*>(slot);
|
SignalInstanceData *target = reinterpret_cast<SignalInstanceData*>(slot);
|
||||||
if (QMetaObject::checkConnectArgs(source->signature, target->signature)) {
|
if (QMetaObject::checkConnectArgs(source->signature, target->signature)) {
|
||||||
PyList_Append(pyArgs, source->source);
|
PyList_Append(pyArgs, source->source);
|
||||||
Shiboken::AutoDecRef source_signature(PyString_FromString(source->signature));
|
Shiboken::AutoDecRef source_signature(signal_build_qt_compatible(source->signature));
|
||||||
PyList_Append(pyArgs, source_signature);
|
PyList_Append(pyArgs, source_signature);
|
||||||
|
|
||||||
PyList_Append(pyArgs, target->source);
|
PyList_Append(pyArgs, target->source);
|
||||||
Shiboken::AutoDecRef target_signature(PyString_FromString(target->signature));
|
Shiboken::AutoDecRef target_signature(signal_build_qt_compatible(target->signature));
|
||||||
PyList_Append(pyArgs, target_signature);
|
PyList_Append(pyArgs, target_signature);
|
||||||
match = true;
|
match = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//try the first signature
|
//try the first signature
|
||||||
PyList_Append(pyArgs, source->source);
|
PyList_Append(pyArgs, source->source);
|
||||||
Shiboken::AutoDecRef signature(PyString_FromString(source->signature));
|
Shiboken::AutoDecRef signature(signal_build_qt_compatible(source->signature));
|
||||||
PyList_Append(pyArgs, signature);
|
PyList_Append(pyArgs, signature);
|
||||||
|
|
||||||
PyList_Append(pyArgs, slot);
|
PyList_Append(pyArgs, slot);
|
||||||
|
|
@ -486,7 +489,7 @@ PyObject* signal_instance_emit(PyObject* self, PyObject* args)
|
||||||
SignalInstanceData *source = reinterpret_cast<SignalInstanceData*>(self);
|
SignalInstanceData *source = reinterpret_cast<SignalInstanceData*>(self);
|
||||||
|
|
||||||
Shiboken::AutoDecRef pyArgs(PyList_New(0));
|
Shiboken::AutoDecRef pyArgs(PyList_New(0));
|
||||||
Shiboken::AutoDecRef source_signature(PyString_FromString(source->signature));
|
Shiboken::AutoDecRef source_signature(signal_build_qt_compatible(source->signature));
|
||||||
|
|
||||||
PyList_Append(pyArgs, source_signature);
|
PyList_Append(pyArgs, source_signature);
|
||||||
for(Py_ssize_t i=0, i_max=PyTuple_Size(args); i < i_max; i++)
|
for(Py_ssize_t i=0, i_max=PyTuple_Size(args); i < i_max; i++)
|
||||||
|
|
@ -522,4 +525,15 @@ PyObject* signalNew(const char* name, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PyObject* signal_build_qt_compatible(const char* signature)
|
||||||
|
{
|
||||||
|
char* qtSignature;
|
||||||
|
qtSignature = reinterpret_cast<char*>(malloc(strlen(signature)+2));
|
||||||
|
sprintf(qtSignature, QT_SIGNAL_SENTINEL"%s", signature);
|
||||||
|
PyObject* ret = PyString_FromString(qtSignature);
|
||||||
|
free(qtSignature);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} //namespace PySide
|
} //namespace PySide
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue