55class Q_QML_EXPORT
QQmlData :
public QAbstractDeclarativeData
58 enum Ownership { DoesNotOwnMemory, OwnsMemory };
60 QQmlData(Ownership ownership);
63 static inline void init() {
64 static bool initialized =
false;
67 QAbstractDeclarativeData::destroyed = destroyed;
68 QAbstractDeclarativeData::signalEmitted = signalEmitted;
69 QAbstractDeclarativeData::receivers = receivers;
70 QAbstractDeclarativeData::isSignalConnected = isSignalConnected;
74 static void destroyed(QAbstractDeclarativeData *, QObject *);
75 static void signalEmitted(QAbstractDeclarativeData *, QObject *,
int,
void **);
76 static int receivers(QAbstractDeclarativeData *,
const QObject *,
int);
77 static bool isSignalConnected(QAbstractDeclarativeData *,
const QObject *,
int);
79 void destroyed(QObject *);
81 void setImplicitDestructible() {
82 if (!explicitIndestructibleSet) indestructible =
false;
92 quint32 indestructible:1;
95 quint32 explicitIndestructibleSet:1;
98 quint32 hasTaintedV4Object:1;
99 quint32 isQueuedForDeletion:1;
101
102
103
104 quint32 rootObjectInCreation:1;
106 quint32 hasInterceptorMetaObject:1;
107 quint32 hasVMEMetaObject:1;
109
110
111
112
113 quint32 hasConstWrapper: 1;
119 quint32 bindingBitsArraySize : 16;
120 typedef quintptr BindingBitsType;
122 BitsPerType =
sizeof(BindingBitsType) * 8,
123 InlineBindingArraySize = 2
126 BindingBitsType *bindingBits;
127 BindingBitsType bindingBitsValue[InlineBindingArraySize];
131 QAtomicInteger<quint64> connectionMask;
132 QQmlNotifierEndpoint *todo =
nullptr;
133 QQmlNotifierEndpoint**notifies =
nullptr;
134 quint16 maximumTodoIndex = 0;
135 quint16 notifiesSize = 0;
138 void layout(QQmlNotifierEndpoint*);
140 QAtomicPointer<NotifyList> notifyList;
142 inline QQmlNotifierEndpoint *notify(
int index)
const;
143 void addNotify(
int index, QQmlNotifierEndpoint *);
144 int endpointCount(
int index);
145 bool signalHasEndpoint(
int index)
const;
147 enum class DeleteNotifyList { Yes, No };
148 void disconnectNotifiers(DeleteNotifyList doDelete);
151 QQmlContextData *context =
nullptr;
153 QQmlContextData *outerContext =
nullptr;
154 QQmlRefPointer<QQmlContextData> ownContext;
156 QQmlAbstractBinding *bindings =
nullptr;
157 QQmlBoundSignal *signalHandlers =
nullptr;
158 std::vector<QQmlPropertyObserver> propertyObservers;
161 QQmlData *nextContextObject =
nullptr;
162 QQmlData**prevContextObject =
nullptr;
164 inline bool hasBindingBit(
int)
const;
165 inline void setBindingBit(QObject *obj,
int);
166 inline void clearBindingBit(
int);
168 inline bool hasPendingBindingBit(
int index)
const;
169 inline void setPendingBindingBit(QObject *obj,
int);
170 inline void clearPendingBindingBit(
int);
172 quint16 lineNumber = 0;
173 quint16 columnNumber = 0;
175 quint32 jsEngineId = 0;
177 struct DeferredData {
180 unsigned int deferredIdx;
181 QMultiHash<
int,
const QV4::CompiledData::Binding *> bindings;
184 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
187 QQmlRefPointer<QQmlContextData> context;
189
190
191 QString inlineComponentName;
192 Q_DISABLE_COPY(DeferredData);
194 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
195 QVector<DeferredData *> deferredData;
197 void deferData(
int objectIndex,
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &,
198 const QQmlRefPointer<QQmlContextData> &,
const QString &inlineComponentName);
199 void releaseDeferredData();
201 QV4::WeakValue jsWrapper;
203 QQmlPropertyCache::ConstPtr propertyCache;
205 QQmlGuardImpl *guards =
nullptr;
207 static QQmlData *get(QObjectPrivate *priv,
bool create) {
210 if (priv->isDeletingChildren || priv->wasDeleted) {
213 }
else if (priv->declarativeData) {
214 return static_cast<QQmlData *>(priv->declarativeData);
216 return createQQmlData(priv);
222 static QQmlData *get(
const QObjectPrivate *priv) {
225 if (priv->isDeletingChildren || priv->wasDeleted)
227 if (priv->declarativeData)
228 return static_cast<QQmlData *>(priv->declarativeData);
232 static QQmlData *get(QObject *object,
bool create) {
233 return QQmlData::get(QObjectPrivate::get(object), create);
236 static QQmlData *get(
const QObject *object) {
237 return QQmlData::get(QObjectPrivate::get(object));
241 static bool keepAliveDuringGarbageCollection(
const QObject *object) {
242 QQmlData *ddata = get(object);
243 if (!ddata || ddata->indestructible || ddata->rootObjectInCreation)
248 bool hasExtendedData()
const {
return extendedData !=
nullptr; }
249 QHash<QQmlAttachedPropertiesFunc, QObject *> *attachedProperties()
const;
251 static inline bool wasDeleted(
const QObject *);
252 static inline bool wasDeleted(
const QObjectPrivate *);
254 static void markAsDeleted(QObject *);
255 static void setQueuedForDeletion(QObject *);
257 static inline void flushPendingBinding(QObject *object,
int coreIndex);
258 void flushPendingBinding(
int coreIndex);
260 static QQmlPropertyCache::ConstPtr ensurePropertyCache(QObject *object)
262 QQmlData *ddata = QQmlData::get(object,
true);
263 if (Q_LIKELY(ddata->propertyCache))
264 return ddata->propertyCache;
265 return createPropertyCache(object);
268 Q_ALWAYS_INLINE
static uint offsetForBit(
int bit) {
return static_cast<uint>(bit) / BitsPerType; }
269 Q_ALWAYS_INLINE
static BindingBitsType bitFlagForBit(
int bit) {
return BindingBitsType(1) << (
static_cast<uint>(bit) & (BitsPerType - 1)); }
273 mutable QQmlDataExtended *extendedData =
nullptr;
275 Q_NEVER_INLINE
static QQmlData *createQQmlData(QObjectPrivate *priv);
276 Q_NEVER_INLINE
static QQmlPropertyCache::ConstPtr createPropertyCache(QObject *object);
278 Q_ALWAYS_INLINE
bool hasBitSet(
int bit)
const
280 uint offset = offsetForBit(bit);
281 if (bindingBitsArraySize <= offset)
284 const BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
285 return bits[offset] & bitFlagForBit(bit);
288 Q_ALWAYS_INLINE
void clearBit(
int bit)
290 uint offset = QQmlData::offsetForBit(bit);
291 if (bindingBitsArraySize > offset) {
292 BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
293 bits[offset] &= ~QQmlData::bitFlagForBit(bit);
297 Q_ALWAYS_INLINE
void setBit(QObject *obj,
int bit)
299 uint offset = QQmlData::offsetForBit(bit);
300 BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
301 if (Q_UNLIKELY(bindingBitsArraySize <= offset))
302 bits = growBits(obj, bit);
303 bits[offset] |= QQmlData::bitFlagForBit(bit);
306 Q_NEVER_INLINE BindingBitsType *growBits(QObject *obj,
int bit);
308 Q_DISABLE_COPY_MOVE(QQmlData);