aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2011-11-24 14:43:09 +1000
committerQt by Nokia <qt-info@nokia.com>2011-11-28 00:05:04 +0100
commitf98ebe34e17fcf955a77b35b098b5be81dc6c7d8 (patch)
tree9b85be0d23be63cd8117d2de59033161b70a1bc6 /src
parentaae3dd6ee06e94ee366c788ca79c0dde67f426ac (diff)
Rewrite Connections signal handlers at compile time.
Task-number: QTBUG-22726 Change-Id: I039d54661bbf7d44912c894bf0cc1d70023a9187 Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp6
-rw-r--r--src/declarative/qml/qdeclarativecompiler_p.h1
-rw-r--r--src/declarative/qml/qdeclarativecustomparser.cpp9
-rw-r--r--src/declarative/qml/qdeclarativecustomparser_p.h1
-rw-r--r--src/declarative/qml/qdeclarativeexpression.cpp6
-rw-r--r--src/declarative/qml/qdeclarativeexpression_p.h2
-rw-r--r--src/declarative/util/qdeclarativeconnections.cpp18
7 files changed, 38 insertions, 5 deletions
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index a2eae79ff7..9b80c2cad1 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -2494,6 +2494,12 @@ int QDeclarativeCompiler::rewriteBinding(const QDeclarativeScript::Variant& valu
return output->indexForString(rewrite);
}
+QString QDeclarativeCompiler::rewriteSignalHandler(const QString &handler, const QString &name)
+{
+ QDeclarativeRewrite::RewriteSignalHandler rewriteSignalHandler;
+ return rewriteSignalHandler(handler, name);
+}
+
// Ensures that the dynamic meta specification on obj is valid
bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeScript::Object *obj)
{
diff --git a/src/declarative/qml/qdeclarativecompiler_p.h b/src/declarative/qml/qdeclarativecompiler_p.h
index 1ee5afbc41..9a67f3213b 100644
--- a/src/declarative/qml/qdeclarativecompiler_p.h
+++ b/src/declarative/qml/qdeclarativecompiler_p.h
@@ -280,6 +280,7 @@ public:
int evaluateEnum(const QByteArray& script) const; // for QDeclarativeCustomParser::evaluateEnum
const QMetaObject *resolveType(const QString& name) const; // for QDeclarativeCustomParser::resolveType
int rewriteBinding(const QDeclarativeScript::Variant& value, const QString& name); // for QDeclarativeCustomParser::rewriteBinding
+ QString rewriteSignalHandler(const QString &handler, const QString &name); // for QDeclarativeCustomParser::rewriteSignalHandler
private:
typedef QDeclarativeCompiledData::Instruction Instruction;
diff --git a/src/declarative/qml/qdeclarativecustomparser.cpp b/src/declarative/qml/qdeclarativecustomparser.cpp
index 9d643d3129..788a670cae 100644
--- a/src/declarative/qml/qdeclarativecustomparser.cpp
+++ b/src/declarative/qml/qdeclarativecustomparser.cpp
@@ -307,4 +307,13 @@ QDeclarativeBinding::Identifier QDeclarativeCustomParser::rewriteBinding(const Q
return compiler->rewriteBinding(value, name);
}
+/*!
+ Returns a rewritten \a handler. \a name
+ is used as the name of the rewritten function.
+*/
+QString QDeclarativeCustomParser::rewriteSignalHandler(const QString &handler, const QString &name)
+{
+ return compiler->rewriteSignalHandler(handler, name);
+}
+
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativecustomparser_p.h b/src/declarative/qml/qdeclarativecustomparser_p.h
index 83e1319fd2..5a9220a43f 100644
--- a/src/declarative/qml/qdeclarativecustomparser_p.h
+++ b/src/declarative/qml/qdeclarativecustomparser_p.h
@@ -143,6 +143,7 @@ protected:
const QMetaObject *resolveType(const QString&) const;
QDeclarativeBinding::Identifier rewriteBinding(const QDeclarativeScript::Variant&, const QString&);
+ QString rewriteSignalHandler(const QString&, const QString&);
private:
QList<QDeclarativeError> exceptions;
diff --git a/src/declarative/qml/qdeclarativeexpression.cpp b/src/declarative/qml/qdeclarativeexpression.cpp
index 0895ffa1ec..bf2552df10 100644
--- a/src/declarative/qml/qdeclarativeexpression.cpp
+++ b/src/declarative/qml/qdeclarativeexpression.cpp
@@ -158,6 +158,12 @@ QDeclarativeExpressionPrivate::evalFunction(QDeclarativeContextData *ctxt, QObje
return qPersistentNew<v8::Function>(v8::Local<v8::Function>::Cast(result));
}
+QDeclarativeExpression *QDeclarativeExpressionPrivate::create(QDeclarativeContextData *ctxt, QObject *object, const QString &expr, bool isRewritten,
+ const QString &url, int lineNumber)
+{
+ return new QDeclarativeExpression(ctxt, object, expr, isRewritten, url, lineNumber, *new QDeclarativeExpressionPrivate);
+}
+
/*!
\class QDeclarativeExpression
\since 4.7
diff --git a/src/declarative/qml/qdeclarativeexpression_p.h b/src/declarative/qml/qdeclarativeexpression_p.h
index bfe031fbc8..7a2bda218f 100644
--- a/src/declarative/qml/qdeclarativeexpression_p.h
+++ b/src/declarative/qml/qdeclarativeexpression_p.h
@@ -193,6 +193,8 @@ public:
static v8::Persistent<v8::Function> evalFunction(QDeclarativeContextData *ctxt, QObject *scope,
const QString &code, const QString &filename, int line,
v8::Persistent<v8::Object> *qmlscope = 0);
+ static QDeclarativeExpression *create(QDeclarativeContextData *, QObject *, const QString &, bool,
+ const QString &, int);
bool expressionFunctionValid:1;
bool extractExpressionFromFunction:1;
diff --git a/src/declarative/util/qdeclarativeconnections.cpp b/src/declarative/util/qdeclarativeconnections.cpp
index aa944f3622..ee2c6edcc5 100644
--- a/src/declarative/util/qdeclarativeconnections.cpp
+++ b/src/declarative/util/qdeclarativeconnections.cpp
@@ -41,7 +41,7 @@
#include "qdeclarativeconnections_p.h"
-#include <qdeclarativeexpression.h>
+#include <private/qdeclarativeexpression_p.h>
#include <private/qdeclarativeproperty_p.h>
#include <private/qdeclarativeboundsignal_p.h>
#include <qdeclarativecontext.h>
@@ -225,7 +225,7 @@ QDeclarativeConnectionsParser::compile(const QList<QDeclarativeCustomParserPrope
QDeclarativeScript::Variant v = qvariant_cast<QDeclarativeScript::Variant>(value);
if (v.isScript()) {
ds << propName;
- ds << v.asScript();
+ ds << rewriteSignalHandler(v.asScript(), propName);
ds << propLine;
} else {
error(props.at(ii), QDeclarativeConnections::tr("Connections: script expected"));
@@ -265,10 +265,18 @@ void QDeclarativeConnections::connectSignals()
if (prop.isValid() && (prop.type() & QDeclarativeProperty::SignalProperty)) {
QDeclarativeBoundSignal *signal =
new QDeclarativeBoundSignal(target(), prop.method(), this);
- QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(this), 0, script);
+
+ QString location;
+ QDeclarativeContextData *ctxtdata = 0;
QDeclarativeData *ddata = QDeclarativeData::get(this);
- if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty())
- expression->setSourceLocation(ddata->outerContext->url.toString(), line);
+ if (ddata) {
+ ctxtdata = ddata->outerContext;
+ if (ctxtdata && !ctxtdata->url.isEmpty())
+ location = ddata->outerContext->url.toString();
+ }
+
+ QDeclarativeExpression *expression = ctxtdata ?
+ QDeclarativeExpressionPrivate::create(ctxtdata, 0, script, true, location, line) : 0;
signal->setExpression(expression);
d->boundsignals += signal;
} else {