aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/types/qqmlconnections.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-03-31 16:49:14 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-02 14:04:11 +0200
commit4e012093462f07e7ffd42d4061539c54b4f43ace (patch)
tree5a90968cf1a57860af3a870d5a0d2c0619629bb6 /src/qml/types/qqmlconnections.cpp
parent010e3e4f8d4045d3e807d612289886f3d709773c (diff)
Avoid recompiling of signal handlers defined in QtQuick state changes and Connection objects
We can re-use the expression we've compiled at QML type compilation time, as long as we "inject" the signal parameters in the dynamic qml lookup chain. Change-Id: Icc417531c41dea06ff5d033011179af49b03f542 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/types/qqmlconnections.cpp')
-rw-r--r--src/qml/types/qqmlconnections.cpp26
1 files changed, 8 insertions, 18 deletions
diff --git a/src/qml/types/qqmlconnections.cpp b/src/qml/types/qqmlconnections.cpp
index 25ef5db394..99ec0b55de 100644
--- a/src/qml/types/qqmlconnections.cpp
+++ b/src/qml/types/qqmlconnections.cpp
@@ -46,6 +46,7 @@
#include <private/qqmlboundsignal_p.h>
#include <qqmlcontext.h>
#include <private/qqmlcontext_p.h>
+#include <private/qqmlcompiler_p.h>
#include <qqmlinfo.h>
#include <QtCore/qdebug.h>
@@ -68,6 +69,7 @@ public:
bool componentcomplete;
QByteArray data;
+ QQmlRefPointer<QQmlCompiledData> cdata;
};
/*!
@@ -211,8 +213,6 @@ QByteArray QQmlConnectionsParser::compile(const QV4::CompiledData::QmlUnit *qmlU
for (int ii = 0; ii < props.count(); ++ii) {
const QV4::CompiledData::Binding *binding = props.at(ii);
QString propName = qmlUnit->header.stringAt(binding->propertyNameIndex);
- int propLine = binding->location.line;
- int propColumn = binding->location.column;
if (!propName.startsWith(QLatin1String("on")) || !propName.at(2).isUpper()) {
error(props.at(ii), QQmlConnections::tr("Cannot assign to non-existent property \"%1\"").arg(propName));
@@ -232,21 +232,19 @@ QByteArray QQmlConnectionsParser::compile(const QV4::CompiledData::QmlUnit *qmlU
return QByteArray();
} else {
ds << propName;
- ds << binding->valueAsString(&qmlUnit->header);
- ds << propLine;
- ds << propColumn;
+ ds << bindingIdentifier(binding);
}
}
return rv;
}
-void QQmlConnectionsParser::setCustomData(QObject *object,
- const QByteArray &data)
+void QQmlConnectionsParser::setCustomData(QObject *object, const QByteArray &data, QQmlCompiledData *cdata)
{
QQmlConnectionsPrivate *p =
static_cast<QQmlConnectionsPrivate *>(QObjectPrivate::get(object));
p->data = data;
+ p->cdata = cdata;
}
@@ -260,12 +258,8 @@ void QQmlConnections::connectSignals()
while (!ds.atEnd()) {
QString propName;
ds >> propName;
- QString script;
- ds >> script;
- int line;
- ds >> line;
- int column;
- ds >> column;
+ int bindingId;
+ ds >> bindingId;
QQmlProperty prop(target(), propName);
if (prop.isValid() && (prop.type() & QQmlProperty::SignalProperty)) {
@@ -273,19 +267,15 @@ void QQmlConnections::connectSignals()
QQmlBoundSignal *signal =
new QQmlBoundSignal(target(), signalIndex, this, qmlEngine(this));
- QString location;
QQmlContextData *ctxtdata = 0;
QQmlData *ddata = QQmlData::get(this);
if (ddata) {
ctxtdata = ddata->outerContext;
- if (ctxtdata && !ctxtdata->url.isEmpty())
- location = ddata->outerContext->urlString;
}
QQmlBoundSignalExpression *expression = ctxtdata ?
new QQmlBoundSignalExpression(target(), signalIndex,
- ctxtdata, this, script,
- location, line, column) : 0;
+ ctxtdata, this, d->cdata->functionForBindingId(bindingId)) : 0;
signal->takeExpression(expression);
d->boundsignals += signal;
} else {