From 06467a192b7b107987b2d2d030a32a36ffbece5f Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Sun, 29 May 2016 18:58:07 +0200 Subject: Moved meta-type id members to QV4::CompiledData::CompilationUnit Change-Id: I808d0a36094e873b69cf24a5b0113e741ff2a25d Reviewed-by: Lars Knoll --- src/qml/compiler/qqmlirbuilder.cpp | 2 +- src/qml/compiler/qqmltypecompiler.cpp | 20 ++++++++++---------- src/qml/compiler/qv4compileddata.cpp | 10 ++++++++++ src/qml/compiler/qv4compileddata_p.h | 5 +++++ src/qml/qml/qqmlcompileddata.cpp | 5 +---- src/qml/qml/qqmlcompiler_p.h | 4 ---- src/qml/qml/qqmlengine.cpp | 18 +++++++++--------- src/qml/qml/qqmlengine_p.h | 2 +- 8 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index c9a4e21ddd..43410785b1 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -1698,7 +1698,7 @@ static QV4::IR::DiscoveredType resolveQmlType(QQmlEnginePrivate *qmlEngine, if (tdata->isComplete()) { auto newResolver = resolver->owner->New(); newResolver->owner = resolver->owner; - initMetaObjectResolver(newResolver, qmlEngine->propertyCacheForType(tdata->compiledData()->metaTypeId)); + initMetaObjectResolver(newResolver, qmlEngine->propertyCacheForType(tdata->compiledData()->compilationUnit->metaTypeId)); newResolver->flags |= AllPropertiesAreFinal; return newResolver->resolveMember(qmlEngine, newResolver, member); } diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 4a621f6d19..0ad683dc84 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -254,11 +254,11 @@ bool QQmlTypeCompiler::compile() auto *typeRef = m_resolvedTypes.value(obj->inheritedTypeNameIndex); Q_ASSERT(typeRef); if (typeRef->component) { - compiledData->metaTypeId = typeRef->component->metaTypeId; - compiledData->listMetaTypeId = typeRef->component->listMetaTypeId; + compiledData->compilationUnit->metaTypeId = typeRef->component->compilationUnit->metaTypeId; + compiledData->compilationUnit->listMetaTypeId = typeRef->component->compilationUnit->listMetaTypeId; } else { - compiledData->metaTypeId = typeRef->type->typeId(); - compiledData->listMetaTypeId = typeRef->type->qListTypeId(); + compiledData->compilationUnit->metaTypeId = typeRef->type->typeId(); + compiledData->compilationUnit->listMetaTypeId = typeRef->type->qListTypeId(); } } @@ -507,7 +507,7 @@ bool QQmlPropertyCacheCreator::buildMetaObjectRecursively(int objectIndex, int r Q_ASSERT(tdata->isComplete()); QQmlCompiledData *data = tdata->compiledData(); - qmltype = QQmlMetaType::qmlType(data->metaTypeId); + qmltype = QQmlMetaType::qmlType(data->compilationUnit->metaTypeId); tdata->release(); } @@ -717,7 +717,7 @@ bool QQmlPropertyCacheCreator::createMetaObject(int objectIndex, const QmlIR::Ob QQmlCompiledData *data = tdata->compiledData(); - paramTypes[i + 1] = data->metaTypeId; + paramTypes[i + 1] = data->compilationUnit->metaTypeId; tdata->release(); } else { @@ -801,9 +801,9 @@ bool QQmlPropertyCacheCreator::createMetaObject(int objectIndex, const QmlIR::Ob QQmlCompiledData *data = tdata->compiledData(); if (p->type == QV4::CompiledData::Property::Custom) { - propertyType = data->metaTypeId; + propertyType = data->compilationUnit->metaTypeId; } else { - propertyType = data->listMetaTypeId; + propertyType = data->compilationUnit->listMetaTypeId; } tdata->release(); @@ -887,7 +887,7 @@ bool SignalHandlerConverter::convertSignalHandlerExpressionsToFunctionDeclaratio Q_ASSERT(tdata->isComplete()); QQmlCompiledData *data = tdata->compiledData(); - type = QQmlMetaType::qmlType(data->metaTypeId); + type = QQmlMetaType::qmlType(data->compilationUnit->metaTypeId); tdata->release(); } @@ -1577,7 +1577,7 @@ bool QQmlComponentAndAliasResolver::resolveAliases() if (typeRef->type) type = typeRef->type->typeId(); else - type = typeRef->component->metaTypeId; + type = typeRef->component->compilationUnit->metaTypeId; alias->flags |= QV4::CompiledData::Alias::AliasPointsToPointerObject; propertyFlags |= QQmlPropertyData::IsQObjectDerived; diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index 2b437254c0..b2cd7b5953 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -74,6 +74,9 @@ CompilationUnit::CompilationUnit() , totalBindingsCount(0) , totalParserStatusCount(0) , totalObjectCount(0) + , metaTypeId(-1) + , listMetaTypeId(-1) + , isRegisteredWithEngine(false) {} CompilationUnit::~CompilationUnit() @@ -173,6 +176,13 @@ void CompilationUnit::unlink() if (engine) engine->compilationUnits.erase(engine->compilationUnits.find(this)); + if (isRegisteredWithEngine) { + Q_ASSERT(data && quint32(propertyCaches.count()) > data->indexOfRootObject && !propertyCaches.at(data->indexOfRootObject).isNull()); + QQmlEnginePrivate *qmlEngine = QQmlEnginePrivate::get(propertyCaches.at(data->indexOfRootObject)->engine); + qmlEngine->unregisterInternalCompositeType(this); + isRegisteredWithEngine = false; + } + for (int ii = 0; ii < propertyCaches.count(); ++ii) if (propertyCaches.at(ii).data()) propertyCaches.at(ii)->release(); diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index 0e2e2306d8..cb4941d147 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -724,6 +724,11 @@ struct Q_QML_PRIVATE_EXPORT CompilationUnit : public QQmlRefCount // map from name index QHash resolvedTypes; + int metaTypeId; + int listMetaTypeId; + bool isRegisteredWithEngine; + + QV4::Function *linkToEngine(QV4::ExecutionEngine *engine); void unlink(); diff --git a/src/qml/qml/qqmlcompileddata.cpp b/src/qml/qml/qqmlcompileddata.cpp index fad13bb1e3..bd867a9b90 100644 --- a/src/qml/qml/qqmlcompileddata.cpp +++ b/src/qml/qml/qqmlcompileddata.cpp @@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE QQmlCompiledData::QQmlCompiledData(QQmlEngine *engine) -: engine(engine), metaTypeId(-1), listMetaTypeId(-1), isRegisteredWithEngine(false) +: engine(engine) { Q_ASSERT(engine); } @@ -70,9 +70,6 @@ void QQmlCompiledData::destroy() QQmlCompiledData::~QQmlCompiledData() { - if (isRegisteredWithEngine) - QQmlEnginePrivate::get(engine)->unregisterInternalCompositeType(this); - clear(); } diff --git a/src/qml/qml/qqmlcompiler_p.h b/src/qml/qml/qqmlcompiler_p.h index 39fa84df3d..4f27e3ef44 100644 --- a/src/qml/qml/qqmlcompiler_p.h +++ b/src/qml/qml/qqmlcompiler_p.h @@ -89,10 +89,6 @@ public: QQmlEngine *engine; - int metaTypeId; - int listMetaTypeId; - bool isRegisteredWithEngine; - QQmlRefPointer compilationUnit; bool isInitialized() const { return hasEngine(); } diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index fd1795499e..7749c4f563 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -641,12 +641,12 @@ QQmlEnginePrivate::~QQmlEnginePrivate() for (TypePropertyCacheIt iter = typePropertyCache.cbegin(), end = typePropertyCache.cend(); iter != end; ++iter) (*iter)->release(); for (CompositeTypesIt iter = m_compositeTypes.cbegin(), end = m_compositeTypes.cend(); iter != end; ++iter) { - iter.value()->isRegisteredWithEngine = false; + iter.value()->compilationUnit->isRegisteredWithEngine = false; // since unregisterInternalCompositeType() will not be called in this // case, we have to clean up the type registration manually - QMetaType::unregisterType(iter.value()->metaTypeId); - QMetaType::unregisterType(iter.value()->listMetaTypeId); + QMetaType::unregisterType(iter.value()->compilationUnit->metaTypeId); + QMetaType::unregisterType(iter.value()->compilationUnit->listMetaTypeId); } delete profiler; } @@ -2292,9 +2292,9 @@ void QQmlEnginePrivate::registerInternalCompositeType(QQmlCompiledData *data) static_cast >(QtPrivate::QMetaTypeTypeFlags >::Flags), static_cast(0)); - data->metaTypeId = ptr_type; - data->listMetaTypeId = lst_type; - data->isRegisteredWithEngine = true; + data->compilationUnit->metaTypeId = ptr_type; + data->compilationUnit->listMetaTypeId = lst_type; + data->compilationUnit->isRegisteredWithEngine = true; Locker locker(this); m_qmlLists.insert(lst_type, ptr_type); @@ -2303,10 +2303,10 @@ void QQmlEnginePrivate::registerInternalCompositeType(QQmlCompiledData *data) m_compositeTypes.insert(ptr_type, data); } -void QQmlEnginePrivate::unregisterInternalCompositeType(QQmlCompiledData *data) +void QQmlEnginePrivate::unregisterInternalCompositeType(QV4::CompiledData::CompilationUnit *compilationUnit) { - int ptr_type = data->metaTypeId; - int lst_type = data->listMetaTypeId; + int ptr_type = compilationUnit->metaTypeId; + int lst_type = compilationUnit->listMetaTypeId; Locker locker(this); m_qmlLists.remove(lst_type); diff --git a/src/qml/qml/qqmlengine_p.h b/src/qml/qml/qqmlengine_p.h index 18bee387dd..13a4280203 100644 --- a/src/qml/qml/qqmlengine_p.h +++ b/src/qml/qml/qqmlengine_p.h @@ -217,7 +217,7 @@ public: QQmlPropertyCache *propertyCacheForType(int); QQmlPropertyCache *rawPropertyCacheForType(int); void registerInternalCompositeType(QQmlCompiledData *); - void unregisterInternalCompositeType(QQmlCompiledData *); + void unregisterInternalCompositeType(QV4::CompiledData::CompilationUnit *compilationUnit); bool isTypeLoaded(const QUrl &url) const; bool isScriptLoaded(const QUrl &url) const; -- cgit v1.2.3