diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-11-26 22:13:47 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-11-27 10:14:07 +0100 |
commit | 8e5d49a2f96221dd191b9497ef2ec4da34a66e5f (patch) | |
tree | 03ff3bfc538b9fb6e6dedf8db5bc9796a428b29d /src/qml/qml/qqmlpropertybinding.cpp | |
parent | 58b3c7b0d5177e54a4dbb8f4cdbe2fc49804899e (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.cpp | 59 |
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); |