4#ifndef QQMLCONTEXTDATA_P_H
5#define QQMLCONTEXTDATA_P_H
18#include <QtQml/private/qtqmlglobal_p.h>
19#include <QtQml/private/qqmlcontext_p.h>
20#include <QtQml/private/qqmlguard_p.h>
21#include <QtQml/private/qqmltypenamecache_p.h>
22#include <QtQml/private/qqmlnotifier_p.h>
23#include <QtQml/private/qv4identifierhash_p.h>
24#include <QtQml/private/qv4executablecompilationunit_p.h>
37 const QQmlRefPointer<QQmlContextData> &parent)
39 return QQmlRefPointer<QQmlContextData>(
new QQmlContextData(RefCounted,
nullptr, parent),
45 const QQmlRefPointer<QQmlContextData> &parent)
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; }
58 return m_typeCompilationUnit;
60 void initFromTypeCompilationUnit(
const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit,
61 int subComponentIndex);
67 void emitDestruction();
69 void clearContextRecursively();
74 return m_engine && (!m_isInternal || !m_contextObject
79 void setInternal(
bool isInternal) { m_isInternal = isInternal; }
82 void setJSContext(
bool isJSContext) { m_isJSContext = isJSContext; }
87 QQmlRefPointer<QQmlContextData>
parent()
const {
return m_parent; }
94 if (m_ownedByParent) {
95 m_ownedByParent =
false;
100 void refreshExpressions();
102 void addOwnedObject(
QQmlData *ownedObject);
110 void installContext(
QQmlData *ddata, QmlObjectKind kind);
118 if (!m_publicContext)
120 return m_publicContext;
131 template<
typename HandleSelf,
typename HandleLinked>
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;
147 deepClearContextObject(
159 if (!m_publicContext)
162 m_publicContext =
nullptr;
163 if (m_ownedByPublicContext) {
164 m_ownedByPublicContext =
false;
171 ensurePropertyNames();
172 return m_propertyNameCache.value(
name);
177 ensurePropertyNames();
178 return m_propertyNameCache.value(
name);
183 ensurePropertyNames();
184 return m_propertyNameCache.findId(
index);
189 Q_ASSERT(!m_propertyNameCache.isEmpty());
197 m_expressions =
nullptr;
203 m_childContexts = childContexts.data();
205 QQmlRefPointer<QQmlContextData>
childContexts()
const {
return m_childContexts; }
208 QQmlRefPointer<QQmlContextData> childContexts = m_childContexts;
209 m_childContexts =
nullptr;
210 return childContexts;
212 QQmlRefPointer<QQmlContextData>
nextChild()
const {
return m_nextChild; }
235 if (!
data->m_baseUrlString.isEmpty())
236 return data->m_baseUrlString;
237 if (
data->m_typeCompilationUnit)
238 return data->m_typeCompilationUnit->finalUrlString();
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; }
261 Q_ASSERT(!m_hasExtraObject || m_extraObject ==
nullptr);
262 m_hasExtraObject =
false;
263 m_incubator = incubator;
269 Q_ASSERT(m_hasExtraObject || m_incubator ==
nullptr);
270 m_hasExtraObject =
true;
271 m_extraObject = extraObject;
280 QQmlRefPointer<QQmlContextData>
linkedContext()
const {
return m_linkedContext; }
292 return m_typeCompilationUnit && m_typeCompilationUnit->valueTypesAreAddressable();
306 struct ContextGuard :
public QQmlGuard<QObject>
316 inline bool wasSet()
const;
319 void setContext(
const QQmlRefPointer<QQmlContextData> &
context)
327 QTaggedPointer<QQmlContextData, Tag> m_context;
335 const QQmlRefPointer<QQmlContextData> &parent,
QQmlEngine *
engine =
nullptr)
336 : m_parent(parent.
data()),
338 m_isInternal(
false), m_isJSContext(
false), m_isPragmaLibraryContext(
false),
339 m_unresolvedNames(
false), m_hasEmittedDestruction(
false), m_isRootObjectInCreation(
false),
340 m_ownedByParent(ownership == OwnedByParent),
341 m_ownedByPublicContext(ownership == OwnedByPublicContext), m_hasExtraObject(
false),
342 m_dummy(0), m_publicContext(publicContext), m_incubator(
nullptr)
344 Q_ASSERT(!m_ownedByParent || !m_ownedByPublicContext);
348 m_nextChild = m_parent->m_childContexts;
350 m_nextChild->m_prevChild = &m_nextChild;
351 m_prevChild = &m_parent->m_childContexts;
352 m_parent->m_childContexts =
this;
357 bool hasExpressionsToRun(
bool isGlobalRefresh)
const
359 return m_expressions && (!isGlobalRefresh || m_unresolvedNames);
362 void refreshExpressionsRecursive(
bool isGlobal);
364 void initPropertyNames()
const;
366 void ensurePropertyNames()
const
368 if (m_propertyNameCache.isEmpty())
370 Q_ASSERT(!m_propertyNameCache.isEmpty());
377 mutable quint32 m_refCount = 1;
380 quint32 m_isPragmaLibraryContext:1;
382 quint32 m_hasEmittedDestruction:1;
383 quint32 m_isRootObjectInCreation:1;
385 quint32 m_ownedByPublicContext:1;
398 QQmlRefPointer<QV4::ExecutableCompilationUnit> m_typeCompilationUnit;
401 int m_componentObjectIndex = -1;
407 QObject *m_contextObject =
nullptr;
416 QQmlRefPointer<QQmlTypeNameCache> m_imports;
434 ContextGuard *m_idValues =
nullptr;
435 int m_idValueCount = 0;
438 QQmlRefPointer<QQmlContextData> m_linkedContext;
444QQmlContextData::ContextGuard &QQmlContextData::ContextGuard::operator=(
QObject *
obj)
447 m_context.
setTag(ObjectWasSet);
452 void QQmlContextData::ContextGuard::objectDestroyedImpl(
QQmlGuardImpl *impl)
454 auto This =
static_cast<QQmlContextData::ContextGuard *
>(impl);
457 This->m_bindings.notify();
461bool QQmlContextData::ContextGuard::wasSet()
const
463 return m_context.tag() == ObjectWasSet;
static QObjectPrivate * get(QObject *o)
QObject * idValue(int index) const
void setContextObject(QObject *contextObject)
bool hasUnresolvedNames() const
void setRootObjectInCreation(bool rootInCreation)
void deepClearContextObject(QObject *contextObject, HandleSelf &&handleSelf, HandleLinked &&handleLinked)
int propertyIndex(const QString &name) const
void setOwnedObjects(QQmlData *ownedObjects)
void deepClearContextObject(QObject *contextObject)
QQmlContext * asQQmlContext()
void setInternal(bool isInternal)
QQmlRefPointer< QQmlTypeNameCache > imports() const
void setExtraObject(QObject *extraObject)
static QQmlRefPointer< QQmlContextData > get(QQmlContext *context)
bool valueTypesAreAddressable() const
QQmlData * ownedObjects() const
QV4::PersistentValue importedScripts() const
void setEngine(QQmlEngine *engine)
QObject * contextObject() const
QQmlRefPointer< QQmlContextData > nextChild() const
QQmlIncubatorPrivate * incubator() const
void setUnresolvedNames(bool hasUnresolvedNames)
QQmlRefPointer< QQmlContextData > takeChildContexts()
void clearPublicContext()
QQmlIncubatorPrivate * m_incubator
void setPragmaLibraryContext(bool library)
void setImportedScripts(const QV4::PersistentValue &scripts)
QString baseUrlString() const
QQmlNotifier * idValueBindings(int index) const
void setLinkedContext(const QQmlRefPointer< QQmlContextData > &context)
static QQmlRefPointer< QQmlContextData > createChild(const QQmlRefPointer< QQmlContextData > &parent)
void setBaseUrl(const QUrl &baseUrl)
QQmlComponentAttached * componentAttacheds() const
QObject * extraObject() const
void setImports(const QQmlRefPointer< QQmlTypeNameCache > &imports)
void setIncubator(QQmlIncubatorPrivate *incubator)
QQmlRefPointer< QQmlContextData > childContexts() const
void setExpressions(QQmlJavaScriptExpression *expressions)
void addPropertyNameAndIndex(const QString &name, int index)
void setBaseUrlString(const QString &baseUrlString)
static QQmlRefPointer< QQmlContextData > createRefCounted(const QQmlRefPointer< QQmlContextData > &parent)
int propertyIndex(QV4::String *name) const
bool isIdValueSet(int index) const
QQmlRefPointer< QV4::ExecutableCompilationUnit > typeCompilationUnit() const
QQmlRefPointer< QQmlContextData > linkedContext() const
QQmlContext * publicContext() const
QQmlJavaScriptExpression * takeExpressions()
bool isPragmaLibraryContext() const
QQmlRefPointer< QQmlContextData > parent() const
void setChildContexts(const QQmlRefPointer< QQmlContextData > &childContexts)
void setJSContext(bool isJSContext)
QQmlEngine * engine() const
QQmlContextPrivate * asQQmlContextPrivate()
bool isRootObjectInCreation() const
QString propertyName(int index) const
static QQmlContextPrivate * get(QQmlContext *context)
The QQmlContext class defines a context within a QML engine.
The QQmlEngine class provides an environment for instantiating QML components.
QQmlGuard< T > & operator=(const QQmlGuard< T > &o)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
#define Q_DECL_UNUSED_MEMBER
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static QUrl resolvedUrl(const QUrl &url, const QQmlRefPointer< QQmlContextData > &context)
QUrl url("example.com")
[constructor-url-reference]