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;
244 return !isAlias() && staticMetaCallFunction() !=
nullptr;
257 bool hasRevision()
const {
return revision() != QTypeRevision::zero(); }
268 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
269 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
270 m_notifyIndex = qint16(idx);
279 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
280 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
281 m_overrideIndex = qint16(idx);
287 Q_ASSERT(idx >= std::numeric_limits<qint16>::min());
288 Q_ASSERT(idx <= std::numeric_limits<qint16>::max());
289 m_coreIndex = qint16(idx);
295 return m_encodedAliasTargetIndex;
300 m_encodedAliasTargetIndex = target;
306 return m_metaObjectOffsetOrAliasTargetObjectId;
312 Q_ASSERT(id >= std::numeric_limits<qint16>::min());
313 Q_ASSERT(id <= std::numeric_limits<qint16>::max());
314 m_metaObjectOffsetOrAliasTargetObjectId = id;
318 void setRevision(QTypeRevision revision) { m_revision = revision; }
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
360 Q_ASSERT(!hasArguments() || !m_arguments);
362 m_metaObject = metaObject;
369 return m_metaObject->method(m_coreIndex);
375 return m_metaObjectOffsetOrAliasTargetObjectId;
381 Q_ASSERT(off >= std::numeric_limits<qint16>::min());
382 Q_ASSERT(off <= std::numeric_limits<qint16>::max());
383 m_metaObjectOffsetOrAliasTargetObjectId = qint16(off);
389 return m_staticMetaCallFunction;
395 if (relativePropertyIndex < (1 <<
Flags::BitsLeftInFlags) - 1) {
396 m_flags.otherBits = relativePropertyIndex;
397 m_staticMetaCallFunction = f;
403 void load(
const QMetaProperty &);
404 void load(
const QMetaMethod &);
406 QString name(QObject *object)
const {
return object ? name(object->metaObject()) : QString(); }
409 if (!metaObject || m_coreIndex == -1)
412 return QString::fromUtf8(isFunction()
413 ? metaObject->method(m_coreIndex).name().constData()
414 : metaObject->property(m_coreIndex).name());
421 void *args[] = { property,
nullptr };
422 readPropertyWithArgs(target, args);
427 template<QMetaObject::Call call>
430 if (QDynamicMetaObjectData *dynamicMetaObject = QObjectPrivate::get(object)->metaObject)
431 dynamicMetaObject->metaCall(object, call, idx, argv);
433 object->qt_metacall(call, idx, argv);
438 if (hasStaticMetaCallFunction())
439 staticMetaCallFunction()(target, QMetaObject::ReadProperty, relativePropertyIndex(), args);
441 doMetacall<QMetaObject::ReadProperty>(target, coreIndex(), args);
447 void *argv[] = { value,
nullptr, &status, &flags };
448 if (flags.testFlag(BypassInterceptor) && hasStaticMetaCallFunction())
449 staticMetaCallFunction()(target, QMetaObject::WriteProperty, relativePropertyIndex(), argv);
451 doMetacall<QMetaObject::WriteProperty>(target, coreIndex(), argv);
457 if (flags.testFlag(BypassInterceptor) && hasStaticMetaCallFunction())
458 staticMetaCallFunction()(target, QMetaObject::ResetProperty, relativePropertyIndex(),
nullptr);
460 doMetacall<QMetaObject::ResetProperty>(target, coreIndex(),
nullptr);
466 QUntypedBindable result;
467 void *argv[] = { &result };
468 if (hasStaticMetaCallFunction())
469 staticMetaCallFunction()(target, QMetaObject::BindableProperty, relativePropertyIndex(), argv);
471 doMetacall<QMetaObject::BindableProperty>(target, coreIndex(), argv);
493 friend class QQmlPropertyCache;
496 qint16 m_coreIndex = -1;
500 qint16 m_notifyIndex = -1;
501 qint16 m_overrideIndex = -1;
503 qint16 m_metaObjectOffsetOrAliasTargetObjectId = -1;
508 QMetaType m_propType = {};
525#if QT_POINTER_SIZE == 4
526 Q_STATIC_ASSERT(
sizeof(QQmlPropertyData) == 24);
531static_assert(std::is_trivially_copyable<QQmlPropertyData>::value);
535 return flags() == other.flags() &&
536 propType() == other.propType() &&
537 coreIndex() == other.coreIndex() &&
538 notifyIndex() == other.notifyIndex() &&
539 revision() == other.revision();
545 isDeepAliasORisVMEFunction(
false),
546 isWritableORhasArguments(
false),
547 isResettableORisSignal(
false),
548 isAliasORisVMESignal(
false),
549 isFinalORisV4Function(
false),
550 isSignalHandler(
false),
551 isOverridableSignal(
false),
552 isRequiredORisCloned(
false),
553 isConstructorORisBindable(
false),
557 hasMetaObject(
false),
559 overrideIndexIsProperty(
false)
565 return isConst == other.isConst
566 && isDeepAliasORisVMEFunction == other.isDeepAliasORisVMEFunction
567 && isWritableORhasArguments == other.isWritableORhasArguments
568 && isResettableORisSignal == other.isResettableORisSignal
569 && isAliasORisVMESignal == other.isAliasORisVMESignal
570 && isFinalORisV4Function == other.isFinalORisV4Function && isVirtual == other.isVirtual
571 && doesOverride == other.doesOverride && isOverridden == other.isOverridden
572 && isSignalHandler == other.isSignalHandler
573 && isRequiredORisCloned == other.isRequiredORisCloned
574 && hasMetaObject == other.hasMetaObject && type == other.type
575 && isConstructorORisBindable == other.isConstructorORisBindable
576 && 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)
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)