6#include <QtQml/qjsvalue.h>
7#include <QtQml/qqmlengine.h>
8#include <QtQml/qqmlcontext.h>
9#include <QtQml/qqmlcomponent.h>
11#include <private/qqmlcustomparser_p.h>
12#include <private/qqmldata_p.h>
13#include <private/qqmlmetatypedata_p.h>
14#include <private/qqmlpropertycache_p.h>
15#include <private/qqmltypedata_p.h>
59 default:
qFatal(
"QQmlTypePrivate Internal Error.");
63QQmlTypePrivate::~QQmlTypePrivate()
65 delete enums.fetchAndStoreAcquire(
nullptr);
66 delete proxyMetaObjects.fetchAndStoreAcquire(
nullptr);
75 delete extraData.cppTypeData->customParser;
80 extraData.singletonTypeData->singletonInstanceInfo.reset();
87 extraData.inlineComponentTypeData.~QUrl();
90 extraData.sequentialContainerTypeData.~QMetaSequence();
135 if (!d ||
module != d->module)
146 QQmlRefPointer<QQmlTypeData> td(
engine->typeLoader.getType(
sourceUrl()));
147 if (td.isNull() || !td->isComplete())
161 QQmlRefPointer<QQmlTypeData> td(
engine->typeLoader.getType(
sourceUrl()));
162 if (td.isNull() || !td->isComplete())
170 return mo->property(
index).revision();
181 if (proxyMetaObjects.testAndSetOrdered(
nullptr, proxies, concurrentModification))
185 return concurrentModification;
194 QList<QQmlProxyMetaObject::ProxyData> metaObjects;
196 auto setupExtendedMetaObject = [&](
const QMetaObject *extMetaObject,
206 mmo->
d.superdata =
mo;
219 : metaObjects.constLast().metaObject));
221 for (
int ii = 0; ii < metaObjects.size(); ++ii) {
222 metaObjects[ii].propertyOffset =
223 metaObjects.at(ii).metaObject->propertyOffset();
224 metaObjects[ii].methodOffset =
225 metaObjects.at(ii).metaObject->methodOffset();
228 bool containsRevisionedAttributes =
false;
233 if (metaObjects.isEmpty())
236 mo = metaObjects.constFirst().metaObject;
238 for (
int ii = 0; !containsRevisionedAttributes && ii <
mo->propertyCount(); ++ii) {
240 containsRevisionedAttributes =
true;
243 for (
int ii = 0; !containsRevisionedAttributes && ii <
mo->methodCount(); ++ii) {
244 if (
mo->method(ii).revision() != 0)
245 containsRevisionedAttributes =
true;
249 proxies->
data = std::move(metaObjects);
257 if (
const Enums *
result = enums.loadRelaxed())
267 Enums *newEnums =
new Enums;
272 insertEnumsFromPropertyCache(newEnums,
cache);
276 const ProxyMetaObjects *proxies =
init();
282 const Enums *concurrentModification;
283 if (enums.testAndSetOrdered(
nullptr, newEnums, concurrentModification))
287 return concurrentModification;
294 if (
const auto *related =
metaObject->
d.relatedMetaObjects) {
295 while (
const QMetaObject *relatedMetaObject = *related) {
296 insertEnums(enums, relatedMetaObject);
302 QSet<QString> localEnums;
306 auto shouldSingletonAlsoRegisterUnscoped = [&](){
322 QStringHash<int> *scoped = isScoped ?
new QStringHash<int>() :
nullptr;
334 const bool shouldRegisterUnscoped = !isScoped
339 for (
int jj = 0; jj < e.
keyCount(); ++jj) {
342 if (shouldRegisterUnscoped) {
343 if (localEnums.contains(
key)) {
344 auto existingEntry = enums->enums.find(
key);
345 if (existingEntry != enums->enums.end() && existingEntry.value() !=
value) {
350 localEnums.insert(
key);
359 enums->scopedEnums << scoped;
370 const auto *related =
metaObject->
d.relatedMetaObjects;
373 createListOfPossibleConflictingItems(*related++, enumInfoList,
path);
380 for (
int jj = 0; jj < e.
keyCount(); ++jj) {
386 enumInfo.enumKey =
key;
388 enumInfo.path =
path;
390 enumInfoList.append(enumInfo);
397 QList<EnumInfo> enumInfoList;
403 qWarning() <<
"No meta object information available. Skipping conflict analysis.";
411 for (
const auto &
i :
std::as_const(enumInfoList)) {
412 if (
i.enumKey == conflictingKey)
413 qWarning().noquote().nospace() <<
" " <<
i.metaObjectName <<
"." <<
i.enumName <<
"." <<
i.enumKey <<
" from scope "
414 <<
i.metaEnumScope <<
" injected by " <<
i.path.join(
QLatin1String(
"->"));
418void QQmlTypePrivate::insertEnumsFromPropertyCache(
424 currentCache && currentCache->metaObject() != cppMetaObject;
425 currentCache = currentCache->parent().data()) {
427 int count = currentCache->qmlEnumCount();
428 for (
int ii = 0; ii <
count; ++ii) {
429 QStringHash<int> *scoped =
new QStringHash<int>();
432 for (
int jj = 0; jj < enumData->values.size(); ++jj) {
434 enums->enums.insert(
value.namedValue,
value.value);
435 scoped->insert(
value.namedValue,
value.value);
437 enums->scopedEnums << scoped;
438 enums->scopedEnumIndex.insert(enumData->name, enums->scopedEnums.size()-1);
441 insertEnums(enums, cppMetaObject);
455 return d->
extraData.singletonTypeData->singletonInstanceInfo->typeName;
485 return create(&unused, 0);
520 void *ddataMemory =
nullptr;
526 if (!
p->declarativeData)
537 return d->
extraData.singletonTypeData->singletonInstanceInfo;
546 return d->
extraData.cppTypeData->customParser;
553 return d->
extraData.cppTypeData->createValueTypeFunc;
560 return d->
extraData.cppTypeData->constructValueType;
567 return d->
extraData.cppTypeData->populateValueType;
574 return d->
extraData.cppTypeData->newFunc;
581 return d->
extraData.cppTypeData->noCreationReason;
596 return d->
extraData.cppTypeData->extFunc;
598 return d->
extraData.singletonTypeData->extFunc;
611 return d->
extraData.cppTypeData->extMetaObject;
613 return d->
extraData.singletonTypeData->extMetaObject;
712 return base->extraData.cppTypeData->attachedPropertiesFunc;
719 return base->extraData.cppTypeData->attachedPropertiesType;
727 return d->
extraData.cppTypeData->parserStatusCast;
734 return d->
extraData.cppTypeData->propertyValueSourceCast;
741 return d->
extraData.cppTypeData->propertyValueInterceptorCast;
748 return d->
extraData.cppTypeData->finalizerCast;
760 return d ? d->
index : -1;
bool isEmpty() const noexcept
static QObjectPrivate * get(QObject *o)
The QQmlCustomParser class allows you to add new arbitrary types to QML.
void setName(const QString &uri, const QString &element)
static int scopedEnumIndex(const QQmlRefPointer< const QQmlTypePrivate > &d, QQmlEnginePrivate *engine, const String &name, bool *ok)
const ProxyMetaObjects * init() const
QQmlPropertyCache::ConstPtr compositePropertyCache(QQmlEnginePrivate *engine) const
static int enumValue(const QQmlRefPointer< const QQmlTypePrivate > &d, QQmlEnginePrivate *engine, const String &name, bool *ok)
union QQmlTypePrivate::extraData extraData
static int scopedEnumValue(const QQmlRefPointer< const QQmlTypePrivate > &d, QQmlEnginePrivate *engine, int index, const String &name, bool *ok)
const QQmlTypePrivate * attachedPropertiesBase(QQmlEnginePrivate *engine) const
QHashedString QString name
const QMetaObject * metaObject() const
QQmlTypePrivate(QQmlType::RegistrationType type)
QQmlType::RegistrationType regType
const QMetaObject * baseMetaObject
QQmlType resolveCompositeBaseType(QQmlEnginePrivate *engine) const
const QMetaObject * metaObjectForValueType() const
const QMetaObject * metaObjectForValueType() const
int propertyValueSourceCast() const
bool isCompositeSingleton() const
bool availableInVersion(QTypeRevision version) const
@ SequentialContainerType
int propertyValueInterceptorCast() const
bool canPopulateValueType() const
const char * interfaceIId() const
QTypeRevision version() const
bool isQObjectSingleton() const
QQmlAttachedPropertiesFunc attachedPropertiesFunction(QQmlEnginePrivate *engine) const
QString noCreationReason() const
bool isSequentialContainer() const
const QMetaObject * attachedPropertiesType(QQmlEnginePrivate *engine) const
QMetaSequence listMetaSequence() const
QString qmlTypeName() const
SingletonInstanceInfo::ConstPtr singletonInstanceInfo() const
CreateValueTypeFunc createValueTypeFunction() const
QMetaType qListTypeId() const
CreateFunc createFunction() const
QHashedString module() const
int scopedEnumIndex(QQmlEnginePrivate *engine, const QV4::String *, bool *ok) const
QObject * createWithQQmlData() const
void createProxy(QObject *instance) const
QByteArray typeName() const
static int refCount(const QQmlTypePrivate *priv)
bool canConstructValueType() const
const QMetaObject * baseMetaObject() const
QVariant(* CreateValueTypeFunc)(const QJSValue &)
const QQmlTypePrivate * priv() const
ExtensionFunc extensionFunction() const
bool isQJSValueSingleton() const
const QMetaObject * metaObject() const
static void refHandle(const QQmlTypePrivate *priv)
int enumValue(QQmlEnginePrivate *engine, const QHashedStringRef &, bool *ok) const
static void derefHandle(const QQmlTypePrivate *priv)
QQmlCustomParser * customParser() const
QQmlType & operator=(const QQmlType &other)
QObject *(* ExtensionFunc)(QObject *)
bool isExtendedType() const
const QMetaObject * extensionMetaObject() const
int finalizerCast() const
QTypeRevision metaObjectRevision() const
bool isInlineComponentType() const
QString elementName() const
bool containsRevisionedAttributes() const
int parserStatusCast() const
void(* CreateFunc)(void *, void *)
int scopedEnumValue(QQmlEnginePrivate *engine, int index, const QV4::String *, bool *ok) const
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
constexpr bool hasMinorVersion() const
Returns true if the minor version is known, otherwise false.
constexpr bool hasMajorVersion() const
Returns true if the major version is known, otherwise false.
constexpr quint8 minorVersion() const
Returns the minor version encoded in the revision.
constexpr quint8 majorVersion() const
Returns the major version encoded in the revision.
QCache< int, Employee > cache
[0]
Combined button and popup list for selecting options.
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
QList< QString > QStringList
Constructs a string list that contains the given string, str.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLsizei GLenum GLsizei GLsizei GLuint memory
GLsizei const GLchar *const * path
QQmlPrivate::QQmlAttachedPropertiesFunc< QObject > QQmlAttachedPropertiesFunc
static bool isPropertyRevisioned(const QMetaObject *mo, int index)
QLatin1StringView QLatin1String
obj metaObject() -> className()
\inmodule QtCore \reentrant
const QMetaObject * attachedPropertiesType
bool registerEnumsFromRelatedTypes
QQmlAttachedPropertiesFunc attachedPropertiesFunc
QQmlCustomParser * customParser
int propertyValueSourceCast
const QMetaObject * extMetaObject
int propertyValueInterceptorCast
bool registerEnumClassesUnscoped
QObject *(* extFunc)(QObject *)
void(* newFunc)(void *, void *)
QVariant(* createValueTypeFunc)(const QJSValue &)
QObject *(* extFunc)(QObject *)
const QMetaObject * extMetaObject
QQmlType::SingletonInstanceInfo::ConstPtr singletonInstanceInfo
QQmlPropertyCache::ConstPtr rootPropertyCache() const