189class Q_QML_EXPORT QQmlPropertyCache final :
public QQmlRefCounted<QQmlPropertyCache>
192 using Ptr = QQmlRefPointer<QQmlPropertyCache>;
194 struct ConstPtr :
public QQmlRefPointer<
const QQmlPropertyCache>
196 using QQmlRefPointer<
const QQmlPropertyCache>::QQmlRefPointer;
198 ConstPtr(
const Ptr &ptr) : ConstPtr(ptr.data(), AddRef) {}
199 ConstPtr(Ptr &&ptr) : ConstPtr(ptr.take(), Adopt) {}
200 ConstPtr &operator=(
const Ptr &ptr) {
return operator=(ConstPtr(ptr)); }
201 ConstPtr &operator=(Ptr &&ptr) {
return operator=(ConstPtr(std::move(ptr))); }
204 static Ptr createStandalone(
205 const QMetaObject *, QTypeRevision metaObjectRevision = QTypeRevision::zero());
208 OverrideSemantics::HandlerRef handleOverride = OverrideSemantics::handleOverride)
209 : _handleOverride(handleOverride) { };
210 ~QQmlPropertyCache();
212 void update(
const QMetaObject *);
213 void invalidate(
const QMetaObject *);
215 QQmlPropertyCache::Ptr copy()
const;
217 QQmlPropertyCache::Ptr copyAndAppend(
218 const QMetaObject *, QTypeRevision typeVersion,
219 QQmlPropertyData::Flags propertyFlags = QQmlPropertyData::Flags(),
220 QQmlPropertyData::Flags methodFlags = QQmlPropertyData::Flags(),
221 QQmlPropertyData::Flags signalFlags = QQmlPropertyData::Flags())
const;
223 QQmlPropertyCache::Ptr copyAndReserve(
224 int propertyCount,
int methodCount,
int signalCount,
int enumCount)
const;
226 const QMetaObject *metaObject()
const;
227 const QMetaObject *createMetaObject()
const;
228 const QMetaObject *firstCppMetaObject()
const;
231 const QQmlPropertyData *property(
const K &key, QObject *object,
232 const QQmlRefPointer<QQmlContextData> &context)
const
234 return findProperty(stringCache.find(key), object, context);
237 const QQmlPropertyData *property(
int)
const;
238 const QQmlPropertyData *maybeUnresolvedProperty(
int)
const;
239 const QQmlPropertyData *method(
int)
const;
240 const QQmlPropertyData *signal(
int index)
const;
241 QQmlEnumData *qmlEnum(
int)
const;
242 int methodIndexToSignalIndex(
int)
const;
244 QString defaultPropertyName()
const;
245 const QQmlPropertyData *defaultProperty()
const;
248 inline const QQmlPropertyCache::ConstPtr &parent()
const;
251 void setParent(QQmlPropertyCache::ConstPtr newParent);
253 inline const QQmlPropertyData *overrideData(
const QQmlPropertyData *)
const;
254 inline bool isAllowedInRevision(
const QQmlPropertyData *)
const;
256 static const QQmlPropertyData *property(
257 QObject *, QStringView,
const QQmlRefPointer<QQmlContextData> &,
259 static const QQmlPropertyData *property(QObject *,
const QLatin1String &,
const QQmlRefPointer<QQmlContextData> &,
261 static const QQmlPropertyData *property(QObject *,
const QV4::String *,
const QQmlRefPointer<QQmlContextData> &,
265 int originalClone(
int index)
const;
266 static int originalClone(
const QObject *,
int index);
268 QList<QByteArray> signalParameterNames(
int index)
const;
269 static QString signalParameterStringForJS(
270 const QList<QByteArray> ¶meterNameList, QString *errorString =
nullptr);
272 const char *className()
const;
274 inline int propertyCount()
const;
275 inline int ownPropertyCount()
const {
return int(propertyIndexCache.count()); }
276 inline int propertyOffset()
const;
277 inline int methodCount()
const;
278 inline int ownMethodCount()
const {
return int(methodIndexCache.count()); }
279 inline int methodOffset()
const;
280 inline int signalCount()
const;
281 inline int ownSignalCount()
const {
return int(signalHandlerIndexCache.count()); }
282 inline int signalOffset()
const;
283 inline int qmlEnumCount()
const;
285 void toMetaObjectBuilder(QMetaObjectBuilder &)
const;
287 inline bool callJSFactoryMethod(QObject *object,
void **args)
const;
289 static bool determineMetaObjectSizes(
const QMetaObject &mo,
int *fieldCount,
int *stringCount);
290 static bool addToHash(QCryptographicHash &hash,
const QMetaObject &mo);
292 QByteArray checksum(QHash<quintptr, QByteArray> *checksums,
bool *ok)
const;
294 QTypeRevision allowedRevision(
int index)
const {
return allowedRevisionCache[index]; }
295 void setAllowedRevision(
int index, QTypeRevision allowed) { allowedRevisionCache[index] = allowed; }
298 friend class QQmlEnginePrivate;
299 friend class QQmlCompiler;
300 template <
typename T>
friend class QQmlPropertyCacheCreator;
301 template <
typename T>
friend class QQmlPropertyCacheAliasCreator;
302 template <
typename T>
friend class QQmlComponentAndAliasResolver;
303 friend class QQmlMetaObject;
304 friend class ::tst_qqmlpropertycache;
307 const QQmlMetaObjectPointer &metaObject,
308 OverrideSemantics::HandlerRef handleOverride = OverrideSemantics::handleOverride)
309 : _handleOverride(handleOverride), _metaObject(metaObject)
313 inline QQmlPropertyCache::Ptr copy(
const QQmlMetaObjectPointer &mo,
int reserve)
const;
315 void append(
const QMetaObject *, QTypeRevision typeVersion,
316 QQmlPropertyData::Flags propertyFlags = QQmlPropertyData::Flags(),
317 QQmlPropertyData::Flags methodFlags = QQmlPropertyData::Flags(),
318 QQmlPropertyData::Flags signalFlags = QQmlPropertyData::Flags());
321 using Error = OverrideSemantics::Status;
322 using AppendResult = q23::expected<
void, Error>;
327 AppendResult appendPropertyAttr(
const QString &name, QQmlPropertyData &&data);
328 AppendResult appendAlias(
const QString &, QQmlPropertyData::Flags flags,
int coreIndex,
329 QMetaType propType, QTypeRevision version,
int notifyIndex,
330 int encodedTargetIndex);
331 void appendSignal(
const QString &, QQmlPropertyData::Flags,
int coreIndex,
332 const QMetaType *types =
nullptr,
333 const QList<QByteArray> &names = QList<QByteArray>());
334 void appendMethod(
const QString &, QQmlPropertyData::Flags flags,
int coreIndex,
335 QMetaType returnType,
const QList<QByteArray> &names,
336 const QList<QMetaType> ¶meterTypes);
337 void appendEnum(
const QString &,
const QList<QQmlEnumValue> &);
339 QQmlPropertyCacheMethodArguments *createArgumentsObject(
int count,
340 const QList<QByteArray> &names);
342 typedef QList<QQmlPropertyData> IndexCache;
343 typedef QLinkedStringMultiHash<std::pair<
int, QQmlPropertyData *> > StringCache;
344 typedef QList<QTypeRevision> AllowedRevisionCache;
346 const QQmlPropertyData *findProperty(StringCache::ConstIterator it, QObject *,
347 const QQmlRefPointer<QQmlContextData> &)
const;
348 const QQmlPropertyData *findProperty(StringCache::ConstIterator it,
const QQmlVMEMetaObject *,
349 const QQmlRefPointer<QQmlContextData> &)
const;
352 QQmlPropertyData *findNamedProperty(
const K &key)
const
354 StringCache::mapped_type *it = stringCache.value(key);
355 return it ? it->second : 0;
359 void setNamedProperty(
const K &key,
int index, QQmlPropertyData *data)
361 stringCache.insert(key, std::make_pair(index, data));
372 template <
typename String>
373 void maybeLog(OverrideSemantics::Status status,
const String &name)
const
376 case OverrideSemantics::Status::OverridingFinal: {
377 qCWarning(qqmlPropertyCacheAppend).noquote()
378 << QStringLiteral(
"Final member %1 is overridden in class %2. The "
379 "override won't be used.")
380 .arg(qPrintable(name), className());
383 case OverrideSemantics::Status::MissingBase: {
384 qCWarning(qqmlPropertyCacheAppend).noquote()
385 << QStringLiteral(
"Member %1 of the object %2 does not override anything."
386 " Consider removing \"override\". ")
387 .arg(qPrintable(name), className());
390 case OverrideSemantics::Status::OverridingNonVirtual:
391 case OverrideSemantics::Status::OverridingNonVirtualError: {
392 qCWarning(qqmlPropertyCacheAppend).noquote()
393 << QStringLiteral(
"Member %1 of the object %2 overrides a non-virtual member. "
394 "Consider renaming it or mark it virtual in the base object")
395 .arg(qPrintable(name), className());
398 case OverrideSemantics::Status::MissingOverrideOrFinalSpecifier: {
399 qCWarning(qqmlPropertyCacheAppend).noquote()
401 "Member %s of the object %s overrides a member of the base object. "
402 "Consider renaming it or adding final or override specifier")
403 .arg(qPrintable(name), className());
413 OverrideSemantics::HandlerRef _handleOverride;
415 int propertyIndexCacheStart = 0;
416 QQmlPropertyCache::ConstPtr _parent;
418 IndexCache propertyIndexCache;
419 IndexCache methodIndexCache;
420 IndexCache signalHandlerIndexCache;
421 StringCache stringCache;
422 AllowedRevisionCache allowedRevisionCache;
423 QList<QQmlEnumData> enumCache;
425 QQmlMetaObjectPointer _metaObject;
426 QByteArray _dynamicClassName;
427 QByteArray _dynamicStringData;
428 QByteArray _listPropertyAssignBehavior;
429 QString _defaultPropertyName;
430 QQmlPropertyCacheMethodArguments *argumentsCache =
nullptr;
431 int methodIndexCacheStart = 0;
432 int signalHandlerIndexCacheStart = 0;
433 int _jsFactoryMethodIndex = -1;