diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2011-11-17 12:53:26 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-20 23:23:38 +0100 |
commit | 7e8e6b2d5be6419374cefdd2acf5c328890f2ec3 (patch) | |
tree | de535f788492a36f1d439f06e5bc65bf787f5446 /src | |
parent | 62a31676830aca745df23a5dc18b59c4211eea56 (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.cpp | 7 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativeinstruction_p.h | 1 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativerewrite.cpp | 5 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativerewrite_p.h | 6 | ||||
-rw-r--r-- | src/declarative/qml/qdeclarativevme.cpp | 4 |
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) |