aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-06-26 13:45:56 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2017-08-02 16:32:56 +0000
commite61dca72682c9f65c6ab6254fc7e80b49be3ad43 (patch)
treee11413ad237abc8df737c4e55bc38a8012c2ae14
parentaa6120cc3524b8d603e92e952aece7494a5d8f02 (diff)
Change data structures in QQmlMetaTypeData
Make sure any QQmlType stored in the meta type data has a refcount of 1. This should now make it possible to clean out unused types by iterating over the list of types and removing those that have a refcount of 1. Some care is still needed for C++ registered types, that will need to get one more refcount, so we don't accidentally remove them. Task-number: QTBUG-61536 Change-Id: Id2a18dae5ddcb815f34013f5fde1f05d2d9d0214 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp2
-rw-r--r--src/qml/qml/qqmlmetatype.cpp238
-rw-r--r--src/qml/qml/qqmlmetatype_p.h13
-rw-r--r--src/qml/qml/qqmltypewrapper.cpp2
-rw-r--r--tools/qmlplugindump/main.cpp110
5 files changed, 173 insertions, 192 deletions
diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp
index f5cb468479..e17ab354cf 100644
--- a/src/qml/compiler/qqmltypecompiler.cpp
+++ b/src/qml/compiler/qqmltypecompiler.cpp
@@ -344,7 +344,7 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio
if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) {
const QmlIR::Object *attachedObj = qmlObjects.at(binding->value.objectIndex);
auto *typeRef = resolvedTypes.value(binding->propertyNameIndex);
- QQmlType type = typeRef ? typeRef->type : nullptr;
+ QQmlType type = typeRef ? typeRef->type : QQmlType();
if (!type.isValid()) {
if (imports->resolveType(propertyName, &type, 0, 0, 0)) {
if (type.isComposite()) {
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp
index 9dd0c14723..36d70f24c8 100644
--- a/src/qml/qml/qqmlmetatype.cpp
+++ b/src/qml/qml/qqmlmetatype.cpp
@@ -69,18 +69,18 @@ struct QQmlMetaTypeData
{
QQmlMetaTypeData();
~QQmlMetaTypeData();
- QList<QQmlType *> types;
- typedef QHash<int, QQmlType *> Ids;
+ QList<QQmlType> types;
+ typedef QHash<int, QQmlTypePrivate *> Ids;
Ids idToType;
- typedef QHash<QHashedStringRef,QQmlType *> Names;
+ typedef QHash<QHashedStringRef, QQmlTypePrivate *> Names;
Names nameToType;
- typedef QHash<QUrl, QQmlType *> Files; //For file imported composite types only
+ typedef QHash<QUrl, QQmlTypePrivate *> Files; //For file imported composite types only
Files urlToType;
Files urlToNonFileImportType; // For non-file imported composite and composite
// singleton types. This way we can locate any
// of them by url, even if it was registered as
// a module via QQmlPrivate::RegisterCompositeType
- typedef QHash<const QMetaObject *, QQmlType *> MetaObjects;
+ typedef QHash<const QMetaObject *, QQmlTypePrivate *> MetaObjects;
MetaObjects metaObjectToType;
typedef QHash<int, QQmlMetaType::StringConverter> StringConverters;
StringConverters stringConverters;
@@ -130,10 +130,10 @@ public:
int maxMinorVersion;
bool locked;
- void add(QQmlType *);
+ void add(QQmlTypePrivate *);
- QStringHash<QList<QQmlType *> > typeHash;
- QList<QQmlType *> types;
+ QStringHash<QList<QQmlTypePrivate *> > typeHash;
+ QList<QQmlTypePrivate *> types;
};
Q_GLOBAL_STATIC(QQmlMetaTypeData, metaTypeData)
@@ -150,9 +150,6 @@ QQmlMetaTypeData::QQmlMetaTypeData()
QQmlMetaTypeData::~QQmlMetaTypeData()
{
- for (int i = 0; i < types.count(); ++i)
- delete types.at(i);
-
for (TypeModules::const_iterator i = uriToModule.constBegin(), cend = uriToModule.constEnd(); i != cend; ++i)
delete *i;
for (QHash<const QMetaObject *, QQmlPropertyCache *>::Iterator it = propertyCaches.begin(), end = propertyCaches.end();
@@ -494,27 +491,6 @@ QQmlType::~QQmlType()
delete d;
}
-QQmlType::QQmlType(QQmlType *otherPointer)
- : d(0)
-{
- if (otherPointer) {
- d = otherPointer->d;
- if (d)
- d->refCount.ref();
- }
-}
-
-QQmlType &QQmlType::operator =(QQmlType *otherPointer) {
- if (otherPointer && otherPointer->d != d) {
- if (d && !d->refCount.deref())
- delete d;
- d = otherPointer->d;
- if (d)
- d->refCount.ref();
- }
- return *this;
-}
-
QHashedString QQmlType::module() const
{
if (!d)
@@ -556,7 +532,7 @@ bool QQmlType::availableInVersion(const QHashedStringRef &module, int vmajor, in
QQmlType QQmlType::superType() const
{
if (!d)
- return 0;
+ return QQmlType();
if (!d->haveSuperType && d->baseMetaObject) {
const QMetaObject *mo = d->baseMetaObject->superClass();
while (mo && !d->superType.isValid()) {
@@ -573,10 +549,10 @@ QQmlType QQmlType::resolveCompositeBaseType(QQmlEnginePrivate *engine) const
{
Q_ASSERT(isComposite());
if (!engine || !d)
- return 0;
+ return QQmlType();
QQmlRefPointer<QQmlTypeData> td(engine->typeLoader.getType(sourceUrl()), QQmlRefPointer<QQmlTypeData>::Adopt);
if (td.isNull() || !td->isComplete())
- return 0;
+ return QQmlType();
QV4::CompiledData::CompilationUnit *compilationUnit = td->compilationUnit();
const QMetaObject *mo = compilationUnit->rootPropertyCache()->firstCppMetaObject();
return QQmlMetaType::qmlType(mo);
@@ -709,18 +685,18 @@ void QQmlTypePrivate::init() const
mo = mo->d.superdata;
while(mo) {
- QQmlType *t = metaTypeData()->metaObjectToType.value(mo);
+ QQmlTypePrivate *t = metaTypeData()->metaObjectToType.value(mo);
if (t) {
- if (t->d->regType == QQmlType::CppType) {
- if (t->d->extraData.cd->extFunc) {
+ if (t->regType == QQmlType::CppType) {
+ if (t->extraData.cd->extFunc) {
QMetaObjectBuilder builder;
- clone(builder, t->d->extraData.cd->extMetaObject, t->d->baseMetaObject, baseMetaObject);
+ clone(builder, t->extraData.cd->extMetaObject, t->baseMetaObject, baseMetaObject);
builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
QMetaObject *mmo = builder.toMetaObject();
mmo->d.superdata = baseMetaObject;
if (!metaObjects.isEmpty())
metaObjects.constLast().metaObject->d.superdata = mmo;
- QQmlProxyMetaObject::ProxyData data = { mmo, t->d->extraData.cd->extFunc, 0, 0 };
+ QQmlProxyMetaObject::ProxyData data = { mmo, t->extraData.cd->extFunc, 0, 0 };
metaObjects << data;
}
}
@@ -1178,14 +1154,16 @@ int QQmlTypeModule::maximumMinorVersion() const
return d->maxMinorVersion;
}
-void QQmlTypeModulePrivate::add(QQmlType *type)
+void QQmlTypeModulePrivate::add(QQmlTypePrivate *type)
{
- minMinorVersion = qMin(minMinorVersion, type->minorVersion());
- maxMinorVersion = qMax(maxMinorVersion, type->minorVersion());
+ int minVersion = type->version_min;
+ minMinorVersion = qMin(minMinorVersion, minVersion);
+ maxMinorVersion = qMax(maxMinorVersion, minVersion);
- QList<QQmlType *> &list = typeHash[type->elementName()];
+ QList<QQmlTypePrivate *> &list = typeHash[type->elementName];
for (int ii = 0; ii < list.count(); ++ii) {
- if (list.at(ii)->minorVersion() < type->minorVersion()) {
+ Q_ASSERT(list.at(ii));
+ if (list.at(ii)->version_min < minVersion) {
list.insert(ii, type);
return;
}
@@ -1197,11 +1175,11 @@ QQmlType QQmlTypeModule::type(const QHashedStringRef &name, int minor) const
{
QMutexLocker lock(metaTypeDataLock());
- QList<QQmlType *> *types = d->typeHash.value(name);
+ QList<QQmlTypePrivate *> *types = d->typeHash.value(name);
if (types) {
for (int ii = 0; ii < types->count(); ++ii)
- if (types->at(ii)->minorVersion() <= minor)
- return types->at(ii);
+ if (types->at(ii)->version_min <= minor)
+ return QQmlType(types->at(ii));
}
return QQmlType();
@@ -1211,11 +1189,11 @@ QQmlType QQmlTypeModule::type(const QV4::String *name, int minor) const
{
QMutexLocker lock(metaTypeDataLock());
- QList<QQmlType *> *types = d->typeHash.value(name);
+ QList<QQmlTypePrivate *> *types = d->typeHash.value(name);
if (types) {
for (int ii = 0; ii < types->count(); ++ii)
- if (types->at(ii)->minorVersion() <= minor)
- return types->at(ii);
+ if (types->at(ii)->version_min <= minor)
+ return QQmlType(types->at(ii));
}
return QQmlType();
@@ -1275,9 +1253,6 @@ void qmlClearTypeRegistrations() // Declared in qqml.h
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- for (int i = 0; i < data->types.count(); ++i)
- delete data->types.at(i);
-
for (QQmlMetaTypeData::TypeModules::const_iterator i = data->uriToModule.constBegin(), cend = data->uriToModule.constEnd(); i != cend; ++i)
delete *i;
@@ -1315,14 +1290,16 @@ int registerInterface(const QQmlPrivate::RegisterInterface &interface)
int index = data->types.count();
- QQmlType *type = new QQmlType(index, interface);
+ QQmlType type(index, interface);
+ QQmlTypePrivate *priv = type.priv();
+ Q_ASSERT(priv);
data->types.append(type);
- data->idToType.insert(type->typeId(), type);
- data->idToType.insert(type->qListTypeId(), type);
+ data->idToType.insert(priv->typeId, priv);
+ data->idToType.insert(priv->listId, priv);
// XXX No insertMulti, so no multi-version interfaces?
- if (!type->elementName().isEmpty())
- data->nameToType.insert(type->elementName(), type);
+ if (!priv->elementName.isEmpty())
+ data->nameToType.insert(priv->elementName, priv);
if (data->interfaces.size() <= interface.typeId)
data->interfaces.resize(interface.typeId + 16);
@@ -1413,32 +1390,34 @@ QQmlTypeModule *getTypeModule(const QHashedString &uri, int majorVersion, QQmlMe
}
// NOTE: caller must hold a QMutexLocker on "data"
-void addTypeToData(QQmlType *type, QQmlMetaTypeData *data)
+void addTypeToData(QQmlTypePrivate *type, QQmlMetaTypeData *data)
{
- if (!type->elementName().isEmpty())
- data->nameToType.insertMulti(type->elementName(), type);
+ Q_ASSERT(type);
+
+ if (!type->elementName.isEmpty())
+ data->nameToType.insertMulti(type->elementName, type);
- if (type->baseMetaObject())
- data->metaObjectToType.insertMulti(type->baseMetaObject(), type);
+ if (type->baseMetaObject)
+ data->metaObjectToType.insertMulti(type->baseMetaObject, type);
- if (type->typeId()) {
- data->idToType.insert(type->typeId(), type);
- if (data->objects.size() <= type->typeId())
- data->objects.resize(type->typeId() + 16);
- data->objects.setBit(type->typeId(), true);
+ if (type->typeId) {
+ data->idToType.insert(type->typeId, type);
+ if (data->objects.size() <= type->typeId)
+ data->objects.resize(type->typeId + 16);
+ data->objects.setBit(type->typeId, true);
}
- if (type->qListTypeId()) {
- if (data->lists.size() <= type->qListTypeId())
- data->lists.resize(type->qListTypeId() + 16);
- data->lists.setBit(type->qListTypeId(), true);
- data->idToType.insert(type->qListTypeId(), type);
+ if (type->listId) {
+ if (data->lists.size() <= type->listId)
+ data->lists.resize(type->listId + 16);
+ data->lists.setBit(type->listId, true);
+ data->idToType.insert(type->listId, type);
}
- if (!type->module().isEmpty()) {
- const QHashedString &mod = type->module();
+ if (!type->module.isEmpty()) {
+ const QHashedString &mod = type->module;
- QQmlTypeModule *module = getTypeModule(mod, type->majorVersion(), data);
+ QQmlTypeModule *module = getTypeModule(mod, type->version_maj, data);
Q_ASSERT(module);
module->d->add(type);
}
@@ -1454,12 +1433,12 @@ int registerType(const QQmlPrivate::RegisterType &type)
int index = data->types.count();
- QQmlType *dtype = new QQmlType(index, elementName, type);
+ QQmlType dtype(index, elementName, type);
data->types.append(dtype);
- addTypeToData(dtype, data);
+ addTypeToData(dtype.priv(), data);
if (!type.typeId)
- data->idToType.insert(dtype->typeId(), dtype);
+ data->idToType.insert(dtype.typeId(), dtype.priv());
return index;
}
@@ -1474,10 +1453,10 @@ int registerSingletonType(const QQmlPrivate::RegisterSingletonType &type)
int index = data->types.count();
- QQmlType *dtype = new QQmlType(index, typeName, type);
+ QQmlType dtype(index, typeName, type);
data->types.append(dtype);
- addTypeToData(dtype, data);
+ addTypeToData(dtype.priv(), data);
return index;
}
@@ -1496,13 +1475,13 @@ int registerCompositeSingletonType(const QQmlPrivate::RegisterCompositeSingleton
int index = data->types.count();
- QQmlType *dtype = new QQmlType(index, typeName, type);
+ QQmlType dtype(index, typeName, type);
data->types.append(dtype);
- addTypeToData(dtype, data);
+ addTypeToData(dtype.priv(), data);
QQmlMetaTypeData::Files *files = fileImport ? &(data->urlToType) : &(data->urlToNonFileImportType);
- files->insertMulti(type.url, dtype);
+ files->insertMulti(type.url, dtype.priv());
return index;
}
@@ -1521,12 +1500,12 @@ int registerCompositeType(const QQmlPrivate::RegisterCompositeType &type)
int index = data->types.count();
- QQmlType *dtype = new QQmlType(index, typeName, type);
+ QQmlType dtype(index, typeName, type);
data->types.append(dtype);
- addTypeToData(dtype, data);
+ addTypeToData(dtype.priv(), data);
QQmlMetaTypeData::Files *files = fileImport ? &(data->urlToType) : &(data->urlToNonFileImportType);
- files->insertMulti(type.url, dtype);
+ files->insertMulti(type.url, dtype.priv());
return index;
}
@@ -1602,8 +1581,8 @@ bool QQmlMetaType::namespaceContainsRegistrations(const QString &uri, int majorV
// Has any type previously been installed to this namespace?
QHashedString nameSpace(uri);
- for (const QQmlType *type : data->types)
- if (type->module() == nameSpace && type->majorVersion() == majorVersion)
+ for (const QQmlType &type : data->types)
+ if (type.module() == nameSpace && type.majorVersion() == majorVersion)
return true;
return false;
@@ -1735,9 +1714,9 @@ int QQmlMetaType::listType(int id)
{
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- QQmlType *type = data->idToType.value(id);
- if (type && type->qListTypeId() == id)
- return type->typeId();
+ QQmlTypePrivate *type = data->idToType.value(id);
+ if (type && type->listId == id)
+ return type->typeId;
else
return 0;
}
@@ -1747,9 +1726,9 @@ int QQmlMetaType::attachedPropertiesFuncId(QQmlEnginePrivate *engine, const QMet
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- QQmlType *type = data->metaObjectToType.value(mo);
- if (type && type->attachedPropertiesFunction(engine))
- return type->attachedPropertiesId(engine);
+ QQmlType type(data->metaObjectToType.value(mo));
+ if (type.attachedPropertiesFunction(engine))
+ return type.attachedPropertiesId(engine);
else
return -1;
}
@@ -1760,7 +1739,7 @@ QQmlAttachedPropertiesFunc QQmlMetaType::attachedPropertiesFuncById(QQmlEnginePr
return 0;
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- return data->types.at(id)->attachedPropertiesFunction(engine);
+ return data->types.at(id).attachedPropertiesFunction(engine);
}
QMetaProperty QQmlMetaType::defaultProperty(const QMetaObject *metaObject)
@@ -1843,10 +1822,10 @@ const char *QQmlMetaType::interfaceIId(int userType)
{
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- QQmlType *type = data->idToType.value(userType);
+ QQmlType type(data->idToType.value(userType));
lock.unlock();
- if (type && type->isInterface() && type->typeId() == userType)
- return type->interfaceIId();
+ if (type.isInterface() && type.typeId() == userType)
+ return type.interfaceIId();
else
return 0;
}
@@ -1903,7 +1882,7 @@ QQmlType QQmlMetaType::qmlType(const QString &qualifiedName, int version_major,
{
int slash = qualifiedName.indexOf(QLatin1Char('/'));
if (slash <= 0)
- return 0;
+ return QQmlType();
QHashedStringRef module(qualifiedName.constData(), slash);
QHashedStringRef name(qualifiedName.constData() + slash + 1, qualifiedName.length() - slash - 1);
@@ -1923,9 +1902,10 @@ QQmlType QQmlMetaType::qmlType(const QHashedStringRef &name, const QHashedString
QQmlMetaTypeData::Names::ConstIterator it = data->nameToType.constFind(name);
while (it != data->nameToType.cend() && it.key() == name) {
+ QQmlType t(*it);
// XXX version_major<0 just a kludge for QQmlPropertyPrivate::initProperty
- if (version_major < 0 || module.isEmpty() || (*it)->availableInVersion(module, version_major,version_minor))
- return *(*it);
+ if (version_major < 0 || module.isEmpty() || t.availableInVersion(module, version_major,version_minor))
+ return t;
++it;
}
@@ -1941,7 +1921,7 @@ QQmlType QQmlMetaType::qmlType(const QMetaObject *metaObject)
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- return data->metaObjectToType.value(metaObject);
+ return QQmlType(data->metaObjectToType.value(metaObject));
}
/*!
@@ -1957,13 +1937,13 @@ QQmlType QQmlMetaType::qmlType(const QMetaObject *metaObject, const QHashedStrin
QQmlMetaTypeData::MetaObjects::const_iterator it = data->metaObjectToType.constFind(metaObject);
while (it != data->metaObjectToType.cend() && it.key() == metaObject) {
- QQmlType *t = *it;
- if (version_major < 0 || module.isEmpty() || t->availableInVersion(module, version_major,version_minor))
+ QQmlType t(*it);
+ if (version_major < 0 || module.isEmpty() || t.availableInVersion(module, version_major,version_minor))
return t;
++it;
}
- return 0;
+ return QQmlType();
}
/*!
@@ -1975,11 +1955,11 @@ QQmlType QQmlMetaType::qmlType(int userType)
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- QQmlType *type = data->idToType.value(userType);
- if (type && type->typeId() == userType)
- return type;
+ QQmlTypePrivate *type = data->idToType.value(userType);
+ if (type && type->typeId == userType)
+ return QQmlType(type);
else
- return 0;
+ return QQmlType();
}
/*!
@@ -1993,12 +1973,12 @@ QQmlType QQmlMetaType::qmlType(const QUrl &url, bool includeNonFileImports /* =
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
- QQmlType *type = data->urlToType.value(url);
- if (!type && includeNonFileImports)
- type = data->urlToNonFileImportType.value(url);
+ QQmlType type(data->urlToType.value(url));
+ if (!type.isValid() && includeNonFileImports)
+ type = QQmlType(data->urlToNonFileImportType.value(url));
- if (type && type->sourceUrl() == url)
- return *type;
+ if (type.sourceUrl() == url)
+ return type;
else
return QQmlType();
}
@@ -2014,7 +1994,7 @@ QQmlType QQmlMetaType::qmlTypeFromIndex(int idx)
QQmlMetaTypeData *data = metaTypeData();
if (idx < 0 || idx >= data->types.count())
- return 0;
+ return QQmlType();
return data->types.at(idx);
}
@@ -2060,7 +2040,7 @@ QQmlPropertyCache *QQmlMetaTypeData::propertyCache(const QQmlType &type, int min
maxMinorVersion = qMax(maxMinorVersion, t.minorVersion());
types << t;
} else {
- types << 0;
+ types << QQmlType();
}
metaObject = metaObject->superClass();
@@ -2165,7 +2145,8 @@ QList<QString> QQmlMetaType::qmlTypeNames()
names.reserve(data->nameToType.count());
QQmlMetaTypeData::Names::ConstIterator it = data->nameToType.cbegin();
while (it != data->nameToType.cend()) {
- names += (*it)->qmlTypeName();
+ QQmlType t(*it);
+ names += t.qmlTypeName();
++it;
}
@@ -2175,18 +2156,22 @@ QList<QString> QQmlMetaType::qmlTypeNames()
/*!
Returns the list of registered QML types.
*/
-QList<QQmlType *> QQmlMetaType::qmlTypes()
+QList<QQmlType> QQmlMetaType::qmlTypes()
{
QMutexLocker lock(metaTypeDataLock());
- QQmlMetaTypeData *data = metaTypeData();
+ const QQmlMetaTypeData *data = metaTypeData();
+
+ QList<QQmlType> types;
+ for (QQmlTypePrivate *t : data->nameToType)
+ types.append(QQmlType(t));
- return data->nameToType.values();
+ return types;
}
/*!
Returns the list of all registered types.
*/
-QList<QQmlType *> QQmlMetaType::qmlAllTypes()
+QList<QQmlType> QQmlMetaType::qmlAllTypes()
{
QMutexLocker lock(metaTypeDataLock());
QQmlMetaTypeData *data = metaTypeData();
@@ -2203,9 +2188,10 @@ QList<QQmlType> QQmlMetaType::qmlSingletonTypes()
QQmlMetaTypeData *data = metaTypeData();
QList<QQmlType> retn;
- for (const auto type : qAsConst(data->nameToType)) {
- if (type->isSingleton())
- retn.append(*type);
+ for (const auto t : qAsConst(data->nameToType)) {
+ QQmlType type(t);
+ if (type.isSingleton())
+ retn.append(type);
}
return retn;
}
diff --git a/src/qml/qml/qqmlmetatype_p.h b/src/qml/qml/qqmlmetatype_p.h
index 43eda2b4f1..0077306a64 100644
--- a/src/qml/qml/qqmlmetatype_p.h
+++ b/src/qml/qml/qqmlmetatype_p.h
@@ -78,9 +78,9 @@ class Q_QML_PRIVATE_EXPORT QQmlMetaType
{
public:
static QList<QString> qmlTypeNames();
- static QList<QQmlType *> qmlTypes();
+ static QList<QQmlType> qmlTypes();
static QList<QQmlType> qmlSingletonTypes();
- static QList<QQmlType *> qmlAllTypes();
+ static QList<QQmlType> qmlAllTypes();
static QQmlType qmlType(const QString &qualifiedName, int, int);
static QQmlType qmlType(const QHashedStringRef &name, const QHashedStringRef &module, int, int);
@@ -148,10 +148,6 @@ public:
explicit QQmlType(QQmlTypePrivate *priv);
~QQmlType();
- // ### get rid of these two again
- QQmlType(QQmlType *otherPointer);
- QQmlType &operator =(QQmlType *otherPointer);
-
bool operator ==(const QQmlType &other) const {
return d == other.d;
}
@@ -238,7 +234,7 @@ public:
int enumValue(QQmlEnginePrivate *engine, const QHashedCStringRef &, bool *ok) const;
int enumValue(QQmlEnginePrivate *engine, const QV4::String *, bool *ok) const;
- QQmlTypePrivate *handle() const { return d; }
+ QQmlTypePrivate *priv() const { return d; }
static void refHandle(QQmlTypePrivate *priv);
static void derefHandle(QQmlTypePrivate *priv);
private:
@@ -246,7 +242,6 @@ private:
QQmlType resolveCompositeBaseType(QQmlEnginePrivate *engine) const;
int resolveCompositeEnumValue(QQmlEnginePrivate *engine, const QString &name, bool *ok) const;
friend class QQmlTypePrivate;
- friend struct QQmlMetaTypeData;
enum RegistrationType {
CppType = 0,
@@ -296,7 +291,7 @@ public:
private:
//Used by register functions and creates the QQmlTypeModule for them
friend QQmlTypeModule *getTypeModule(const QHashedString &uri, int majorVersion, QQmlMetaTypeData *data);
- friend void addTypeToData(QQmlType* type, QQmlMetaTypeData *data);
+ friend void addTypeToData(QQmlTypePrivate *type, QQmlMetaTypeData *data);
friend struct QQmlMetaTypeData;
friend Q_QML_EXPORT void qmlClearTypeRegistrations();
friend class QQmlTypeModulePrivate;
diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp
index 6fab7697f8..ba07b77c72 100644
--- a/src/qml/qml/qqmltypewrapper.cpp
+++ b/src/qml/qml/qqmltypewrapper.cpp
@@ -112,7 +112,7 @@ ReturnedValue QmlTypeWrapper::create(QV4::ExecutionEngine *engine, QObject *o, c
Scoped<QmlTypeWrapper> w(scope, engine->memoryManager->allocObject<QmlTypeWrapper>());
w->d()->mode = mode; w->d()->object = o;
- w->d()->typePrivate = t.handle();
+ w->d()->typePrivate = t.priv();
QQmlType::refHandle(w->d()->typePrivate);
return w.asReturnedValue();
}
diff --git a/tools/qmlplugindump/main.cpp b/tools/qmlplugindump/main.cpp
index 911ef9e9a4..982936011d 100644
--- a/tools/qmlplugindump/main.cpp
+++ b/tools/qmlplugindump/main.cpp
@@ -164,11 +164,11 @@ public:
To do this, we need to find the QQmlTypes associated with this
QMetaObject.
*/
-static QHash<QByteArray, QSet<const QQmlType *> > qmlTypesByCppName;
+static QHash<QByteArray, QSet<QQmlType> > qmlTypesByCppName;
/* A composite type is completely specified by name, major version and minor version.
*/
-static QMap<QString, QSet<const QQmlType *> > qmlTypesByCompositeName;
+static QMap<QString, QSet<QQmlType> > qmlTypesByCompositeName;
static QHash<QByteArray, QByteArray> cppToId;
@@ -213,12 +213,12 @@ QByteArray convertToId(const QMetaObject *mo)
// Collect all metaobjects for types registered with qmlRegisterType() without parameters
void collectReachableMetaObjectsWithoutQmlName(QQmlEnginePrivate *engine, QSet<const QMetaObject *>& metas ) {
const auto qmlAllTypes = QQmlMetaType::qmlAllTypes();
- for (const QQmlType *ty : qmlAllTypes) {
- if ( ! metas.contains(ty->metaObject()) ) {
- if (!ty->isComposite()) {
- collectReachableMetaObjects(engine, *ty, &metas);
+ for (const QQmlType &ty : qmlAllTypes) {
+ if ( ! metas.contains(ty.metaObject()) ) {
+ if (!ty.isComposite()) {
+ collectReachableMetaObjects(engine, ty, &metas);
} else {
- qmlTypesByCompositeName[ty->elementName()].insert(ty);
+ qmlTypesByCompositeName[ty.elementName()].insert(ty);
}
}
}
@@ -227,25 +227,25 @@ void collectReachableMetaObjectsWithoutQmlName(QQmlEnginePrivate *engine, QSet<c
QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine,
QSet<const QMetaObject *> &noncreatables,
QSet<const QMetaObject *> &singletons,
- const QList<QQmlType *> &skip = QList<QQmlType *>())
+ const QList<QQmlType> &skip = QList<QQmlType>())
{
QSet<const QMetaObject *> metas;
metas.insert(FriendlyQObject::qtMeta());
QHash<QByteArray, QSet<QByteArray> > extensions;
const auto qmlTypes = QQmlMetaType::qmlTypes();
- for (const QQmlType *ty : qmlTypes) {
- if (!ty->isCreatable())
- noncreatables.insert(ty->metaObject());
- if (ty->isSingleton())
- singletons.insert(ty->metaObject());
- if (!ty->isComposite()) {
- qmlTypesByCppName[ty->metaObject()->className()].insert(ty);
- if (ty->isExtendedType())
- extensions[ty->typeName()].insert(ty->metaObject()->className());
- collectReachableMetaObjects(QQmlEnginePrivate::get(engine), *ty, &metas);
+ for (const QQmlType &ty : qmlTypes) {
+ if (!ty.isCreatable())
+ noncreatables.insert(ty.metaObject());
+ if (ty.isSingleton())
+ singletons.insert(ty.metaObject());
+ if (!ty.isComposite()) {
+ qmlTypesByCppName[ty.metaObject()->className()].insert(ty);
+ if (ty.isExtendedType())
+ extensions[ty.typeName()].insert(ty.metaObject()->className());
+ collectReachableMetaObjects(QQmlEnginePrivate::get(engine), ty, &metas);
} else {
- qmlTypesByCompositeName[ty->elementName()].insert(ty);
+ qmlTypesByCompositeName[ty.elementName()].insert(ty);
}
}
@@ -254,21 +254,21 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine,
// Example: QDeclarativeGraphicsWidget overrides the QtQuick/QGraphicsWidget export
// of QGraphicsWidget.
for (auto it = extensions.cbegin(), end = extensions.cend(); it != end; ++it) {
- QSet<const QQmlType *> baseExports = qmlTypesByCppName.value(it.key());
+ QSet<QQmlType> baseExports = qmlTypesByCppName.value(it.key());
const QSet<QByteArray> extensionCppNames = it.value();
for (const QByteArray &extensionCppName : extensionCppNames) {
- const QSet<const QQmlType *> extensionExports = qmlTypesByCppName.value(extensionCppName);
+ const QSet<QQmlType> extensionExports = qmlTypesByCppName.value(extensionCppName);
// remove extension exports from base imports
// unfortunately the QQmlType pointers don't match, so can't use QSet::subtract
- QSet<const QQmlType *> newBaseExports;
- for (const QQmlType *baseExport : qAsConst(baseExports)) {
+ QSet<QQmlType> newBaseExports;
+ for (const QQmlType &baseExport : qAsConst(baseExports)) {
bool match = false;
- for (const QQmlType *extensionExport : extensionExports) {
- if (baseExport->qmlTypeName() == extensionExport->qmlTypeName()
- && baseExport->majorVersion() == extensionExport->majorVersion()
- && baseExport->minorVersion() == extensionExport->minorVersion()) {
+ for (const QQmlType &extensionExport : extensionExports) {
+ if (baseExport.qmlTypeName() == extensionExport.qmlTypeName()
+ && baseExport.majorVersion() == extensionExport.majorVersion()
+ && baseExport.minorVersion() == extensionExport.minorVersion()) {
match = true;
break;
}
@@ -284,17 +284,17 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine,
if (creatable) {
// find even more QMetaObjects by instantiating QML types and running
// over the instances
- for (QQmlType *ty : qmlTypes) {
+ for (const QQmlType &ty : qmlTypes) {
if (skip.contains(ty))
continue;
- if (ty->isExtendedType())
+ if (ty.isExtendedType())
continue;
- if (!ty->isCreatable())
+ if (!ty.isCreatable())
continue;
- if (ty->typeName() == "QQmlComponent")
+ if (ty.typeName() == "QQmlComponent")
continue;
- QString tyName = ty->qmlTypeName();
+ QString tyName = ty.qmlTypeName();
tyName = tyName.mid(tyName.lastIndexOf(QLatin1Char('/')) + 1);
if (tyName.isEmpty())
continue;
@@ -302,11 +302,11 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine,
inObjectInstantiation = tyName;
QObject *object = 0;
- if (ty->isSingleton()) {
- QQmlType::SingletonInstanceInfo *siinfo = ty->singletonInstanceInfo();
+ if (ty.isSingleton()) {
+ QQmlType::SingletonInstanceInfo *siinfo = ty.singletonInstanceInfo();
if (!siinfo) {
std::cerr << "Internal error, " << qPrintable(tyName)
- << "(" << qPrintable( QString::fromUtf8(ty->typeName()) ) << ")"
+ << "(" << qPrintable( QString::fromUtf8(ty.typeName()) ) << ")"
<< " is singleton, but has no singletonInstanceInfo" << std::endl;
continue;
}
@@ -324,8 +324,8 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine,
} else {
if (verbose)
std::cerr << "Trying to create object " << qPrintable( tyName )
- << " (" << qPrintable( QString::fromUtf8(ty->typeName()) ) << ")" << std::endl;
- object = ty->create();
+ << " (" << qPrintable( QString::fromUtf8(ty.typeName()) ) << ")" << std::endl;
+ object = ty.create();
}
inObjectInstantiation.clear();
@@ -333,7 +333,7 @@ QSet<const QMetaObject *> collectReachableMetaObjects(QQmlEngine *engine,
if (object) {
if (verbose)
std::cerr << "Got " << qPrintable( tyName )
- << " (" << qPrintable( QString::fromUtf8(ty->typeName()) ) << ")" << std::endl;
+ << " (" << qPrintable( QString::fromUtf8(ty.typeName()) ) << ")" << std::endl;
collectReachableMetaObjects(object, &metas);
object->deleteLater();
} else {
@@ -476,17 +476,17 @@ public:
return prototypeName;
}
- void dumpComposite(QQmlEngine *engine, const QSet<const QQmlType *> &compositeType, QSet<QByteArray> &defaultReachableNames)
+ void dumpComposite(QQmlEngine *engine, const QSet<QQmlType> &compositeType, QSet<QByteArray> &defaultReachableNames)
{
- for (const QQmlType *type : compositeType)
+ for (const QQmlType &type : compositeType)
dumpCompositeItem(engine, type, defaultReachableNames);
}
- void dumpCompositeItem(QQmlEngine *engine, const QQmlType *compositeType, QSet<QByteArray> &defaultReachableNames)
+ void dumpCompositeItem(QQmlEngine *engine, const QQmlType &compositeType, QSet<QByteArray> &defaultReachableNames)
{
- QQmlComponent e(engine, compositeType->sourceUrl());
+ QQmlComponent e(engine, compositeType.sourceUrl());
if (!e.isReady()) {
- std::cerr << "WARNING: skipping module " << compositeType->elementName().toStdString()
+ std::cerr << "WARNING: skipping module " << compositeType.elementName().toStdString()
<< std::endl << e.errorString().toStdString() << std::endl;
return;
}
@@ -507,14 +507,14 @@ public:
&objectsToMerge);
qml->writeScriptBinding(QLatin1String("prototype"), enquote(prototypeName));
- QString qmlTyName = compositeType->qmlTypeName();
- const QString exportString = getExportString(qmlTyName, compositeType->majorVersion(), compositeType->minorVersion());
+ QString qmlTyName = compositeType.qmlTypeName();
+ const QString exportString = getExportString(qmlTyName, compositeType.majorVersion(), compositeType.minorVersion());
qml->writeScriptBinding(QLatin1String("name"), exportString);
qml->writeArrayBinding(QLatin1String("exports"), QStringList() << exportString);
- qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), QStringList() << QString::number(compositeType->minorVersion()));
+ qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), QStringList() << QString::number(compositeType.minorVersion()));
qml->writeBooleanBinding(QLatin1String("isComposite"), true);
- if (compositeType->isSingleton()) {
+ if (compositeType.isSingleton()) {
qml->writeBooleanBinding(QLatin1String("isCreatable"), false);
qml->writeBooleanBinding(QLatin1String("isSingleton"), true);
}
@@ -551,12 +551,12 @@ public:
if (meta->superClass())
qml->writeScriptBinding(QLatin1String("prototype"), enquote(convertToId(meta->superClass())));
- const QSet<const QQmlType *> qmlTypes = qmlTypesByCppName.value(meta->className());
+ const QSet<QQmlType> qmlTypes = qmlTypesByCppName.value(meta->className());
if (!qmlTypes.isEmpty()) {
- QHash<QString, const QQmlType *> exports;
+ QHash<QString, QQmlType> exports;
- for (const QQmlType *qmlTy : qmlTypes) {
- const QString exportString = getExportString(qmlTy->qmlTypeName(), qmlTy->majorVersion(), qmlTy->minorVersion());
+ for (const QQmlType &qmlTy : qmlTypes) {
+ const QString exportString = getExportString(qmlTy.qmlTypeName(), qmlTy.majorVersion(), qmlTy.minorVersion());
exports.insert(exportString, qmlTy);
}
@@ -574,12 +574,12 @@ public:
// write meta object revisions
QStringList metaObjectRevisions;
for (const QString &exportString : qAsConst(exportStrings)) {
- int metaObjectRevision = exports[exportString]->metaObjectRevision();
+ int metaObjectRevision = exports[exportString].metaObjectRevision();
metaObjectRevisions += QString::number(metaObjectRevision);
}
qml->writeArrayBinding(QLatin1String("exportMetaObjectRevisions"), metaObjectRevisions);
- if (const QMetaObject *attachedType = (*qmlTypes.begin())->attachedPropertiesType(engine)) {
+ if (const QMetaObject *attachedType = (*qmlTypes.begin()).attachedPropertiesType(engine)) {
// Can happen when a type is registered that returns itself as attachedPropertiesType()
// because there is no creatable type to attach to.
if (attachedType != meta) {
@@ -1185,7 +1185,7 @@ int main(int argc, char *argv[])
QSet<const QMetaObject *> uncreatableMetas;
QSet<const QMetaObject *> singletonMetas;
QSet<const QMetaObject *> defaultReachable = collectReachableMetaObjects(&engine, uncreatableMetas, singletonMetas);
- QList<QQmlType *> defaultTypes = QQmlMetaType::qmlTypes();
+ QList<QQmlType> defaultTypes = QQmlMetaType::qmlTypes();
// add some otherwise unreachable QMetaObjects
defaultReachable.insert(&QQuickMouseEvent::staticMetaObject);
@@ -1324,7 +1324,7 @@ int main(int argc, char *argv[])
dumper.dump(QQmlEnginePrivate::get(&engine), meta, uncreatableMetas.contains(meta), singletonMetas.contains(meta));
}
- QMap<QString, QSet<const QQmlType *> >::const_iterator iter = qmlTypesByCompositeName.constBegin();
+ QMap<QString, QSet<QQmlType> >::const_iterator iter = qmlTypesByCompositeName.constBegin();
for (; iter != qmlTypesByCompositeName.constEnd(); ++iter)
dumper.dumpComposite(&engine, iter.value(), defaultReachableNames);