Get rid of QDeclarativeMetaType::{canCopy,copy}
authorKent Hansen <kent.hansen@nokia.com>
Wed, 12 Oct 2011 12:27:57 +0000 (14:27 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 9 Dec 2011 12:08:36 +0000 (13:08 +0100)
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>
src/declarative/qml/qdeclarativeboundsignal.cpp
src/declarative/qml/qdeclarativemetatype.cpp
src/declarative/qml/qdeclarativemetatype_p.h
tests/auto/declarative/qdeclarativeecmascript/data/signalWithQJSValue.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeecmascript/testtypes.h
tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp

index 6bbbb24..8c0c0b1 100644 (file)
@@ -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);
index ac89eb9..6ead4f1 100644 (file)
 
 #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;
index fc4cff8..6a8da1a 100644 (file)
@@ -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 (file)
index 0000000..36f481d
--- /dev/null
@@ -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);
+    }
+}
index 06cc561..b7f3f90 100644 (file)
@@ -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;
 };
 
index 31d4feb..38d4364 100644 (file)
@@ -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");
index bf83a3d..7426ac1 100644 (file)
 ****************************************************************************/
 
 #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);