aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dist/changes-5.2.04
-rw-r--r--src/qml/compiler/qv4ssa.cpp14
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp2
-rw-r--r--src/qml/qml/qqmlproperty.cpp2
-rw-r--r--tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp8
-rw-r--r--tests/auto/quick/qquickstates/tst_qquickstates.cpp2
6 files changed, 17 insertions, 15 deletions
diff --git a/dist/changes-5.2.0 b/dist/changes-5.2.0
index 969d4e30e6..9db8458319 100644
--- a/dist/changes-5.2.0
+++ b/dist/changes-5.2.0
@@ -42,6 +42,10 @@ Third party components
flag QSGNode::DirtySubtreeBlocked whenever the state of
QSGNode::isSubtreeBlocked() is changed.
+ - When assigning double precision floating point values to integer properties,
+ the engine now truncates instead of rounding. This is consistent with the
+ ECMAScript specification's way of converting doubles to ints.
+
****************************************************************************
* Library *
****************************************************************************
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp
index 6b8c8af8e4..8f17fb1aff 100644
--- a/src/qml/compiler/qv4ssa.cpp
+++ b/src/qml/compiler/qv4ssa.cpp
@@ -1572,10 +1572,7 @@ protected:
{
switch (propType) {
case QMetaType::Bool: return BoolType;
-
- // Can't propagate integers right now, because QML rounds doubles to integers on assignment, as opposed to EcmaScript
-// case QMetaType::Int: return SInt32Type;
-
+ case QMetaType::Int: return SInt32Type;
case QMetaType::Double: return DoubleType;
case QMetaType::QString: return StringType;
default: break;
@@ -1813,11 +1810,12 @@ protected:
}
}
- // Resettable properties need to be able to receive the un-converted
- // value, because assigning "undefined" to them calls the reset function
- // of the property.
+ // Don't convert when writing to QObject properties. All sorts of extra behavior
+ // is defined when writing to them, for example resettable properties are reset
+ // when writing undefined to them, and an exception is thrown when they're missing
+ // a reset function.
const Member *targetMember = s->target->asMember();
- const bool inhibitConversion = targetMember && targetMember->type == Member::MemberOfQObject && targetMember->property->isResettable();
+ const bool inhibitConversion = targetMember && targetMember->type == Member::MemberOfQObject && targetMember->property;
run(s->source, s->target->type, !inhibitConversion);
}
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 07a4ff7cd7..d5aa9f4ead 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -524,7 +524,7 @@ void QObjectWrapper::setProperty(QObject *object, ExecutionContext *ctx, QQmlPro
} else if (value->asFunctionObject()) {
// this is handled by the binding creation above
} else if (property->propType == QMetaType::Int && value->isNumber()) {
- PROPERTY_STORE(int, qRound(value->asDouble()));
+ PROPERTY_STORE(int, value->asDouble());
} else if (property->propType == QMetaType::QReal && value->isNumber()) {
PROPERTY_STORE(qreal, qreal(value->asDouble()));
} else if (property->propType == QMetaType::Float && value->isNumber()) {
diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp
index 7723404831..3975b88bb0 100644
--- a/src/qml/qml/qqmlproperty.cpp
+++ b/src/qml/qml/qqmlproperty.cpp
@@ -1485,7 +1485,7 @@ bool QQmlPropertyPrivate::writeBinding(QObject *object,
if (result->isInteger())
QUICK_STORE(int, result->integerValue())
else if (result->isNumber())
- QUICK_STORE(int, qRound(result->doubleValue()))
+ QUICK_STORE(int, result->doubleValue())
break;
case QMetaType::Double:
if (result->isNumber())
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
index 5b06c3cce9..b1cf8c905f 100644
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
@@ -3489,9 +3489,9 @@ void tst_qqmlecmascript::compiled()
QCOMPARE(object->property("test15").toBool(), false);
QCOMPARE(object->property("test16").toBool(), true);
- QCOMPARE(object->property("test17").toInt(), 5);
+ QCOMPARE(object->property("test17").toInt(), 4);
QCOMPARE(object->property("test18").toReal(), qreal(176));
- QCOMPARE(object->property("test19").toInt(), 7);
+ QCOMPARE(object->property("test19").toInt(), 6);
QCOMPARE(object->property("test20").toReal(), qreal(6.7));
QCOMPARE(object->property("test21").toString(), QLatin1String("6.7"));
QCOMPARE(object->property("test22").toString(), QLatin1String("!"));
@@ -3516,7 +3516,7 @@ void tst_qqmlecmascript::numberAssignment()
QCOMPARE(object->property("test3"), QVariant((qreal)6));
QCOMPARE(object->property("test4"), QVariant((qreal)6));
- QCOMPARE(object->property("test5"), QVariant((int)7));
+ QCOMPARE(object->property("test5"), QVariant((int)6));
QCOMPARE(object->property("test6"), QVariant((int)7));
QCOMPARE(object->property("test7"), QVariant((int)6));
QCOMPARE(object->property("test8"), QVariant((int)6));
@@ -6445,7 +6445,7 @@ void tst_qqmlecmascript::realToInt()
QMetaObject::invokeMethod(object, "test1");
QCOMPARE(object->value(), int(4));
QMetaObject::invokeMethod(object, "test2");
- QCOMPARE(object->value(), int(8));
+ QCOMPARE(object->value(), int(7));
}
void tst_qqmlecmascript::urlProperty()
diff --git a/tests/auto/quick/qquickstates/tst_qquickstates.cpp b/tests/auto/quick/qquickstates/tst_qquickstates.cpp
index e165b559f7..0c9b75636f 100644
--- a/tests/auto/quick/qquickstates/tst_qquickstates.cpp
+++ b/tests/auto/quick/qquickstates/tst_qquickstates.cpp
@@ -1567,7 +1567,7 @@ void tst_qquickstates::QTBUG_14830()
QVERIFY(rect != 0);
QQuickItem *item = rect->findChild<QQuickItem*>("area");
- QCOMPARE(item->width(), qreal(171));
+ QCOMPARE(item->width(), qreal(170));
}
void tst_qquickstates::avoidFastForward()