diff options
author | Chris Adams <christopher.adams@nokia.com> | 2012-07-13 15:53:04 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-08 06:04:03 +0200 |
commit | 92562eacbc3c614a83a734f1108ed7df02415eae (patch) | |
tree | 05fc063849e032cb03e4f919811d8ea4da147773 /src/qml/qml/qqmlcompiler.cpp | |
parent | b2120f68683b7948891d72fe077f44ab7e6baf18 (diff) |
Allow signal parameters which are custom QML object-types
This commit allows lazy resolution of signal parameter types, which
allows QML object types to be used as signal parameters. If a signal
is emitted with an incorrect parameter type, it will be passed through
as a null parameter.
Task-number: QTBUG-14550
Change-Id: I7e899ad57452826cc405bed10c541f8d35789d04
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlcompiler.cpp')
-rw-r--r-- | src/qml/qml/qqmlcompiler.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/src/qml/qml/qqmlcompiler.cpp b/src/qml/qml/qqmlcompiler.cpp index 453ee0841b..af8448001e 100644 --- a/src/qml/qml/qqmlcompiler.cpp +++ b/src/qml/qml/qqmlcompiler.cpp @@ -2978,9 +2978,33 @@ bool QQmlCompiler::buildDynamicMeta(QQmlScript::Object *obj, DynamicMetaMode mod paramTypes[0] = paramCount; for (int i = 0; i < paramCount; ++i) { - Q_ASSERT(s->parameterTypes.at(i) < builtinTypeCount); - paramTypes[i + 1] = builtinTypes[s->parameterTypes.at(i)].metaType; - names.append(s->parameterNames.at(i).toString().toUtf8()); + if (s->parameterTypes.at(i) < builtinTypeCount) { + // built-in type + paramTypes[i + 1] = builtinTypes[s->parameterTypes.at(i)].metaType; + names.append(s->parameterNames.at(i).toString().toUtf8()); + } else { + // lazily resolved type + Q_ASSERT(s->parameterTypes.at(i) == Object::DynamicProperty::Custom); + QQmlType *qmltype = 0; + QString url; + if (!unit->imports().resolveType(s->parameterTypeNames.at(i).toString(), &qmltype, &url, 0, 0, 0)) + COMPILE_EXCEPTION(s, tr("Invalid signal parameter type: %1").arg(s->parameterTypeNames.at(i).toString())); + + if (!qmltype) { + QQmlTypeData *tdata = enginePrivate->typeLoader.getType(QUrl(url)); + Q_ASSERT(tdata); + Q_ASSERT(tdata->isComplete()); + + QQmlCompiledData *data = tdata->compiledData(); + + paramTypes[i + 1] = data->metaTypeId; + + tdata->release(); + } else { + paramTypes[i + 1] = qmltype->typeId(); + } + names.append(s->parameterNames.at(i).toString().toUtf8()); + } } } |