aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-04-06 12:05:21 +0200
committerLars Knoll <lars.knoll@qt.io>2018-05-02 14:17:59 +0000
commit5cd9d88c2683c5d226ab1dc0384868408c036fe9 (patch)
treee7499131b3ef31b945e2aceec68c285103eea637
parent2c23299ecd94dbcce0a90b3b374a674cad6a3683 (diff)
Avoid excessive creation of contexts
Variables do not escape if they are being used from an inner block in the same function. Change-Id: I494861edf9d8a492930797928a3137362082d084 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/compiler/qv4compilercontext.cpp1
-rw-r--r--src/qml/compiler/qv4compilerscanfunctions.cpp6
2 files changed, 6 insertions, 1 deletions
diff --git a/src/qml/compiler/qv4compilercontext.cpp b/src/qml/compiler/qv4compilercontext.cpp
index a0467aa427..d232a43291 100644
--- a/src/qml/compiler/qv4compilercontext.cpp
+++ b/src/qml/compiler/qv4compilercontext.cpp
@@ -132,7 +132,6 @@ Context::ResolvedName Context::resolveName(const QString &name)
result.type = ResolvedName::Local;
return result;
} else {
- Q_ASSERT(scope == 0);
result.index = argIdx + sizeof(CallData)/sizeof(Value) - 1;
result.scope = 0;
result.type = ResolvedName::Stack;
diff --git a/src/qml/compiler/qv4compilerscanfunctions.cpp b/src/qml/compiler/qv4compilerscanfunctions.cpp
index f5bfd14c93..40459b3b28 100644
--- a/src/qml/compiler/qv4compilerscanfunctions.cpp
+++ b/src/qml/compiler/qv4compilerscanfunctions.cpp
@@ -524,6 +524,12 @@ void ScanFunctions::calcEscapingVariables()
for (const QString &var : qAsConst(inner->usedVariables)) {
Context *c = inner;
while (c) {
+ Context *current = c;
+ c = c->parent;
+ if (current->isWithBlock || current->contextType != ContextType::Block)
+ break;
+ }
+ while (c) {
Context::MemberMap::const_iterator it = c->members.find(var);
if (it != c->members.end()) {
if (c != inner) {