aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2021-03-22 14:11:17 +0100
committerUlf Hermann <ulf.hermann@qt.io>2021-03-24 10:17:35 +0100
commit2943eb3b110e8e93651b42f5d70a574517aaf437 (patch)
treec051bf69fb7460733f7613376836d20ba7dd7aad /src/qml/jsruntime
parent33cf3aab88acfa7c47e3eb7bf2f84a041adbd7d3 (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.cpp13
-rw-r--r--src/qml/jsruntime/qv4engine_p.h2
-rw-r--r--src/qml/jsruntime/qv4jscall_p.h4
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);
}
}