aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@theqtcompany.com>2016-05-29 18:58:07 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2016-05-31 14:29:11 +0000
commit06467a192b7b107987b2d2d030a32a36ffbece5f (patch)
tree0de7a7e6b5bc7df282613324a0580073510265e5
parent2bb309af8b2e32bd34644bed363f5880c50221af (diff)
Moved meta-type id members to QV4::CompiledData::CompilationUnit
Change-Id: I808d0a36094e873b69cf24a5b0113e741ff2a25d Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp2
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp20
-rw-r--r--src/qml/compiler/qv4compileddata.cpp10
-rw-r--r--src/qml/compiler/qv4compileddata_p.h5
-rw-r--r--src/qml/qml/qqmlcompileddata.cpp5
-rw-r--r--src/qml/qml/qqmlcompiler_p.h4
-rw-r--r--src/qml/qml/qqmlengine.cpp18
-rw-r--r--src/qml/qml/qqmlengine_p.h2
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<QV4::IR::MemberExpressionResolver>();
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<int, ResolvedTypeReference*> 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<QV4::CompiledData::CompilationUnit> 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<QFlags<QMetaType::TypeFlag> >(QtPrivate::QMetaTypeTypeFlags<QQmlListProperty<QObject> >::Flags),
static_cast<QMetaObject*>(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;