aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2011-11-17 12:53:26 +1000
committerQt by Nokia <qt-info@nokia.com>2011-11-20 23:23:38 +0100
commit7e8e6b2d5be6419374cefdd2acf5c328890f2ec3 (patch)
treede535f788492a36f1d439f06e5bc65bf787f5446 /src
parent62a31676830aca745df23a5dc18b59c4211eea56 (diff)
Rewrite signal handlers at compile time.
Task-number: QTBUG-22726 Change-Id: If2c3c00c646b2ed6b6899573a0b487c8deeaad3f Reviewed-by: Kai Koehne <kai.koehne@nokia.com> Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp7
-rw-r--r--src/declarative/qml/qdeclarativeinstruction_p.h1
-rw-r--r--src/declarative/qml/qdeclarativerewrite.cpp5
-rw-r--r--src/declarative/qml/qdeclarativerewrite_p.h6
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp4
5 files changed, 16 insertions, 7 deletions
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index d3069ecf81..e7d9b80c35 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -1227,10 +1227,11 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeScript::Object *obj)
Instruction::StoreSignal store;
store.signalIndex = prop->index;
- store.value =
- output->indexForString(v->value.asScript().trimmed());
+ QDeclarativeRewrite::RewriteSignalHandler rewriteSignalHandler;
+ const QString &rewrite =
+ rewriteSignalHandler(v->value.asScript().trimmed(), prop->name().toString());
+ store.value = output->indexForString(rewrite);
store.context = v->signalExpressionContextStack;
- store.name = output->indexForByteArray(prop->name().toUtf8());
store.line = v->location.start.line;
output->addInstruction(store);
diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h
index 8940e99b96..d73ce46d7e 100644
--- a/src/declarative/qml/qdeclarativeinstruction_p.h
+++ b/src/declarative/qml/qdeclarativeinstruction_p.h
@@ -382,7 +382,6 @@ union QDeclarativeInstruction
int signalIndex;
int value;
short context;
- int name;
ushort line;
};
struct instr_assignSignalObject {
diff --git a/src/declarative/qml/qdeclarativerewrite.cpp b/src/declarative/qml/qdeclarativerewrite.cpp
index 98bd34f9ed..dab7c3d7e0 100644
--- a/src/declarative/qml/qdeclarativerewrite.cpp
+++ b/src/declarative/qml/qdeclarativerewrite.cpp
@@ -266,6 +266,11 @@ void RewriteBinding::endVisit(AST::LocalForEachStatement *)
--_inLoop;
}
+QString RewriteSignalHandler::operator()(const QString &code, const QString &name)
+{
+ return QStringLiteral("(function ") + name + QStringLiteral("() { ") + code + QStringLiteral(" })");
+}
+
} // namespace QDeclarativeRewrite
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativerewrite_p.h b/src/declarative/qml/qdeclarativerewrite_p.h
index c57e9956b0..b5ea44f23f 100644
--- a/src/declarative/qml/qdeclarativerewrite_p.h
+++ b/src/declarative/qml/qdeclarativerewrite_p.h
@@ -119,6 +119,12 @@ private:
int _inLoop;
};
+class RewriteSignalHandler
+{
+public:
+ QString operator()(const QString &code, const QString &name);
+};
+
} // namespace QDeclarativeRewrite
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index 8f11b2842d..24d2ef45e7 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -863,9 +863,7 @@ QObject *QDeclarativeVME::run(QList<QDeclarativeError> *errors,
QDeclarativeBoundSignal *bs = new QDeclarativeBoundSignal(target, signal, target);
QDeclarativeExpression *expr =
- new QDeclarativeExpression(CTXT, context, PRIMITIVES.at(instr.value));
- expr->setSourceLocation(COMP->name, instr.line);
- static_cast<QDeclarativeExpressionPrivate *>(QObjectPrivate::get(expr))->name = QString::fromUtf8(DATAS.at(instr.name));
+ new QDeclarativeExpression(CTXT, context, PRIMITIVES.at(instr.value), true, COMP->name, instr.line, *new QDeclarativeExpressionPrivate);
bs->setExpression(expr);
QML_END_INSTR(StoreSignal)