diff options
Diffstat (limited to 'src/qml/qml/qqmlcompiler.cpp')
-rw-r--r-- | src/qml/qml/qqmlcompiler.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/qml/qml/qqmlcompiler.cpp b/src/qml/qml/qqmlcompiler.cpp index ec1d19dd4e..ee8b30aab7 100644 --- a/src/qml/qml/qqmlcompiler.cpp +++ b/src/qml/qml/qqmlcompiler.cpp @@ -1323,8 +1323,17 @@ void QQmlCompiler::genObjectBody(QQmlScript::Object *obj) Instruction::StoreSignal store; store.signalIndex = prop->index; - const QString &rewrite = rewriteSignalHandler(v->value, prop->name().toString()); + + const QList<QByteArray> ¶meterNameList = obj->metatype->signalParameterNames(prop->index); + QQmlRewrite::RewriteSignalHandler rewriter; + int count = 0; + const QString &rewrite = rewriter(v->value.asAST(), v->value.asScript(), + prop->name().toString(), + obj->metatype->signalParameterStringForJS(prop->index, &count), + parameterNameList); store.value = output->indexForByteArray(rewrite.toUtf8()); + store.parameterCount = + (rewriter.parameterAccess() == QQmlRewrite::RewriteSignalHandler::ParametersUnaccessed) ? 0 : count; store.context = v->signalExpressionContextStack; store.line = v->location.start.line; store.column = v->location.start.column; @@ -1694,6 +1703,15 @@ bool QQmlCompiler::buildSignal(QQmlScript::Property *prop, QQmlScript::Object *o if (script.isEmpty()) COMPILE_EXCEPTION(prop, tr("Empty signal assignment")); + //all handlers should be on the original, rather than cloned signals in order + //to ensure all parameters are available (see qqmlboundsignal constructor for more details) + prop->index = obj->metatype->originalClone(prop->index); + + QString errorString; + obj->metatype->signalParameterStringForJS(prop->index, 0, &errorString); + if (!errorString.isEmpty()) + COMPILE_EXCEPTION(prop, errorString); + prop->values.first()->signalExpressionContextStack = ctxt.stack; } } |