diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2016-04-04 15:58:45 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2016-04-04 14:15:19 +0000 |
commit | fcbbedc3c21ff69d9251264dd708d6ca66c09359 (patch) | |
tree | fad2efa8f745c9c461d3a9fd07f51d9ff505108d /src/qml/compiler/qv4ssa.cpp | |
parent | ad1b0b6e7a6b5d266a36138295e6a58ad98fd1ef (diff) |
QML: do not re-use the resolver data for members.
On successful lookup, the resolver data was cleared and re-used for the
resolved member.
The effect is that a second time the resolver is used, it will not be
able to do the same lookup, resulting in it returning an unknown type.
Because the same expression might need to be resolved multiple times
(e.g. when a dependency changes type), this results in the wrong type
(var), and then more iterations to propagate this wrong type to all
usages.
Instead, return a new resolver with its own data for the resolved
member. This way, a member access on this result can be resolved
correctly by this new resolver.
Change-Id: Ia930c08a2e4a2182d800192547fc03cba209c78c
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/compiler/qv4ssa.cpp')
-rw-r--r-- | src/qml/compiler/qv4ssa.cpp | 23 |
1 files changed, 1 insertions, 22 deletions
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp index 39f23ffc71..6a4c1c54d6 100644 --- a/src/qml/compiler/qv4ssa.cpp +++ b/src/qml/compiler/qv4ssa.cpp @@ -2073,27 +2073,6 @@ protected: } }; -struct DiscoveredType { - int type; - MemberExpressionResolver *memberResolver; - - DiscoveredType() : type(UnknownType), memberResolver(0) {} - DiscoveredType(Type t) : type(t), memberResolver(0) { Q_ASSERT(type != QObjectType); } - explicit DiscoveredType(int t) : type(t), memberResolver(0) { Q_ASSERT(type != QObjectType); } - explicit DiscoveredType(MemberExpressionResolver *memberResolver) - : type(QObjectType) - , memberResolver(memberResolver) - { Q_ASSERT(memberResolver); } - - bool test(Type t) const { return type & t; } - bool isNumber() const { return (type & NumberType) && !(type & ~NumberType); } - - bool operator!=(Type other) const { return type != other; } - bool operator==(Type other) const { return type == other; } - bool operator==(const DiscoveredType &other) const { return type == other.type; } - bool operator!=(const DiscoveredType &other) const { return type != other.type; } -}; - class PropagateTempTypes: public StmtVisitor, ExprVisitor { const DefUses &defUses; @@ -2449,7 +2428,7 @@ protected: if (_ty.fullyTyped && _ty.type.memberResolver && _ty.type.memberResolver->isValid()) { MemberExpressionResolver *resolver = _ty.type.memberResolver; - _ty.type.type = resolver->resolveMember(qmlEngine, resolver, e); + _ty.type = resolver->resolveMember(qmlEngine, resolver, e); } else _ty.type = VarType; } |