diff options
author | Jędrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-12-02 17:52:00 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-22 16:09:34 +0100 |
commit | ee0a997bcd8d00f0515d037c964d77ecfdd3159f (patch) | |
tree | 876cf0c9d4b4ceea9dae39f74bdc560053c8b5ec /tests/auto/corelib/kernel | |
parent | a7b99151f4445755c91d5227607d9ea2f785301f (diff) |
Fix movablity of QVariant.
After 8fd64d22ac7892b061a09c42c72aacf033b80876 (Make usage of internal
QVariant space.) change QVariant started to "inherit" movablity from
interned type.
This change fix it by interning only movable type in QVariant and by
using external allocation for not movable ones.
Obviously, this change has negative impact on QVariant it self, but
after it, QVariant will behave a lot nicer with our containers.
Change-Id: Ibffc95833918f65be737f52d694ee81a2036c412
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib/kernel')
-rw-r--r-- | tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index e540474b3e..9404130d35 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -253,6 +253,7 @@ private slots: void numericalConvert(); void moreCustomTypes(); + void movabilityTest(); void variantInVariant(); void colorInteger(); @@ -2006,7 +2007,7 @@ void tst_QVariant::userType() QVariant userVar3; qVariantSetValue(userVar3, data2); - QVERIFY(userVar2 == userVar3); + userVar3 = userVar2; QVERIFY(userVar2 == userVar3); } @@ -2049,7 +2050,7 @@ void tst_QVariant::userType() QCOMPARE(instanceCount, 3); { QVariant second = myCarrier; - QCOMPARE(instanceCount, 4); + QCOMPARE(instanceCount, 3); second.detach(); QCOMPARE(instanceCount, 4); } @@ -3220,6 +3221,27 @@ void tst_QVariant::moreCustomTypes() QCOMPARE(MyMovable::count, 0); } +void tst_QVariant::movabilityTest() +{ + // This test checks if QVariant is movable even if an internal data is not movable. + QVERIFY(!MyNotMovable::count); + { + QVariant variant = QVariant::fromValue(MyNotMovable()); + QVERIFY(MyNotMovable::count); + + // prepare destination memory space to which variant will be moved + QVariant buffer[1]; + QCOMPARE(buffer[0].type(), QVariant::Invalid); + buffer[0].~QVariant(); + + memcpy(buffer, &variant, sizeof(QVariant)); + QCOMPARE(buffer[0].type(), QVariant::UserType); + MyNotMovable tmp(buffer[0].value<MyNotMovable>()); + + new (&variant) QVariant(); + } + QVERIFY(!MyNotMovable::count); +} void tst_QVariant::variantInVariant() { |