79 QQmlMetaTypeData *data,
const QString &elementName,
80 const QQmlPrivate::RegisterSingletonType &type,
81 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
83 auto *d =
new QQmlTypePrivate(QQmlType::SingletonType);
84 data->registerType(d);
86 d->setName(QString::fromUtf8(type.uri), elementName);
87 d->version = type.version;
89 if (type.qObjectApi) {
90 d->baseMetaObject = type.instanceMetaObject;
91 d->typeId = type.typeId;
92 d->revision = type.revision;
95 d->extraData.singletonTypeData->singletonInstanceInfo = siinfo;
96 d->extraData.singletonTypeData->extFunc = type.extensionObjectCreate;
97 d->extraData.singletonTypeData->extMetaObject = type.extensionMetaObject;
103 const QQmlPrivate::RegisterType &type)
105 QQmlTypePrivate *d =
new QQmlTypePrivate(QQmlType::CppType);
106 data->registerType(d);
107 d->setName(QString::fromUtf8(type.uri), elementName);
109 d->version = type.version;
110 d->revision = type.revision;
111 d->typeId = type.typeId;
112 d->listId = type.listId;
113 d->extraData.cppTypeData->allocationSize = type.objectSize;
114 d->extraData.cppTypeData->userdata = type.userdata;
115 d->extraData.cppTypeData->newFunc = type.create;
116 d->extraData.cppTypeData->noCreationReason = type.noCreationReason;
117 d->extraData.cppTypeData->createValueTypeFunc = type.createValueType;
118 d->baseMetaObject = type.metaObject;
119 d->extraData.cppTypeData->attachedPropertiesFunc = type.attachedPropertiesFunction;
120 d->extraData.cppTypeData->attachedPropertiesType = type.attachedPropertiesMetaObject;
121 d->extraData.cppTypeData->parserStatusCast = type.parserStatusCast;
122 d->extraData.cppTypeData->propertyValueSourceCast = type.valueSourceCast;
123 d->extraData.cppTypeData->propertyValueInterceptorCast = type.valueInterceptorCast;
124 d->extraData.cppTypeData->finalizerCast = type.has(QQmlPrivate::RegisterType::FinalizerCast)
127 d->extraData.cppTypeData->extFunc = type.extensionObjectCreate;
128 d->extraData.cppTypeData->customParser =
reinterpret_cast<QQmlCustomParser *>(type.customParser);
129 d->extraData.cppTypeData->registerEnumClassesUnscoped =
true;
130 d->extraData.cppTypeData->registerEnumsFromRelatedTypes =
true;
131 d->extraData.cppTypeData->constructValueType = type.has(QQmlPrivate::RegisterType::CreationMethod)
132 && type.creationMethod != QQmlPrivate::ValueTypeCreationMethod::None;
133 d->extraData.cppTypeData->populateValueType = type.has(QQmlPrivate::RegisterType::CreationMethod)
134 && type.creationMethod == QQmlPrivate::ValueTypeCreationMethod::Structured;
136 if (type.extensionMetaObject)
137 d->extraData.cppTypeData->extMetaObject = type.extensionMetaObject;
140 if (d->baseMetaObject) {
141 auto indexOfUnscoped = d->baseMetaObject->indexOfClassInfo(
"RegisterEnumClassesUnscoped");
142 if (indexOfUnscoped != -1
143 && qstrcmp(d->baseMetaObject->classInfo(indexOfUnscoped).value(),
"false") == 0) {
144 d->extraData.cppTypeData->registerEnumClassesUnscoped =
false;
147 auto indexOfRelated = d->baseMetaObject->indexOfClassInfo(
"RegisterEnumsFromRelatedTypes");
148 if (indexOfRelated != -1
149 && qstrcmp(d->baseMetaObject->classInfo(indexOfRelated).value(),
"false") == 0) {
150 d->extraData.cppTypeData->registerEnumsFromRelatedTypes =
false;
158 QQmlMetaTypeData *data,
const QUrl &url, QQmlTypePrivate *priv,
const QByteArray &className)
160 Q_ASSERT(!className.isEmpty());
161 QByteArray ptr = className +
'*';
162 QByteArray lst =
"QQmlListProperty<" + className +
'>';
164 QQmlMetaTypeData::CompositeMetaTypes &types = data->compositeMetaTypes[url];
166 Q_ASSERT(types.listType);
168 QMetaType::unregisterMetaType(QMetaType(types.type));
169 QMetaType::unregisterMetaType(QMetaType(types.listType));
171 types.type->name = std::move(ptr);
172 types.type->QMetaTypeInterface::name = types.type->name.constData();
173 types.listType->name = std::move(lst);
174 types.listType->QMetaTypeInterface::name = types.listType->name.constData();
176 types.type =
new QQmlMetaTypeInterface(std::move(ptr));
177 types.listType =
new QQmlListMetaTypeInterface(std::move(lst), types.type);
180 QMetaType ptr_type(types.type);
181 QMetaType lst_type(types.listType);
187 priv->typeId = ptr_type;
188 priv->listId = lst_type;
192 const QQmlPrivate::RegisterCompositeType &type)
194 auto *d =
new QQmlTypePrivate(QQmlType::CompositeType);
195 data->registerType(d);
196 d->setName(QString::fromUtf8(type.uri), elementName);
197 d->version = type.version;
199 const QUrl normalized = QQmlMetaType::normalizedUrl(type.url);
200 d->extraData.compositeTypeData = normalized;
201 addQQmlMetaTypeInterfaces(
202 data, normalized, d, QQmlPropertyCacheCreatorBase::createClassNameTypeByUrl(normalized));
207 QQmlMetaTypeData *data,
const QString &elementName,
208 const QQmlPrivate::RegisterCompositeSingletonType &type,
209 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
211 auto *d =
new QQmlTypePrivate(QQmlType::CompositeSingletonType);
212 data->registerType(d);
213 d->setName(QString::fromUtf8(type.uri), elementName);
215 d->version = type.version;
217 d->extraData.singletonTypeData->singletonInstanceInfo = siinfo;
218 const QUrl &url = siinfo->url;
219 addQQmlMetaTypeInterfaces(
220 data, url, d, QQmlPropertyCacheCreatorBase::createClassNameTypeByUrl(url));
224void QQmlMetaType::clone(QMetaObjectBuilder &builder,
const QMetaObject *mo,
225 const QMetaObject *ignoreStart,
const QMetaObject *ignoreEnd,
226 QQmlMetaType::ClonePolicy policy)
229 builder.setClassName(mo->className());
232 for (
int ii = mo->classInfoOffset(); ii < mo->classInfoCount(); ++ii) {
233 QMetaClassInfo info = mo->classInfo(ii);
235 int otherIndex = ignoreEnd->indexOfClassInfo(info.name());
236 if (otherIndex >= ignoreStart->classInfoOffset() + ignoreStart->classInfoCount()) {
239 builder.addClassInfo(info.name(), info.value());
243 if (policy != QQmlMetaType::CloneEnumsOnly) {
245 for (
int ii = mo->methodOffset(); ii < mo->methodCount(); ++ii) {
246 QMetaMethod method = mo->method(ii);
249 QByteArray name = method.name();
253 for (
int ii = ignoreStart->methodOffset() + ignoreStart->methodCount();
254 !found && ii < ignoreEnd->methodOffset() + ignoreEnd->methodCount(); ++ii) {
256 QMetaMethod other = ignoreEnd->method(ii);
258 found = name == other.name();
261 QMetaMethodBuilder m = builder.addMethod(method);
263 m.setAccess(QMetaMethod::Private);
267 for (
int ii = mo->propertyOffset(); ii < mo->propertyCount(); ++ii) {
268 QMetaProperty property = mo->property(ii);
270 int otherIndex = ignoreEnd->indexOfProperty(property.name());
271 if (otherIndex >= ignoreStart->propertyOffset() + ignoreStart->propertyCount()) {
272 builder.addProperty(QByteArray(
"__qml_ignore__") + property.name(),
276 builder.addProperty(property);
282 for (
int ii = mo->enumeratorOffset(); ii < mo->enumeratorCount(); ++ii) {
283 QMetaEnum enumerator = mo->enumerator(ii);
285 int otherIndex = ignoreEnd->indexOfEnumerator(enumerator.name());
286 if (otherIndex >= ignoreStart->enumeratorOffset() + ignoreStart->enumeratorCount()) {
289 builder.addEnumerator(enumerator);
322void QQmlMetaType::clearTypeRegistrations()
325 QQmlMetaTypeDataPtr data;
327 data->uriToModule.clear();
329 data->idToType.clear();
330 data->nameToType.clear();
331 data->urlToType.clear();
332 data->typePropertyCaches.clear();
333 data->metaObjectToType.clear();
334 data->undeletableTypes.clear();
335 data->propertyCaches.clear();
337 qDeleteAll(data->metaTypeToValueType);
338 data->metaTypeToValueType.clear();
340 data->moduleImports.clear();
342 data->clearCompositeTypes();
344 qDeleteAll(data->metaTypeToValueType);
345 data->metaTypeToValueType.clear();
347 data->clearCompositeMetaTypes();
350void QQmlMetaType::registerTypeAlias(
int typeIndex,
const QString &name)
352 QQmlMetaTypeDataPtr data;
353 const QQmlType type = data->types.value(typeIndex);
354 const QQmlTypePrivate *priv = type.priv();
355 data->nameToType.insert(name, priv);
358int QQmlMetaType::registerAutoParentFunction(
const QQmlPrivate::RegisterAutoParent &function)
360 if (function.structVersion > 1)
361 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
363 QQmlMetaTypeDataPtr data;
365 data->parentFunctions.append(function.function);
367 return data->parentFunctions.size() - 1;
376QQmlType QQmlMetaType::registerInterface(
const QQmlPrivate::RegisterInterface &type)
378 if (type.structVersion > 1)
379 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
381 QQmlMetaTypeDataPtr data;
382 QQmlTypePrivate *priv = createQQmlType(data, type);
386 data->idToType.insert(priv->typeId.id(), priv);
387 data->idToType.insert(priv->listId.id(), priv);
389 data->interfaces.insert(type.typeId.id());
391 return QQmlType(priv);
397 if (typeType == QQmlType::CppType)
398 typeStr = QStringLiteral(
"element");
399 else if (typeType == QQmlType::SingletonType)
400 typeStr = QStringLiteral(
"singleton type");
401 else if (typeType == QQmlType::CompositeSingletonType)
402 typeStr = QStringLiteral(
"composite singleton type");
403 else if (typeType == QQmlType::SequentialContainerType)
404 typeStr = QStringLiteral(
"sequential container type");
406 typeStr = QStringLiteral(
"type");
412 QQmlType::RegistrationType typeType, QQmlMetaTypeData *data,
const char *uri,
413 const QString &typeName, QTypeRevision version, QMetaType::TypeFlags flags)
415 if (!typeName.isEmpty()) {
416 if (typeName.at(0).isLower() && (flags & QMetaType::PointerToQObject)) {
417 QString failure(QCoreApplication::translate(
"qmlRegisterType",
"Invalid QML %1 name \"%2\"; type names must begin with an uppercase letter"));
418 data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType), typeName));
422 if (typeName.at(0).isUpper()
423 && (flags & (QMetaType::IsGadget | QMetaType::PointerToGadget))) {
424 qCWarning(lcTypeRegistration).noquote()
425 << QCoreApplication::translate(
427 "Invalid QML %1 name \"%2\"; "
428 "value type names should begin with a lowercase letter")
429 .arg(registrationTypeString(typeType), typeName);
435 int typeNameLen = typeName.size();
436 for (
int ii = 0; ii < typeNameLen; ++ii) {
437 if (!(typeName.at(ii).isLetterOrNumber() || typeName.at(ii) == u'_')) {
438 QString failure(QCoreApplication::translate(
"qmlRegisterType",
"Invalid QML %1 name \"%2\""));
439 data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType), typeName));
445 if (uri && !typeName.isEmpty()) {
446 QString nameSpace = QString::fromUtf8(uri);
448 if (qqtm && qqtm->lockLevel() != QQmlTypeModule::LockLevel::Open) {
449 QString failure(QCoreApplication::translate(
451 "Cannot install %1 '%2' into protected module '%3' version '%4'"));
452 data->recordTypeRegFailure(failure
453 .arg(registrationTypeString(typeType), typeName, nameSpace)
454 .arg(version.majorVersion()));
476 if (!type->elementName.isEmpty())
477 data->nameToType.insert(type->elementName, type);
479 if (type->baseMetaObject)
480 data->metaObjectToType.insert(type->baseMetaObject, type);
482 if (type->regType == QQmlType::SequentialContainerType) {
483 if (type->listId.isValid())
484 data->idToType.insert(type->listId.id(), type);
486 if (type->typeId.isValid())
487 data->idToType.insert(type->typeId.id(), type);
489 if (type->listId.flags().testFlag(QMetaType::IsQmlList))
490 data->idToType.insert(type->listId.id(), type);
493 if (!type->module.isEmpty()) {
494 const QHashedString &mod = type->module;
502QQmlType QQmlMetaType::registerType(
const QQmlPrivate::RegisterType &type)
504 if (type.structVersion >
int(QQmlPrivate::RegisterType::CurrentVersion))
505 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
507 QQmlMetaTypeDataPtr data;
509 QString elementName = QString::fromUtf8(type.elementName);
510 if (!checkRegistration(QQmlType::CppType, data, type.uri, elementName, type.version,
511 QMetaType(type.typeId).flags())) {
515 QQmlTypePrivate *priv = createQQmlType(data, elementName, type);
516 addTypeToData(priv, data);
518 return QQmlType(priv);
521QQmlType QQmlMetaType::registerSingletonType(
522 const QQmlPrivate::RegisterSingletonType &type,
523 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
525 if (type.structVersion > 1)
526 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
528 QQmlMetaTypeDataPtr data;
530 QString typeName = QString::fromUtf8(type.typeName);
531 if (!checkRegistration(QQmlType::SingletonType, data, type.uri, typeName, type.version,
532 QMetaType(type.typeId).flags())) {
536 QQmlTypePrivate *priv = createQQmlType(data, typeName, type, siinfo);
538 addTypeToData(priv, data);
540 return QQmlType(priv);
543QQmlType QQmlMetaType::registerCompositeSingletonType(
544 const QQmlPrivate::RegisterCompositeSingletonType &type,
545 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
547 if (type.structVersion > 1)
548 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
551 QQmlMetaTypeDataPtr data;
553 QString typeName = QString::fromUtf8(type.typeName);
554 if (!checkRegistration(
555 QQmlType::CompositeSingletonType, data, type.uri, typeName, type.version, {})) {
559 QQmlTypePrivate *priv = createQQmlType(data, typeName, type, siinfo);
560 addTypeToData(priv, data);
562 data->urlToType.insert(siinfo->url, priv);
564 return QQmlType(priv);
567QQmlType QQmlMetaType::registerCompositeType(
const QQmlPrivate::RegisterCompositeType &type)
569 if (type.structVersion > 1)
570 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
573 QQmlMetaTypeDataPtr data;
575 QString typeName = QString::fromUtf8(type.typeName);
576 if (!checkRegistration(QQmlType::CompositeType, data, type.uri, typeName, type.version, {}))
579 QQmlTypePrivate *priv = createQQmlType(data, typeName, type);
580 addTypeToData(priv, data);
582 data->urlToType.insert(QQmlMetaType::normalizedUrl(type.url), priv);
584 return QQmlType(priv);
607 QQmlMetaTypeData *data,
const QUrl &url,
const QHashedStringRef &qualifiedType,
608 QQmlMetaType::CompositeTypeLookupMode mode, QList<QQmlError> *errors, QTypeRevision version)
610 const int dot = qualifiedType.indexOf(QLatin1Char(
'.'));
611 const QString typeName = dot < 0
612 ? qualifiedType.toString()
613 : QString(qualifiedType.constData() + dot + 1, qualifiedType.length() - dot - 1);
615 QStringList failures;
635 QQmlType::RegistrationType registrationType;
637 case QQmlMetaType::Singleton:
638 registrationType = QQmlType::CompositeSingletonType;
640 case QQmlMetaType::NonSingleton:
641 registrationType = QQmlType::CompositeType;
643 case QQmlMetaType::JavaScript:
644 registrationType = QQmlType::JavaScriptType;
647 Q_UNREACHABLE_RETURN(QQmlType());
650 if (checkRegistration(registrationType, data,
nullptr, typeName, version, {})) {
657 auto *priv =
new QQmlTypePrivate(registrationType);
658 addQQmlMetaTypeInterfaces(
659 data, url, priv, QQmlPropertyCacheCreatorBase::createClassNameTypeByUrl(url));
661 priv->setName(QString(), typeName);
662 priv->version = version;
665 case QQmlMetaType::Singleton: {
666 QQmlType::SingletonInstanceInfo::Ptr siinfo = QQmlType::SingletonInstanceInfo::create();
668 siinfo->typeName = typeName.toUtf8();
669 priv->extraData.singletonTypeData->singletonInstanceInfo =
670 QQmlType::SingletonInstanceInfo::ConstPtr(
671 siinfo.take(), QQmlType::SingletonInstanceInfo::ConstPtr::Adopt);
674 case QQmlMetaType::NonSingleton: {
675 priv->extraData.compositeTypeData = url;
678 case QQmlMetaType::JavaScript: {
679 priv->extraData.javaScriptTypeData = url;
684 data->registerType(priv);
685 addTypeToData(priv, data);
686 return QQmlType(priv);
694 error.setDescription(failures.join(u'\n'));
695 errors->prepend(error);
697 qWarning(
"%s", failures.join(u'\n').toLatin1().constData());
702QQmlType QQmlMetaType::findCompositeType(
703 const QUrl &url,
const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit,
704 CompositeTypeLookupMode mode)
706 const QUrl normalized = QQmlMetaType::normalizedUrl(url);
707 QQmlMetaTypeDataPtr data;
709 bool urlExists =
true;
710 auto found = data->urlToType.constFind(normalized);
711 if (found == data->urlToType.cend())
715 if (compilationUnit.isNull())
716 return QQmlType(*found);
717 const auto [begin, end]
718 = std::as_const(data->compositeTypes).equal_range(found.value()->typeId.iface());
720 return QQmlType(*found);
721 for (
auto it = begin; it != end; ++it) {
722 if (it.value() == compilationUnit)
723 return QQmlType(*found);
727 const QQmlType type = createTypeForUrl(
728 data, normalized, QHashedStringRef(), mode,
nullptr, QTypeRevision());
730 if (!urlExists && type.isValid())
731 data->urlToType.insert(normalized, type.priv());
738 QQmlTypePrivate *priv =
new QQmlTypePrivate(QQmlType::InlineComponentType);
739 priv->setName(QString(), url.fragment());
741 priv->extraData.inlineComponentTypeData = url;
742 data->registerType(priv);
744 addQQmlMetaTypeInterfaces(
745 data, url, priv, QQmlPropertyCacheCreatorBase::createClassNameForInlineComponent(url));
746 data->urlToType.insert(url, priv);
748 data->idToType.insert(priv->typeId.id(), priv);
749 data->idToType.insert(priv->listId.id(), priv);
751 return QQmlType(priv);
754QQmlType QQmlMetaType::findInlineComponentType(
755 const QUrl &url,
const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
757 QQmlMetaTypeDataPtr data;
761 const auto it = data->urlToType.constFind(url);
762 if (it != data->urlToType.constEnd()) {
763 const auto [begin, end]
764 = std::as_const(data->compositeTypes).equal_range((*it)->typeId.iface());
766 return QQmlType(*it);
767 for (
auto jt = begin; jt != end; ++jt) {
768 if (*jt == compilationUnit)
769 return QQmlType(*it);
773 return doRegisterInlineComponentType(data, url);
776int QQmlMetaType::registerUnitCacheHook(
777 const QQmlPrivate::RegisterQmlUnitCacheHook &hookRegistration)
779 if (hookRegistration.structVersion > 1)
780 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
782 QQmlMetaTypeDataPtr data;
783 data->lookupCachedQmlUnit << hookRegistration.lookupCachedQmlUnit;
787QQmlType QQmlMetaType::registerSequentialContainer(
788 const QQmlPrivate::RegisterSequentialContainer &container)
790 if (container.structVersion > 1)
791 qFatal(
"qmlRegisterSequenceContainer(): Cannot mix incompatible QML versions.");
793 QQmlMetaTypeDataPtr data;
795 if (!checkRegistration(QQmlType::SequentialContainerType, data, container.uri, QString(),
796 container.version, {})) {
800 QQmlTypePrivate *priv =
new QQmlTypePrivate(QQmlType::SequentialContainerType);
802 data->registerType(priv);
803 priv->setName(QString::fromUtf8(container.uri), QString());
804 priv->version = container.version;
805 priv->revision = container.revision;
806 priv->typeId = container.metaSequence.valueMetaType();
807 priv->listId = container.typeId;
808 priv->extraData.sequentialContainerTypeData = container.metaSequence;
810 addTypeToData(priv, data);
812 return QQmlType(priv);
820bool QQmlMetaType::protectModule(
const QString &uri, QTypeRevision version,
821 bool weakProtectAllVersions)
823 QQmlMetaTypeDataPtr data;
824 if (version.hasMajorVersion()) {
825 if (QQmlTypeModule *module = data->findTypeModule(uri, version)) {
826 if (!weakProtectAllVersions) {
827 module->setLockLevel(QQmlTypeModule::LockLevel::Strong);
835 const auto range = std::equal_range(
836 data->uriToModule.begin(), data->uriToModule.end(), uri,
837 std::less<ModuleUri>());
839 for (
auto it = range.first; it != range.second; ++it)
840 (*it)->setLockLevel(QQmlTypeModule::LockLevel::Weak);
842 return range.first != range.second;
845void QQmlMetaType::registerModuleImport(
const QString &uri, QTypeRevision moduleVersion,
846 const QQmlDirParser::Import &import)
848 QQmlMetaTypeDataPtr data;
850 data->moduleImports.insert(QQmlMetaTypeData::VersionedUri(uri, moduleVersion), import);
853void QQmlMetaType::unregisterModuleImport(
const QString &uri, QTypeRevision moduleVersion,
854 const QQmlDirParser::Import &import)
856 QQmlMetaTypeDataPtr data;
857 data->moduleImports.remove(QQmlMetaTypeData::VersionedUri(uri, moduleVersion), import);
860QList<QQmlDirParser::Import> QQmlMetaType::moduleImports(
861 const QString &uri, QTypeRevision version)
863 QQmlMetaTypeDataPtr data;
864 QList<QQmlDirParser::Import> result;
866 const auto unrevisioned = data->moduleImports.equal_range(
867 QQmlMetaTypeData::VersionedUri(uri, QTypeRevision()));
868 for (
auto it = unrevisioned.second; it != unrevisioned.first;)
869 result.append(*(--it));
871 if (version.hasMajorVersion()) {
872 const auto revisioned = data->moduleImports.equal_range(
873 QQmlMetaTypeData::VersionedUri(uri, version));
874 for (
auto it = revisioned.second; it != revisioned.first;)
875 result.append(*(--it));
880 const auto begin = data->moduleImports.begin();
881 auto it = unrevisioned.first;
885 const QQmlMetaTypeData::VersionedUri latestVersion = (--it).key();
886 if (latestVersion.uri != uri)
891 }
while (it != begin && (--it).key() == latestVersion);
896void QQmlMetaType::registerModule(
const char *uri, QTypeRevision version)
898 QQmlMetaTypeDataPtr data;
900 QQmlTypeModule *module = getTypeModule(QString::fromUtf8(uri), version, data);
903 if (version.hasMinorVersion())
904 module->addMinorVersion(version.minorVersion());
907int QQmlMetaType::typeId(
const char *uri, QTypeRevision version,
const char *qmlName)
909 QQmlMetaTypeDataPtr data;
911 QQmlTypeModule *module = getTypeModule(QString::fromUtf8(uri), version, data);
915 QQmlType type = module->type(QHashedStringRef(QString::fromUtf8(qmlName)), version);
941QQmlMetaType::RegistrationResult QQmlMetaType::registerPluginTypes(
942 QObject *instance,
const QString &basePath,
const QString &uri,
943 const QString &typeNamespace, QTypeRevision version, QList<QQmlError> *errors)
945 if (!typeNamespace.isEmpty() && typeNamespace != uri) {
950 error.setDescription(
951 QStringLiteral(
"Module namespace '%1' does not match import URI '%2'")
952 .arg(typeNamespace, uri));
953 errors->prepend(error);
955 return RegistrationResult::Failure;
958 QStringList failures;
959 QQmlMetaTypeDataPtr data;
961 QQmlMetaTypeRegistrationFailureRecorder failureRecorder(data, &failures);
962 if (!typeNamespace.isEmpty()) {
964 if (namespaceContainsRegistrations(data, typeNamespace, version)) {
968 error.setDescription(QStringLiteral(
"Namespace '%1' has already been used "
969 "for type registration")
970 .arg(typeNamespace));
971 errors->prepend(error);
973 return RegistrationResult::Failure;
977 qWarning().nospace() << qPrintable(
978 QStringLiteral(
"Module '%1' does not contain a module identifier directive - "
979 "it cannot be protected from external registrations.").arg(uri));
982 if (instance && !qobject_cast<QQmlEngineExtensionInterface *>(instance)) {
983 QQmlTypesExtensionInterface *iface = qobject_cast<QQmlTypesExtensionInterface *>(instance);
988 error.setDescription(QStringLiteral(
"Module loaded for URI '%1' does not implement "
989 "QQmlEngineExtensionInterface").arg(typeNamespace));
990 errors->prepend(error);
992 return RegistrationResult::Failure;
995#if QT_DEPRECATED_SINCE(6
, 3
)
996 if (
auto *plugin = qobject_cast<QQmlExtensionPlugin *>(instance)) {
998 QQmlExtensionPluginPrivate::get(plugin)->baseUrl
999 = QQmlImports::urlFromLocalFileOrQrcOrUrl(basePath);
1005 const QByteArray bytes = uri.toUtf8();
1006 const char *moduleId = bytes.constData();
1007 iface->registerTypes(moduleId);
1010 if (failures.isEmpty() && !data->registerModuleTypes(uri))
1011 return RegistrationResult::NoRegistrationFunction;
1013 if (!failures.isEmpty()) {
1015 for (
const QString &failure : std::as_const(failures)) {
1017 error.setDescription(failure);
1018 errors->prepend(error);
1021 return RegistrationResult::Failure;
1025 return RegistrationResult::Success;
1039QQmlType QQmlMetaType::typeForUrl(
1040 const QUrl &url,
const QHashedStringRef &qualifiedType, CompositeTypeLookupMode mode,
1041 QList<QQmlError> *errors, QTypeRevision version)
1044 const QUrl normalized = QQmlMetaType::normalizedUrl(url);
1046 QQmlMetaTypeDataPtr data;
1048 QQmlType ret(data->urlToType.value(normalized));
1049 if (ret.isValid() && ret.sourceUrl() == normalized)
1053 const QQmlType type = createTypeForUrl(
1054 data, normalized, qualifiedType, mode, errors, version);
1055 data->urlToType.insert(normalized, type.priv());
1062QTypeRevision QQmlMetaType::latestModuleVersion(
const QString &uri)
1064 QQmlMetaTypeDataPtr data;
1065 auto upper = std::upper_bound(data->uriToModule.begin(), data->uriToModule.end(), uri,
1066 std::less<ModuleUri>());
1067 if (upper == data->uriToModule.begin())
1068 return QTypeRevision();
1070 const auto module = (--upper)->get();
1071 return (module->module() == uri)
1072 ? QTypeRevision::fromVersion(module->majorVersion(), module->maximumMinorVersion())
1079bool QQmlMetaType::isStronglyLockedModule(
const QString &uri, QTypeRevision version)
1081 QQmlMetaTypeDataPtr data;
1083 if (QQmlTypeModule* qqtm = data->findTypeModule(uri, version))
1084 return qqtm->lockLevel() == QQmlTypeModule::LockLevel::Strong;
1095QTypeRevision QQmlMetaType::matchingModuleVersion(
const QString &module, QTypeRevision version)
1097 if (!version.hasMajorVersion())
1098 return latestModuleVersion(module);
1100 QQmlMetaTypeDataPtr data;
1103 if (QQmlTypeModule *tm = data->findTypeModule(module, version)) {
1104 if (!version.hasMinorVersion())
1105 return QTypeRevision::fromVersion(version.majorVersion(), tm->maximumMinorVersion());
1107 if (tm->minimumMinorVersion() <= version.minorVersion()
1108 && tm->maximumMinorVersion() >= version.minorVersion()) {
1113 return QTypeRevision();
1116QQmlTypeModule *QQmlMetaType::typeModule(
const QString &uri, QTypeRevision version)
1118 QQmlMetaTypeDataPtr data;
1120 if (version.hasMajorVersion())
1121 return data->findTypeModule(uri, version);
1123 auto range = std::equal_range(data->uriToModule.begin(), data->uriToModule.end(),
1124 uri, std::less<ModuleUri>());
1126 return range.first == range.second ?
nullptr : (--range.second)->get();
1150QMetaType QQmlMetaType::listValueType(QMetaType metaType)
1152 if (isList(metaType)) {
1153 const auto iface = metaType.iface();
1154 if (iface && iface->metaObjectFn == &dynamicQmlListMarker)
1155 return QMetaType(
static_cast<
const QQmlListMetaTypeInterface *>(iface)->valueType);
1156 }
else if (metaType.flags() & QMetaType::PointerToQObject) {
1160 QQmlMetaTypeDataPtr data;
1162 QQmlTypePrivate *type = data->idToType.value(metaType.id());
1164 if (type && type->listId == metaType)
1165 return type->typeId;
1167 return QMetaType {};
1170QQmlAttachedPropertiesFunc QQmlMetaType::attachedPropertiesFunc(
1171 QQmlTypeLoader *typeLoader,
const QMetaObject *mo)
1173 QQmlMetaTypeDataPtr data;
1175 QQmlType type(data->metaObjectToType.value(mo));
1176 return type.attachedPropertiesFunction(typeLoader);
1179QMetaProperty QQmlMetaType::defaultProperty(
const QMetaObject *metaObject)
1181 int idx = metaObject->indexOfClassInfo(
"DefaultProperty");
1183 return QMetaProperty();
1185 QMetaClassInfo info = metaObject->classInfo(idx);
1187 return QMetaProperty();
1189 idx = metaObject->indexOfProperty(info.value());
1191 return QMetaProperty();
1193 return metaObject->property(idx);
1259QQmlType QQmlMetaType::qmlType(
const QString &qualifiedName, QTypeRevision version)
1261 int slash = qualifiedName.indexOf(QLatin1Char(
'/'));
1265 QHashedStringRef module(qualifiedName.constData(), slash);
1266 QHashedStringRef name(qualifiedName.constData() + slash + 1, qualifiedName.size() - slash - 1);
1268 return qmlType(name, module, version);
1279QQmlType QQmlMetaType::qmlType(
const QHashedStringRef &name,
const QHashedStringRef &module,
1280 QTypeRevision version)
1282 const QQmlMetaTypeDataPtr data;
1284 const QHashedString key(QString::fromRawData(name.constData(), name.length()), name.hash());
1285 QQmlMetaTypeData::Names::ConstIterator it = data->nameToType.constFind(key);
1286 while (it != data->nameToType.cend() && it.key() == name) {
1288 if (module.isEmpty() || t.availableInVersion(module, version))
1311QQmlType QQmlMetaType::qmlType(
const QMetaObject *metaObject,
const QHashedStringRef &module,
1312 QTypeRevision version)
1314 const QQmlMetaTypeDataPtr data;
1316 const auto range = data->metaObjectToType.equal_range(metaObject);
1317 for (
auto it = range.first; it != range.second; ++it) {
1319 if (module.isEmpty() || t.availableInVersion(module, version))
1363QQmlType QQmlMetaType::qmlType(
const QUrl &unNormalizedUrl)
1365 const QUrl url = QQmlMetaType::normalizedUrl(unNormalizedUrl);
1366 const QQmlMetaTypeDataPtr data;
1368 QQmlType type(data->urlToType.value(url));
1370 if (type.sourceUrl() == url)
1376QQmlType QQmlMetaType::fetchOrCreateInlineComponentTypeForUrl(
const QUrl &url)
1378 QQmlMetaTypeDataPtr data;
1379 const auto it = data->urlToType.constFind(url);
1380 if (it != data->urlToType.constEnd())
1381 return QQmlType(*it);
1383 return doRegisterInlineComponentType(data, url);
1392QQmlPropertyCache::ConstPtr QQmlMetaType::propertyCache(QObject *obj, QTypeRevision version)
1394 if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
1395 return QQmlPropertyCache::ConstPtr();
1396 return QQmlMetaType::propertyCache(obj->metaObject(), version);
1399QQmlPropertyCache::ConstPtr QQmlMetaType::propertyCache(
1400 const QMetaObject *metaObject, QTypeRevision version)
1402 QQmlMetaTypeDataPtr data;
1403 return data->propertyCache(metaObject, version);
1418QQmlMetaObject QQmlMetaType::rawMetaObjectForType(QMetaType metaType)
1420 const QQmlMetaTypeDataPtr data;
1421 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1422 return QQmlMetaObject(composite);
1424 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1425 return (type && type->typeId == metaType) ? type->baseMetaObject :
nullptr;
1433QQmlMetaObject QQmlMetaType::metaObjectForType(QMetaType metaType)
1435 const QQmlMetaTypeDataPtr data;
1436 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1437 return QQmlMetaObject(composite);
1439 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1440 return (type && type->typeId == metaType)
1441 ? QQmlType(type).metaObject()
1450QQmlPropertyCache::ConstPtr QQmlMetaType::propertyCacheForType(QMetaType metaType)
1452 QQmlMetaTypeDataPtr data;
1453 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1456 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1457 if (type && type->typeId == metaType) {
1458 if (
const QMetaObject *mo = QQmlType(type).metaObject())
1459 return data->propertyCache(mo, type->version);
1462 return QQmlPropertyCache::ConstPtr();
1472QQmlPropertyCache::ConstPtr QQmlMetaType::rawPropertyCacheForType(QMetaType metaType)
1474 QQmlMetaTypeDataPtr data;
1475 if (
auto composite = QQmlMetaType::findPropertyCacheInCompositeTypes(metaType))
1478 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1479 if (!type || type->typeId != metaType)
1480 return QQmlPropertyCache::ConstPtr();
1482 const QMetaObject *metaObject = type->isValueType()
1483 ? type->metaObjectForValueType()
1484 : type->baseMetaObject;
1487 ? data->propertyCache(metaObject, QTypeRevision())
1488 : QQmlPropertyCache::ConstPtr();
1497QQmlPropertyCache::ConstPtr QQmlMetaType::rawPropertyCacheForType(
1498 QMetaType metaType, QTypeRevision version)
1500 QQmlMetaTypeDataPtr data;
1501 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1504 const QQmlTypePrivate *typePriv = data->idToType.value(metaType.id());
1505 if (!typePriv || typePriv->typeId != metaType)
1506 return QQmlPropertyCache::ConstPtr();
1508 const QQmlType type(typePriv);
1509 if (type.containsRevisionedAttributes()) {
1511 Q_ASSERT(type.metaObject());
1512 return data->propertyCache(type, version);
1515 if (
const QMetaObject *metaObject = type.metaObject())
1516 return data->propertyCache(metaObject, version);
1518 return QQmlPropertyCache::ConstPtr();
1521void QQmlMetaType::unregisterType(
int typeIndex)
1523 QQmlMetaTypeDataPtr data;
1524 const QQmlType type = data->types.value(typeIndex);
1525 if (
const QQmlTypePrivate *d = type.priv()) {
1526 if (d->regType == QQmlType::CompositeType || d->regType == QQmlType::CompositeSingletonType)
1527 removeFromInlineComponents(data->urlToType, d);
1528 removeQQmlTypePrivate(data->idToType, d);
1529 removeQQmlTypePrivate(data->nameToType, d);
1530 removeQQmlTypePrivate(data->urlToType, d);
1531 removeQQmlTypePrivate(data->metaObjectToType, d);
1532 for (
auto & module : data->uriToModule)
1534 data->clearPropertyCachesForVersion(typeIndex);
1535 data->types[typeIndex] = QQmlType();
1536 data->undeletableTypes.remove(type);
1563 QQmlMetaTypeData *data,
1564 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
1567 auto doCheck = [&](
const QtPrivate::QMetaTypeInterface *iface) {
1571 const auto [begin, end] = std::as_const(data->compositeTypes).equal_range(iface);
1572 for (
auto it = begin; it != end; ++it) {
1573 if (*it == compilationUnit)
1578 doCheck(compilationUnit->metaType().iface());
1579 for (
auto &&inlineData: compilationUnit->inlineComponentData)
1580 doCheck(inlineData.qmlType.typeId().iface());
1585void QQmlMetaType::freeUnusedTypesAndCaches()
1587 QQmlMetaTypeDataPtr data;
1590 if (!data.isValid())
1593 bool droppedAtLeastOneComposite;
1595 droppedAtLeastOneComposite =
false;
1596 auto it = data->compositeTypes.cbegin();
1597 while (it != data->compositeTypes.cend()) {
1598 const auto &cu = *it;
1599 if (cu->count() <= doCountInternalCompositeTypeSelfReferences(data, cu)) {
1600 QQmlMetaTypeData::clearCompositeType(cu);
1601 it = data->compositeTypes.erase(it);
1602 droppedAtLeastOneComposite =
true;
1607 }
while (droppedAtLeastOneComposite);
1609 bool deletedAtLeastOneType;
1611 deletedAtLeastOneType =
false;
1612 QList<QQmlType>::Iterator it = data->types.begin();
1613 while (it != data->types.end()) {
1614 const QQmlTypePrivate *d = (*it).priv();
1615 if (d && d->count() == 1 && !hasActiveInlineComponents(data, d)) {
1616 deletedAtLeastOneType =
true;
1618 if (d->regType == QQmlType::CompositeType
1619 || d->regType == QQmlType::CompositeSingletonType) {
1620 removeFromInlineComponents(data->urlToType, d);
1622 removeQQmlTypePrivate(data->idToType, d);
1623 removeQQmlTypePrivate(data->nameToType, d);
1624 removeQQmlTypePrivate(data->urlToType, d);
1625 removeQQmlTypePrivate(data->metaObjectToType, d);
1627 for (
auto &module : data->uriToModule)
1630 data->clearPropertyCachesForVersion(d->index);
1636 }
while (deletedAtLeastOneType);
1638 bool deletedAtLeastOneCache;
1640 deletedAtLeastOneCache =
false;
1641 auto it = data->propertyCaches.begin();
1642 while (it != data->propertyCaches.end()) {
1643 if ((*it)->count() == 1) {
1644 it = data->propertyCaches.erase(it);
1645 deletedAtLeastOneCache =
true;
1650 }
while (deletedAtLeastOneCache);
1656QList<QString> QQmlMetaType::qmlTypeNames()
1658 const QQmlMetaTypeDataPtr data;
1660 QList<QString> names;
1661 names.reserve(data->nameToType.size());
1662 QQmlMetaTypeData::Names::ConstIterator it = data->nameToType.cbegin();
1663 while (it != data->nameToType.cend()) {
1665 names += t.qmlTypeName();
1724const QQmlPrivate::CachedQmlUnit *QQmlMetaType::findCachedCompilationUnit(
1725 const QUrl &uri, QQmlMetaType::CacheMode mode, CachedUnitLookupError *status)
1727 Q_ASSERT(mode != RejectAll);
1728 const QQmlMetaTypeDataPtr data;
1730 for (
const auto lookup : std::as_const(data->lookupCachedQmlUnit)) {
1731 if (
const QQmlPrivate::CachedQmlUnit *unit = lookup(uri)) {
1733 if (!unit->qmlData->verifyHeader(QDateTime(), &error)) {
1734 qCDebug(DBG_DISK_CACHE) <<
"Error loading pre-compiled file " << uri <<
":" << error;
1736 *status = CachedUnitLookupError::VersionMismatch;
1740 if (mode == RequireFullyTyped && !isFullyTyped(unit)) {
1741 qCDebug(DBG_DISK_CACHE)
1742 <<
"Error loading pre-compiled file " << uri
1743 <<
": compilation unit contains functions not compiled to native code.";
1745 *status = CachedUnitLookupError::NotFullyTyped;
1750 *status = CachedUnitLookupError::NoError;
1756 *status = CachedUnitLookupError::NoUnitFound;
1776QString QQmlMetaType::prettyTypeName(
const QObject *object)
1783 QQmlType type = QQmlMetaType::qmlType(object->metaObject());
1784 if (type.isValid()) {
1785 typeName = type.qmlTypeName();
1786 const int lastSlash = typeName.lastIndexOf(QLatin1Char(
'/'));
1787 if (lastSlash != -1)
1788 typeName = typeName.mid(lastSlash + 1);
1791 if (typeName.isEmpty()) {
1792 typeName = QString::fromUtf8(object->metaObject()->className());
1793 int marker = typeName.indexOf(QLatin1String(
"_QMLTYPE_"));
1795 typeName = typeName.left(marker);
1797 marker = typeName.indexOf(QLatin1String(
"_QML_"));
1799 typeName = QStringView{typeName}.left(marker) + QLatin1Char(
'*');
1800 type = QQmlMetaType::qmlType(QMetaType::fromName(typeName.toUtf8()));
1801 if (type.isValid()) {
1802 QString qmlTypeName = type.qmlTypeName();
1803 const int lastSlash = qmlTypeName.lastIndexOf(QLatin1Char(
'/'));
1804 if (lastSlash != -1)
1805 qmlTypeName = qmlTypeName.mid(lastSlash + 1);
1806 if (!qmlTypeName.isEmpty())
1807 typeName = qmlTypeName;
1815QList<QQmlProxyMetaObject::ProxyData> QQmlMetaType::proxyData(
const QMetaObject *mo,
1816 const QMetaObject *baseMetaObject,
1817 QMetaObject *lastMetaObject)
1819 QList<QQmlProxyMetaObject::ProxyData> metaObjects;
1820 mo = mo->d.superdata;
1825 auto createProxyMetaObject = [&](QQmlTypePrivate *This,
1826 const QMetaObject *superdataBaseMetaObject,
1827 const QMetaObject *extMetaObject,
1828 QObject *(*extFunc)(QObject *)) {
1832 QMetaObjectBuilder builder;
1833 clone(builder, extMetaObject, superdataBaseMetaObject, baseMetaObject,
1834 extFunc ? QQmlMetaType::CloneAll : QQmlMetaType::CloneEnumsOnly);
1835 QMetaObject *mmo = builder.toMetaObject();
1836 mmo->d.superdata = baseMetaObject;
1837 if (!metaObjects.isEmpty())
1838 metaObjects.constLast().metaObject->d.superdata = mmo;
1839 else if (lastMetaObject)
1840 lastMetaObject->d.superdata = mmo;
1841 QQmlProxyMetaObject::ProxyData data = { mmo, extFunc, 0, 0 };
1842 metaObjects << data;
1843 registerMetaObjectForType(mmo, This);
1846 for (
const QQmlMetaTypeDataPtr data; mo; mo = mo->d.superdata) {
1853 if (QQmlTypePrivate *t = data->metaObjectToType.value(mo)) {
1854 if (t->regType == QQmlType::CppType) {
1855 createProxyMetaObject(
1856 t, t->baseMetaObject, t->extraData.cppTypeData->extMetaObject,
1857 t->extraData.cppTypeData->extFunc);
1858 }
else if (t->regType == QQmlType::SingletonType) {
1859 createProxyMetaObject(
1860 t, t->baseMetaObject, t->extraData.singletonTypeData->extMetaObject,
1861 t->extraData.singletonTypeData->extFunc);
1899const QMetaObject *QQmlMetaType::metaObjectForValueType(QMetaType metaType)
1901 switch (metaType.id()) {
1902 case QMetaType::QPoint:
1903 return &QQmlPointValueType::staticMetaObject;
1904 case QMetaType::QPointF:
1905 return &QQmlPointFValueType::staticMetaObject;
1906 case QMetaType::QSize:
1907 return &QQmlSizeValueType::staticMetaObject;
1908 case QMetaType::QSizeF:
1909 return &QQmlSizeFValueType::staticMetaObject;
1910 case QMetaType::QRect:
1911 return &QQmlRectValueType::staticMetaObject;
1912 case QMetaType::QRectF:
1913 return &QQmlRectFValueType::staticMetaObject;
1914#if QT_CONFIG(easingcurve)
1915 case QMetaType::QEasingCurve:
1916 return &QQmlEasingValueType::staticMetaObject;
1925 if (!(metaType.flags() & QMetaType::PointerToQObject)) {
1926 const QQmlMetaTypeDataPtr data;
1927 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1928 if (type && type->regType == QQmlType::CppType && type->typeId == metaType) {
1929 if (
const QMetaObject *mo = type->metaObjectForValueType())
1935 if (metaType.flags() & QMetaType::IsGadget)
1936 return metaType.metaObject();
1941QQmlValueType *QQmlMetaType::valueType(QMetaType type)
1943 QQmlMetaTypeDataPtr data;
1945 const auto it = data->metaTypeToValueType.constFind(type.id());
1946 if (it != data->metaTypeToValueType.constEnd())
1949 if (
const QMetaObject *mo = metaObjectForValueType(type))
1950 return *data->metaTypeToValueType.insert(type.id(),
new QQmlValueType(type, mo));
1951 return *data->metaTypeToValueType.insert(type.id(),
nullptr);
1960void QQmlMetaType::registerInternalCompositeType(
1961 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
1963 QQmlMetaTypeDataPtr data;
1965 auto doInsert = [&data, &compilationUnit](
const QtPrivate::QMetaTypeInterface *iface) {
1967 Q_ASSERT(compilationUnit);
1972 auto it = data->compositeTypes.insert(iface, compilationUnit);
1978 const auto end = data->compositeTypes.end();
1979 while (++it != end && it.key() == iface) {
1980 if (*it == compilationUnit) {
1981 data->compositeTypes.erase(it);
1987 doInsert(compilationUnit->metaType().iface());
1988 for (
auto &&inlineData: compilationUnit->inlineComponentData)
1989 doInsert(inlineData.qmlType.typeId().iface());
1992void QQmlMetaType::unregisterInternalCompositeType(
1993 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
1995 QQmlMetaTypeDataPtr data;
1997 auto doRemove = [&](
const QtPrivate::QMetaTypeInterface *iface) {
2001 const auto [begin, end] = std::as_const(data->compositeTypes).equal_range(iface);
2002 for (
auto it = begin; it != end; ++it) {
2003 if (*it == compilationUnit) {
2004 QQmlMetaTypeData::clearCompositeType(compilationUnit);
2005 data->compositeTypes.erase(it);
2011 doRemove(compilationUnit->metaType().iface());
2012 for (
auto &&inlineData: compilationUnit->inlineComponentData)
2013 doRemove(inlineData.qmlType.typeId().iface());
2032QQmlRefPointer<QV4::CompiledData::CompilationUnit> QQmlMetaType::obtainCompilationUnit(
2035 const QUrl normalized = QQmlMetaType::normalizedUrl(url);
2036 QQmlMetaTypeDataPtr data;
2038 auto found = data->urlToType.constFind(normalized);
2039 if (found == data->urlToType.constEnd())
2040 return QQmlRefPointer<QV4::CompiledData::CompilationUnit>();
2043 const auto composite = data->compositeTypes.constFind(found.value()->typeId.iface());
2044 return composite == data->compositeTypes.constEnd()
2045 ? QQmlRefPointer<QV4::CompiledData::CompilationUnit>()
2046 : composite.value();