diff options
author | Ulf Hermann <[email protected]> | 2020-09-17 18:15:07 +0200 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2020-09-23 14:54:47 +0200 |
commit | 20a1002fba8c14514f5a40a9c468adb4c84410d3 (patch) | |
tree | 69d76e857bd7e81cad49dc2a9c8c9d62499cf55c /src | |
parent | 8e222a70d19d5eef616e1d6306415da64fbab4cb (diff) |
QQmlValueTypeProvider: Pass arguments as QJSValue
This is so that we can replace them with factory functions as a next
step.
Change-Id: Ic8619e4e779bd3e47471642c556601555758697b
Reviewed-by: Fabian Kosmale <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/qml/qqmlglobal.cpp | 6 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal_p.h | 4 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 90 | ||||
-rw-r--r-- | src/quick/util/qquickglobal.cpp | 61 |
4 files changed, 62 insertions, 99 deletions
diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp index 0cc7c525c7..0291701164 100644 --- a/src/qml/qml/qqmlglobal.cpp +++ b/src/qml/qml/qqmlglobal.cpp @@ -67,13 +67,13 @@ bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst) return true; } -QVariant QQmlValueTypeProvider::createValueType(int type, int argc, const void *argv[]) +QVariant QQmlValueTypeProvider::createValueType(int type, const QJSValue ¶ms) { QVariant v; QQmlValueTypeProvider *p = this; do { - if (p->create(type, argc, argv, &v)) + if (p->create(type, params, &v)) return v; } while ((p = p->next)); @@ -169,7 +169,7 @@ bool QQmlValueTypeProvider::writeValueType(int type, const void *src, QVariant& return true; } -bool QQmlValueTypeProvider::create(int, int, const void *[], QVariant *) { return false; } +bool QQmlValueTypeProvider::create(int, const QJSValue &, QVariant *) { return false; } bool QQmlValueTypeProvider::createFromString(int, const QString &, void *, size_t) { return false; } bool QQmlValueTypeProvider::variantFromString(int, const QString &, QVariant *) { return false; } bool QQmlValueTypeProvider::variantFromJsObject(int, const QV4::Value &, QV4::ExecutionEngine *, QVariant *) { return false; } diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h index 5fbf3d0e38..707fc0ea1c 100644 --- a/src/qml/qml/qqmlglobal_p.h +++ b/src/qml/qml/qqmlglobal_p.h @@ -224,7 +224,7 @@ public: bool initValueType(int, QVariant&); - QVariant createValueType(int, int, const void *[]); + QVariant createValueType(int, const QJSValue ¶ms); bool createValueFromString(int, const QString &, void *, size_t); QVariant createVariantFromString(int, const QString &, bool *); @@ -236,7 +236,7 @@ public: bool writeValueType(int, const void *, QVariant&); private: - virtual bool create(int, int, const void *[], QVariant *); + virtual bool create(int, const QJSValue ¶ms, QVariant *); virtual bool createFromString(int, const QString &, void *, size_t); virtual bool variantFromString(int, const QString &, QVariant *); diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 6dd12d61d5..afa5c64794 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -468,7 +468,21 @@ ReturnedValue QtObject::method_font(const FunctionObject *b, const Value *, cons return scope.engine->fromVariant(v); } +static ReturnedValue createValueType(const FunctionObject *b, const Value *argv, int argc, + int parameters, QMetaType::Type type, const char *method) +{ + QV4::Scope scope(b); + if (argc != parameters) { + return scope.engine->throwError(QString::fromUtf8("Qt.%1(): Invalid arguments") + .arg(QString::fromUtf8(method))); + } + QJSValue params = scope.engine->jsEngine()->newArray(parameters); + for (int i = 0; i < parameters; ++i) + params.setProperty(i, QJSValuePrivate::fromReturnedValue(argv[i].asReturnedValue())); + + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(type, params)); +} /*! \qmlmethod vector2d Qt::vector2d(real x, real y) @@ -477,16 +491,7 @@ ReturnedValue QtObject::method_font(const FunctionObject *b, const Value *, cons */ ReturnedValue QtObject::method_vector2d(const FunctionObject *b, const Value *, const Value *argv, int argc) { - QV4::Scope scope(b); - if (argc != 2) - THROW_GENERIC_ERROR("Qt.vector2d(): Invalid arguments"); - - float xy[3]; // qvector2d uses float internally - xy[0] = argv[0].toNumber(); - xy[1] = argv[1].toNumber(); - - const void *params[] = { xy }; - return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector2D, 1, params)); + return createValueType(b, argv, argc, 2, QMetaType::QVector2D, "vector2d"); } /*! @@ -496,17 +501,7 @@ ReturnedValue QtObject::method_vector2d(const FunctionObject *b, const Value *, */ ReturnedValue QtObject::method_vector3d(const FunctionObject *b, const Value *, const Value *argv, int argc) { - QV4::Scope scope(b); - if (argc != 3) - THROW_GENERIC_ERROR("Qt.vector3d(): Invalid arguments"); - - float xyz[3]; // qvector3d uses float internally - xyz[0] = argv[0].toNumber(); - xyz[1] = argv[1].toNumber(); - xyz[2] = argv[2].toNumber(); - - const void *params[] = { xyz }; - return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector3D, 1, params)); + return createValueType(b, argv, argc, 3, QMetaType::QVector3D, "vector3d"); } /*! @@ -516,18 +511,7 @@ ReturnedValue QtObject::method_vector3d(const FunctionObject *b, const Value *, */ ReturnedValue QtObject::method_vector4d(const FunctionObject *b, const Value *, const Value *argv, int argc) { - QV4::Scope scope(b); - if (argc != 4) - THROW_GENERIC_ERROR("Qt.vector4d(): Invalid arguments"); - - float xyzw[4]; // qvector4d uses float internally - xyzw[0] = argv[0].toNumber(); - xyzw[1] = argv[1].toNumber(); - xyzw[2] = argv[2].toNumber(); - xyzw[3] = argv[3].toNumber(); - - const void *params[] = { xyzw }; - return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QVector4D, 1, params)); + return createValueType(b, argv, argc, 4, QMetaType::QVector4D, "vector4d"); } /*! @@ -537,18 +521,7 @@ ReturnedValue QtObject::method_vector4d(const FunctionObject *b, const Value *, */ ReturnedValue QtObject::method_quaternion(const FunctionObject *b, const Value *, const Value *argv, int argc) { - QV4::Scope scope(b); - if (argc != 4) - THROW_GENERIC_ERROR("Qt.quaternion(): Invalid arguments"); - - qreal sxyz[4]; // qquaternion uses qreal internally - sxyz[0] = argv[0].toNumber(); - sxyz[1] = argv[1].toNumber(); - sxyz[2] = argv[2].toNumber(); - sxyz[3] = argv[3].toNumber(); - - const void *params[] = { sxyz }; - return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QQuaternion, 1, params)); + return createValueType(b, argv, argc, 4, QMetaType::QQuaternion, "quaternion"); } /*! @@ -577,7 +550,8 @@ ReturnedValue QtObject::method_matrix4x4(const FunctionObject *b, const Value *, QV4::Scope scope(b); if (argc == 0) { - return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 0, nullptr)); + return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType( + QMetaType::QMatrix4x4, QJSValue())); } if (argc == 1 && argv[0].isObject()) { @@ -588,29 +562,7 @@ ReturnedValue QtObject::method_matrix4x4(const FunctionObject *b, const Value *, return scope.engine->fromVariant(v); } - if (argc != 16) - THROW_GENERIC_ERROR("Qt.matrix4x4(): Invalid arguments"); - - qreal vals[16]; // qmatrix4x4 uses qreal internally - vals[0] = argv[0].toNumber(); - vals[1] = argv[1].toNumber(); - vals[2] = argv[2].toNumber(); - vals[3] = argv[3].toNumber(); - vals[4] = argv[4].toNumber(); - vals[5] = argv[5].toNumber(); - vals[6] = argv[6].toNumber(); - vals[7] = argv[7].toNumber(); - vals[8] = argv[8].toNumber(); - vals[9] = argv[9].toNumber(); - vals[10] = argv[10].toNumber(); - vals[11] = argv[11].toNumber(); - vals[12] = argv[12].toNumber(); - vals[13] = argv[13].toNumber(); - vals[14] = argv[14].toNumber(); - vals[15] = argv[15].toNumber(); - - const void *params[] = { vals }; - return scope.engine->fromVariant(QQml_valueTypeProvider()->createValueType(QMetaType::QMatrix4x4, 1, params)); + return createValueType(b, argv, argc, 16, QMetaType::QMatrix4x4, "matrix4x4"); } /*! diff --git a/src/quick/util/qquickglobal.cpp b/src/quick/util/qquickglobal.cpp index 9fe4c6c119..539336a048 100644 --- a/src/quick/util/qquickglobal.cpp +++ b/src/quick/util/qquickglobal.cpp @@ -581,55 +581,66 @@ public: return QMatrix4x4(matVals); } - bool create(int type, int argc, const void *argv[], QVariant *v) override + bool create(int type, const QJSValue ¶ms, QVariant *v) override { switch (type) { case QMetaType::QFont: // must specify via js-object. break; case QMetaType::QVector2D: - if (argc == 1) { - const float *xy = reinterpret_cast<const float*>(argv[0]); - QVector2D v2(xy[0], xy[1]); - *v = QVariant(v2); + if (params.isArray()) { + *v = QVariant(QVector2D(params.property(0).toNumber(), + params.property(1).toNumber())); return true; } break; case QMetaType::QVector3D: - if (argc == 1) { - const float *xyz = reinterpret_cast<const float*>(argv[0]); - QVector3D v3(xyz[0], xyz[1], xyz[2]); - *v = QVariant(v3); + if (params.isArray()) { + *v = QVariant(QVector3D(params.property(0).toNumber(), + params.property(1).toNumber(), + params.property(2).toNumber())); return true; } break; case QMetaType::QVector4D: - if (argc == 1) { - const float *xyzw = reinterpret_cast<const float*>(argv[0]); - QVector4D v4(xyzw[0], xyzw[1], xyzw[2], xyzw[3]); - *v = QVariant(v4); + if (params.isArray()) { + *v = QVariant(QVector4D(params.property(0).toNumber(), + params.property(1).toNumber(), + params.property(2).toNumber(), + params.property(3).toNumber())); return true; } break; case QMetaType::QQuaternion: - if (argc == 1) { - const qreal *sxyz = reinterpret_cast<const qreal*>(argv[0]); - QQuaternion q(sxyz[0], sxyz[1], sxyz[2], sxyz[3]); - *v = QVariant(q); + if (params.isArray()) { + *v = QVariant(QQuaternion(params.property(0).toNumber(), + params.property(1).toNumber(), + params.property(2).toNumber(), + params.property(3).toNumber())); return true; } break; case QMetaType::QMatrix4x4: - if (argc == 0) { + if (params.isNull() || params.isUndefined()) { QMatrix4x4 m; *v = QVariant(m); return true; - } else if (argc == 1) { - const qreal *vals = reinterpret_cast<const qreal*>(argv[0]); - QMatrix4x4 m(vals[0], vals[1], vals[2], vals[3], - vals[4], vals[5], vals[6], vals[7], - vals[8], vals[9], vals[10], vals[11], - vals[12], vals[13], vals[14], vals[15]); - *v = QVariant(m); + } else if (params.isArray()) { + *v = QVariant(QMatrix4x4(params.property(0).toNumber(), + params.property(1).toNumber(), + params.property(2).toNumber(), + params.property(3).toNumber(), + params.property(4).toNumber(), + params.property(5).toNumber(), + params.property(6).toNumber(), + params.property(7).toNumber(), + params.property(8).toNumber(), + params.property(9).toNumber(), + params.property(10).toNumber(), + params.property(11).toNumber(), + params.property(12).toNumber(), + params.property(13).toNumber(), + params.property(14).toNumber(), + params.property(15).toNumber())); return true; } break; |