119class Q_QML_EXPORT QQmlPropertyCache final
120 :
public QQmlRefCounted<QQmlPropertyCache>
123 using Ptr = QQmlRefPointer<QQmlPropertyCache>;
125 struct ConstPtr :
public QQmlRefPointer<
const QQmlPropertyCache>
127 using QQmlRefPointer<
const QQmlPropertyCache>::QQmlRefPointer;
129 ConstPtr(
const Ptr &ptr) : ConstPtr(ptr.data(), AddRef) {}
130 ConstPtr(Ptr &&ptr) : ConstPtr(ptr.take(), Adopt) {}
131 ConstPtr &operator=(
const Ptr &ptr) {
return operator=(ConstPtr(ptr)); }
132 ConstPtr &operator=(Ptr &&ptr) {
return operator=(ConstPtr(std::move(ptr))); }
135 static Ptr createStandalone(
136 const QMetaObject *, QTypeRevision metaObjectRevision = QTypeRevision::zero());
138 QQmlPropertyCache() =
default;
139 ~QQmlPropertyCache();
141 void update(
const QMetaObject *);
142 void invalidate(
const QMetaObject *);
144 QQmlPropertyCache::Ptr copy()
const;
146 QQmlPropertyCache::Ptr copyAndAppend(
147 const QMetaObject *, QTypeRevision typeVersion,
148 QQmlPropertyData::Flags propertyFlags = QQmlPropertyData::Flags(),
149 QQmlPropertyData::Flags methodFlags = QQmlPropertyData::Flags(),
150 QQmlPropertyData::Flags signalFlags = QQmlPropertyData::Flags())
const;
152 QQmlPropertyCache::Ptr copyAndReserve(
153 int propertyCount,
int methodCount,
int signalCount,
int enumCount)
const;
155 enum OverrideResult { NoOverride, InvalidOverride, ValidOverride };
156 OverrideResult appendAlias(
const QString &, QQmlPropertyData::Flags flags,
int coreIndex,
157 QMetaType propType, QTypeRevision version,
int notifyIndex,
158 int encodedTargetIndex);
159 void appendSignal(
const QString &, QQmlPropertyData::Flags,
int coreIndex,
160 const QMetaType *types =
nullptr,
161 const QList<QByteArray> &names = QList<QByteArray>());
162 void appendMethod(
const QString &, QQmlPropertyData::Flags flags,
int coreIndex,
163 QMetaType returnType,
const QList<QByteArray> &names,
164 const QVector<QMetaType> ¶meterTypes);
165 void appendEnum(
const QString &,
const QVector<QQmlEnumValue> &);
167 const QMetaObject *metaObject()
const;
168 const QMetaObject *createMetaObject()
const;
169 const QMetaObject *firstCppMetaObject()
const;
172 const QQmlPropertyData *property(
const K &key, QObject *object,
173 const QQmlRefPointer<QQmlContextData> &context)
const
175 return findProperty(stringCache.find(key), object, context);
178 const QQmlPropertyData *property(
int)
const;
179 const QQmlPropertyData *maybeUnresolvedProperty(
int)
const;
180 const QQmlPropertyData *method(
int)
const;
181 const QQmlPropertyData *signal(
int index)
const;
182 QQmlEnumData *qmlEnum(
int)
const;
183 int methodIndexToSignalIndex(
int)
const;
185 QString defaultPropertyName()
const;
186 const QQmlPropertyData *defaultProperty()
const;
189 inline const QQmlPropertyCache::ConstPtr &parent()
const;
192 void setParent(QQmlPropertyCache::ConstPtr newParent);
194 inline const QQmlPropertyData *overrideData(
const QQmlPropertyData *)
const;
195 inline bool isAllowedInRevision(
const QQmlPropertyData *)
const;
197 static const QQmlPropertyData *property(
198 QObject *, QStringView,
const QQmlRefPointer<QQmlContextData> &,
200 static const QQmlPropertyData *property(QObject *,
const QLatin1String &,
const QQmlRefPointer<QQmlContextData> &,
202 static const QQmlPropertyData *property(QObject *,
const QV4::String *,
const QQmlRefPointer<QQmlContextData> &,
206 int originalClone(
int index)
const;
207 static int originalClone(
const QObject *,
int index);
209 QList<QByteArray> signalParameterNames(
int index)
const;
210 static QString signalParameterStringForJS(
211 const QList<QByteArray> ¶meterNameList, QString *errorString =
nullptr);
213 const char *className()
const;
215 inline int propertyCount()
const;
216 inline int ownPropertyCount()
const {
return int(propertyIndexCache.count()); }
217 inline int propertyOffset()
const;
218 inline int methodCount()
const;
219 inline int ownMethodCount()
const {
return int(methodIndexCache.count()); }
220 inline int methodOffset()
const;
221 inline int signalCount()
const;
222 inline int ownSignalCount()
const {
return int(signalHandlerIndexCache.count()); }
223 inline int signalOffset()
const;
224 inline int qmlEnumCount()
const;
226 void toMetaObjectBuilder(QMetaObjectBuilder &)
const;
228 inline bool callJSFactoryMethod(QObject *object,
void **args)
const;
230 static bool determineMetaObjectSizes(
const QMetaObject &mo,
int *fieldCount,
int *stringCount);
231 static bool addToHash(QCryptographicHash &hash,
const QMetaObject &mo);
233 QByteArray checksum(QHash<quintptr, QByteArray> *checksums,
bool *ok)
const;
235 QTypeRevision allowedRevision(
int index)
const {
return allowedRevisionCache[index]; }
236 void setAllowedRevision(
int index, QTypeRevision allowed) { allowedRevisionCache[index] = allowed; }
239 friend class QQmlEnginePrivate;
240 friend class QQmlCompiler;
241 template <
typename T>
friend class QQmlPropertyCacheCreator;
242 template <
typename T>
friend class QQmlPropertyCacheAliasCreator;
243 template <
typename T>
friend class QQmlComponentAndAliasResolver;
244 friend class QQmlMetaObject;
246 QQmlPropertyCache(
const QQmlMetaObjectPointer &metaObject) : _metaObject(metaObject) {}
248 inline QQmlPropertyCache::Ptr copy(
const QQmlMetaObjectPointer &mo,
int reserve)
const;
250 void append(
const QMetaObject *, QTypeRevision typeVersion,
251 QQmlPropertyData::Flags propertyFlags = QQmlPropertyData::Flags(),
252 QQmlPropertyData::Flags methodFlags = QQmlPropertyData::Flags(),
253 QQmlPropertyData::Flags signalFlags = QQmlPropertyData::Flags());
255 QQmlPropertyCacheMethodArguments *createArgumentsObject(
int count,
const QList<QByteArray> &names);
257 typedef QVector<QQmlPropertyData> IndexCache;
258 typedef QLinkedStringMultiHash<std::pair<
int, QQmlPropertyData *> > StringCache;
259 typedef QVector<QTypeRevision> AllowedRevisionCache;
261 const QQmlPropertyData *findProperty(StringCache::ConstIterator it, QObject *,
262 const QQmlRefPointer<QQmlContextData> &)
const;
263 const QQmlPropertyData *findProperty(StringCache::ConstIterator it,
const QQmlVMEMetaObject *,
264 const QQmlRefPointer<QQmlContextData> &)
const;
267 QQmlPropertyData *findNamedProperty(
const K &key)
const
269 StringCache::mapped_type *it = stringCache.value(key);
270 return it ? it->second : 0;
274 void setNamedProperty(
const K &key,
int index, QQmlPropertyData *data)
276 stringCache.insert(key, std::make_pair(index, data));
280 template<
typename String>
281 OverrideResult handleOverride(
const String &name, QQmlPropertyData *data, QQmlPropertyData *old)
286 if (old->isFinal()) {
288 qWarning(
"Final member %s is overridden in class %s. The override won't be used.",
289 qPrintable(name), className());
290 return InvalidOverride;
293 data->markAsOverrideOf(old);
294 return ValidOverride;
298 OverrideResult doAppendPropertyData(
const QString &name, QQmlPropertyData &&data)
300 QQmlPropertyData *old = findNamedProperty(name);
301 const OverrideResult overrideResult = handleOverride(name, &data, old);
302 if (overrideResult == InvalidOverride) {
304 propertyIndexCache.append(*old);
305 return overrideResult;
308 const int index = propertyIndexCache.size();
309 propertyIndexCache.append(std::move(data));
311 setNamedProperty(name, index + propertyOffset(), propertyIndexCache.data() + index);
312 return overrideResult;
315 int propertyIndexCacheStart = 0;
316 QQmlPropertyCache::ConstPtr _parent;
318 IndexCache propertyIndexCache;
319 IndexCache methodIndexCache;
320 IndexCache signalHandlerIndexCache;
321 StringCache stringCache;
322 AllowedRevisionCache allowedRevisionCache;
323 QVector<QQmlEnumData> enumCache;
325 QQmlMetaObjectPointer _metaObject;
326 QByteArray _dynamicClassName;
327 QByteArray _dynamicStringData;
328 QByteArray _listPropertyAssignBehavior;
329 QString _defaultPropertyName;
330 QQmlPropertyCacheMethodArguments *argumentsCache =
nullptr;
331 int methodIndexCacheStart = 0;
332 int signalHandlerIndexCacheStart = 0;
333 int _jsFactoryMethodIndex = -1;