51 const auto qqtm = std::lower_bound(
52 uriToModule.begin(), uriToModule.end(), VersionedUri(module, version),
53 std::less<QQmlMetaTypeData::VersionedUri>());
54 if (qqtm == uriToModule.end())
57 QQmlTypeModule *candidate = qqtm->get();
58 return (candidate->module() == module && candidate->majorVersion() == version.majorVersion())
65 QQmlTypeModule *ret = module.get();
66 uriToModule.emplace_back(std::move(module));
67 std::sort(uriToModule.begin(), uriToModule.end(),
68 [](
const std::unique_ptr<QQmlTypeModule> &a,
69 const std::unique_ptr<QQmlTypeModule> &b) {
70 const int diff = a->module().compare(b->module());
71 return diff < 0 || (diff == 0 && a->majorVersion() < b->majorVersion());
103 const QMetaObject *metaObject, QTypeRevision version)
105 if (QQmlPropertyCache::ConstPtr rv = propertyCaches.value(metaObject))
108 QQmlPropertyCache::ConstPtr rv;
109 if (
const QMetaObject *superMeta = metaObject->superClass())
110 rv = propertyCache(superMeta, version)->copyAndAppend(metaObject, version);
112 rv = QQmlPropertyCache::createStandalone(metaObject);
114 const auto *mop =
reinterpret_cast<
const QMetaObjectPrivate *>(metaObject->d.data);
115 if (!(mop->flags & DynamicMetaObject))
116 propertyCaches.insert(metaObject, rv);
122 const QQmlType &type, QTypeRevision version)
124 Q_ASSERT(type.isValid());
126 if (
auto pc = propertyCacheForVersion(type.index(), version))
129 QList<QQmlType> types;
131 quint8 maxMinorVersion = 0;
133 const QMetaObject *metaObject = type.metaObject();
134 Q_ASSERT(metaObject);
136 const QTypeRevision combinedVersion = version.hasMajorVersion()
138 : (version.hasMinorVersion()
139 ? QTypeRevision::fromVersion(type.version().majorVersion(),
140 version.minorVersion())
141 : QTypeRevision::fromMajorVersion(type.version().majorVersion()));
144 QQmlType t = QQmlMetaType::qmlType(metaObject, type.module(), combinedVersion);
146 maxMinorVersion = qMax(maxMinorVersion, t.version().minorVersion());
152 metaObject = metaObject->superClass();
155 const QTypeRevision maxVersion = QTypeRevision::fromVersion(combinedVersion.majorVersion(),
157 if (
auto pc = propertyCacheForVersion(type.index(), maxVersion)) {
158 setPropertyCacheForVersion(type.index(), maxVersion, pc);
162 QQmlPropertyCache::ConstPtr raw = propertyCache(type.metaObject(), combinedVersion);
163 QQmlPropertyCache::Ptr copied;
165 for (
int ii = 0; ii < types.size(); ++ii) {
166 const QQmlType ¤tType = types.at(ii);
167 if (!currentType.isValid())
170 QTypeRevision rev = currentType.metaObjectRevision();
171 int moIndex = types.size() - 1 - ii;
173 if (raw->allowedRevision(moIndex) != rev) {
174 if (copied.isNull()) {
175 copied = raw->copy();
178 copied->setAllowedRevision(moIndex, rev);
197 bool overloadError =
false;
198 QString overloadName;
200 for (QQmlPropertyCache::StringCache::ConstIterator iter = raw->stringCache.begin();
201 !overloadError && iter != raw->stringCache.end();
204 const QQmlPropertyData *d = *iter;
205 if (raw->isAllowedInRevision(d))
209 const QQmlPropertyData *current = d;
210 while (!overloadError && current) {
211 current = d->overrideData(current);
212 if (current && raw->isAllowedInRevision(current))
213 overloadError =
true;
218 if (hasCopied) raw->release();
220 error.setDescription(QLatin1String(
"Type ") + type.qmlTypeName() + QLatin1Char(
' ') + QString::number(type.majorVersion()) + QLatin1Char(
'.') + QString::number(minorVersion) + QLatin1String(
" contains an illegal property \"") + overloadName + QLatin1String(
"\". This is an error in the type's implementation."));
225 setPropertyCacheForVersion(type.index(), version, raw);
227 if (version != maxVersion)
228 setPropertyCacheForVersion(type.index(), maxVersion, raw);
234 QMetaType t,
const QQmlMetaTypeData::CompositeTypes::const_iterator &iter) {
235 if (t != (*iter)->metaType()) {
237 for (
auto &&icDatum: (*iter)->inlineComponentData)
238 if (icDatum.qmlType.typeId() == t)
239 return (*iter)->propertyCaches.at(icDatum.objectIndex);
241 return (*iter)->rootPropertyCache();
267 for (
const auto &compositeMetaType : std::as_const(compositeMetaTypes)) {
268 Q_ASSERT(compositeMetaType.type);
269 QMetaType::unregisterMetaType(QMetaType(compositeMetaType.type));
270 delete compositeMetaType.type;
272 Q_ASSERT(compositeMetaType.listType);
273 QMetaType::unregisterMetaType(QMetaType(compositeMetaType.listType));
274 delete compositeMetaType.listType;
276 compositeMetaTypes.clear();