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 quint32 hasConstWrapper: 1;
115 quint32 bindingBitsArraySize : 16;
116 typedef quintptr BindingBitsType;
118 BitsPerType =
sizeof(BindingBitsType) * 8,
119 InlineBindingArraySize = 2
122 BindingBitsType *bindingBits;
123 BindingBitsType bindingBitsValue[InlineBindingArraySize];
127 QAtomicInteger<quint64> connectionMask;
128 QQmlNotifierEndpoint *todo =
nullptr;
129 QQmlNotifierEndpoint**notifies =
nullptr;
130 quint16 maximumTodoIndex = 0;
131 quint16 notifiesSize = 0;
134 void layout(QQmlNotifierEndpoint*);
136 QAtomicPointer<NotifyList> notifyList;
138 inline QQmlNotifierEndpoint *notify(
int index)
const;
139 void addNotify(
int index, QQmlNotifierEndpoint *);
140 int endpointCount(
int index);
141 bool signalHasEndpoint(
int index)
const;
143 enum class DeleteNotifyList { Yes, No };
144 void disconnectNotifiers(DeleteNotifyList doDelete);
147 QQmlContextData *context =
nullptr;
149 QQmlContextData *outerContext =
nullptr;
150 QQmlRefPointer<QQmlContextData> ownContext;
152 QQmlAbstractBinding *bindings =
nullptr;
153 QQmlBoundSignal *signalHandlers =
nullptr;
154 std::vector<QQmlPropertyObserver> propertyObservers;
157 QQmlData *nextContextObject =
nullptr;
158 QQmlData**prevContextObject =
nullptr;
160 inline bool hasBindingBit(
int)
const;
161 inline void setBindingBit(QObject *obj,
int);
162 inline void clearBindingBit(
int);
164 inline bool hasPendingBindingBit(
int index)
const;
165 inline void setPendingBindingBit(QObject *obj,
int);
166 inline void clearPendingBindingBit(
int);
168 quint16 lineNumber = 0;
169 quint16 columnNumber = 0;
171 quint32 jsEngineId = 0;
173 struct DeferredData {
176 unsigned int deferredIdx;
177 QMultiHash<
int,
const QV4::CompiledData::Binding *> bindings;
180 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
183 QQmlRefPointer<QQmlContextData> context;
185
186
187 QString inlineComponentName;
188 Q_DISABLE_COPY(DeferredData);
190 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
191 QVector<DeferredData *> deferredData;
193 void deferData(
int objectIndex,
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &,
194 const QQmlRefPointer<QQmlContextData> &,
const QString &inlineComponentName);
195 void releaseDeferredData();
197 QV4::WeakValue jsWrapper;
199 QQmlPropertyCache::ConstPtr propertyCache;
201 QQmlGuardImpl *guards =
nullptr;
203 static QQmlData *get(QObjectPrivate *priv,
bool create) {
206 if (priv->isDeletingChildren || priv->wasDeleted) {
209 }
else if (priv->declarativeData) {
210 return static_cast<QQmlData *>(priv->declarativeData);
212 return createQQmlData(priv);
218 static QQmlData *get(
const QObjectPrivate *priv) {
221 if (priv->isDeletingChildren || priv->wasDeleted)
223 if (priv->declarativeData)
224 return static_cast<QQmlData *>(priv->declarativeData);
228 static QQmlData *get(QObject *object,
bool create) {
229 return QQmlData::get(QObjectPrivate::get(object), create);
232 static QQmlData *get(
const QObject *object) {
233 return QQmlData::get(QObjectPrivate::get(object));
237 static bool keepAliveDuringGarbageCollection(
const QObject *object) {
238 QQmlData *ddata = get(object);
239 if (!ddata || ddata->indestructible || ddata->rootObjectInCreation)
244 bool hasExtendedData()
const {
return extendedData !=
nullptr; }
245 QHash<QQmlAttachedPropertiesFunc, QObject *> *attachedProperties()
const;
247 static inline bool wasDeleted(
const QObject *);
248 static inline bool wasDeleted(
const QObjectPrivate *);
250 static void markAsDeleted(QObject *);
251 static void setQueuedForDeletion(QObject *);
253 static inline void flushPendingBinding(QObject *object,
int coreIndex);
254 void flushPendingBinding(
int coreIndex);
256 static QQmlPropertyCache::ConstPtr ensurePropertyCache(QObject *object)
258 QQmlData *ddata = QQmlData::get(object,
true);
259 if (Q_LIKELY(ddata->propertyCache))
260 return ddata->propertyCache;
261 return createPropertyCache(object);
264 Q_ALWAYS_INLINE
static uint offsetForBit(
int bit) {
return static_cast<uint>(bit) / BitsPerType; }
265 Q_ALWAYS_INLINE
static BindingBitsType bitFlagForBit(
int bit) {
return BindingBitsType(1) << (
static_cast<uint>(bit) & (BitsPerType - 1)); }
269 mutable QQmlDataExtended *extendedData =
nullptr;
271 Q_NEVER_INLINE
static QQmlData *createQQmlData(QObjectPrivate *priv);
272 Q_NEVER_INLINE
static QQmlPropertyCache::ConstPtr createPropertyCache(QObject *object);
274 Q_ALWAYS_INLINE
bool hasBitSet(
int bit)
const
276 uint offset = offsetForBit(bit);
277 if (bindingBitsArraySize <= offset)
280 const BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
281 return bits[offset] & bitFlagForBit(bit);
284 Q_ALWAYS_INLINE
void clearBit(
int bit)
286 uint offset = QQmlData::offsetForBit(bit);
287 if (bindingBitsArraySize > offset) {
288 BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
289 bits[offset] &= ~QQmlData::bitFlagForBit(bit);
293 Q_ALWAYS_INLINE
void setBit(QObject *obj,
int bit)
295 uint offset = QQmlData::offsetForBit(bit);
296 BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
297 if (Q_UNLIKELY(bindingBitsArraySize <= offset))
298 bits = growBits(obj, bit);
299 bits[offset] |= QQmlData::bitFlagForBit(bit);
302 Q_NEVER_INLINE BindingBitsType *growBits(QObject *obj,
int bit);
304 Q_DISABLE_COPY_MOVE(QQmlData);