diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-06-23 10:41:21 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-08-02 16:32:33 +0000 |
commit | ee1de29c2dcb16a4b0c691c7fc53310e175fa49f (patch) | |
tree | e600742d3ed76475608175252c46ed4e5d50dfac /src | |
parent | 2a79c2bf4d9525a31e180d87d3fa249e98f5683e (diff) |
Use QQmlType by value in the MemberExpressionResolver
Task-number: QTBUG-61536
Change-Id: Ia9a43890937399f3a109d93227e5d44420974737
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 20 | ||||
-rw-r--r-- | src/qml/compiler/qv4jsir_p.h | 8 |
2 files changed, 17 insertions, 11 deletions
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<QQmlType*>(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<QQmlTypeData> tdata = qmlEngine->typeLoader.getType(type->singletonInstanceInfo()->url); + if (type.isCompositeSingleton()) { + QQmlRefPointer<QQmlTypeData> 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<QV4::IR::MemberExpressionResolver>(); 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<QV4::IR::MemberExpressionResolver>(); 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<QV4::IR::MemberExpressionResolver>(); 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 <private/qqmljsmemorypool_p.h> #include <private/qqmljsastfwd_p.h> #include <private/qflagpointer_p.h> +#ifndef V4_BOOTSTRAP +#include <private/qqmlmetatype_p.h> +#endif #include <QtCore/private/qnumeric_p.h> #include <QtCore/QVector> @@ -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; |