4#ifndef QQMLPROPERTYDATA_P_H
5#define QQMLPROPERTYDATA_P_H
18#include <private/qobject_p.h>
19#include <QtCore/qglobal.h>
20#include <QtCore/qversionnumber.h>
24class QQmlPropertyCacheMethodArguments;
57 enum { BitsLeftInFlags = 14 };
58 unsigned otherBits : BitsLeftInFlags;
70 unsigned isDeepAliasORisVMEFunction : 1;
71 unsigned isWritableORhasArguments : 1;
72 unsigned isResettableORisSignal : 1;
73 unsigned isAliasORisVMESignal : 1;
74 unsigned isFinalORisV4Function : 1;
75 unsigned isSignalHandler : 1;
78 unsigned isOverridableSignal : 1;
80 unsigned isRequiredORisCloned : 1;
81 unsigned isConstructorORisBindable : 1;
82 unsigned isVirtual : 1;
86 unsigned doesOverride : 1;
87 unsigned isOverridden : 1;
88 unsigned hasMetaObject : 1;
92 unsigned overrideIndexIsProperty : 1;
105 isWritableORhasArguments = b;
110 isResettableORisSignal = b;
115 isAliasORisVMESignal = b;
120 isDeepAliasORisVMEFunction = b;
125 isFinalORisV4Function = b;
142 isConstructorORisBindable = b;
147 isRequiredORisCloned = b;
152 isDeepAliasORisVMEFunction = b;
157 isWritableORhasArguments = b;
161 isResettableORisSignal = b;
165 isAliasORisVMESignal = b;
170 isFinalORisV4Function = b;
181 Q_ASSERT(isResettableORisSignal);
182 isOverridableSignal = b;
187 isRequiredORisCloned = b;
192 isConstructorORisBindable = b;
210 unsigned otherBits = m_flags.otherBits;
212 m_flags.otherBits = otherBits;
243 return !isAlias() && staticMetaCallFunction() !=
nullptr;
256 bool hasRevision()
const {
return revision() != QTypeRevision::zero(); }
267 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
268 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
269 m_notifyIndex = qint16(idx);
278 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
279 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
280 m_overrideIndex = qint16(idx);
286 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
287 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
288 m_coreIndex = qint16(idx);
294 return m_encodedAliasTargetIndex;
299 m_encodedAliasTargetIndex = target;
303 void setRevision(QTypeRevision revision) { m_revision = revision; }
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
345 Q_ASSERT(!hasArguments() || !m_arguments);
347 m_metaObject = metaObject;
354 return m_metaObject->method(m_coreIndex);
360 Q_ASSERT(off >= std::numeric_limits<qint16>::min());
361 Q_ASSERT(off <= std::numeric_limits<qint16>::max());
362 m_metaObjectOffset = qint16(off);
368 return m_staticMetaCallFunction;
374 if (relativePropertyIndex < (1 <<
Flags::BitsLeftInFlags) - 1) {
375 m_flags.otherBits = relativePropertyIndex;
376 m_staticMetaCallFunction = f;
382 void load(
const QMetaProperty &);
383 void load(
const QMetaMethod &);
385 QString name(QObject *object)
const {
return object ? name(object->metaObject()) : QString(); }
388 if (!metaObject || m_coreIndex == -1)
391 return QString::fromUtf8(isFunction()
392 ? metaObject->method(m_coreIndex).name().constData()
393 : metaObject->property(m_coreIndex).name());
400 void *args[] = { property,
nullptr };
401 readPropertyWithArgs(target, args);
406 template<QMetaObject::Call call>
409 if (QDynamicMetaObjectData *dynamicMetaObject = QObjectPrivate::get(object)->metaObject)
410 dynamicMetaObject->metaCall(object, call, idx, argv);
412 object->qt_metacall(call, idx, argv);
417 if (hasStaticMetaCallFunction())
418 staticMetaCallFunction()(target, QMetaObject::ReadProperty, relativePropertyIndex(), args);
420 doMetacall<QMetaObject::ReadProperty>(target, coreIndex(), args);
426 void *argv[] = { value,
nullptr, &status, &flags };
427 if (flags.testFlag(BypassInterceptor) && hasStaticMetaCallFunction())
428 staticMetaCallFunction()(target, QMetaObject::WriteProperty, relativePropertyIndex(), argv);
430 doMetacall<QMetaObject::WriteProperty>(target, coreIndex(), argv);
436 if (flags.testFlag(BypassInterceptor) && hasStaticMetaCallFunction())
437 staticMetaCallFunction()(target, QMetaObject::ResetProperty, relativePropertyIndex(),
nullptr);
439 doMetacall<QMetaObject::ResetProperty>(target, coreIndex(),
nullptr);
445 QUntypedBindable result;
446 void *argv[] = { &result };
447 if (hasStaticMetaCallFunction())
448 staticMetaCallFunction()(target, QMetaObject::BindableProperty, relativePropertyIndex(), argv);
450 doMetacall<QMetaObject::BindableProperty>(target, coreIndex(), argv);
472 friend class QQmlPropertyCache;
475 qint16 m_coreIndex = -1;
479 qint16 m_notifyIndex = -1;
480 qint16 m_overrideIndex = -1;
482 qint16 m_metaObjectOffset = -1;
487 QMetaType m_propType = {};
504#if QT_POINTER_SIZE == 4
505 Q_STATIC_ASSERT(
sizeof(QQmlPropertyData) == 24);
510static_assert(std::is_trivially_copyable<QQmlPropertyData>::value);
514 return flags() == other.flags() &&
515 propType() == other.propType() &&
516 coreIndex() == other.coreIndex() &&
517 notifyIndex() == other.notifyIndex() &&
518 revision() == other.revision();
524 isDeepAliasORisVMEFunction(
false),
525 isWritableORhasArguments(
false),
526 isResettableORisSignal(
false),
527 isAliasORisVMESignal(
false),
528 isFinalORisV4Function(
false),
529 isSignalHandler(
false),
530 isOverridableSignal(
false),
531 isRequiredORisCloned(
false),
532 isConstructorORisBindable(
false),
536 hasMetaObject(
false),
538 overrideIndexIsProperty(
false)
544 return isConst == other.isConst
545 && isDeepAliasORisVMEFunction == other.isDeepAliasORisVMEFunction
546 && isWritableORhasArguments == other.isWritableORhasArguments
547 && isResettableORisSignal == other.isResettableORisSignal
548 && isAliasORisVMESignal == other.isAliasORisVMESignal
549 && isFinalORisV4Function == other.isFinalORisV4Function && isVirtual == other.isVirtual
550 && doesOverride == other.doesOverride && isOverridden == other.isOverridden
551 && isSignalHandler == other.isSignalHandler
552 && isRequiredORisCloned == other.isRequiredORisCloned
553 && hasMetaObject == other.hasMetaObject && type == other.type
554 && isConstructorORisBindable == other.isConstructorORisBindable
555 && 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)
void setMetaObject(const QMetaObject *metaObject)
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)
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 setWritable(bool onoff)
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)