diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2021-03-22 14:11:17 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2021-03-24 10:17:35 +0100 |
commit | 2943eb3b110e8e93651b42f5d70a574517aaf437 (patch) | |
tree | c051bf69fb7460733f7613376836d20ba7dd7aad /src/qml/jsruntime | |
parent | 33cf3aab88acfa7c47e3eb7bf2f84a041adbd7d3 (diff) |
Use QMetaType for ExecutionEngine::metaTypeFromJS()
We should avoid looking up metatypes by ID. That's expensive.
Change-Id: I00ce0a7f95ec82b0db6e7eb976e39e50522a7fe4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 13 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4jscall_p.h | 4 |
3 files changed, 8 insertions, 11 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index b18c055786..556409b2fc 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -2231,10 +2231,10 @@ void ExecutionEngine::setExtensionData(int index, Deletable *data) // Converts a JS value to a meta-type. // data must point to a place that can store a value of the given type. // Returns true if conversion succeeded, false otherwise. -bool ExecutionEngine::metaTypeFromJS(const Value &value, int type, void *data) +bool ExecutionEngine::metaTypeFromJS(const Value &value, QMetaType metaType, void *data) { // check if it's one of the types we know - switch (QMetaType::Type(type)) { + switch (metaType.id()) { case QMetaType::Bool: *reinterpret_cast<bool*>(data) = value.toBoolean(); return true; @@ -2382,7 +2382,6 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, int type, void *data) ; } - const QMetaType metaType(type); { if (metaType.flags() & QMetaType::IsEnumeration) { *reinterpret_cast<int *>(data) = value.toInt32(); @@ -2399,9 +2398,8 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, int type, void *data) { const QQmlValueTypeWrapper *vtw = value.as<QQmlValueTypeWrapper>(); - if (vtw && vtw->typeId() == type) { + if (vtw && vtw->type() == metaType) return vtw->toGadget(data); - } } #if 0 @@ -2445,8 +2443,7 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, int type, void *data) bool canCast = false; if (QV4::VariantObject *vo = proto->as<QV4::VariantObject>()) { const QVariant &v = vo->d()->data(); - canCast = (type == v.userType()) - || (valueType.isValid() && (valueType == v.metaType())); + canCast = (metaType == v.metaType()); } else if (proto->as<QV4::QObjectWrapper>()) { QV4::ScopedObject p(scope, proto.getPointer()); @@ -2471,7 +2468,7 @@ bool ExecutionEngine::metaTypeFromJS(const Value &value, int type, void *data) } else if (value.isNull() && isPointer) { *reinterpret_cast<void* *>(data) = nullptr; return true; - } else if (type == qMetaTypeId<QJSValue>()) { + } else if (metaType == QMetaType::fromType<QJSValue>()) { QJSValuePrivate::setValue(reinterpret_cast<QJSValue*>(data), value.asReturnedValue()); return true; } diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 7f14fd5e4e..1ec5eb126a 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -667,7 +667,7 @@ public: QVariantMap variantMapFromJS(const QV4::Object *o); - static bool metaTypeFromJS(const Value &value, int type, void *data); + static bool metaTypeFromJS(const Value &value, QMetaType type, void *data); QV4::ReturnedValue metaTypeToJS(QMetaType type, const void *data); int maxJSStackSize() const; diff --git a/src/qml/jsruntime/qv4jscall_p.h b/src/qml/jsruntime/qv4jscall_p.h index 285164604c..46503d25e8 100644 --- a/src/qml/jsruntime/qv4jscall_p.h +++ b/src/qml/jsruntime/qv4jscall_p.h @@ -173,7 +173,7 @@ ReturnedValue convertAndCall( Q_ALLOCA_VAR(void, argument, argumentSize); argumentType.construct(argument); if (i < argc) - engine->metaTypeFromJS(argv[i], argumentType.id(), argument); + engine->metaTypeFromJS(argv[i], argumentType, argument); values[i + 1] = argument; } else { values[i + 1] = nullptr; @@ -235,7 +235,7 @@ void convertAndCall(ExecutionEngine *engine, const Value *thisObject, if (resultType == QMetaType::fromType<QVariant>()) *static_cast<QVariant *>(result) = scope.engine->toVariant(jsResult, 0); else - scope.engine->metaTypeFromJS(jsResult, resultType.id(), result); + scope.engine->metaTypeFromJS(jsResult, resultType, result); } } |