Used shared pointer on MethodData to allow copy.

Reviewer: Hugo Parente Lima <hugo.lima@openbossa.org>,
          Luciano Wolf <luciano.wolf@openbossa.org>
This commit is contained in:
Renato Filho 2010-05-17 18:40:38 -03:00
commit 089cce5dbb
2 changed files with 33 additions and 14 deletions

View file

@ -62,36 +62,49 @@ static int registerString(const QByteArray& s, QList<QByteArray>* strings)
} }
MethodData::MethodData(const char* signature, const char* type) MethodData::MethodData(const char* signature, const char* type)
: m_signature(signature), m_type(type)
{ {
m_signature = QSharedPointer<QByteArray>(new QByteArray(signature));
m_type = QSharedPointer<QByteArray>(new QByteArray(type));
} }
void MethodData::clear() void MethodData::clear()
{ {
m_signature.clear(); m_signature->clear();
m_type.clear(); m_type->clear();
} }
bool MethodData::operator==(const MethodData& other) const bool MethodData::operator==(const MethodData& other) const
{ {
return m_signature == other.signature(); return *m_signature == other.signature();
} }
bool MethodData::operator==(const char* other) const bool MethodData::operator==(const char* other) const
{ {
return m_signature == other; return *m_signature == other;
} }
QByteArray MethodData::signature() const QByteArray MethodData::signature() const
{ {
return m_signature; if (!m_signature.isNull())
return *m_signature;
else
return QByteArray();
} }
QByteArray MethodData::type() const QByteArray MethodData::type() const
{ {
if (m_type == "void") if (!m_type.isNull()) {
return QByteArray(""); if (*m_type == "void")
return m_type; return QByteArray();
return *m_type;
} else {
return QByteArray();
}
}
bool MethodData::isValid() const
{
return m_signature->size();
} }
DynamicQMetaObject::DynamicQMetaObject(const char* className, const QMetaObject* metaObject) DynamicQMetaObject::DynamicQMetaObject(const char* className, const QMetaObject* metaObject)
@ -260,7 +273,7 @@ void DynamicQMetaObject::updateMetaObject()
QLinkedList<MethodData>::iterator iSignal = m_signals.begin(); QLinkedList<MethodData>::iterator iSignal = m_signals.begin();
for(int i=0; i < MAX_SIGNALS_COUNT; i++) { for(int i=0; i < MAX_SIGNALS_COUNT; i++) {
QByteArray sigType; QByteArray sigType;
if (iSignal != m_signals.end()) { if (iSignal != m_signals.end() && ((*iSignal).signature().size() > 0) ) {
data[index++] = registerString((*iSignal).signature(), &strings); // func name data[index++] = registerString((*iSignal).signature(), &strings); // func name
sigType = (*iSignal).type(); sigType = (*iSignal).type();
iSignal++; iSignal++;
@ -276,9 +289,13 @@ void DynamicQMetaObject::updateMetaObject()
//write slots //write slots
foreach(MethodData slot, m_slots) { foreach(MethodData slot, m_slots) {
if (slot.isValid())
data[index++] = registerString(slot.signature(), &strings); // func name data[index++] = registerString(slot.signature(), &strings); // func name
else
data[index++] = NULL_INDEX;
data[index++] = NULL_INDEX; // arguments data[index++] = NULL_INDEX; // arguments
data[index++] = (slot.type().size() > 0 ? registerString(slot.type(), &strings) : NULL_INDEX); // normalized type data[index++] = (slot.isValid() ? registerString(slot.type(), &strings) : NULL_INDEX); // normalized type
data[index++] = NULL_INDEX; // tags data[index++] = NULL_INDEX; // tags
data[index++] = AccessPublic | MethodSlot; // flags data[index++] = AccessPublic | MethodSlot; // flags
} }

View file

@ -40,6 +40,7 @@
#include <QMetaObject> #include <QMetaObject>
#include <QLinkedList> #include <QLinkedList>
#include <QByteArray> #include <QByteArray>
#include <QSharedPointer>
#define PYSIDE_SLOT_LIST_ATTR "_slots" #define PYSIDE_SLOT_LIST_ATTR "_slots"
@ -54,14 +55,15 @@ public:
MethodData(){} MethodData(){}
MethodData(const char* signature, const char* type); MethodData(const char* signature, const char* type);
void clear(); void clear();
bool isValid() const;
QByteArray signature() const; QByteArray signature() const;
QByteArray type() const; QByteArray type() const;
bool operator==(const MethodData& other) const; bool operator==(const MethodData& other) const;
bool operator==(const char* other) const; bool operator==(const char* other) const;
private: private:
QByteArray m_signature; QSharedPointer<QByteArray> m_signature;
QByteArray m_type; QSharedPointer<QByteArray> m_type;
}; };
class PYSIDE_API DynamicQMetaObject : public QMetaObject class PYSIDE_API DynamicQMetaObject : public QMetaObject