aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/compiler')
-rw-r--r--src/qml/compiler/qqmlcodegenerator.cpp4
-rw-r--r--src/qml/compiler/qv4isel_p.cpp13
-rw-r--r--src/qml/compiler/qv4jsir_p.h4
3 files changed, 17 insertions, 4 deletions
diff --git a/src/qml/compiler/qqmlcodegenerator.cpp b/src/qml/compiler/qqmlcodegenerator.cpp
index 7ebe4dcba2..8693c32c92 100644
--- a/src/qml/compiler/qqmlcodegenerator.cpp
+++ b/src/qml/compiler/qqmlcodegenerator.cpp
@@ -1595,7 +1595,7 @@ V4IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int col
return 0;
if (pd) {
if (!pd->isConstant())
- _function->scopeObjectDependencies.insert(pd);
+ _function->scopeObjectDependencyCandidates.insert(pd); // We don't know if we'll ever read from there or just write, hence candidate
V4IR::Temp *base = _block->TEMP(_scopeObjectTemp);
initMetaObjectResolver(&base->memberResolver, _scopeObject);
return _block->MEMBER(base, _function->newString(name), pd);
@@ -1609,7 +1609,7 @@ V4IR::Expr *JSCodeGen::fallbackNameLookup(const QString &name, int line, int col
return 0;
if (pd) {
if (!pd->isConstant())
- _function->contextObjectDependencies.insert(pd);
+ _function->contextObjectDependencyCandidates.insert(pd); // We don't know if we'll ever read from there or just write, hence candidate
V4IR::Temp *base = _block->TEMP(_contextObjectTemp);
initMetaObjectResolver(&base->memberResolver, _contextObject);
return _block->MEMBER(base, _function->newString(name), pd);
diff --git a/src/qml/compiler/qv4isel_p.cpp b/src/qml/compiler/qv4isel_p.cpp
index 7ba43dd552..78eb9ba0f5 100644
--- a/src/qml/compiler/qv4isel_p.cpp
+++ b/src/qml/compiler/qv4isel_p.cpp
@@ -149,8 +149,17 @@ void IRDecoder::visitMove(V4IR::Move *s)
if (m->property) {
bool captureRequired = true;
if (_function && m->attachedPropertiesId == 0) {
- captureRequired = !_function->contextObjectDependencies.contains(m->property)
- && !_function->scopeObjectDependencies.contains(m->property);
+ if (_function->contextObjectDependencyCandidates.remove(m->property)) {
+ _function->contextObjectDependencies.insert(m->property);
+ captureRequired = false;
+ } else if (_function->scopeObjectDependencyCandidates.remove(m->property)) {
+ _function->scopeObjectDependencies.insert(m->property);
+ captureRequired = false;
+ }
+
+ if (captureRequired)
+ captureRequired = !_function->contextObjectDependencies.contains(m->property)
+ && !_function->scopeObjectDependencies.contains(m->property);
}
getQObjectProperty(m->base, m->property->coreIndex, captureRequired, m->attachedPropertiesId, t);
return;
diff --git a/src/qml/compiler/qv4jsir_p.h b/src/qml/compiler/qv4jsir_p.h
index 59e8d02bbc..b0ca4c0478 100644
--- a/src/qml/compiler/qv4jsir_p.h
+++ b/src/qml/compiler/qv4jsir_p.h
@@ -782,6 +782,10 @@ struct Function {
// Qml extension:
QSet<int> idObjectDependencies;
+ // Context/Scope properties discovered during identifier resolution
+ QSet<QQmlPropertyData*> contextObjectDependencyCandidates;
+ QSet<QQmlPropertyData*> scopeObjectDependencyCandidates;
+ // Context/Scope properties actually being read from, not only written
QSet<QQmlPropertyData*> contextObjectDependencies;
QSet<QQmlPropertyData*> scopeObjectDependencies;