aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-02-28 13:06:28 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-02 20:52:46 +0100
commit735cbe15c20f3a3fde23987b0e1a596d64324f20 (patch)
tree97790ac814e893d7987dddd50a0e77e03b7e17c6
parenta283fab5bec49cc1588125b3130867796b04e0d0 (diff)
[new compiler] Fix for tst_qqmlconnections
Make sure to pass onFooChanged handlers to QQmlConnection's custom parser by not relying on the signal handler converter to set the IsSignalHandlerExpression flag. That should only be set for real signal handlers, the custom parser gets the raw bindings. Also don't try to initialize bindings at creation time the custom parser covers. Change-Id: Iae22bc886c312843136f073959e59da440f4184c Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp17
-rw-r--r--src/qml/compiler/qqmltypecompiler_p.h4
-rw-r--r--src/qml/qml/qqmlcompiler_p.h6
-rw-r--r--src/qml/qml/qqmlobjectcreator.cpp20
-rw-r--r--src/qml/qml/qqmlobjectcreator_p.h6
5 files changed, 36 insertions, 17 deletions
diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp
index b04c65c968..493eb504c3 100644
--- a/src/qml/compiler/qqmltypecompiler.cpp
+++ b/src/qml/compiler/qqmltypecompiler.cpp
@@ -344,7 +344,7 @@ QHash<int, QHash<int, int> > *QQmlTypeCompiler::objectIndexToIdPerComponent()
return &compiledData->objectIndexToIdPerComponent;
}
-QHash<int, QByteArray> *QQmlTypeCompiler::customParserData()
+QHash<int, QQmlCompiledData::CustomParserData> *QQmlTypeCompiler::customParserData()
{
return &compiledData->customParserData;
}
@@ -1485,6 +1485,8 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD
groupProperties.insert(pos, binding);
}
+ QBitArray customParserBindings(obj->nBindings);
+
PropertyResolver propertyResolver(propertyCache);
QString defaultPropertyName;
@@ -1500,20 +1502,24 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD
binding = obj->bindingTable();
for (quint32 i = 0; i < obj->nBindings; ++i, ++binding) {
+ QString name = stringAt(binding->propertyNameIndex);
if (customParser) {
if (binding->type == QV4::CompiledData::Binding::Type_AttachedProperty) {
if (customParser->flags() & QQmlCustomParser::AcceptsAttachedProperties) {
customBindings << binding;
+ customParserBindings.setBit(i);
continue;
}
- } else if ((binding->flags & QV4::CompiledData::Binding::IsSignalHandlerExpression)
+ } else if (QQmlCodeGenerator::isSignalPropertyName(name)
&& !(customParser->flags() & QQmlCustomParser::AcceptsSignalHandlers)) {
customBindings << binding;
+ customParserBindings.setBit(i);
continue;
} else if (binding->type == QV4::CompiledData::Binding::Type_Object
|| binding->type == QV4::CompiledData::Binding::Type_GroupProperty) {
customBindings << binding;
+ customParserBindings.setBit(i);
continue;
}
}
@@ -1523,8 +1529,6 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD
|| binding->flags & QV4::CompiledData::Binding::IsSignalHandlerObject)
continue;
- QString name = stringAt(binding->propertyNameIndex);
-
if (name.constData()->isUpper() && !binding->isAttachedProperty()) {
QQmlType *type = 0;
QQmlImportNamespace *typeNamespace = 0;
@@ -1639,6 +1643,7 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD
} else {
if (customParser) {
customBindings << binding;
+ customParserBindings.setBit(i);
continue;
}
if (bindingToDefaultProperty) {
@@ -1652,7 +1657,9 @@ bool QQmlPropertyValidator::validateObject(int objectIndex, const QV4::CompiledD
if (customParser && !customBindings.isEmpty()) {
customParser->clearErrors();
customParser->compiler = this;
- QByteArray data = customParser->compile(qmlUnit, customBindings);
+ QQmlCompiledData::CustomParserData data;
+ data.bindings = customParserBindings;
+ data.compilationArtifact = customParser->compile(qmlUnit, customBindings);
customParser->compiler = 0;
customParserData->insert(objectIndex, data);
const QList<QQmlError> parserErrors = customParser->errors();
diff --git a/src/qml/compiler/qqmltypecompiler_p.h b/src/qml/compiler/qqmltypecompiler_p.h
index 6c4532da5e..d574291869 100644
--- a/src/qml/compiler/qqmltypecompiler_p.h
+++ b/src/qml/compiler/qqmltypecompiler_p.h
@@ -92,7 +92,7 @@ public:
QVector<QByteArray> *vmeMetaObjects() const;
QHash<int, int> *objectIndexToIdForRoot();
QHash<int, QHash<int, int> > *objectIndexToIdPerComponent();
- QHash<int, QByteArray> *customParserData();
+ QHash<int, QQmlCompiledData::CustomParserData> *customParserData();
QQmlJS::MemoryPool *memoryPool();
void setCustomParserBindings(const QVector<int> &bindings);
@@ -238,7 +238,7 @@ private:
const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes;
const QVector<QQmlPropertyCache *> &propertyCaches;
const QHash<int, QHash<int, int> > objectIndexToIdPerComponent;
- QHash<int, QByteArray> *customParserData;
+ QHash<int, QQmlCompiledData::CustomParserData> *customParserData;
QVector<int> customParserBindings;
};
diff --git a/src/qml/qml/qqmlcompiler_p.h b/src/qml/qml/qqmlcompiler_p.h
index 5a96580f78..5a6291afe6 100644
--- a/src/qml/qml/qqmlcompiler_p.h
+++ b/src/qml/qml/qqmlcompiler_p.h
@@ -160,7 +160,11 @@ public:
QHash<int, QHash<int, int> > objectIndexToIdPerComponent;
QHash<int, int> objectIndexToIdForRoot;
// hash key is object index
- QHash<int, QByteArray> customParserData;
+ struct CustomParserData {
+ QByteArray compilationArtifact; // produced by custom parser
+ QBitArray bindings; // bindings covered by the custom parser
+ };
+ QHash<int, CustomParserData> customParserData;
QVector<int> customParserBindings; // index is binding identifier, value is compiled function index.
int totalBindingsCount; // Number of bindings used in this type
int totalParserStatusCount; // Number of instantiated types that are QQmlParserStatus subclasses
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 5f0b5f79be..5d6cbba910 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -561,7 +561,7 @@ static QQmlType *qmlTypeForObject(QObject *object)
return type;
}
-void QQmlObjectCreator::setupBindings()
+void QQmlObjectCreator::setupBindings(const QBitArray &bindingsToSkip)
{
QQmlListProperty<void> savedList;
qSwap(_currentList, savedList);
@@ -641,6 +641,9 @@ void QQmlObjectCreator::setupBindings()
}
+ if (static_cast<int>(i) < bindingsToSkip.size() && bindingsToSkip.testBit(i))
+ continue;
+
if (!setPropertyBinding(property, binding))
return;
}
@@ -1031,10 +1034,13 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent)
if (idEntry != objectIndexToId.constEnd())
context->setIdProperty(idEntry.value(), instance);
+ QBitArray bindingsToSkip;
if (customParser) {
- QHash<int, QByteArray>::ConstIterator entry = compiledData->customParserData.find(index);
- if (entry != compiledData->customParserData.constEnd())
- customParser->setCustomData(instance, *entry);
+ QHash<int, QQmlCompiledData::CustomParserData>::ConstIterator entry = compiledData->customParserData.find(index);
+ if (entry != compiledData->customParserData.constEnd()) {
+ customParser->setCustomData(instance, entry->compilationArtifact);
+ bindingsToSkip = entry->bindings;
+ }
}
if (isComponent)
@@ -1056,7 +1062,7 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent)
qSwap(_qmlContext, qmlContext);
- bool result = populateInstance(index, instance, cache, /*binding target*/instance, /*value type property*/0, installPropertyCache);
+ bool result = populateInstance(index, instance, cache, /*binding target*/instance, /*value type property*/0, installPropertyCache, bindingsToSkip);
qSwap(_qmlContext, qmlContext);
qSwap(_scopeObject, scopeObject);
@@ -1136,7 +1142,7 @@ QQmlContextData *QQmlObjectCreator::finalize(QQmlInstantiationInterrupt &interru
return sharedState->rootContext;
}
-bool QQmlObjectCreator::populateInstance(int index, QObject *instance, QQmlRefPointer<QQmlPropertyCache> cache, QObject *bindingTarget, QQmlPropertyData *valueTypeProperty, bool installPropertyCache)
+bool QQmlObjectCreator::populateInstance(int index, QObject *instance, QQmlRefPointer<QQmlPropertyCache> cache, QObject *bindingTarget, QQmlPropertyData *valueTypeProperty, bool installPropertyCache, const QBitArray &bindingsToSkip)
{
const QV4::CompiledData::Object *obj = qmlUnit->objectAt(index);
@@ -1177,7 +1183,7 @@ bool QQmlObjectCreator::populateInstance(int index, QObject *instance, QQmlRefPo
QVector<QQmlAbstractBinding*> createdBindings(_compiledObject->nBindings, 0);
setupFunctions();
- setupBindings();
+ setupBindings(bindingsToSkip);
qSwap(_vmeMetaObject, vmeMetaObject);
qSwap(_bindingTarget, bindingTarget);
diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h
index 2545e45fb6..d72b9ec065 100644
--- a/src/qml/qml/qqmlobjectcreator_p.h
+++ b/src/qml/qml/qqmlobjectcreator_p.h
@@ -80,9 +80,11 @@ private:
QObject *createInstance(int index, QObject *parent = 0);
- bool populateInstance(int index, QObject *instance, QQmlRefPointer<QQmlPropertyCache> cache, QObject *bindingTarget, QQmlPropertyData *valueTypeProperty, bool installPropertyCache = true);
+ bool populateInstance(int index, QObject *instance, QQmlRefPointer<QQmlPropertyCache> cache,
+ QObject *bindingTarget, QQmlPropertyData *valueTypeProperty, bool installPropertyCache = true,
+ const QBitArray &bindingsToSkip = QBitArray());
- void setupBindings();
+ void setupBindings(const QBitArray &bindingsToSkip);
bool setPropertyBinding(QQmlPropertyData *property, const QV4::CompiledData::Binding *binding);
void setPropertyValue(QQmlPropertyData *property, const QV4::CompiledData::Binding *binding);
void setupFunctions();