36 static QQmlRefPointer<QQmlContextData> createRefCounted(
37 const QQmlRefPointer<QQmlContextData> &parent)
39 return QQmlRefPointer<QQmlContextData>(
new QQmlContextData(RefCounted,
nullptr, parent),
40 QQmlRefPointer<QQmlContextData>::Adopt);
44 static QQmlRefPointer<QQmlContextData> createChild(
45 const QQmlRefPointer<QQmlContextData> &parent)
47 Q_ASSERT(!parent.isNull());
48 return QQmlRefPointer<QQmlContextData>(
new QQmlContextData(OwnedByParent,
nullptr, parent));
51 void addref()
const { ++m_refCount; }
52 void release()
const {
if (--m_refCount == 0)
delete this; }
53 int count()
const {
return m_refCount; }
54 int refCount()
const {
return m_refCount; }
56 QQmlRefPointer<QV4::ExecutableCompilationUnit> typeCompilationUnit()
const
58 return m_typeCompilationUnit;
60 void initFromTypeCompilationUnit(
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
61 int subComponentIndex);
63 static QQmlRefPointer<QQmlContextData> get(QQmlContext *context) {
64 return QQmlContextPrivate::get(context)->m_data;
67 void emitDestruction();
69 void clearContextRecursively();
74 return m_engine && (!m_isInternal || !m_contextObject
75 || !QObjectPrivate::get(m_contextObject)->wasDeleted);
78 bool isInternal()
const {
return m_isInternal; }
79 void setInternal(
bool isInternal) { m_isInternal = isInternal; }
81 bool isJSContext()
const {
return m_isJSContext; }
82 void setJSContext(
bool isJSContext) { m_isJSContext = isJSContext; }
84 bool isPragmaLibraryContext()
const {
return m_isPragmaLibraryContext; }
85 void setPragmaLibraryContext(
bool library) { m_isPragmaLibraryContext = library; }
87 QQmlRefPointer<QQmlContextData> parent()
const {
return m_parent; }
94 if (m_ownedByParent) {
95 m_ownedByParent =
false;
100 void refreshExpressions();
102 void addOwnedObject(QQmlData *ownedObject);
103 QQmlData *ownedObjects()
const {
return m_ownedObjects; }
104 void setOwnedObjects(QQmlData *ownedObjects) { m_ownedObjects = ownedObjects; }
110 void installContext(QQmlData *ddata, QmlObjectKind kind);
112 QUrl resolvedUrl(
const QUrl &)
const;
116 QQmlContext *asQQmlContext()
118 if (!m_publicContext)
119 m_publicContext =
new QQmlContext(*
new QQmlContextPrivate(
this));
120 return m_publicContext;
123 QQmlContextPrivate *asQQmlContextPrivate()
125 return QQmlContextPrivate::get(asQQmlContext());
128 QObject *contextObject()
const {
return m_contextObject; }
129 void setContextObject(QObject *contextObject) { m_contextObject = contextObject; }
131 template<
typename HandleSelf,
typename HandleLinked>
132 void deepClearContextObject(
133 QObject *contextObject, HandleSelf &&handleSelf, HandleLinked &&handleLinked) {
134 for (QQmlContextData *lc = m_linkedContext.data(); lc; lc = lc->m_linkedContext.data()) {
136 if (lc->m_contextObject == contextObject)
137 lc->m_contextObject =
nullptr;
141 if (m_contextObject == contextObject)
142 m_contextObject =
nullptr;
145 void deepClearContextObject(QObject *contextObject)
147 deepClearContextObject(
149 [](QQmlContextData *self) { self->emitDestruction(); },
150 [](QQmlContextData *){});
153 QQmlEngine *engine()
const {
return m_engine; }
154 void setEngine(QQmlEngine *engine) { m_engine = engine; }
156 QQmlContext *publicContext()
const {
return m_publicContext; }
157 void clearPublicContext()
159 if (!m_publicContext)
162 m_publicContext =
nullptr;
163 if (m_ownedByPublicContext) {
164 m_ownedByPublicContext =
false;
169 int propertyIndex(
const QString &name)
const
171 ensurePropertyNames();
172 return m_propertyNameCache.value(name);
175 int propertyIndex(QV4::String *name)
const
177 ensurePropertyNames();
178 return m_propertyNameCache.value(name);
181 QString propertyName(
int index)
const
183 ensurePropertyNames();
184 return m_propertyNameCache.findId(index);
187 void addPropertyNameAndIndex(
const QString &name,
int index)
189 Q_ASSERT(!m_propertyNameCache.isEmpty());
190 m_propertyNameCache.add(name, index);
193 void setExpressions(QQmlJavaScriptExpression *expressions) { m_expressions = expressions; }
194 QQmlJavaScriptExpression *takeExpressions()
196 QQmlJavaScriptExpression *expressions = m_expressions;
197 m_expressions =
nullptr;
201 void setChildContexts(
const QQmlRefPointer<QQmlContextData> &childContexts)
203 m_childContexts = childContexts.data();
205 QQmlRefPointer<QQmlContextData> childContexts()
const {
return m_childContexts; }
206 QQmlRefPointer<QQmlContextData> takeChildContexts()
208 QQmlRefPointer<QQmlContextData> childContexts = m_childContexts;
209 m_childContexts =
nullptr;
210 return childContexts;
212 QQmlRefPointer<QQmlContextData> nextChild()
const {
return m_nextChild; }
214 int numIdValues()
const {
return m_idValueCount; }
215 void setIdValue(
int index, QObject *idValue);
216 bool isIdValueSet(
int index)
const {
return m_idValues[index].wasSet(); }
217 QQmlNotifier *idValueBindings(
int index)
const {
return m_idValues[index].bindings(); }
218 QObject *idValue(
int index)
const {
return m_idValues[index].data(); }
221 QString findObjectId(
const QObject *obj)
const;
229 QString urlString()
const;
231 void setBaseUrlString(
const QString &baseUrlString) { m_baseUrlString = baseUrlString; }
232 QString baseUrlString()
const
234 for (
const QQmlContextData *data =
this; data; data = data->m_parent) {
235 if (!data->m_baseUrlString.isEmpty())
236 return data->m_baseUrlString;
237 if (data->m_typeCompilationUnit)
238 return data->m_typeCompilationUnit->finalUrlString();
243 void setBaseUrl(
const QUrl &baseUrl) { m_baseUrl = baseUrl; }
246 for (
const QQmlContextData *data =
this; data; data = data->m_parent) {
247 if (!data->m_baseUrl.isEmpty())
248 return data->m_baseUrl;
249 if (data->m_typeCompilationUnit)
250 return data->m_typeCompilationUnit->finalUrl();
255 QQmlRefPointer<QQmlTypeNameCache> imports()
const {
return m_imports; }
256 void setImports(
const QQmlRefPointer<QQmlTypeNameCache> &imports) { m_imports = imports; }
258 QQmlIncubatorPrivate *incubator()
const {
return m_hasExtraObject ?
nullptr : m_incubator; }
259 void setIncubator(QQmlIncubatorPrivate *incubator)
261 Q_ASSERT(!m_hasExtraObject || m_extraObject ==
nullptr);
262 m_hasExtraObject =
false;
263 m_incubator = incubator;
266 QObject *extraObject()
const {
return m_hasExtraObject ? m_extraObject :
nullptr; }
267 void setExtraObject(QObject *extraObject)
269 Q_ASSERT(m_hasExtraObject || m_incubator ==
nullptr);
270 m_hasExtraObject =
true;
271 m_extraObject = extraObject;
274 bool isRootObjectInCreation()
const {
return m_isRootObjectInCreation; }
275 void setRootObjectInCreation(
bool rootInCreation) { m_isRootObjectInCreation = rootInCreation; }
277 QV4::ReturnedValue importedScripts()
const
279 if (m_hasWeakImportedScripts)
280 return m_weakImportedScripts.value();
282 return m_importedScripts.value();
284 void setImportedScripts(QV4::ExecutionEngine *engine, QV4::Value scripts) {
286 Q_ASSERT(!m_hasWeakImportedScripts);
287 m_importedScripts.set(engine, scripts);
291
292
293
294
295 void setImportedScripts(QV4::ExecutionEngine *engine, QV4::ReturnedValue scripts) {
297 Q_ASSERT(!m_hasWeakImportedScripts);
298 m_importedScripts.set(engine, scripts);
301 QQmlRefPointer<QQmlContextData> linkedContext()
const {
return m_linkedContext; }
302 void setLinkedContext(
const QQmlRefPointer<QQmlContextData> &context) { m_linkedContext = context; }
304 bool hasUnresolvedNames()
const {
return m_unresolvedNames; }
305 void setUnresolvedNames(
bool hasUnresolvedNames) { m_unresolvedNames = hasUnresolvedNames; }
307 QQmlComponentAttached *componentAttacheds()
const {
return m_componentAttacheds; }
308 void addComponentAttached(QQmlComponentAttached *attached);
310 void addExpression(QQmlJavaScriptExpression *expression);
312 bool valueTypesAreAddressable()
const {
313 return m_typeCompilationUnit && m_typeCompilationUnit->valueTypesAreAddressable();
316 bool valueTypesAreAssertable()
const {
317 return m_typeCompilationUnit && m_typeCompilationUnit->valueTypesAreAssertable();
321 friend class QQmlGuardedContextData;
322 friend class QQmlContextPrivate;
331 struct ContextGuard :
public QQmlGuard<QObject>
338 inline ContextGuard() : QQmlGuard<QObject>(&ContextGuard::objectDestroyedImpl,
nullptr), m_context(
nullptr) {}
339 inline ContextGuard &operator=(QObject *obj);
341 inline bool wasSet()
const;
343 QQmlNotifier *bindings() {
return &m_bindings; }
344 void setContext(
const QQmlRefPointer<QQmlContextData> &context)
346 m_context = context.data();
350 inline static void objectDestroyedImpl(QQmlGuardImpl *);
352 QTaggedPointer<QQmlContextData, Tag> m_context;
353 QQmlNotifier m_bindings;
359 Ownership ownership, QQmlContext *publicContext,
360 const QQmlRefPointer<QQmlContextData> &parent, QQmlEngine *engine =
nullptr)
361 : m_parent(parent.data()),
362 m_engine(engine ? engine : (parent.isNull() ?
nullptr : parent->engine())),
363 m_isInternal(
false), m_isJSContext(
false), m_isPragmaLibraryContext(
false),
364 m_unresolvedNames(
false), m_hasEmittedDestruction(
false), m_isRootObjectInCreation(
false),
365 m_ownedByParent(ownership == OwnedByParent),
366 m_ownedByPublicContext(ownership == OwnedByPublicContext), m_hasExtraObject(
false),
367 m_hasWeakImportedScripts(
false), m_dummy(0), m_publicContext(publicContext), m_incubator(
nullptr)
369 Q_ASSERT(!m_ownedByParent || !m_ownedByPublicContext);
373 m_nextChild = m_parent->m_childContexts;
375 m_nextChild->m_prevChild = &m_nextChild;
376 m_prevChild = &m_parent->m_childContexts;
377 m_parent->m_childContexts =
this;
382 bool hasExpressionsToRun(
bool isGlobalRefresh)
const
384 return m_expressions && (!isGlobalRefresh || m_unresolvedNames);
387 void refreshExpressionsRecursive(
bool isGlobal);
388 void refreshExpressionsRecursive(QQmlJavaScriptExpression *);
389 void initPropertyNames()
const;
391 void ensurePropertyNames()
const
393 if (m_propertyNameCache.isEmpty())
395 Q_ASSERT(!m_propertyNameCache.isEmpty());
399 QQmlContextData *m_parent =
nullptr;
400 QQmlEngine *m_engine =
nullptr;
402 mutable quint32 m_refCount = 1;
403 quint32 m_isInternal:1;
404 quint32 m_isJSContext:1;
405 quint32 m_isPragmaLibraryContext:1;
406 quint32 m_unresolvedNames:1;
407 quint32 m_hasEmittedDestruction:1;
408 quint32 m_isRootObjectInCreation:1;
409 quint32 m_ownedByParent:1;
410 quint32 m_ownedByPublicContext:1;
411 quint32 m_hasExtraObject:1;
412 quint32 m_hasWeakImportedScripts:1;
413 Q_DECL_UNUSED_MEMBER quint32 m_dummy:22;
414 QQmlContext *m_publicContext =
nullptr;
418 QQmlIncubatorPrivate *m_incubator;
420 QObject *m_extraObject;
424 QQmlRefPointer<QV4::ExecutableCompilationUnit> m_typeCompilationUnit;
427 int m_componentObjectIndex = -1;
430 mutable QV4::IdentifierHash m_propertyNameCache;
433 QObject *m_contextObject =
nullptr;
438
439
440
441 QV4::PersistentValue m_importedScripts = {};
442 QV4::WeakValue m_weakImportedScripts;
446 QString m_baseUrlString;
449 QQmlRefPointer<QQmlTypeNameCache> m_imports;
452 QQmlContextData *m_childContexts =
nullptr;
455 QQmlContextData *m_nextChild =
nullptr;
456 QQmlContextData **m_prevChild =
nullptr;
459 QQmlJavaScriptExpression *m_expressions =
nullptr;
462 QQmlData *m_ownedObjects =
nullptr;
465 QQmlGuardedContextData *m_contextGuards =
nullptr;
467 ContextGuard *m_idValues =
nullptr;
468 int m_idValueCount = 0;
471 QQmlRefPointer<QQmlContextData> m_linkedContext;
474 QQmlComponentAttached *m_componentAttacheds =
nullptr;