aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@qt.io>2017-06-30 10:33:37 +0200
committerLars Knoll <lars.knoll@qt.io>2017-06-30 08:57:14 +0000
commitb31ac3e4870ac73034e678fbdd8bca04de282dfc (patch)
tree3c30c389b75691c500383c15f998fb01607a1739 /src
parent6f1b4931d75993227def93c06935a933e8692f0b (diff)
Re-add missing captureRequired flag
Change-Id: I79b49655a55f98906723351ef7dd79099697bea1 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp40
-rw-r--r--src/qml/compiler/qv4codegen.cpp8
-rw-r--r--src/qml/compiler/qv4codegen_p.h11
3 files changed, 21 insertions, 38 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp
index 10f1b53ff3..fa5dbdeda7 100644
--- a/src/qml/compiler/qqmlirbuilder.cpp
+++ b/src/qml/compiler/qqmlirbuilder.cpp
@@ -1969,16 +1969,6 @@ QQmlJS::Codegen::Reference JSCodeGen::fallbackNameLookup(const QString &name)
load.result = result.asLValue();
bytecodeGenerator->addInstruction(load);
result.isReadonly = true;
-
-#if 0
- if (mapping.type) {
- result->memberResolver = _function->New<QV4::IR::MemberExpressionResolver>();
- result->memberResolver->owner = _function;
- initMetaObjectResolver(result->memberResolver, mapping.type);
- result->memberResolver->flags |= AllPropertiesAreFinal;
- }
- result->isReadOnly = true; // don't allow use as lvalue
-#endif
return result;
}
}
@@ -1990,13 +1980,6 @@ QQmlJS::Codegen::Reference JSCodeGen::fallbackNameLookup(const QString &name)
Reference imports = Reference::fromTemp(this, _importedScriptsTemp);
return Reference::fromSubscript(imports, Reference::fromConst(this, QV4::Encode(r.scriptIndex)));
} else if (r.type) {
-#if 0
- typeName->freeOfSideEffects = true;
- result = _block->TEMP(result->index);
- result->memberResolver = _function->New<QV4::IR::MemberExpressionResolver>();
- result->memberResolver->owner = _function;
- initQmlTypeResolver(result->memberResolver, r.type);
-#endif
if (r.type->isCompositeSingleton()) {
Reference result = Reference::fromTemp(this);
Instruction::LoadQmlSingleton load;
@@ -2005,21 +1988,10 @@ QQmlJS::Codegen::Reference JSCodeGen::fallbackNameLookup(const QString &name)
bytecodeGenerator->addInstruction(load);
return result;
}
- Reference result = Reference::fromName(this, name);
- return result;
+ return Reference::fromName(this, name);
} else {
Q_ASSERT(r.importNamespace);
- Reference result = Reference::fromName(this, name);
-#if 0
- QV4::IR::Name *namespaceName = _block->NAME(name, line, col);
- namespaceName->freeOfSideEffects = true;
- QV4::IR::Temp *result = _block->TEMP(_block->newTemp());
- result->memberResolver = _function->New<QV4::IR::MemberExpressionResolver>();
- result->memberResolver->owner = _function;
- initImportNamespaceResolver(result->memberResolver, imports, r.importNamespace);
- _block->MOVE(result, namespaceName);
-#endif
- return result;
+ return Reference::fromName(this, name);
}
}
}
@@ -2029,7 +2001,9 @@ QQmlJS::Codegen::Reference JSCodeGen::fallbackNameLookup(const QString &name)
if (!data)
return Reference::fromName(this, name);
Reference base = Reference::fromTemp(this, _qmlContextTemp);
- return Reference::fromQmlScopeObject(base, data->coreIndex(), data->notifyIndex());
+ bool requiresCapture = !data->isConstant() && _function->isQmlBinding;
+ return Reference::fromQmlScopeObject(base, data->coreIndex(), data->notifyIndex(),
+ requiresCapture);
}
if (_contextObject) {
@@ -2037,7 +2011,9 @@ QQmlJS::Codegen::Reference JSCodeGen::fallbackNameLookup(const QString &name)
if (!data)
return Reference::fromName(this, name);
Reference base = Reference::fromTemp(this, _qmlContextTemp);
- return Reference::fromQmlContextObject(base, data->coreIndex(), data->notifyIndex());
+ bool requiresCapture = !data->isConstant() && _function->isQmlBinding;
+ return Reference::fromQmlContextObject(base, data->coreIndex(), data->notifyIndex(),
+ requiresCapture);
}
#else
Q_UNUSED(name)
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp
index 0440a7801a..6980e69ff7 100644
--- a/src/qml/compiler/qv4codegen.cpp
+++ b/src/qml/compiler/qv4codegen.cpp
@@ -3275,6 +3275,7 @@ Codegen::Reference &Codegen::Reference::operator =(const Reference &other)
case QmlContextObject:
qmlCoreIndex = other.qmlCoreIndex;
qmlNotifyIndex = other.qmlNotifyIndex;
+ requiresCapture = other.requiresCapture;
break;
case This:
break;
@@ -3318,7 +3319,8 @@ bool Codegen::Reference::operator==(const Codegen::Reference &other) const
return closureId == other.closureId;
case QmlScopeObject:
case QmlContextObject:
- return qmlCoreIndex == other.qmlCoreIndex && qmlNotifyIndex == other.qmlNotifyIndex;
+ return qmlCoreIndex == other.qmlCoreIndex && qmlNotifyIndex == other.qmlNotifyIndex &&
+ requiresCapture == other.requiresCapture;
case This:
return true;
}
@@ -3515,7 +3517,7 @@ void Codegen::Reference::load(uint tmp) const
Instruction::LoadScopeObjectProperty load;
load.base = base;
load.propertyIndex = qmlCoreIndex;
- load.captureRequired = true; // ### captureRequired;
+ load.captureRequired = requiresCapture;
load.result = temp;
codegen->bytecodeGenerator->addInstruction(load);
codegen->_function->scopeObjectPropertyDependencies.insert(qmlCoreIndex, qmlNotifyIndex);
@@ -3523,7 +3525,7 @@ void Codegen::Reference::load(uint tmp) const
Instruction::LoadContextObjectProperty load;
load.base = base;
load.propertyIndex = qmlCoreIndex;
- load.captureRequired = true; // ### captureRequired;
+ load.captureRequired = requiresCapture;
load.result = temp;
codegen->bytecodeGenerator->addInstruction(load);
codegen->_function->contextObjectPropertyDependencies.insert(qmlCoreIndex, qmlNotifyIndex);
diff --git a/src/qml/compiler/qv4codegen_p.h b/src/qml/compiler/qv4codegen_p.h
index 36b65133e0..5a74b3cf54 100644
--- a/src/qml/compiler/qv4codegen_p.h
+++ b/src/qml/compiler/qv4codegen_p.h
@@ -326,18 +326,22 @@ public:
r.closureId = functionId;
return r;
}
- static Reference fromQmlScopeObject(const Reference &base, qint16 coreIndex, qint16 notifyIndex) {
+ static Reference fromQmlScopeObject(const Reference &base, qint16 coreIndex,
+ qint16 notifyIndex, bool requiresCapture) {
Reference r(base.codegen, QmlScopeObject);
r.base = base.asRValue();
r.qmlCoreIndex = coreIndex;
r.qmlNotifyIndex = notifyIndex;
+ r.requiresCapture = requiresCapture;
return r;
}
- static Reference fromQmlContextObject(const Reference &base, qint16 coreIndex, qint16 notifyIndex) {
+ static Reference fromQmlContextObject(const Reference &base, qint16 coreIndex,
+ qint16 notifyIndex, bool requiresCapture) {
Reference r(base.codegen, QmlContextObject);
r.base = base.asRValue();
r.qmlCoreIndex = coreIndex;
r.qmlNotifyIndex = notifyIndex;
+ r.requiresCapture = requiresCapture;
return r;
}
static Reference fromThis(Codegen *cg) {
@@ -373,9 +377,10 @@ public:
QV4::Moth::Param subscript;
QV4::ReturnedValue constant;
int closureId;
- struct {
+ struct { // QML scope/context object case
qint16 qmlCoreIndex;
qint16 qmlNotifyIndex;
+ bool requiresCapture;
};
};
mutable int tempIndex = -1;