aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qqmltypecompiler.cpp
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 /src/qml/compiler/qqmltypecompiler.cpp
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>
Diffstat (limited to 'src/qml/compiler/qqmltypecompiler.cpp')
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp17
1 files changed, 12 insertions, 5 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();