aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlpropertybinding.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-11-26 22:13:47 +0100
committerLars Knoll <lars.knoll@qt.io>2020-11-27 10:14:07 +0100
commit8e5d49a2f96221dd191b9497ef2ec4da34a66e5f (patch)
tree03ff3bfc538b9fb6e6dedf8db5bc9796a428b29d /src/qml/qml/qqmlpropertybinding.cpp
parent58b3c7b0d5177e54a4dbb8f4cdbe2fc49804899e (diff)
Shortcut conversions of common data types
When returning the result of bindings, shortcut the conversion of common data types and do not go through QVariant. Removes ~20% of the overhead in the evaluation of simple bindings of types bool, int, double, float and QString. Pick-to: dev Change-Id: I0323cae12892b8ca52aedfe5e58a23e614a10d45 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlpropertybinding.cpp')
-rw-r--r--src/qml/qml/qqmlpropertybinding.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/qml/qml/qqmlpropertybinding.cpp b/src/qml/qml/qqmlpropertybinding.cpp
index 656e2788c4..ec1b6c7176 100644
--- a/src/qml/qml/qqmlpropertybinding.cpp
+++ b/src/qml/qml/qqmlpropertybinding.cpp
@@ -122,6 +122,65 @@ bool QQmlPropertyBinding::evaluate(QMetaType metaType, void *dataPtr)
return false;
}
+ int propertyType = metaType.id();
+
+ switch (propertyType) {
+ case QMetaType::Bool: {
+ bool b;
+ if (result->isBoolean())
+ b = result->booleanValue();
+ else
+ b = result->toBoolean();
+ if (b == *static_cast<bool *>(dataPtr))
+ return false;
+ *static_cast<bool *>(dataPtr) = b;
+ return true;
+ }
+ case QMetaType::Int: {
+ int i;
+ if (result->isInteger())
+ i = result->integerValue();
+ else if (result->isNumber()) {
+ i = QV4::StaticValue::toInteger(result->doubleValue());
+ } else {
+ break;
+ }
+ if (i == *static_cast<int *>(dataPtr))
+ return false;
+ *static_cast<int *>(dataPtr) = i;
+ return true;
+ }
+ case QMetaType::Double:
+ if (result->isNumber()) {
+ double d = result->asDouble();
+ if (d == *static_cast<double *>(dataPtr))
+ return false;
+ *static_cast<double *>(dataPtr) = d;
+ return true;
+ }
+ break;
+ case QMetaType::Float:
+ if (result->isNumber()) {
+ float d = float(result->asDouble());
+ if (d == *static_cast<float *>(dataPtr))
+ return false;
+ *static_cast<float *>(dataPtr) = d;
+ return true;
+ }
+ break;
+ case QMetaType::QString:
+ if (result->isString()) {
+ QString s = result->toQStringNoThrow();
+ if (s == *static_cast<QString *>(dataPtr))
+ return false;
+ *static_cast<QString *>(dataPtr) = s;
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+
QVariant resultVariant(scope.engine->toVariant(result, metaType.id()));
resultVariant.convert(metaType);
const bool hasChanged = !metaType.equals(resultVariant.constData(), dataPtr);