diff options
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/compiler/qqmlirbuilder.cpp | 40 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 8 | ||||
-rw-r--r-- | src/qml/compiler/qv4codegen_p.h | 11 |
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; |