diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-11-15 00:06:18 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-11-28 13:47:40 +0100 |
commit | f474eede801ed7bec712069e95bbe2f4ab5558ae (patch) | |
tree | 94470e17070c1ff1b9805c38ed2bec10cc9110ff /src/qml/compiler/qv4jsir_p.h | |
parent | 140400be0f8a8c91ce02ad5691d81d7604e5a4db (diff) |
Add support for accelerated property access to QML types and namespace support
* Resolve lookups in namespaces at compile time and instruct the SSA optimizer
to eliminate reads from the namespace (QQmlTypeWrapper) if possible. For example
access to attached properties of types (i.e. MyNameSpace.ListView.isCurrentItem)
requires neither reading the namespace nor the type.
* Add support for accelerated lookup of attached properties
Change-Id: Ib0b66404ed7e70e1d4a46a1ac8218743a4cc8608
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4jsir_p.h')
-rw-r--r-- | src/qml/compiler/qv4jsir_p.h | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/src/qml/compiler/qv4jsir_p.h b/src/qml/compiler/qv4jsir_p.h index aa85c4cf3c..9105a9137d 100644 --- a/src/qml/compiler/qv4jsir_p.h +++ b/src/qml/compiler/qv4jsir_p.h @@ -236,14 +236,16 @@ struct MemberExpressionResolver typedef Type (*ResolveFunction)(QQmlEnginePrivate *engine, MemberExpressionResolver *resolver, Member *member); MemberExpressionResolver() - : resolveMember(0), data(0), flags(0) {} + : resolveMember(0), data(0), extraData(0), flags(0), isQObjectResolver(false) {} bool isValid() const { return !!resolveMember; } void clear() { *this = MemberExpressionResolver(); } ResolveFunction resolveMember; - void *data; // Could be pointer to meta object, QQmlTypeNameCache, etc. - depends on resolveMember implementation - int flags; + void *data; // Could be pointer to meta object, importNameSpace, etc. - depends on resolveMember implementation + void *extraData; // Could be QQmlTypeNameCache + unsigned int flags : 31; + unsigned int isQObjectResolver; // neede for IR dump helpers }; struct Expr { @@ -555,15 +557,31 @@ struct Member: Expr { Expr *base; const QString *name; QQmlPropertyData *property; + int attachedPropertiesId; int enumValue; - bool memberIsEnum; + bool memberIsEnum : 1; + bool freeOfSideEffects : 1; - void init(Expr *base, const QString *name, QQmlPropertyData *property = 0) + void init(Expr *base, const QString *name, QQmlPropertyData *property = 0, int attachedPropertiesId = 0) { this->base = base; this->name = name; this->property = property; + this->attachedPropertiesId = attachedPropertiesId; + this->enumValue = 0; this->memberIsEnum = false; + this->freeOfSideEffects = false; + } + + void init(Expr *base, const QString *name, int enumValue) + { + this->base = base; + this->name = name; + this->property = 0; + this->attachedPropertiesId = 0; + this->enumValue = enumValue; + this->memberIsEnum = true; + this->freeOfSideEffects = false; } virtual void accept(ExprVisitor *v) { v->visitMember(this); } @@ -869,7 +887,8 @@ struct BasicBlock { Expr *CALL(Expr *base, ExprList *args = 0); Expr *NEW(Expr *base, ExprList *args = 0); Expr *SUBSCRIPT(Expr *base, Expr *index); - Expr *MEMBER(Expr *base, const QString *name, QQmlPropertyData *property = 0); + Expr *MEMBER(Expr *base, const QString *name, QQmlPropertyData *property = 0, int attachedPropertiesId = 0); + Expr *MEMBER(Expr *base, const QString *name, int enumValue); Stmt *EXP(Expr *expr); |