diff options
author | Simon Hausmann <[email protected]> | 2013-11-15 00:06:18 +0100 |
---|---|---|
committer | The Qt Project <[email protected]> | 2013-11-28 13:47:40 +0100 |
commit | f474eede801ed7bec712069e95bbe2f4ab5558ae (patch) | |
tree | 94470e17070c1ff1b9805c38ed2bec10cc9110ff /src/qml/compiler/qv4ssa.cpp | |
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 <[email protected]>
Diffstat (limited to 'src/qml/compiler/qv4ssa.cpp')
-rw-r--r-- | src/qml/compiler/qv4ssa.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp index f9acf99a65..5e2c7ba722 100644 --- a/src/qml/compiler/qv4ssa.cpp +++ b/src/qml/compiler/qv4ssa.cpp @@ -1260,6 +1260,8 @@ protected: virtual void visitMember(Member *e) { e->base->accept(this); + if (e->freeOfSideEffects) + return; markAsSideEffect(); } @@ -2514,14 +2516,22 @@ void optimizeSSA(Function *function, DefUsesCalculator &defUses) } continue; } - if (Member *potentialEnumMember = m->source->asMember()) { - if (potentialEnumMember->memberIsEnum) { + if (Member *member = m->source->asMember()) { + if (member->memberIsEnum) { Const *c = function->New<Const>(); - c->init(SInt32Type, potentialEnumMember->enumValue); + c->init(SInt32Type, member->enumValue); W += replaceUses(targetTemp, c); defUses.removeDef(*targetTemp); *ref[s] = 0; - defUses.removeUse(s, *potentialEnumMember->base->asTemp()); + defUses.removeUse(s, *member->base->asTemp()); + continue; + } else if (member->attachedPropertiesId != 0 && member->property && member->base->asTemp()) { + // Attached properties have no dependency on their base. Isel doesn't + // need it and we can eliminate the temp used to initialize it. + defUses.removeUse(s, *member->base->asTemp()); + Const *c = function->New<Const>(); + c->init(SInt32Type, 0); + member->base = c; continue; } } |