diff options
author | Kent Hansen <kent.hansen@nokia.com> | 2011-10-12 14:27:57 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-09 13:08:36 +0100 |
commit | f6416183d36a260f3cbf6f89753f8a0ee27df7cc (patch) | |
tree | c0a8e60bfe2cf7dccba11f9518c7bac031b3796b | |
parent | 3cfee36b9910dafebd0846dd58115bf2f069ccba (diff) |
Get rid of QDeclarativeMetaType::{canCopy,copy}
Now that we have QMetaType::construct() that does placement new
construction, we can use that to copy the value.
We need to destruct the (default-constructed) existing value first,
but for primitive types that's a no-op, and for Qt's types it's
cheap since they use lazy initialization or "shared null".
Change-Id: Idadee04b1d5b590be7fec50fb0396fd277bee973
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
7 files changed, 53 insertions, 747 deletions
diff --git a/src/declarative/qml/qdeclarativeboundsignal.cpp b/src/declarative/qml/qdeclarativeboundsignal.cpp index 6bbbb243fc..8c0c0b1519 100644 --- a/src/declarative/qml/qdeclarativeboundsignal.cpp +++ b/src/declarative/qml/qdeclarativeboundsignal.cpp @@ -252,15 +252,9 @@ QDeclarativeBoundSignalParameters::QDeclarativeBoundSignalParameters(const QMeta } } } - if (QDeclarativeMetaType::canCopy(t)) { - types[ii] = t; - QMetaPropertyBuilder prop = mob.addProperty(name, propType); - prop.setWritable(false); - } else { - types[ii] = 0x80000000 | t; - QMetaPropertyBuilder prop = mob.addProperty(name, "QVariant"); - prop.setWritable(false); - } + types[ii] = t; + QMetaPropertyBuilder prop = mob.addProperty(name, propType); + prop.setWritable(false); } } myMetaObject = mob.toMetaObject(); @@ -291,11 +285,10 @@ int QDeclarativeBoundSignalParameters::metaCall(QMetaObject::Call c, int id, voi return -1; if (c == QMetaObject::ReadProperty && id >= 1) { - if (types[id - 1] & 0x80000000) { - *((QVariant *)a[0]) = QVariant(types[id - 1] & 0x7FFFFFFF, values[id]); - } else { - QDeclarativeMetaType::copy(types[id - 1], a[0], values[id]); - } + int t = types[id - 1]; + void *p = a[0]; + QMetaType::destruct(t, p); + QMetaType::construct(t, p, values[id]); return -1; } else { return qt_metacall(c, id, a); diff --git a/src/declarative/qml/qdeclarativemetatype.cpp b/src/declarative/qml/qdeclarativemetatype.cpp index ac89eb9a2e..6ead4f19fa 100644 --- a/src/declarative/qml/qdeclarativemetatype.cpp +++ b/src/declarative/qml/qdeclarativemetatype.cpp @@ -56,36 +56,14 @@ #include <qmetatype.h> #include <qobjectdefs.h> -#include <qdatetime.h> #include <qbytearray.h> #include <qreadwritelock.h> #include <qstring.h> #include <qstringlist.h> #include <qvector.h> -#include <qlocale.h> -#include <QtDeclarative/qjsvalue.h> #include <ctype.h> -#ifdef QT_BOOTSTRAPPED -# ifndef QT_NO_GEOM_VARIANT -# define QT_NO_GEOM_VARIANT -# endif -#else -# include <qbitarray.h> -# include <qurl.h> -# include <qvariant.h> -#endif - -#ifndef QT_NO_GEOM_VARIANT -# include <qsize.h> -# include <qpoint.h> -# include <qrect.h> -# include <qline.h> -# include <qvector3d.h> -#endif -#define NS(x) QT_PREPEND_NAMESPACE(x) - QT_BEGIN_NAMESPACE struct QDeclarativeMetaTypeData @@ -1356,547 +1334,6 @@ QList<QDeclarativeType*> QDeclarativeMetaType::qmlTypes() return data->nameToType.values(); } -QT_END_NAMESPACE - -#include <QtGui/qfont.h> -#include <QtGui/qpixmap.h> -#include <QtGui/qbrush.h> -#include <QtGui/qcolor.h> -#include <QtGui/qpalette.h> -#include <QtGui/qimage.h> -#include <QtGui/qpolygon.h> -#include <QtGui/qregion.h> -#include <QtGui/qbitmap.h> -#include <QtGui/qcursor.h> -#include <QtGui/qkeysequence.h> -#include <QtGui/qpen.h> - -//#include <QtGui/qtextlength.h> -#include <QtGui/qtextformat.h> -#include <QtGui/qmatrix.h> -#include <QtGui/qtransform.h> -#include <QtGui/qmatrix4x4.h> -#include <QtGui/qvector2d.h> -#include <QtGui/qvector3d.h> -#include <QtGui/qvector4d.h> -#include <QtGui/qquaternion.h> -#include <private/qv8engine_p.h> - -Q_DECLARE_METATYPE(QJSValue); -Q_DECLARE_METATYPE(QDeclarativeV8Handle); - -QT_BEGIN_NAMESPACE - -bool QDeclarativeMetaType::canCopy(int type) -{ - switch(type) { - case QMetaType::VoidStar: - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - case QMetaType::Long: - case QMetaType::Int: - case QMetaType::Short: - case QMetaType::Char: - case QMetaType::ULong: - case QMetaType::UInt: - case QMetaType::LongLong: - case QMetaType::ULongLong: - case QMetaType::UShort: - case QMetaType::UChar: - case QMetaType::Bool: - case QMetaType::Float: - case QMetaType::Double: - case QMetaType::QChar: - case QMetaType::QVariantMap: - case QMetaType::QVariantHash: - case QMetaType::QVariantList: - case QMetaType::QByteArray: - case QMetaType::QString: - case QMetaType::QStringList: - case QMetaType::QBitArray: - case QMetaType::QDate: - case QMetaType::QTime: - case QMetaType::QDateTime: - case QMetaType::QUrl: - case QMetaType::QLocale: - case QMetaType::QRect: - case QMetaType::QRectF: - case QMetaType::QSize: - case QMetaType::QSizeF: - case QMetaType::QLine: - case QMetaType::QLineF: - case QMetaType::QPoint: - case QMetaType::QPointF: - case QMetaType::QVector3D: -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: -#endif - case QMetaType::Void: -#ifdef QT3_SUPPORT - case QMetaType::QColorGroup: -#endif - case QMetaType::QFont: - case QMetaType::QPixmap: - case QMetaType::QBrush: - case QMetaType::QColor: - case QMetaType::QPalette: - case QMetaType::QImage: - case QMetaType::QPolygon: - case QMetaType::QRegion: - case QMetaType::QBitmap: -#ifndef QT_NO_CURSOR - case QMetaType::QCursor: -#endif - case QMetaType::QKeySequence: - case QMetaType::QPen: - case QMetaType::QTextLength: - case QMetaType::QTextFormat: - case QMetaType::QMatrix: - case QMetaType::QTransform: - case QMetaType::QMatrix4x4: - case QMetaType::QVector2D: - case QMetaType::QVector4D: - case QMetaType::QQuaternion: - return true; - - default: - if (type == qMetaTypeId<QVariant>() || - type == qMetaTypeId<QJSValue>() || - type == qMetaTypeId<QDeclarativeV8Handle>() || - typeCategory(type) != Unknown) { - return true; - } - break; - } - - return false; -} - -/*! - Copies \a copy into \a data, assuming they both are of type \a type. If - \a copy is zero, a default type is copied. Returns true if the copy was - successful and false if not. - - \note This should move into QMetaType once complete - -*/ -bool QDeclarativeMetaType::copy(int type, void *data, const void *copy) -{ - if (copy) { - switch(type) { - case QMetaType::VoidStar: - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - *static_cast<void **>(data) = *static_cast<void* const *>(copy); - return true; - case QMetaType::Long: - *static_cast<long *>(data) = *static_cast<const long*>(copy); - return true; - case QMetaType::Int: - *static_cast<int *>(data) = *static_cast<const int*>(copy); - return true; - case QMetaType::Short: - *static_cast<short *>(data) = *static_cast<const short*>(copy); - return true; - case QMetaType::Char: - *static_cast<char *>(data) = *static_cast<const char*>(copy); - return true; - case QMetaType::ULong: - *static_cast<ulong *>(data) = *static_cast<const ulong*>(copy); - return true; - case QMetaType::UInt: - *static_cast<uint *>(data) = *static_cast<const uint*>(copy); - return true; - case QMetaType::LongLong: - *static_cast<qlonglong *>(data) = *static_cast<const qlonglong*>(copy); - return true; - case QMetaType::ULongLong: - *static_cast<qulonglong *>(data) = *static_cast<const qulonglong*>(copy); - return true; - case QMetaType::UShort: - *static_cast<ushort *>(data) = *static_cast<const ushort*>(copy); - return true; - case QMetaType::UChar: - *static_cast<uchar *>(data) = *static_cast<const uchar*>(copy); - return true; - case QMetaType::Bool: - *static_cast<bool *>(data) = *static_cast<const bool*>(copy); - return true; - case QMetaType::Float: - *static_cast<float *>(data) = *static_cast<const float*>(copy); - return true; - case QMetaType::Double: - *static_cast<double *>(data) = *static_cast<const double*>(copy); - return true; - case QMetaType::QChar: - *static_cast<NS(QChar) *>(data) = *static_cast<const NS(QChar)*>(copy); - return true; - case QMetaType::QVariantMap: - *static_cast<NS(QVariantMap) *>(data) = *static_cast<const NS(QVariantMap)*>(copy); - return true; - case QMetaType::QVariantHash: - *static_cast<NS(QVariantHash) *>(data) = *static_cast<const NS(QVariantHash)*>(copy); - return true; - case QMetaType::QVariantList: - *static_cast<NS(QVariantList) *>(data) = *static_cast<const NS(QVariantList)*>(copy); - return true; - case QMetaType::QByteArray: - *static_cast<NS(QByteArray) *>(data) = *static_cast<const NS(QByteArray)*>(copy); - return true; - case QMetaType::QString: - *static_cast<NS(QString) *>(data) = *static_cast<const NS(QString)*>(copy); - return true; - case QMetaType::QStringList: - *static_cast<NS(QStringList) *>(data) = *static_cast<const NS(QStringList)*>(copy); - return true; - case QMetaType::QBitArray: - *static_cast<NS(QBitArray) *>(data) = *static_cast<const NS(QBitArray)*>(copy); - return true; - case QMetaType::QDate: - *static_cast<NS(QDate) *>(data) = *static_cast<const NS(QDate)*>(copy); - return true; - case QMetaType::QTime: - *static_cast<NS(QTime) *>(data) = *static_cast<const NS(QTime)*>(copy); - return true; - case QMetaType::QDateTime: - *static_cast<NS(QDateTime) *>(data) = *static_cast<const NS(QDateTime)*>(copy); - return true; - case QMetaType::QUrl: - *static_cast<NS(QUrl) *>(data) = *static_cast<const NS(QUrl)*>(copy); - return true; - case QMetaType::QLocale: - *static_cast<NS(QLocale) *>(data) = *static_cast<const NS(QLocale)*>(copy); - return true; - case QMetaType::QRect: - *static_cast<NS(QRect) *>(data) = *static_cast<const NS(QRect)*>(copy); - return true; - case QMetaType::QRectF: - *static_cast<NS(QRectF) *>(data) = *static_cast<const NS(QRectF)*>(copy); - return true; - case QMetaType::QSize: - *static_cast<NS(QSize) *>(data) = *static_cast<const NS(QSize)*>(copy); - return true; - case QMetaType::QSizeF: - *static_cast<NS(QSizeF) *>(data) = *static_cast<const NS(QSizeF)*>(copy); - return true; - case QMetaType::QLine: - *static_cast<NS(QLine) *>(data) = *static_cast<const NS(QLine)*>(copy); - return true; - case QMetaType::QLineF: - *static_cast<NS(QLineF) *>(data) = *static_cast<const NS(QLineF)*>(copy); - return true; - case QMetaType::QPoint: - *static_cast<NS(QPoint) *>(data) = *static_cast<const NS(QPoint)*>(copy); - return true; - case QMetaType::QPointF: - *static_cast<NS(QPointF) *>(data) = *static_cast<const NS(QPointF)*>(copy); - return true; - case QMetaType::QVector3D: - *static_cast<NS(QVector3D) *>(data) = *static_cast<const NS(QVector3D)*>(copy); - return true; -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - *static_cast<NS(QRegExp) *>(data) = *static_cast<const NS(QRegExp)*>(copy); - return true; -#endif - case QMetaType::Void: - return true; - - -#ifdef QT3_SUPPORT - case QMetaType::QColorGroup: - *static_cast<NS(QColorGroup) *>(data) = *static_cast<const NS(QColorGroup)*>(copy); - return true; -#endif - - case QMetaType::QFont: - *static_cast<NS(QFont) *>(data) = *static_cast<const NS(QFont)*>(copy); - return true; - case QMetaType::QPixmap: - *static_cast<NS(QPixmap) *>(data) = *static_cast<const NS(QPixmap)*>(copy); - return true; - case QMetaType::QBrush: - *static_cast<NS(QBrush) *>(data) = *static_cast<const NS(QBrush)*>(copy); - return true; - case QMetaType::QColor: - *static_cast<NS(QColor) *>(data) = *static_cast<const NS(QColor)*>(copy); - return true; - case QMetaType::QPalette: - *static_cast<NS(QPalette) *>(data) = *static_cast<const NS(QPalette)*>(copy); - return true; - case QMetaType::QImage: - *static_cast<NS(QImage) *>(data) = *static_cast<const NS(QImage)*>(copy); - return true; - case QMetaType::QPolygon: - *static_cast<NS(QPolygon) *>(data) = *static_cast<const NS(QPolygon)*>(copy); - return true; - case QMetaType::QRegion: - *static_cast<NS(QRegion) *>(data) = *static_cast<const NS(QRegion)*>(copy); - return true; - case QMetaType::QBitmap: - *static_cast<NS(QBitmap) *>(data) = *static_cast<const NS(QBitmap)*>(copy); - return true; -#ifndef QT_NO_CURSOR - case QMetaType::QCursor: - *static_cast<NS(QCursor) *>(data) = *static_cast<const NS(QCursor)*>(copy); - return true; -#endif - case QMetaType::QKeySequence: - *static_cast<NS(QKeySequence) *>(data) = *static_cast<const NS(QKeySequence)*>(copy); - return true; - case QMetaType::QPen: - *static_cast<NS(QPen) *>(data) = *static_cast<const NS(QPen)*>(copy); - return true; - case QMetaType::QTextLength: - *static_cast<NS(QTextLength) *>(data) = *static_cast<const NS(QTextLength)*>(copy); - return true; - case QMetaType::QTextFormat: - *static_cast<NS(QTextFormat) *>(data) = *static_cast<const NS(QTextFormat)*>(copy); - return true; - case QMetaType::QMatrix: - *static_cast<NS(QMatrix) *>(data) = *static_cast<const NS(QMatrix)*>(copy); - return true; - case QMetaType::QTransform: - *static_cast<NS(QTransform) *>(data) = *static_cast<const NS(QTransform)*>(copy); - return true; - case QMetaType::QMatrix4x4: - *static_cast<NS(QMatrix4x4) *>(data) = *static_cast<const NS(QMatrix4x4)*>(copy); - return true; - case QMetaType::QVector2D: - *static_cast<NS(QVector2D) *>(data) = *static_cast<const NS(QVector2D)*>(copy); - return true; - case QMetaType::QVector4D: - *static_cast<NS(QVector4D) *>(data) = *static_cast<const NS(QVector4D)*>(copy); - return true; - case QMetaType::QQuaternion: - *static_cast<NS(QQuaternion) *>(data) = *static_cast<const NS(QQuaternion)*>(copy); - return true; - - default: - if (type == qMetaTypeId<QVariant>()) { - *static_cast<NS(QVariant) *>(data) = *static_cast<const NS(QVariant)*>(copy); - return true; - } else if (type == qMetaTypeId<QJSValue>()) { - *static_cast<NS(QJSValue) *>(data) = *static_cast<const NS(QJSValue)*>(copy); - return true; - } else if (type == qMetaTypeId<QDeclarativeV8Handle>()) { - *static_cast<NS(QDeclarativeV8Handle) *>(data) = *static_cast<const NS(QDeclarativeV8Handle)*>(copy); - return true; - } else if (typeCategory(type) != Unknown) { - *static_cast<void **>(data) = *static_cast<void* const *>(copy); - return true; - } - break; - } - } else { - switch(type) { - case QMetaType::VoidStar: - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - *static_cast<void **>(data) = 0; - return true; - case QMetaType::Long: - *static_cast<long *>(data) = long(0); - return true; - case QMetaType::Int: - *static_cast<int *>(data) = int(0); - return true; - case QMetaType::Short: - *static_cast<short *>(data) = short(0); - return true; - case QMetaType::Char: - *static_cast<char *>(data) = char(0); - return true; - case QMetaType::ULong: - *static_cast<ulong *>(data) = ulong(0); - return true; - case QMetaType::UInt: - *static_cast<uint *>(data) = uint(0); - return true; - case QMetaType::LongLong: - *static_cast<qlonglong *>(data) = qlonglong(0); - return true; - case QMetaType::ULongLong: - *static_cast<qulonglong *>(data) = qulonglong(0); - return true; - case QMetaType::UShort: - *static_cast<ushort *>(data) = ushort(0); - return true; - case QMetaType::UChar: - *static_cast<uchar *>(data) = uchar(0); - return true; - case QMetaType::Bool: - *static_cast<bool *>(data) = bool(false); - return true; - case QMetaType::Float: - *static_cast<float *>(data) = float(0); - return true; - case QMetaType::Double: - *static_cast<double *>(data) = double(0); - return true; - case QMetaType::QChar: - *static_cast<NS(QChar) *>(data) = NS(QChar)(); - return true; - case QMetaType::QVariantMap: - *static_cast<NS(QVariantMap) *>(data) = NS(QVariantMap)(); - return true; - case QMetaType::QVariantHash: - *static_cast<NS(QVariantHash) *>(data) = NS(QVariantHash)(); - return true; - case QMetaType::QVariantList: - *static_cast<NS(QVariantList) *>(data) = NS(QVariantList)(); - return true; - case QMetaType::QByteArray: - *static_cast<NS(QByteArray) *>(data) = NS(QByteArray)(); - return true; - case QMetaType::QString: - *static_cast<NS(QString) *>(data) = NS(QString)(); - return true; - case QMetaType::QStringList: - *static_cast<NS(QStringList) *>(data) = NS(QStringList)(); - return true; - case QMetaType::QBitArray: - *static_cast<NS(QBitArray) *>(data) = NS(QBitArray)(); - return true; - case QMetaType::QDate: - *static_cast<NS(QDate) *>(data) = NS(QDate)(); - return true; - case QMetaType::QTime: - *static_cast<NS(QTime) *>(data) = NS(QTime)(); - return true; - case QMetaType::QDateTime: - *static_cast<NS(QDateTime) *>(data) = NS(QDateTime)(); - return true; - case QMetaType::QUrl: - *static_cast<NS(QUrl) *>(data) = NS(QUrl)(); - return true; - case QMetaType::QLocale: - *static_cast<NS(QLocale) *>(data) = NS(QLocale)(); - return true; - case QMetaType::QRect: - *static_cast<NS(QRect) *>(data) = NS(QRect)(); - return true; - case QMetaType::QRectF: - *static_cast<NS(QRectF) *>(data) = NS(QRectF)(); - return true; - case QMetaType::QSize: - *static_cast<NS(QSize) *>(data) = NS(QSize)(); - return true; - case QMetaType::QSizeF: - *static_cast<NS(QSizeF) *>(data) = NS(QSizeF)(); - return true; - case QMetaType::QLine: - *static_cast<NS(QLine) *>(data) = NS(QLine)(); - return true; - case QMetaType::QLineF: - *static_cast<NS(QLineF) *>(data) = NS(QLineF)(); - return true; - case QMetaType::QPoint: - *static_cast<NS(QPoint) *>(data) = NS(QPoint)(); - return true; - case QMetaType::QPointF: - *static_cast<NS(QPointF) *>(data) = NS(QPointF)(); - return true; - case QMetaType::QVector3D: - *static_cast<NS(QVector3D) *>(data) = NS(QVector3D)(); - return true; -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - *static_cast<NS(QRegExp) *>(data) = NS(QRegExp)(); - return true; -#endif - case QMetaType::Void: - return true; - -#ifdef QT3_SUPPORT - case QMetaType::QColorGroup: - *static_cast<NS(QColorGroup) *>(data) = NS(QColorGroup)(); - return true; -#endif - - case QMetaType::QFont: - *static_cast<NS(QFont) *>(data) = NS(QFont)(); - return true; - case QMetaType::QPixmap: - *static_cast<NS(QPixmap) *>(data) = NS(QPixmap)(); - return true; - case QMetaType::QBrush: - *static_cast<NS(QBrush) *>(data) = NS(QBrush)(); - return true; - case QMetaType::QColor: - *static_cast<NS(QColor) *>(data) = NS(QColor)(); - return true; - case QMetaType::QPalette: - *static_cast<NS(QPalette) *>(data) = NS(QPalette)(); - return true; - case QMetaType::QImage: - *static_cast<NS(QImage) *>(data) = NS(QImage)(); - return true; - case QMetaType::QPolygon: - *static_cast<NS(QPolygon) *>(data) = NS(QPolygon)(); - return true; - case QMetaType::QRegion: - *static_cast<NS(QRegion) *>(data) = NS(QRegion)(); - return true; - case QMetaType::QBitmap: - *static_cast<NS(QBitmap) *>(data) = NS(QBitmap)(); - return true; -#ifndef QT_NO_CURSOR - case QMetaType::QCursor: - *static_cast<NS(QCursor) *>(data) = NS(QCursor)(); - return true; -#endif - case QMetaType::QKeySequence: - *static_cast<NS(QKeySequence) *>(data) = NS(QKeySequence)(); - return true; - case QMetaType::QPen: - *static_cast<NS(QPen) *>(data) = NS(QPen)(); - return true; - case QMetaType::QTextLength: - *static_cast<NS(QTextLength) *>(data) = NS(QTextLength)(); - return true; - case QMetaType::QTextFormat: - *static_cast<NS(QTextFormat) *>(data) = NS(QTextFormat)(); - return true; - case QMetaType::QMatrix: - *static_cast<NS(QMatrix) *>(data) = NS(QMatrix)(); - return true; - case QMetaType::QTransform: - *static_cast<NS(QTransform) *>(data) = NS(QTransform)(); - return true; - case QMetaType::QMatrix4x4: - *static_cast<NS(QMatrix4x4) *>(data) = NS(QMatrix4x4)(); - return true; - case QMetaType::QVector2D: - *static_cast<NS(QVector2D) *>(data) = NS(QVector2D)(); - return true; - case QMetaType::QVector4D: - *static_cast<NS(QVector4D) *>(data) = NS(QVector4D)(); - return true; - case QMetaType::QQuaternion: - *static_cast<NS(QQuaternion) *>(data) = NS(QQuaternion)(); - return true; - default: - if (type == qMetaTypeId<QVariant>()) { - *static_cast<NS(QVariant) *>(data) = NS(QVariant)(); - return true; - } else if (type == qMetaTypeId<QJSValue>()) { - *static_cast<NS(QJSValue) *>(data) = NS(QJSValue)(); - return true; - } else if (type == qMetaTypeId<QDeclarativeV8Handle>()) { - *static_cast<NS(QDeclarativeV8Handle) *>(data) = NS(QDeclarativeV8Handle)(); - return true; - } else if (typeCategory(type) != Unknown) { - *static_cast<void **>(data) = 0; - return true; - } - break; - } - } - - return false; -} - int QDeclarativeMetaType::QQuickAnchorLineMetaTypeId() { static int id = 0; diff --git a/src/declarative/qml/qdeclarativemetatype_p.h b/src/declarative/qml/qdeclarativemetatype_p.h index fc4cff8342..6a8da1a390 100644 --- a/src/declarative/qml/qdeclarativemetatype_p.h +++ b/src/declarative/qml/qdeclarativemetatype_p.h @@ -71,9 +71,6 @@ class QDeclarativeTypeModule; class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeMetaType { public: - static bool canCopy(int type); - static bool copy(int type, void *data, const void *copy = 0); - static QList<QString> qmlTypeNames(); static QList<QDeclarativeType*> qmlTypes(); diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalWithQJSValue.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithQJSValue.qml new file mode 100644 index 0000000000..36f481d533 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithQJSValue.qml @@ -0,0 +1,14 @@ +import Qt.test 1.0 + +MyQmlObject { + property string expression + property string compare + property bool pass: false + + onSignalWithQJSValue: + { + qjsvalueMethod(arg); + var expected = eval(expression); + pass = eval(compare)(arg, expected); + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h index 06cc561c7f..b7f3f909ea 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h @@ -163,6 +163,7 @@ public: int value; }; QVariant variant() const { return m_variant; } + QJSValue qjsvalue() const { return m_qjsvalue; } int intProperty() const { return m_intProperty; } void setIntProperty(int i) { m_intProperty = i; emit intChanged(); } @@ -176,6 +177,7 @@ signals: void thirdBasicSignal(); void signalWithUnknownType(const MyQmlObject::MyType &arg); void signalWithVariant(const QVariant &arg); + void signalWithQJSValue(const QJSValue &arg); void intChanged(); public slots: @@ -185,6 +187,7 @@ public slots: void setString(const QString &s) { m_string = s; } void myinvokable(MyQmlObject *o) { myinvokableObject = o; } void variantMethod(const QVariant &v) { m_variant = v; } + void qjsvalueMethod(const QJSValue &v) { m_qjsvalue = v; } void v8function(QDeclarativeV8Function*); private: @@ -199,6 +202,7 @@ private: int m_resetProperty; QRegExp m_regExp; QVariant m_variant; + QJSValue m_qjsvalue; int m_intProperty; }; diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 31d4feb655..38d436448f 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -148,6 +148,8 @@ private slots: void signalWithJSValueInVariant(); void signalWithJSValueInVariant_twoEngines_data(); void signalWithJSValueInVariant_twoEngines(); + void signalWithQJSValue_data(); + void signalWithQJSValue(); void moduleApi_data(); void moduleApi(); void importScripts_data(); @@ -2945,6 +2947,32 @@ void tst_qdeclarativeecmascript::signalWithJSValueInVariant_twoEngines() QVERIFY(!object->property("pass").toBool()); } +void tst_qdeclarativeecmascript::signalWithQJSValue_data() +{ + signalWithJSValueInVariant_data(); +} + +void tst_qdeclarativeecmascript::signalWithQJSValue() +{ + QFETCH(QString, expression); + QFETCH(QString, compare); + + QDeclarativeComponent component(&engine, TEST_FILE("signalWithQJSValue.qml")); + QScopedPointer<MyQmlObject> object(qobject_cast<MyQmlObject *>(component.create())); + QVERIFY(object != 0); + + QJSValue value = engine.evaluate(expression); + QVERIFY(!engine.hasUncaughtException()); + object->setProperty("expression", expression); + object->setProperty("compare", compare); + object->setProperty("pass", false); + + emit object->signalWithQJSValue(value); + + QVERIFY(object->property("pass").toBool()); + QVERIFY(object->qjsvalue().strictlyEquals(value)); +} + void tst_qdeclarativeecmascript::moduleApi_data() { QTest::addColumn<QUrl>("testfile"); diff --git a/tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp b/tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp index bf83a3d5f8..7426ac1518 100644 --- a/tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp +++ b/tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp @@ -40,18 +40,7 @@ ****************************************************************************/ #include <qtest.h> -#include <QLocale> -#include <QPixmap> -#include <QBitmap> -#include <QPen> -#include <QTextLength> -#include <QMatrix4x4> -#include <QVector2D> -#include <QVector3D> -#include <QVector4D> -#include <QQuaternion> #include <qdeclarative.h> -#include <QWidget> #include <private/qdeclarativemetatype_p.h> #include <private/qdeclarativepropertyvalueinterceptor_p.h> @@ -65,8 +54,6 @@ public: private slots: void initTestCase(); - void copy(); - void qmlParserStatusCast(); void qmlPropertyValueSourceCast(); void qmlPropertyValueInterceptorCast(); @@ -116,26 +103,6 @@ public: }; QML_DECLARE_TYPE(ValueInterceptorTestType); - -#define COPY_TEST(cpptype, metatype, value, defaultvalue) \ -{ \ - cpptype v = (value); cpptype v2 = (value); \ - QVERIFY(QDeclarativeMetaType::copy(QMetaType:: metatype, &v, 0)); \ - QCOMPARE((cpptype)(v),(cpptype)(defaultvalue)); \ - QVERIFY(v == (defaultvalue)); \ - QVERIFY(QDeclarativeMetaType::copy(QMetaType:: metatype, &v, &v2)); \ - QVERIFY(v == (value)); \ -} - -#define QT_COPY_TEST(type, value) \ -{ \ - type v = (value); type v2 = (value); \ - QVERIFY(QDeclarativeMetaType::copy(QMetaType:: type, &v, 0)); \ - QVERIFY(v == (type ())); \ - QVERIFY(QDeclarativeMetaType::copy(QMetaType:: type, &v, &v2)); \ - QVERIFY(v == (value)); \ -} - void tst_qdeclarativemetatype::initTestCase() { qmlRegisterType<TestType>("Test", 1, 0, "TestType"); @@ -144,140 +111,6 @@ void tst_qdeclarativemetatype::initTestCase() qmlRegisterType<ValueInterceptorTestType>("Test", 1, 0, "ValueInterceptorTestType"); } -void tst_qdeclarativemetatype::copy() -{ - QVERIFY(QDeclarativeMetaType::copy(QMetaType::Void, 0, 0)); - - COPY_TEST(bool, Bool, true, false); - COPY_TEST(int, Int, 10, 0); - COPY_TEST(unsigned int, UInt, 10, 0); - COPY_TEST(long long, LongLong, 10, 0); - COPY_TEST(unsigned long long, ULongLong, 10, 0); - COPY_TEST(double, Double, 19.2, 0); - - QT_COPY_TEST(QChar, QChar('a')); - - QVariantMap variantMap; - variantMap.insert("Hello World!", QVariant(10)); - QT_COPY_TEST(QVariantMap, variantMap); - - QT_COPY_TEST(QVariantList, QVariantList() << QVariant(19.2)); - QT_COPY_TEST(QString, QString("QML Rocks!")); - QT_COPY_TEST(QStringList, QStringList() << "QML" << "Rocks"); - QT_COPY_TEST(QByteArray, QByteArray("0x1102DDD")); - QT_COPY_TEST(QBitArray, QBitArray(102, true)); - QDate cd = QDate::currentDate(); - QT_COPY_TEST(QDate, cd); - QTime ct = QTime::currentTime(); - QT_COPY_TEST(QTime, ct); - QDateTime cdt = QDateTime::currentDateTime(); - QT_COPY_TEST(QDateTime, cdt); - QT_COPY_TEST(QUrl, QUrl("http://www.nokia.com")); - QT_COPY_TEST(QLocale, QLocale(QLocale::English, QLocale::Australia)); - QT_COPY_TEST(QRect, QRect(-10, 10, 102, 99)); - QT_COPY_TEST(QRectF, QRectF(-10.2, 1.2, 102, 99.6)); - QT_COPY_TEST(QSize, QSize(100, 2)); - QT_COPY_TEST(QSizeF, QSizeF(20.2, -100234.2)); - QT_COPY_TEST(QLine, QLine(0, 0, 100, 100)); - QT_COPY_TEST(QLineF, QLineF(-10.2, 0, 103, 1)); - QT_COPY_TEST(QPoint, QPoint(-1912, 1613)); - QT_COPY_TEST(QPointF, QPointF(-908.1, 1612)); - QT_COPY_TEST(QRegExp, QRegExp("(\\d+)(?:\\s*)(cm|inch)")); - - QVariantHash variantHash; - variantHash.insert("Hello World!", QVariant(19)); - QT_COPY_TEST(QVariantHash, variantHash); - - QT_COPY_TEST(QFont, QFont("Helvetica", 1024)); - - { - QPixmap v = QPixmap(100, 100); QPixmap v2 = QPixmap(100, 100); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QPixmap, &v, 0)); - QVERIFY(v.size() == QPixmap().size()); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QPixmap , &v, &v2)); - QVERIFY(v.size() == QPixmap(100,100).size()); - } - - QT_COPY_TEST(QBrush, QBrush(Qt::blue)); - QT_COPY_TEST(QColor, QColor("lightsteelblue")); - QT_COPY_TEST(QPalette, QPalette(Qt::green)); - - { - QImage v = QImage(100, 100, QImage::Format_RGB32); - QImage v2 = QImage(100, 100, QImage::Format_RGB32); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QImage, &v, 0)); - QVERIFY(v.size() == QImage().size()); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QImage , &v, &v2)); - QVERIFY(v.size() == QImage(100,100, QImage::Format_RGB32).size()); - } - - QT_COPY_TEST(QPolygon, QPolygon(QRect(100, 100, 200, 103))); - QT_COPY_TEST(QRegion, QRegion(QRect(0, 10, 99, 87))); - - { - QBitmap v = QBitmap(100, 100); QBitmap v2 = QBitmap(100, 100); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QBitmap, &v, 0)); - QVERIFY(v.size() == QBitmap().size()); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QBitmap , &v, &v2)); - QVERIFY(v.size() == QBitmap(100,100).size()); - } - - { - QCursor v = QCursor(Qt::SizeFDiagCursor); QCursor v2 = QCursor(Qt::SizeFDiagCursor); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QCursor, &v, 0)); - QVERIFY(v.shape() == QCursor().shape()); - QVERIFY(QDeclarativeMetaType::copy(QMetaType::QCursor , &v, &v2)); - QVERIFY(v.shape() == QCursor(Qt::SizeFDiagCursor).shape()); - } - - QT_COPY_TEST(QKeySequence, QKeySequence("Ctrl+O")); - QT_COPY_TEST(QPen, QPen(Qt::red)); - QT_COPY_TEST(QTextLength, QTextLength(QTextLength::FixedLength, 10.2)); - QT_COPY_TEST(QTextFormat, QTextFormat(QTextFormat::ListFormat)); - QT_COPY_TEST(QMatrix, QMatrix().translate(10, 10)); - QT_COPY_TEST(QTransform, QTransform().translate(10, 10)); - QT_COPY_TEST(QMatrix4x4, QMatrix4x4(1,0,2,3,0,1,0,0,9,0,1,0,0,0,10,1)); - QT_COPY_TEST(QVector2D, QVector2D(10.2, 1)); - QT_COPY_TEST(QVector3D, QVector3D(10.2, 1, -2)); - QT_COPY_TEST(QVector4D, QVector4D(10.2, 1, -2, 1.2)); - QT_COPY_TEST(QQuaternion, QQuaternion(1.0, 10.2, 1, -2)); - - int voidValue; - COPY_TEST(void *, VoidStar, (void *)&voidValue, (void *)0); - COPY_TEST(long, Long, 10, 0); - COPY_TEST(short, Short, 10, 0); - COPY_TEST(char, Char, 'a', 0); - COPY_TEST(unsigned long, ULong, 10, 0); - COPY_TEST(unsigned short, UShort, 10, 0); - COPY_TEST(unsigned char, UChar, 'a', 0); - COPY_TEST(float, Float, 10.5, 0); - - QObject objectValue; - QWidget widgetValue; - COPY_TEST(QObject *, QObjectStar, &objectValue, 0); - COPY_TEST(QWidget *, QWidgetStar, &widgetValue, 0); - COPY_TEST(qreal, QReal, 10.5, 0); - - { - QVariant tv = QVariant::fromValue(QVariant(10)); - QVariant v(tv); QVariant v2(tv); - QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId<QVariant>(), &v, 0)); - QVERIFY(v == QVariant()); - QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId<QVariant>(), &v, &v2)); - QVERIFY(v == tv); - } - - { - TestType t; QVariant tv = QVariant::fromValue(&t); - - QVariant v(tv); QVariant v2(tv); - QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId<TestType *>(), &v, 0)); - QVERIFY(v == QVariant::fromValue((TestType *)0)); - QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId<TestType *>(), &v, &v2)); - QVERIFY(v == tv); - } -} - void tst_qdeclarativemetatype::qmlParserStatusCast() { QVERIFY(QDeclarativeMetaType::qmlType(QVariant::Int) == 0); |