5#ifndef QQMLPROPERTYDATA_P_H
6#define QQMLPROPERTYDATA_P_H
19#include <private/qobject_p.h>
20#include <QtCore/qglobal.h>
21#include <QtCore/qversionnumber.h>
25class QQmlPropertyCacheMethodArguments;
58 enum { BitsLeftInFlags = 14 };
59 unsigned otherBits : BitsLeftInFlags;
71 unsigned isDeepAliasORisVMEFunction : 1;
72 unsigned isWritableORhasArguments : 1;
73 unsigned isResettableORisSignal : 1;
74 unsigned isAliasORisVMESignal : 1;
75 unsigned isFinalORisV4Function : 1;
76 unsigned isSignalHandler : 1;
79 unsigned isOverridableSignal : 1;
81 unsigned isRequiredORisCloned : 1;
82 unsigned isConstructorORisBindable : 1;
83 unsigned isVirtual : 1;
87 unsigned doesOverride : 1;
88 unsigned isOverridden : 1;
89 unsigned hasMetaObject : 1;
93 unsigned overrideIndexIsProperty : 1;
106 isWritableORhasArguments = b;
111 isResettableORisSignal = b;
116 isAliasORisVMESignal = b;
121 isDeepAliasORisVMEFunction = b;
126 isFinalORisV4Function = b;
143 isConstructorORisBindable = b;
148 isRequiredORisCloned = b;
153 isDeepAliasORisVMEFunction = b;
158 isWritableORhasArguments = b;
162 isResettableORisSignal = b;
166 isAliasORisVMESignal = b;
171 isFinalORisV4Function = b;
182 Q_ASSERT(isResettableORisSignal);
183 isOverridableSignal = b;
188 isRequiredORisCloned = b;
193 isConstructorORisBindable = b;
211 unsigned otherBits = m_flags.otherBits;
213 m_flags.otherBits = otherBits;
245 return !isAlias() && !isComponentWrapper() && staticMetaCallFunction() !=
nullptr;
258 bool hasRevision()
const {
return revision() != QTypeRevision::zero(); }
269 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
270 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
271 m_notifyIndex = qint16(idx);
280 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
281 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
282 m_overrideIndex = qint16(idx);
288 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
289 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
290 m_coreIndex = qint16(idx);
296 return m_encodedAliasTargetIndex;
301 m_encodedAliasTargetIndex = target;
307 return m_metaObjectOffsetOrAliasTargetObjectId;
313 Q_ASSERT(id >= std::numeric_limits<qint16>::min());
314 Q_ASSERT(id <= std::numeric_limits<qint16>::max());
315 m_metaObjectOffsetOrAliasTargetObjectId = id;
321 return m_wrappedObjectIndex;
326 m_wrappedObjectIndex = wrappedObjectIndex;
330 void setRevision(QTypeRevision revision) { m_revision = revision; }
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
372 Q_ASSERT(!hasArguments() || !m_arguments);
374 m_metaObject = metaObject;
381 return m_metaObject->method(m_coreIndex);
387 return m_metaObjectOffsetOrAliasTargetObjectId;
393 Q_ASSERT(off >= std::numeric_limits<qint16>::min());
394 Q_ASSERT(off <= std::numeric_limits<qint16>::max());
395 m_metaObjectOffsetOrAliasTargetObjectId = qint16(off);
401 return m_staticMetaCallFunction;
407 if (relativePropertyIndex < (1 <<
Flags::BitsLeftInFlags) - 1) {
408 m_flags.otherBits = relativePropertyIndex;
409 m_staticMetaCallFunction = f;
415 void load(
const QMetaProperty &);
416 void load(
const QMetaMethod &);
418 QString name(QObject *object)
const {
return object ? name(object->metaObject()) : QString(); }
421 if (!metaObject || m_coreIndex == -1)
424 return QString::fromUtf8(isFunction()
425 ? metaObject->method(m_coreIndex).name().constData()
426 : metaObject->property(m_coreIndex).name());
433 void *args[] = { property,
nullptr };
434 readPropertyWithArgs(target, args);
439 template<QMetaObject::Call call>
442 if (QDynamicMetaObjectData *dynamicMetaObject = QObjectPrivate::get(object)->metaObject)
443 dynamicMetaObject->metaCall(object, call, idx, argv);
445 object->qt_metacall(call, idx, argv);
450 if (hasStaticMetaCallFunction())
451 staticMetaCallFunction()(target, QMetaObject::ReadProperty, relativePropertyIndex(), args);
453 doMetacall<QMetaObject::ReadProperty>(target, coreIndex(), args);
459 void *argv[] = { value,
nullptr, &status, &flags };
460 if (flags.testFlag(BypassInterceptor) && hasStaticMetaCallFunction())
461 staticMetaCallFunction()(target, QMetaObject::WriteProperty, relativePropertyIndex(), argv);
463 doMetacall<QMetaObject::WriteProperty>(target, coreIndex(), argv);
469 if (flags.testFlag(BypassInterceptor) && hasStaticMetaCallFunction())
470 staticMetaCallFunction()(target, QMetaObject::ResetProperty, relativePropertyIndex(),
nullptr);
472 doMetacall<QMetaObject::ResetProperty>(target, coreIndex(),
nullptr);
478 QUntypedBindable result;
479 void *argv[] = { &result };
480 if (hasStaticMetaCallFunction())
481 staticMetaCallFunction()(target, QMetaObject::BindableProperty, relativePropertyIndex(), argv);
483 doMetacall<QMetaObject::BindableProperty>(target, coreIndex(), argv);
505 friend class QQmlPropertyCache;
508 qint16 m_coreIndex = -1;
512 qint16 m_notifyIndex = -1;
513 qint16 m_overrideIndex = -1;
515 qint16 m_metaObjectOffsetOrAliasTargetObjectId = -1;
520 QMetaType m_propType = {};
540#if QT_POINTER_SIZE == 4
541 Q_STATIC_ASSERT(
sizeof(QQmlPropertyData) == 24);
546static_assert(std::is_trivially_copyable<QQmlPropertyData>::value);
550 return flags() == other.flags() &&
551 propType() == other.propType() &&
552 coreIndex() == other.coreIndex() &&
553 notifyIndex() == other.notifyIndex() &&
554 revision() == other.revision();
560 isDeepAliasORisVMEFunction(
false),
561 isWritableORhasArguments(
false),
562 isResettableORisSignal(
false),
563 isAliasORisVMESignal(
false),
564 isFinalORisV4Function(
false),
565 isSignalHandler(
false),
566 isOverridableSignal(
false),
567 isRequiredORisCloned(
false),
568 isConstructorORisBindable(
false),
572 hasMetaObject(
false),
574 overrideIndexIsProperty(
false)
580 return isConst == other.isConst
581 && isDeepAliasORisVMEFunction == other.isDeepAliasORisVMEFunction
582 && isWritableORhasArguments == other.isWritableORhasArguments
583 && isResettableORisSignal == other.isResettableORisSignal
584 && isAliasORisVMESignal == other.isAliasORisVMESignal
585 && isFinalORisV4Function == other.isFinalORisV4Function && isVirtual == other.isVirtual
586 && doesOverride == other.doesOverride && isOverridden == other.isOverridden
587 && isSignalHandler == other.isSignalHandler
588 && isRequiredORisCloned == other.isRequiredORisCloned
589 && hasMetaObject == other.hasMetaObject && type == other.type
590 && isConstructorORisBindable == other.isConstructorORisBindable
591 && overrideIndexIsProperty == other.overrideIndexIsProperty;
bool overrideIndexIsProperty() const
void readProperty(QObject *target, void *property) const
bool isResettable() const
bool isConstructor() const
bool isOverridden() const
int metaObjectOffset() const
bool isVarProperty() const
void readPropertyWithArgs(QObject *target, void *args[]) const
bool notifiesViaBindable() const
QMetaMethod metaMethod() const
QTypeRevision typeVersion() const
void setRevision(QTypeRevision revision)
bool writeProperty(QObject *target, void *value, WriteFlags flags) const
QTypeRevision revision() const
void setAliasTarget(int target)
bool isVMEFunction() const
bool doesOverride() const
void setNotifyIndex(int idx)
StaticMetaCallFunction m_staticMetaCallFunction
StaticMetaCallFunction staticMetaCallFunction() const
bool operator==(const QQmlPropertyData &) const
void setMetaObjectOffset(int off)
int aliasTargetObjectId() const
void setMetaObject(const QMetaObject *metaObject)
void setAliasTargetObjectId(int id)
bool hasArguments() const
QMetaType propType() const
bool isV4Function() const
QString name(const QMetaObject *metaObject) const
void doMetacall(QObject *object, int idx, void **argv) const
void setOverrideIndexIsProperty(bool onoff)
void setCoreIndex(int idx)
bool acceptsQBinding() const
void setArguments(QQmlPropertyCacheMethodArguments *args)
bool isComponentWrapper() const
void setPropType(QMetaType pt)
bool hasMetaObject() const
const QMetaObject * m_metaObject
void setOverrideIndex(int idx)
QUntypedBindable propertyBindable(QObject *target) const
QQmlPropertyCacheMethodArguments * arguments() const
void markAsOverrideOf(QQmlPropertyData *predecessor)
QQmlPropertyCacheMethodArguments * m_arguments
static Flags defaultSlotFlags()
void setWrappedObjectIndex(int wrappedObjectIndex)
void setWritable(bool onoff)
int wrappedObjectIndex() const
bool hasStaticMetaCallFunction() const
void trySetStaticMetaCallFunction(StaticMetaCallFunction f, unsigned relativePropertyIndex)
static Flags defaultSignalFlags()
@ RemoveBindingOnAliasWrite
static Flags flagsForProperty(const QMetaProperty &)
void load(const QMetaProperty &)
int overrideIndex() const
bool resetProperty(QObject *target, WriteFlags flags) const
bool isSignalHandler() const
QString name(QObject *object) const
bool isOverridableSignal() const
void setTypeVersion(QTypeRevision typeVersion)
const QMetaObject * metaObject() const
quint16 relativePropertyIndex() const
int m_encodedAliasTargetIndex
Q_STATIC_ASSERT(sizeof(SharedImageHeader) % 4==0)
void setIsConstant(bool b)
void setIsDeepAlias(bool b)
void setDoesOverride(bool b)
void setHasArguments(bool b)
void copyPropertyTypeFlags(Flags from)
void setIsOverridden(bool b)
void setIsResettable(bool b)
void setIsV4Function(bool b)
void setIsConstructor(bool b)
void setIsWritable(bool b)
void setIsOverridableSignal(bool b)
bool operator==(const Flags &other) const
void setIsRequired(bool b)
void setIsSignalHandler(bool b)
void setHasMetaObject(bool b)
void setIsBindable(bool b)
void setIsVMEFunction(bool b)
void setIsVirtual(bool b)
void setType(Type newType)
void setIsVMESignal(bool b)