From 32ace476d08bad2397026f8d70f6e534ef366aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=A4nel?= Date: Thu, 15 Mar 2012 16:18:34 +0100 Subject: remove double-string-double conversion from QDeclarativeListModel we do a double-string-double conversion in QDeclarativeListModel which introduces precision errors if that conversion is lossy, e.g. ecvt. is used Change-Id: Ie871ebbb04695f56fc7b49b9d788037da4a857c0 Reviewed-by: Glenn Watson --- src/declarative/util/qdeclarativelistmodel.cpp | 11 +++++++---- .../qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/declarative/util/qdeclarativelistmodel.cpp b/src/declarative/util/qdeclarativelistmodel.cpp index 94275311..14de5f63 100644 --- a/src/declarative/util/qdeclarativelistmodel.cpp +++ b/src/declarative/util/qdeclarativelistmodel.cpp @@ -707,7 +707,8 @@ bool QDeclarativeListModelParser::compileProperty(const QDeclarativeCustomParser if (variant.isString()) { d += variant.asString().toUtf8(); } else if (variant.isNumber()) { - d += QByteArray::number(variant.asNumber(),'g',20); + double temp = variant.asNumber(); + d += QByteArray( reinterpret_cast(&temp), sizeof(double)); } else if (variant.isBoolean()) { d += char(variant.asBoolean()); } else if (variant.isScript()) { @@ -726,7 +727,8 @@ bool QDeclarativeListModelParser::compileProperty(const QDeclarativeCustomParser } } else { d[0] = char(QDeclarativeParser::Variant::Number); - d += QByteArray::number(v); + double temp = v; + d += QByteArray( reinterpret_cast(&temp), sizeof(double)); } } } @@ -782,7 +784,6 @@ QByteArray QDeclarativeListModelParser::compile(const QList(obj); - ModelNode *root = new ModelNode(rv->m_nested); rv->m_nested->m_ownsRoot = true; rv->m_nested->_root = root; @@ -824,7 +825,9 @@ void QDeclarativeListModelParser::setCustomData(QObject *obj, const QByteArray & n->values.append(bool(data[1 + instr.dataIdx])); break; case QDeclarativeParser::Variant::Number: - n->values.append(QByteArray(data + 1 + instr.dataIdx).toDouble()); + double temp; + ::memcpy(&temp, data + 1 + instr.dataIdx, sizeof(double)); + n->values.append(temp); break; case QDeclarativeParser::Variant::String: n->values.append(QString::fromUtf8(data + 1 + instr.dataIdx)); diff --git a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp index ebb658dd..8612e50a 100644 --- a/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp +++ b/tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp @@ -557,6 +557,10 @@ void tst_qdeclarativelistmodel::static_types_data() QTest::newRow("enum") << "ListElement { foo: Text.AlignHCenter }" << QVariant(double(QDeclarativeText::AlignHCenter)); + + QTest::newRow("real11") + << "ListElement { foo: 11 }" + << QVariant(11.0); } void tst_qdeclarativelistmodel::static_types() -- cgit v1.2.3