aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-17 18:15:07 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-09-23 14:54:47 +0200
commit20a1002fba8c14514f5a40a9c468adb4c84410d3 (patch)
tree69d76e857bd7e81cad49dc2a9c8c9d62499cf55c
parent8e222a70d19d5eef616e1d6306415da64fbab4cb (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 <fabian.kosmale@qt.io>
-rw-r--r--src/qml/qml/qqmlglobal.cpp6
-rw-r--r--src/qml/qml/qqmlglobal_p.h4
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp90
-rw-r--r--src/quick/util/qquickglobal.cpp61
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 &params)
{
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 &params);
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 &params, 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 &params, 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;