aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlmetatype.cpp
diff options
context:
space:
mode:
authorAlan Alpert <416365416c@gmail.com>2012-12-16 14:42:40 -0800
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-01-24 01:13:10 +0100
commiteab53ad9fe0aa9664702d446a704256f46106c56 (patch)
tree382ba51381f7deb57f4be24dc29650c5d420f188 /src/qml/qml/qqmlmetatype.cpp
parent0e856d7cb5280f19e93a0738a2eb11f70cf9f119 (diff)
Refactor QQmlTypePrivate
Now has a registrationType, and an extraData union for data only relevant to certain registration types. Change-Id: I9b127dff7955456aacb25138fa6ea8efb7bb9220 Reviewed-by: Christopher Adams <chris.adams@jollamobile.com>
Diffstat (limited to 'src/qml/qml/qqmlmetatype.cpp')
-rw-r--r--src/qml/qml/qqmlmetatype.cpp256
1 files changed, 166 insertions, 90 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp
index 207aa1f16d..e4f51474b9 100644
--- a/src/qml/qml/qqmlmetatype.cpp
+++ b/src/qml/qml/qqmlmetatype.cpp
@@ -148,46 +148,60 @@ QQmlMetaTypeData::~QQmlMetaTypeData()
class QQmlTypePrivate
{
public:
- QQmlTypePrivate();
+ QQmlTypePrivate(QQmlType::RegistrationType type);
~QQmlTypePrivate();
void init() const;
void initEnums() const;
void insertEnums(const QMetaObject *metaObject) const;
- bool isInterface : 1;
+ QQmlType::RegistrationType regType;
+
+ struct QQmlCppTypeData
+ {
+ int allocationSize;
+ void (*newFunc)(void *);
+ QString noCreationReason;
+ int parserStatusCast;
+ QObject *(*extFunc)(QObject *);
+ const QMetaObject *extMetaObject;
+ QQmlCustomParser *customParser;
+ QQmlAttachedPropertiesFunc attachedPropertiesFunc;
+ const QMetaObject *attachedPropertiesType;
+ int attachedPropertiesId;
+ int propertyValueSourceCast;
+ int propertyValueInterceptorCast;
+ };
+
+ struct QQmlSingletonTypeData
+ {
+ QQmlType::SingletonInstanceInfo *singletonInstanceInfo;
+ };
+
+ union extraData {
+ QQmlCppTypeData* cd;
+ QQmlSingletonTypeData* sd;
+ } extraData;
+
const char *iid;
QHashedString module;
QString name;
QString elementName;
int version_maj;
int version_min;
- int typeId; int listId;
+ int typeId;
+ int listId;
int revision;
mutable bool containsRevisionedAttributes;
mutable QQmlType *superType;
-
- int allocationSize;
- void (*newFunc)(void *);
- QString noCreationReason;
-
const QMetaObject *baseMetaObject;
- QQmlAttachedPropertiesFunc attachedPropertiesFunc;
- const QMetaObject *attachedPropertiesType;
- int attachedPropertiesId;
- int parserStatusCast;
- int propertyValueSourceCast;
- int propertyValueInterceptorCast;
- QObject *(*extFunc)(QObject *);
- const QMetaObject *extMetaObject;
+
int index;
- QQmlCustomParser *customParser;
mutable volatile bool isSetup:1;
mutable volatile bool isEnumSetup:1;
mutable bool haveSuperType:1;
mutable QList<QQmlProxyMetaObject::ProxyData> metaObjects;
mutable QStringHash<int> enums;
- QQmlType::SingletonInstanceInfo *singletonInstanceInfo;
static QHash<const QMetaObject *, int> attachedPropertyIds;
};
@@ -252,28 +266,58 @@ QJSValue QQmlType::SingletonInstanceInfo::scriptApi(QQmlEngine *e) const
QHash<const QMetaObject *, int> QQmlTypePrivate::attachedPropertyIds;
-QQmlTypePrivate::QQmlTypePrivate()
-: isInterface(false), iid(0), typeId(0), listId(0), revision(0), containsRevisionedAttributes(false),
- superType(0), allocationSize(0), newFunc(0), baseMetaObject(0), attachedPropertiesFunc(0),
- attachedPropertiesType(0), parserStatusCast(-1), propertyValueSourceCast(-1),
- propertyValueInterceptorCast(-1), extFunc(0), extMetaObject(0), index(-1), customParser(0),
- isSetup(false), isEnumSetup(false), haveSuperType(false), singletonInstanceInfo(0)
-{
+QQmlTypePrivate::QQmlTypePrivate(QQmlType::RegistrationType type)
+: regType(type), iid(0), typeId(0), listId(0), revision(0),
+ containsRevisionedAttributes(false), superType(0), baseMetaObject(0),
+ index(-1), isSetup(false), isEnumSetup(false), haveSuperType(false)
+{
+ switch (type) {
+ case QQmlType::CppType:
+ extraData.cd = new QQmlCppTypeData;
+ extraData.cd->allocationSize = 0;
+ extraData.cd->newFunc = 0;
+ extraData.cd->parserStatusCast = -1;
+ extraData.cd->extFunc = 0;
+ extraData.cd->extMetaObject = 0;
+ extraData.cd->customParser = 0;
+ extraData.cd->attachedPropertiesFunc = 0;
+ extraData.cd->attachedPropertiesType = 0;
+ extraData.cd->propertyValueSourceCast = -1;
+ extraData.cd->propertyValueInterceptorCast = -1;
+ break;
+ case QQmlType::SingletonType:
+ extraData.sd = new QQmlSingletonTypeData;
+ extraData.sd->singletonInstanceInfo = 0;
+ break;
+ case QQmlType::InterfaceType:
+ extraData.cd = 0;
+ break;
+ default: qFatal("QQmlTypePrivate Internal Error.");
+ }
}
QQmlTypePrivate::~QQmlTypePrivate()
{
- delete singletonInstanceInfo;
+ switch (regType) {
+ case QQmlType::CppType:
+ delete extraData.cd->customParser;
+ delete extraData.cd;
+ break;
+ case QQmlType::SingletonType:
+ delete extraData.sd->singletonInstanceInfo;
+ delete extraData.sd;
+ break;
+ default: //Also InterfaceType, because it has no extra data
+ break;
+ }
}
QQmlType::QQmlType(int index, const QQmlPrivate::RegisterInterface &interface)
-: d(new QQmlTypePrivate)
+: d(new QQmlTypePrivate(InterfaceType))
{
- d->isInterface = true;
d->iid = interface.iid;
d->typeId = interface.typeId;
d->listId = interface.listId;
- d->newFunc = 0;
d->index = index;
d->isSetup = true;
d->version_maj = 0;
@@ -281,7 +325,7 @@ QQmlType::QQmlType(int index, const QQmlPrivate::RegisterInterface &interface)
}
QQmlType::QQmlType(int index, const QString &elementName, const QQmlPrivate::RegisterSingletonType &type)
-: d(new QQmlTypePrivate)
+: d(new QQmlTypePrivate(SingletonType))
{
d->elementName = elementName;
d->module = moduleFromUtf8(type.uri);
@@ -298,18 +342,18 @@ QQmlType::QQmlType(int index, const QString &elementName, const QQmlPrivate::Reg
d->revision = type.revision;
}
- d->newFunc = 0;
d->index = index;
- d->singletonInstanceInfo = new SingletonInstanceInfo;
- d->singletonInstanceInfo->scriptCallback = type.scriptApi;
- d->singletonInstanceInfo->qobjectCallback = type.qobjectApi;
- d->singletonInstanceInfo->typeName = QString::fromUtf8(type.typeName);
- d->singletonInstanceInfo->instanceMetaObject = (type.qobjectApi && type.version >= 1) ? type.instanceMetaObject : 0;
+ d->extraData.sd->singletonInstanceInfo = new SingletonInstanceInfo;
+ d->extraData.sd->singletonInstanceInfo->scriptCallback = type.scriptApi;
+ d->extraData.sd->singletonInstanceInfo->qobjectCallback = type.qobjectApi;
+ d->extraData.sd->singletonInstanceInfo->typeName = QString::fromUtf8(type.typeName);
+ d->extraData.sd->singletonInstanceInfo->instanceMetaObject
+ = (type.qobjectApi && type.version >= 1) ? type.instanceMetaObject : 0;
}
QQmlType::QQmlType(int index, const QString &elementName, const QQmlPrivate::RegisterType &type)
-: d(new QQmlTypePrivate)
+: d(new QQmlTypePrivate(CppType))
{
d->elementName = elementName;
d->module = moduleFromUtf8(type.uri);
@@ -320,34 +364,33 @@ QQmlType::QQmlType(int index, const QString &elementName, const QQmlPrivate::Reg
d->revision = type.revision;
d->typeId = type.typeId;
d->listId = type.listId;
- d->allocationSize = type.objectSize;
- d->newFunc = type.create;
- d->noCreationReason = type.noCreationReason;
+ d->extraData.cd->allocationSize = type.objectSize;
+ d->extraData.cd->newFunc = type.create;
+ d->extraData.cd->noCreationReason = type.noCreationReason;
d->baseMetaObject = type.metaObject;
- d->attachedPropertiesFunc = type.attachedPropertiesFunction;
- d->attachedPropertiesType = type.attachedPropertiesMetaObject;
- if (d->attachedPropertiesType) {
+ d->extraData.cd->attachedPropertiesFunc = type.attachedPropertiesFunction;
+ d->extraData.cd->attachedPropertiesType = type.attachedPropertiesMetaObject;
+ if (d->extraData.cd->attachedPropertiesType) {
QHash<const QMetaObject *, int>::Iterator iter = d->attachedPropertyIds.find(d->baseMetaObject);
if (iter == d->attachedPropertyIds.end())
iter = d->attachedPropertyIds.insert(d->baseMetaObject, index);
- d->attachedPropertiesId = *iter;
+ d->extraData.cd->attachedPropertiesId = *iter;
} else {
- d->attachedPropertiesId = -1;
+ d->extraData.cd->attachedPropertiesId = -1;
}
- d->parserStatusCast = type.parserStatusCast;
- d->propertyValueSourceCast = type.valueSourceCast;
- d->propertyValueInterceptorCast = type.valueInterceptorCast;
- d->extFunc = type.extensionObjectCreate;
+ d->extraData.cd->parserStatusCast = type.parserStatusCast;
+ d->extraData.cd->propertyValueSourceCast = type.valueSourceCast;
+ d->extraData.cd->propertyValueInterceptorCast = type.valueInterceptorCast;
+ d->extraData.cd->extFunc = type.extensionObjectCreate;
+ d->extraData.cd->customParser = type.customParser;
d->index = index;
- d->customParser = type.customParser;
if (type.extensionMetaObject)
- d->extMetaObject = type.extensionMetaObject;
+ d->extraData.cd->extMetaObject = type.extensionMetaObject;
}
QQmlType::~QQmlType()
{
- delete d->customParser;
delete d;
}
@@ -481,7 +524,8 @@ static bool isPropertyRevisioned(const QMetaObject *mo, int index)
void QQmlTypePrivate::init() const
{
- if (isSetup) return;
+ if (isSetup)
+ return;
QWriteLocker lock(metaTypeDataLock());
if (isSetup)
@@ -489,35 +533,37 @@ void QQmlTypePrivate::init() const
const QMetaObject *mo = baseMetaObject;
if (!mo) {
- // singleton type without metaobject information
+ // version 0 singleton type without metaobject information
return;
}
- // Setup extended meta object
- // XXX - very inefficient
- if (extFunc) {
- QMetaObjectBuilder builder;
- clone(builder, extMetaObject, extMetaObject, extMetaObject);
- builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
- QMetaObject *mmo = builder.toMetaObject();
- mmo->d.superdata = mo;
- QQmlProxyMetaObject::ProxyData data = { mmo, extFunc, 0, 0 };
- metaObjects << data;
+ if (regType == QQmlType::CppType) {
+ // Setup extended meta object
+ // XXX - very inefficient
+ if (extraData.cd->extFunc) {
+ QMetaObjectBuilder builder;
+ clone(builder, extraData.cd->extMetaObject, extraData.cd->extMetaObject, extraData.cd->extMetaObject);
+ builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
+ QMetaObject *mmo = builder.toMetaObject();
+ mmo->d.superdata = mo;
+ QQmlProxyMetaObject::ProxyData data = { mmo, extraData.cd->extFunc, 0, 0 };
+ metaObjects << data;
+ }
}
mo = mo->d.superdata;
while(mo) {
QQmlType *t = metaTypeData()->metaObjectToType.value(mo);
if (t) {
- if (t->d->extFunc) {
+ if (t->d->extraData.cd->extFunc) {
QMetaObjectBuilder builder;
- clone(builder, t->d->extMetaObject, t->d->baseMetaObject, baseMetaObject);
+ clone(builder, t->d->extraData.cd->extMetaObject, t->d->baseMetaObject, baseMetaObject);
builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
QMetaObject *mmo = builder.toMetaObject();
mmo->d.superdata = baseMetaObject;
if (!metaObjects.isEmpty())
metaObjects.last().metaObject->d.superdata = mmo;
- QQmlProxyMetaObject::ProxyData data = { mmo, t->d->extFunc, 0, 0 };
+ QQmlProxyMetaObject::ProxyData data = { mmo, t->d->extraData.cd->extFunc, 0, 0 };
metaObjects << data;
}
}
@@ -530,7 +576,7 @@ void QQmlTypePrivate::init() const
metaObjects[ii].methodOffset =
metaObjects.at(ii).metaObject->methodOffset();
}
-
+
// Check for revisioned details
{
const QMetaObject *mo = 0;
@@ -590,9 +636,9 @@ void QQmlTypePrivate::insertEnums(const QMetaObject *metaObject) const
QByteArray QQmlType::typeName() const
{
- if (d->singletonInstanceInfo)
- return d->singletonInstanceInfo->typeName.toUtf8();
- if (d->baseMetaObject)
+ if (d->regType == SingletonType)
+ return d->extraData.sd->singletonInstanceInfo->typeName.toUtf8();
+ else if (d->baseMetaObject)
return d->baseMetaObject->className();
else
return QByteArray();
@@ -617,10 +663,13 @@ const QString &QQmlType::qmlTypeName() const
QObject *QQmlType::create() const
{
+ if (!isCreatable())
+ return 0;
+
d->init();
- QObject *rv = (QObject *)operator new(d->allocationSize);
- d->newFunc(rv);
+ QObject *rv = (QObject *)operator new(d->extraData.cd->allocationSize);
+ d->extraData.cd->newFunc(rv);
if (rv && !d->metaObjects.isEmpty())
(void)new QQmlProxyMetaObject(rv, &d->metaObjects);
@@ -630,46 +679,59 @@ QObject *QQmlType::create() const
void QQmlType::create(QObject **out, void **memory, size_t additionalMemory) const
{
+ if (!isCreatable())
+ return;
+
d->init();
- QObject *rv = (QObject *)operator new(d->allocationSize + additionalMemory);
- d->newFunc(rv);
+ QObject *rv = (QObject *)operator new(d->extraData.cd->allocationSize + additionalMemory);
+ d->extraData.cd->newFunc(rv);
if (rv && !d->metaObjects.isEmpty())
(void)new QQmlProxyMetaObject(rv, &d->metaObjects);
*out = rv;
- *memory = ((char *)rv) + d->allocationSize;
+ *memory = ((char *)rv) + d->extraData.cd->allocationSize;
}
QQmlType::SingletonInstanceInfo *QQmlType::singletonInstanceInfo() const
{
- return d->singletonInstanceInfo;
+ if (d->regType != SingletonType)
+ return 0;
+ return d->extraData.sd->singletonInstanceInfo;
}
QQmlCustomParser *QQmlType::customParser() const
{
- return d->customParser;
+ if (d->regType != CppType)
+ return 0;
+ return d->extraData.cd->customParser;
}
QQmlType::CreateFunc QQmlType::createFunction() const
{
- return d->newFunc;
+ if (d->regType != CppType)
+ return 0;
+ return d->extraData.cd->newFunc;
}
QString QQmlType::noCreationReason() const
{
- return d->noCreationReason;
+ if (d->regType != CppType)
+ return QString();
+ return d->extraData.cd->noCreationReason;
}
int QQmlType::createSize() const
{
- return d->allocationSize;
+ if (d->regType != CppType)
+ return 0;
+ return d->extraData.cd->allocationSize;
}
bool QQmlType::isCreatable() const
{
- return d->newFunc != 0;
+ return d->regType == CppType && d->extraData.cd->newFunc;
}
bool QQmlType::isExtendedType() const
@@ -681,12 +743,12 @@ bool QQmlType::isExtendedType() const
bool QQmlType::isSingleton() const
{
- return d->singletonInstanceInfo != 0;
+ return d->regType == SingletonType;
}
bool QQmlType::isInterface() const
{
- return d->isInterface;
+ return d->regType == InterfaceType;
}
int QQmlType::typeId() const
@@ -729,12 +791,16 @@ int QQmlType::metaObjectRevision() const
QQmlAttachedPropertiesFunc QQmlType::attachedPropertiesFunction() const
{
- return d->attachedPropertiesFunc;
+ if (d->regType != CppType)
+ return 0;
+ return d->extraData.cd->attachedPropertiesFunc;
}
const QMetaObject *QQmlType::attachedPropertiesType() const
{
- return d->attachedPropertiesType;
+ if (d->regType != CppType)
+ return 0;
+ return d->extraData.cd->attachedPropertiesType;
}
/*
@@ -744,26 +810,36 @@ Qt 4.7 and QtQuick 1.0).
*/
int QQmlType::attachedPropertiesId() const
{
- return d->attachedPropertiesId;
+ if (d->regType != CppType)
+ return 0;
+ return d->extraData.cd->attachedPropertiesId;
}
int QQmlType::parserStatusCast() const
{
- return d->parserStatusCast;
+ if (d->regType != CppType)
+ return -1;
+ return d->extraData.cd->parserStatusCast;
}
int QQmlType::propertyValueSourceCast() const
{
- return d->propertyValueSourceCast;
+ if (d->regType != CppType)
+ return -1;
+ return d->extraData.cd->propertyValueSourceCast;
}
int QQmlType::propertyValueInterceptorCast() const
{
- return d->propertyValueInterceptorCast;
+ if (d->regType != CppType)
+ return -1;
+ return d->extraData.cd->propertyValueInterceptorCast;
}
const char *QQmlType::interfaceIId() const
{
+ if (d->regType != InterfaceType)
+ return 0;
return d->iid;
}