57class Q_QML_EXPORT
QQmlData :
public QAbstractDeclarativeData
60 enum Ownership { DoesNotOwnMemory, OwnsMemory };
62 QQmlData(Ownership ownership);
65 static inline void init() {
66 static bool initialized =
false;
69 QAbstractDeclarativeData::destroyed = destroyed;
70 QAbstractDeclarativeData::signalEmitted = signalEmitted;
71 QAbstractDeclarativeData::receivers = receivers;
72 QAbstractDeclarativeData::isSignalConnected = isSignalConnected;
76 static void destroyed(QAbstractDeclarativeData *, QObject *);
77 static void signalEmitted(QAbstractDeclarativeData *, QObject *,
int,
void **);
78 static int receivers(QAbstractDeclarativeData *,
const QObject *,
int);
79 static bool isSignalConnected(QAbstractDeclarativeData *,
const QObject *,
int);
81 void destroyed(QObject *);
83 void setImplicitDestructible() {
84 if (!explicitIndestructibleSet) indestructible =
false;
94 quint32 indestructible:1;
97 quint32 explicitIndestructibleSet:1;
100 quint32 hasTaintedV4Object:1;
101 quint32 isQueuedForDeletion:1;
103
104
105
106 quint32 rootObjectInCreation:1;
108 quint32 hasInterceptorMetaObject:1;
109 quint32 hasVMEMetaObject:1;
111
112
113
114
115 quint32 hasConstWrapper: 1;
121 quint32 bindingBitsArraySize : 16;
122 typedef quintptr BindingBitsType;
124 BitsPerType =
sizeof(BindingBitsType) * 8,
125 InlineBindingArraySize = 2
128 BindingBitsType *bindingBits;
129 BindingBitsType bindingBitsValue[InlineBindingArraySize];
133 QAtomicInteger<quint64> connectionMask;
134 QQmlNotifierEndpoint *todo =
nullptr;
135 QQmlNotifierEndpoint**notifies =
nullptr;
136 quint16 maximumTodoIndex = 0;
137 quint16 notifiesSize = 0;
140 void layout(QQmlNotifierEndpoint*);
142 QAtomicPointer<NotifyList> notifyList;
144 inline QQmlNotifierEndpoint *notify(
int index)
const;
145 void addNotify(
int index, QQmlNotifierEndpoint *);
146 int endpointCount(
int index);
147 bool signalHasEndpoint(
int index)
const;
149 enum class DeleteNotifyList { Yes, No };
150 void disconnectNotifiers(DeleteNotifyList doDelete);
153 QQmlContextData *context =
nullptr;
155 QQmlContextData *outerContext =
nullptr;
156 QQmlRefPointer<QQmlContextData> ownContext;
158 QQmlAbstractBinding *bindings =
nullptr;
159 QQmlBoundSignal *signalHandlers =
nullptr;
160 std::vector<QQmlPropertyObserver> propertyObservers;
163 QQmlData *nextContextObject =
nullptr;
164 QQmlData**prevContextObject =
nullptr;
166 inline bool hasBindingBit(
int)
const;
167 inline void setBindingBit(QObject *obj,
int);
168 inline void clearBindingBit(
int);
170 inline bool hasPendingBindingBit(
int index)
const;
171 inline void setPendingBindingBit(QObject *obj,
int);
172 inline void clearPendingBindingBit(
int);
174 quint16 lineNumber = 0;
175 quint16 columnNumber = 0;
177 quint32 jsEngineId = 0;
179 struct DeferredData {
182 unsigned int deferredIdx;
183 QMultiHash<
int,
const QV4::CompiledData::Binding *> bindings;
186 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
189 QQmlRefPointer<QQmlContextData> context;
191
192
193 QString inlineComponentName;
194 Q_DISABLE_COPY(DeferredData);
196 QQmlRefPointer<QV4::ExecutableCompilationUnit> compilationUnit;
197 QList<DeferredData *> deferredData;
199 void deferData(
int objectIndex,
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &,
200 const QQmlRefPointer<QQmlContextData> &,
const QString &inlineComponentName);
201 void releaseDeferredData();
203 QV4::WeakValue jsWrapper;
205 QQmlPropertyCache::ConstPtr propertyCache;
207 QQmlGuardImpl *guards =
nullptr;
209 static QQmlData *get(QObjectPrivate *priv,
bool create) {
212 if (priv->isDeletingChildren || priv->wasDeleted) {
215 }
else if (priv->declarativeData) {
216 return static_cast<QQmlData *>(priv->declarativeData);
218 return createQQmlData(priv);
224 static QQmlData *get(
const QObjectPrivate *priv) {
227 if (priv->isDeletingChildren || priv->wasDeleted)
229 if (priv->declarativeData)
230 return static_cast<QQmlData *>(priv->declarativeData);
234 static QQmlData *get(QObject *object,
bool create) {
235 return QQmlData::get(QObjectPrivate::get(object), create);
238 static QQmlData *get(
const QObject *object) {
239 return QQmlData::get(QObjectPrivate::get(object));
243 static bool keepAliveDuringGarbageCollection(
const QObject *object) {
244 QQmlData *ddata = get(object);
245 if (!ddata || ddata->indestructible || ddata->rootObjectInCreation)
250 bool hasExtendedData()
const {
return extendedData !=
nullptr; }
251 QHash<QQmlAttachedPropertiesFunc, QObject *> *attachedProperties()
const;
253 static inline bool wasDeleted(
const QObject *);
254 static inline bool wasDeleted(
const QObjectPrivate *);
256 static void markAsDeleted(QObject *);
257 static void setQueuedForDeletion(QObject *);
259 static inline void flushPendingBinding(QObject *object,
int coreIndex);
260 void flushPendingBinding(
int coreIndex);
262 static QQmlPropertyCache::ConstPtr ensurePropertyCache(QObject *object)
264 QQmlData *ddata = QQmlData::get(object,
true);
265 if (Q_LIKELY(ddata->propertyCache))
266 return ddata->propertyCache;
267 return createPropertyCache(object);
270 Q_ALWAYS_INLINE
static uint offsetForBit(
int bit) {
return static_cast<uint>(bit) / BitsPerType; }
271 Q_ALWAYS_INLINE
static BindingBitsType bitFlagForBit(
int bit) {
return BindingBitsType(1) << (
static_cast<uint>(bit) & (BitsPerType - 1)); }
275 mutable QQmlDataExtended *extendedData =
nullptr;
277 Q_NEVER_INLINE
static QQmlData *createQQmlData(QObjectPrivate *priv);
278 Q_NEVER_INLINE
static QQmlPropertyCache::ConstPtr createPropertyCache(QObject *object);
280 void removeFromContext();
281 void clearBindings();
282 bool clearSignalHandlers();
284 Q_ALWAYS_INLINE
bool hasBitSet(
int bit)
const
286 uint offset = offsetForBit(bit);
287 if (bindingBitsArraySize <= offset)
290 const BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
291 return bits[offset] & bitFlagForBit(bit);
294 Q_ALWAYS_INLINE
void clearBit(
int bit)
296 uint offset = QQmlData::offsetForBit(bit);
297 if (bindingBitsArraySize > offset) {
298 BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
299 bits[offset] &= ~QQmlData::bitFlagForBit(bit);
303 Q_ALWAYS_INLINE
void setBit(QObject *obj,
int bit)
305 uint offset = QQmlData::offsetForBit(bit);
306 BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits;
307 if (Q_UNLIKELY(bindingBitsArraySize <= offset))
308 bits = growBits(obj, bit);
309 bits[offset] |= QQmlData::bitFlagForBit(bit);
312 Q_NEVER_INLINE BindingBitsType *growBits(QObject *obj,
int bit);
314 Q_DISABLE_COPY_MOVE(QQmlData);