From 4e012093462f07e7ffd42d4061539c54b4f43ace Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 31 Mar 2014 16:49:14 +0200 Subject: 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 --- src/qml/types/qqmlconnections.cpp | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) (limited to 'src/qml/types/qqmlconnections.cpp') 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 #include #include +#include #include #include @@ -68,6 +69,7 @@ public: bool componentcomplete; QByteArray data; + QQmlRefPointer 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(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 { -- cgit v1.2.3