diff options
Diffstat (limited to 'src/qml/jsruntime')
| -rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 33 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 2 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4jscall_p.h | 2 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 12 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4sequenceobject.cpp | 4 |
5 files changed, 26 insertions, 27 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 5f3f1a9aed..34fbd19a78 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -1484,7 +1484,7 @@ QQmlError ExecutionEngine::catchExceptionAsQmlError() // Variant conversion code typedef QSet<QV4::Heap::Object *> V4ObjectSet; -static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, int typeHint, bool createJSValueForObjects, V4ObjectSet *visitedObjects); +static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, QMetaType typeHint, bool createJSValueForObjects, V4ObjectSet *visitedObjects); static QObject *qtObjectFromJS(const QV4::Value &value); static QVariant objectToVariant(QV4::ExecutionEngine *e, const QV4::Object *o, V4ObjectSet *visitedObjects = nullptr); static bool convertToNativeQObject(const QV4::Value &value, QMetaType targetType, void **result); @@ -1496,17 +1496,11 @@ static QV4::ReturnedValue variantToJS(QV4::ExecutionEngine *v4, const QVariant & return v4->metaTypeToJS(value.metaType(), value.constData()); } - -QVariant ExecutionEngine::toVariant(const Value &value, int typeHint, bool createJSValueForObjects) -{ - return ::toVariant(this, value, typeHint, createJSValueForObjects, nullptr); -} - - -static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, int typeHint, bool createJSValueForObjects, V4ObjectSet *visitedObjects) +static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, QMetaType metaType, bool createJSValueForObjects, V4ObjectSet *visitedObjects) { Q_ASSERT (!value.isEmpty()); QV4::Scope scope(e); + int typeHint = metaType.id(); if (const QV4::VariantObject *v = value.as<QV4::VariantObject>()) return v->d()->data(); @@ -1517,7 +1511,7 @@ static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, int if (typeHint == QMetaType::QJsonValue) return QVariant::fromValue(QV4::JsonObject::toJsonValue(value)); - if (typeHint == qMetaTypeId<QJSValue>()) + if (metaType == QMetaType::fromType<QJSValue>()) return QVariant::fromValue(QJSValuePrivate::fromReturnedValue(value.asReturnedValue())); if (value.as<QV4::Object>()) { @@ -1569,8 +1563,7 @@ static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, int if (succeeded) return retn; #endif - if (typeHint != -1) { - auto metaType = QMetaType(typeHint); + if (metaType.isValid()) { retn = QVariant(metaType, nullptr); auto retnAsIterable = retn.value<QSequentialIterable>(); if (retnAsIterable.metaContainer().canAddValue()) { @@ -1591,7 +1584,7 @@ static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, int continue; } } - asVariant = toVariant(e, arrayValue, valueMetaType.id(), false, + asVariant = toVariant(e, arrayValue, valueMetaType, false, visitedObjects); if (valueMetaType.id() != QMetaType::QVariant) { auto originalType = asVariant.metaType(); @@ -1653,6 +1646,12 @@ static QVariant toVariant(QV4::ExecutionEngine *e, const QV4::Value &value, int return objectToVariant(e, o, visitedObjects); } + +QVariant ExecutionEngine::toVariant(const Value &value, QMetaType typeHint, bool createJSValueForObjects) +{ + return ::toVariant(this, value, typeHint, createJSValueForObjects, nullptr); +} + static QVariant objectToVariant(QV4::ExecutionEngine *e, const QV4::Object *o, V4ObjectSet *visitedObjects) { Q_ASSERT(o); @@ -1681,7 +1680,7 @@ static QVariant objectToVariant(QV4::ExecutionEngine *e, const QV4::Object *o, V int length = a->getLength(); for (int ii = 0; ii < length; ++ii) { v = a->get(ii); - list << ::toVariant(e, v, -1, /*createJSValueForObjects*/false, visitedObjects); + list << ::toVariant(e, v, QMetaType {}, /*createJSValueForObjects*/false, visitedObjects); } result = list; @@ -1697,7 +1696,7 @@ static QVariant objectToVariant(QV4::ExecutionEngine *e, const QV4::Object *o, V break; QString key = name->toQStringNoThrow(); - map.insert(key, ::toVariant(e, val, /*type hint*/-1, /*createJSValueForObjects*/false, visitedObjects)); + map.insert(key, ::toVariant(e, val, /*type hint*/ QMetaType {}, /*createJSValueForObjects*/false, visitedObjects)); } result = map; @@ -2328,7 +2327,7 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi const QV4::ArrayObject *a = value.as<QV4::ArrayObject>(); if (a) { *reinterpret_cast<QVariantList *>(data) = a->engine()->toVariant( - *a, /*typeHint*/-1, /*createJSValueForObjects*/false).toList(); + *a, /*typeHint*/QMetaType{}, /*createJSValueForObjects*/false).toList(); return true; } break; @@ -2343,7 +2342,7 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, voi } case QMetaType::QVariant: if (const QV4::Managed *m = value.as<QV4::Managed>()) - *reinterpret_cast<QVariant*>(data) = m->engine()->toVariant(value, /*typeHint*/-1, /*createJSValueForObjects*/false); + *reinterpret_cast<QVariant*>(data) = m->engine()->toVariant(value, /*typeHint*/QMetaType{}, /*createJSValueForObjects*/false); else if (value.isNull()) *reinterpret_cast<QVariant*>(data) = QVariant::fromValue(nullptr); else if (value.isUndefined()) diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index ac095d2812..96aad5ee72 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -681,7 +681,7 @@ public: QQmlError catchExceptionAsQmlError(); // variant conversions - QVariant toVariant(const QV4::Value &value, int typeHint, bool createJSValueForObjects = true); + QVariant toVariant(const QV4::Value &value, QMetaType typeHint, bool createJSValueForObjects = true); QV4::ReturnedValue fromVariant(const QVariant &); QVariantMap variantMapFromJS(const QV4::Object *o); diff --git a/src/qml/jsruntime/qv4jscall_p.h b/src/qml/jsruntime/qv4jscall_p.h index 46503d25e8..de4acca8a3 100644 --- a/src/qml/jsruntime/qv4jscall_p.h +++ b/src/qml/jsruntime/qv4jscall_p.h @@ -233,7 +233,7 @@ void convertAndCall(ExecutionEngine *engine, const Value *thisObject, // When the return type is QVariant, JS objects are to be returned as // QJSValue wrapped in QVariant. metaTypeFromJS unwraps them, unfortunately. if (resultType == QMetaType::fromType<QVariant>()) - *static_cast<QVariant *>(result) = scope.engine->toVariant(jsResult, 0); + *static_cast<QVariant *>(result) = scope.engine->toVariant(jsResult, QMetaType {}); else scope.engine->metaTypeFromJS(jsResult, resultType, result); } diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 25d92596c9..4fb5851e42 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -617,9 +617,9 @@ void QObjectWrapper::setProperty(ExecutionEngine *engine, QObject *object, QQmlP } else { QVariant v; if (property->isQList()) - v = scope.engine->toVariant(value, qMetaTypeId<QList<QObject *> >()); + v = scope.engine->toVariant(value, QMetaType::fromType<QList<QObject *> >()); else - v = scope.engine->toVariant(value, propType); + v = scope.engine->toVariant(value, property->propType()); QQmlRefPointer<QQmlContextData> callingQmlContext = scope.engine->callingQmlContext(); if (!QQmlPropertyPrivate::write(object, *property, v, callingQmlContext)) { @@ -1524,7 +1524,7 @@ static int MatchScore(const QV4::Value &actual, QMetaType conversionMetaType) if (obj->as<QV4::VariantObject>()) { if (conversionType == qMetaTypeId<QVariant>()) return 0; - if (obj->engine()->toVariant(actual, -1).metaType() == conversionMetaType) + if (obj->engine()->toVariant(actual, QMetaType {}).metaType() == conversionMetaType) return 0; else return 10; @@ -1547,7 +1547,7 @@ static int MatchScore(const QV4::Value &actual, QMetaType conversionMetaType) } if (obj->as<QV4::QQmlValueTypeWrapper>()) { - const QVariant v = obj->engine()->toVariant(actual, -1); + const QVariant v = obj->engine()->toVariant(actual, QMetaType {}); if (v.userType() == conversionType) return 0; else if (v.canConvert(conversionMetaType)) @@ -1895,7 +1895,7 @@ bool CallArgument::fromValue(QMetaType metaType, QV4::ExecutionEngine *engine, c else if (!value.isNull() && !value.isUndefined()) // null and undefined are nullptr return false; } else if (callType == qMetaTypeId<QVariant>()) { - qvariantPtr = new (&allocData) QVariant(scope.engine->toVariant(value, -1)); + qvariantPtr = new (&allocData) QVariant(scope.engine->toVariant(value, QMetaType {})); type = callType; } else if (callType == qMetaTypeId<QList<QObject*> >()) { qlistPtr = new (&allocData) QList<QObject *>(); @@ -1986,7 +1986,7 @@ bool CallArgument::fromValue(QMetaType metaType, QV4::ExecutionEngine *engine, c type = -1; QQmlEnginePrivate *ep = engine->qmlEngine() ? QQmlEnginePrivate::get(engine->qmlEngine()) : nullptr; - QVariant v = scope.engine->toVariant(value, callType); + QVariant v = scope.engine->toVariant(value, metaType); const QMetaType callMetaType(callType); if (v.metaType() == callMetaType) { diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp index 95ba210753..0523d740fb 100644 --- a/src/qml/jsruntime/qv4sequenceobject.cpp +++ b/src/qml/jsruntime/qv4sequenceobject.cpp @@ -253,7 +253,7 @@ public: qsizetype count = size(); const QMetaType valueMetaType = meta(d())->valueMetaType(); - const QVariant element = engine()->toVariant(value, valueMetaType.id(), false); + const QVariant element = engine()->toVariant(value, valueMetaType, false); if (index == count) { append(element); @@ -680,7 +680,7 @@ QVariant SequencePrototype::toVariant(const QV4::Value &array, int typeHint, boo QV4::ScopedValue v(scope); for (quint32 i = 0; i < length; ++i) { const QMetaType valueMetaType = meta->valueMetaType(); - QVariant variant = scope.engine->toVariant(a->get(i), valueMetaType.id(), false); + QVariant variant = scope.engine->toVariant(a->get(i), valueMetaType, false); if (variant.metaType() != valueMetaType && !variant.convert(valueMetaType)) variant = QVariant(valueMetaType); meta->addValueAtEnd(result.data(), variant.constData()); |
