diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2014-08-03 13:14:17 +0200 |
---|---|---|
committer | Olivier Goffart <ogoffart@woboq.com> | 2014-10-28 16:16:35 +0100 |
commit | 4ed39bed4e119792a8da9445691ba16d5beac30a (patch) | |
tree | 3f944f7da5b316557e8db6b79e69834fce7becec /src/corelib | |
parent | d49e7acc2bb98ae9416a532dac1f18e972fffb88 (diff) |
moc: Move the property access code to the qt_static_metacall
That way we will be able to access property of objects that are not QObject
(Q_GADGET)
Change-Id: Ib8ef6e52fc621e0b0d6530f82b1aa205f1ed5fd9
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 29 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject_p.h | 4 |
2 files changed, 26 insertions, 7 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index b54cb0c344..f351f228fd 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com> ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -2837,8 +2838,13 @@ QVariant QMetaProperty::read(const QObject *object) const // Try to register the type and try again before reporting an error. int registerResult = -1; void *argv[] = { ®isterResult }; - QMetaObject::metacall(const_cast<QObject*>(object), QMetaObject::RegisterPropertyMetaType, - idx + mobj->propertyOffset(), argv); + if ((priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall) && mobj->d.static_metacall) { + mobj->d.static_metacall(const_cast<QObject*>(object), QMetaObject::RegisterPropertyMetaType, + idx, argv); + } else { + QMetaObject::metacall(const_cast<QObject*>(object), QMetaObject::RegisterPropertyMetaType, + idx + mobj->propertyOffset(), argv); + } if (registerResult == -1) { qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property '%s::%s'", typeName, mobj->className(), name()); return QVariant(); @@ -2861,8 +2867,12 @@ QVariant QMetaProperty::read(const QObject *object) const value = QVariant(t, (void*)0); argv[0] = value.data(); } - QMetaObject::metacall(const_cast<QObject*>(object), QMetaObject::ReadProperty, - idx + mobj->propertyOffset(), argv); + if (priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall && mobj->d.static_metacall) { + mobj->d.static_metacall(const_cast<QObject*>(object), QMetaObject::ReadProperty, idx, argv); + } else { + QMetaObject::metacall(const_cast<QObject*>(object), QMetaObject::ReadProperty, + idx + mobj->propertyOffset(), argv); + } if (status != -1) return value; @@ -2932,7 +2942,11 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const argv[0] = &v; else argv[0] = v.data(); - QMetaObject::metacall(object, QMetaObject::WriteProperty, idx + mobj->propertyOffset(), argv); + if (priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall && mobj->d.static_metacall) + mobj->d.static_metacall(object, QMetaObject::WriteProperty, idx, argv); + else + QMetaObject::metacall(object, QMetaObject::WriteProperty, idx + mobj->propertyOffset(), argv); + return status; } @@ -2949,7 +2963,10 @@ bool QMetaProperty::reset(QObject *object) const if (!object || !mobj || !isResettable()) return false; void *argv[] = { 0 }; - QMetaObject::metacall(object, QMetaObject::ResetProperty, idx + mobj->propertyOffset(), argv); + if (priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall && mobj->d.static_metacall) + mobj->d.static_metacall(object, QMetaObject::ResetProperty, idx, argv); + else + QMetaObject::metacall(object, QMetaObject::ResetProperty, idx + mobj->propertyOffset(), argv); return true; } diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h index c08838e456..45fe56ec8a 100644 --- a/src/corelib/kernel/qmetaobject_p.h +++ b/src/corelib/kernel/qmetaobject_p.h @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com> ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -98,7 +99,8 @@ enum MethodFlags { enum MetaObjectFlags { DynamicMetaObject = 0x01, - RequiresVariantMetaObject = 0x02 + RequiresVariantMetaObject = 0x02, + PropertyAccessInStaticMetaCall = 0x04 // since Qt 5.5, property code is in the static metacall }; enum MetaDataFlags { |