From 681ef6fe7ed5b85a2690e320ff3938ff4e1f539d Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Fri, 24 Jun 2016 12:42:04 +0200 Subject: QML: Use write accessors when setting constant binding values. Bindings with constant values like: Item { x: 10 } Setting these values is now also done through write accessors. On x86_64 QQmlObjectCreator::setPropertyBinding goes from ~7600 instructions to ~3600 (according to valgrind). Change-Id: I6a9ecfcd21c7b115828df3f235c292675ea9efc5 Reviewed-by: Simon Hausmann --- src/qml/qml/qqmlobjectcreator.cpp | 40 +++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'src/qml/qml/qqmlobjectcreator.cpp') diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 2e2d87509a..94e81cdcc7 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -342,8 +342,12 @@ void QQmlObjectCreator::setPropertyValue(const QQmlPropertyData *property, const case QVariant::String: { Q_ASSERT(binding->evaluatesToString()); QString value = binding->valueAsString(qmlUnit); - argv[0] = &value; - QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + if (property->hasAccessors()) { + property->accessors->write(_qobject, &value); + } else { + argv[0] = &value; + QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + } } break; case QVariant::StringList: { @@ -386,23 +390,35 @@ void QQmlObjectCreator::setPropertyValue(const QQmlPropertyData *property, const Q_ASSERT(binding->type == QV4::CompiledData::Binding::Type_Number); double d = binding->valueAsNumber(); int value = int(d); - argv[0] = &value; - QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + if (property->hasAccessors()) { + property->accessors->write(_qobject, &value); + } else { + argv[0] = &value; + QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + } break; } break; case QMetaType::Float: { Q_ASSERT(binding->type == QV4::CompiledData::Binding::Type_Number); float value = float(binding->valueAsNumber()); - argv[0] = &value; - QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + if (property->hasAccessors()) { + property->accessors->write(_qobject, &value); + } else { + argv[0] = &value; + QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + } } break; case QVariant::Double: { Q_ASSERT(binding->type == QV4::CompiledData::Binding::Type_Number); double value = binding->valueAsNumber(); - argv[0] = &value; - QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + if (property->hasAccessors()) { + property->accessors->write(_qobject, &value); + } else { + argv[0] = &value; + QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + } } break; case QVariant::Color: { @@ -499,8 +515,12 @@ void QQmlObjectCreator::setPropertyValue(const QQmlPropertyData *property, const case QVariant::Bool: { Q_ASSERT(binding->type == QV4::CompiledData::Binding::Type_Boolean); bool value = binding->valueAsBoolean(); - argv[0] = &value; - QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + if (property->hasAccessors()) { + property->accessors->write(_qobject, &value); + } else { + argv[0] = &value; + QMetaObject::metacall(_qobject, QMetaObject::WriteProperty, property->coreIndex, argv); + } } break; case QVariant::Vector3D: { -- cgit v1.2.3