From ee1de29c2dcb16a4b0c691c7fc53310e175fa49f Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 23 Jun 2017 10:41:21 +0200 Subject: Use QQmlType by value in the MemberExpressionResolver Task-number: QTBUG-61536 Change-Id: Ia9a43890937399f3a109d93227e5d44420974737 Reviewed-by: Simon Hausmann --- src/qml/compiler/qqmlirbuilder.cpp | 20 ++++++++++---------- src/qml/compiler/qv4jsir_p.h | 8 +++++++- 2 files changed, 17 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp index 03a71768d8..60045952c9 100644 --- a/src/qml/compiler/qqmlirbuilder.cpp +++ b/src/qml/compiler/qqmlirbuilder.cpp @@ -1694,19 +1694,19 @@ static QV4::IR::DiscoveredType resolveQmlType(QQmlEnginePrivate *qmlEngine, { QV4::IR::Type result = QV4::IR::VarType; - QQmlType *type = static_cast(resolver->data); + QQmlType type = resolver->qmlType; if (member->name->constData()->isUpper()) { bool ok = false; - int value = type->enumValue(qmlEngine, *member->name, &ok); + int value = type.enumValue(qmlEngine, *member->name, &ok); if (ok) { member->setEnumValue(value); return QV4::IR::SInt32Type; } } - if (type->isCompositeSingleton()) { - QQmlRefPointer tdata = qmlEngine->typeLoader.getType(type->singletonInstanceInfo()->url); + if (type.isCompositeSingleton()) { + QQmlRefPointer tdata = qmlEngine->typeLoader.getType(type.singletonInstanceInfo()->url); Q_ASSERT(tdata); tdata->release(); // Decrease the reference count added from QQmlTypeLoader::getType() // When a singleton tries to reference itself, it may not be complete yet. @@ -1717,8 +1717,8 @@ static QV4::IR::DiscoveredType resolveQmlType(QQmlEnginePrivate *qmlEngine, newResolver->flags |= AllPropertiesAreFinal; return newResolver->resolveMember(qmlEngine, newResolver, member); } - } else if (type->isSingleton()) { - const QMetaObject *singletonMeta = type->singletonInstanceInfo()->instanceMetaObject; + } else if (type.isSingleton()) { + const QMetaObject *singletonMeta = type.singletonInstanceInfo()->instanceMetaObject; if (singletonMeta) { // QJSValue-based singletons cannot be accelerated auto newResolver = resolver->owner->New(); newResolver->owner = resolver->owner; @@ -1743,12 +1743,12 @@ static QV4::IR::DiscoveredType resolveQmlType(QQmlEnginePrivate *qmlEngine, return result; } -static void initQmlTypeResolver(QV4::IR::MemberExpressionResolver *resolver, QQmlType *qmlType) +static void initQmlTypeResolver(QV4::IR::MemberExpressionResolver *resolver, const QQmlType &qmlType) { Q_ASSERT(resolver); resolver->resolveMember = &resolveQmlType; - resolver->data = qmlType; + resolver->qmlType = qmlType; resolver->extraData = 0; resolver->flags = 0; } @@ -1774,7 +1774,7 @@ static QV4::IR::DiscoveredType resolveImportNamespace( if (!r.type->isSingleton()) { auto newResolver = resolver->owner->New(); newResolver->owner = resolver->owner; - initQmlTypeResolver(newResolver, r.type); + initQmlTypeResolver(newResolver, *r.type); return QV4::IR::DiscoveredType(newResolver); } } else { @@ -1961,7 +1961,7 @@ QV4::IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int result = _block->TEMP(result->index); result->memberResolver = _function->New(); result->memberResolver->owner = _function; - initQmlTypeResolver(result->memberResolver, r.type); + initQmlTypeResolver(result->memberResolver, *r.type); return result; } else { Q_ASSERT(r.importNamespace); diff --git a/src/qml/compiler/qv4jsir_p.h b/src/qml/compiler/qv4jsir_p.h index 6f14e3dfaf..e9344a31fb 100644 --- a/src/qml/compiler/qv4jsir_p.h +++ b/src/qml/compiler/qv4jsir_p.h @@ -54,6 +54,9 @@ #include #include #include +#ifndef V4_BOOTSTRAP +#include +#endif #include #include @@ -254,7 +257,10 @@ struct MemberExpressionResolver void clear() { *this = MemberExpressionResolver(); } ResolveFunction resolveMember; - void *data; // Could be pointer to meta object, importNameSpace, etc. - depends on resolveMember implementation +#ifndef V4_BOOTSTRAP + QQmlType qmlType; +#endif + void *data; // Could be pointer to meta object or importNameSpace void *extraData; // Could be QQmlTypeNameCache Function *owner; unsigned int flags; -- cgit v1.2.3