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>
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;
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; }
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;
137 if (!m_publicContext)
140 m_publicContext =
nullptr;
141 if (m_ownedByPublicContext) {
142 m_ownedByPublicContext =
false;
149 ensurePropertyNames();
150 return m_propertyNameCache.value(
name);
155 ensurePropertyNames();
156 return m_propertyNameCache.value(
name);
161 ensurePropertyNames();
162 return m_propertyNameCache.findId(
index);
167 Q_ASSERT(!m_propertyNameCache.isEmpty());
175 m_expressions =
nullptr;
181 m_childContexts = childContexts.
data();
187 m_childContexts =
nullptr;
188 return childContexts;
213 if (!
data->m_baseUrlString.isEmpty())
214 return data->m_baseUrlString;
215 if (
data->m_typeCompilationUnit)
216 return data->m_typeCompilationUnit->finalUrlString();
225 if (!
data->m_baseUrl.isEmpty())
226 return data->m_baseUrl;
227 if (
data->m_typeCompilationUnit)
228 return data->m_typeCompilationUnit->finalUrl();
239 Q_ASSERT(!m_hasExtraObject || m_extraObject ==
nullptr);
240 m_hasExtraObject =
false;
241 m_incubator = incubator;
247 Q_ASSERT(m_hasExtraObject || m_incubator ==
nullptr);
248 m_hasExtraObject =
true;
249 m_extraObject = extraObject;
270 return m_typeCompilationUnit && m_typeCompilationUnit->valueTypesAreAddressable();
284 struct ContextGuard :
public QQmlGuard<QObject>
294 inline bool wasSet()
const;
316 m_isInternal(
false), m_isJSContext(
false), m_isPragmaLibraryContext(
false),
317 m_unresolvedNames(
false), m_hasEmittedDestruction(
false), m_isRootObjectInCreation(
false),
318 m_ownedByParent(ownership == OwnedByParent),
319 m_ownedByPublicContext(ownership == OwnedByPublicContext), m_hasExtraObject(
false),
320 m_dummy(0), m_publicContext(publicContext), m_incubator(
nullptr)
322 Q_ASSERT(!m_ownedByParent || !m_ownedByPublicContext);
326 m_nextChild = m_parent->m_childContexts;
328 m_nextChild->m_prevChild = &m_nextChild;
329 m_prevChild = &m_parent->m_childContexts;
330 m_parent->m_childContexts =
this;
335 bool hasExpressionsToRun(
bool isGlobalRefresh)
const
337 return m_expressions && (!isGlobalRefresh || m_unresolvedNames);
340 void refreshExpressionsRecursive(
bool isGlobal);
342 void initPropertyNames()
const;
344 void ensurePropertyNames()
const
346 if (m_propertyNameCache.isEmpty())
348 Q_ASSERT(!m_propertyNameCache.isEmpty());
355 mutable quint32 m_refCount = 1;
358 quint32 m_isPragmaLibraryContext:1;
360 quint32 m_hasEmittedDestruction:1;
361 quint32 m_isRootObjectInCreation:1;
363 quint32 m_ownedByPublicContext:1;
367 [[maybe_unused]]
quint32 m_dummy:23;
382 int m_componentObjectIndex = -1;
388 QObject *m_contextObject =
nullptr;
415 ContextGuard *m_idValues =
nullptr;
416 int m_idValueCount = 0;
428 m_context.setTag(ObjectWasSet);
433 void QQmlContextData::ContextGuard::objectDestroyedImpl(
QQmlGuardImpl *impl)
435 auto This =
static_cast<QQmlContextData::ContextGuard *
>(impl);
436 if (
QObject *contextObject = This->m_context->contextObject()) {
438 This->m_bindings.notify();
442bool QQmlContextData::ContextGuard::wasSet()
const
444 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)
int propertyIndex(const QString &name) const
void setOwnedObjects(QQmlData *ownedObjects)
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< QObject > & operator=(const QQmlGuard< QObject > &o)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
#define QT_WARNING_DISABLE_GCC(text)
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]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent