Crash fix in ~QVariant
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>
Fri, 16 Mar 2012 16:28:47 +0000 (17:28 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 21 Mar 2012 10:43:14 +0000 (11:43 +0100)
QVariant handlers can not be unregistered. We are not able to guarantee
that such operation is safe and we do not want to.

Change-Id: Id9a12e6a8c750110e4a08eab1de3e07e5c408675
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/kernel/qvariant.cpp
src/corelib/kernel/qvariant_p.h
src/gui/kernel/qguiapplication.cpp
src/gui/kernel/qguivariant.cpp
src/widgets/kernel/qwidgetsvariant.cpp
tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp

index cbef475..19b999a 100644 (file)
@@ -96,8 +96,6 @@ public:
     {
         Handlers[name] = handler;
     }
-
-    inline void unregisterHandler(const QModulesPrivate::Names name);
 };
 }  // namespace
 
@@ -892,21 +890,11 @@ Q_CORE_EXPORT const QVariant::Handler *qcoreVariantHandler()
     return &qt_kernel_variant_handler;
 }
 
-inline void HandlersManager::unregisterHandler(const QModulesPrivate::Names name)
-{
-    Handlers[name] = &qt_dummy_variant_handler;
-}
-
 Q_CORE_EXPORT void QVariantPrivate::registerHandler(const int /* Modules::Names */name, const QVariant::Handler *handler)
 {
     handlerManager.registerHandler(static_cast<QModulesPrivate::Names>(name), handler);
 }
 
-Q_CORE_EXPORT void QVariantPrivate::unregisterHandler(const int /* Modules::Names */ name)
-{
-    handlerManager.unregisterHandler(static_cast<QModulesPrivate::Names>(name));
-}
-
 /*!
     \class QVariant
     \brief The QVariant class acts like a union for the most common Qt data types.
index 75c94ed..2f5c4f5 100644 (file)
@@ -459,7 +459,6 @@ private:
 
 namespace QVariantPrivate {
 Q_CORE_EXPORT void registerHandler(const int /* Modules::Names */ name, const QVariant::Handler *handler);
-Q_CORE_EXPORT void unregisterHandler(const int /* Modules::Names */ name);
 }
 
 #if !defined(QT_NO_DEBUG_STREAM)
index d726470..c6ff5bb 100644 (file)
@@ -143,7 +143,6 @@ QFont *QGuiApplicationPrivate::app_font = 0;
 bool QGuiApplicationPrivate::obey_desktop_settings = true;
 
 extern void qRegisterGuiVariant();
-extern void qUnregisterGuiVariant();
 extern void qInitDrawhelperAsm();
 extern void qInitImageConversions();
 
@@ -358,8 +357,6 @@ QGuiApplication::~QGuiApplication()
 
     clearPalette();
 
-    qUnregisterGuiVariant();
-
 #ifndef QT_NO_CURSOR
     d->cursor_list.clear();
 #endif
index 50d3f0b..531afee 100644 (file)
@@ -389,12 +389,4 @@ void qRegisterGuiVariant()
 }
 Q_CONSTRUCTOR_FUNCTION(qRegisterGuiVariant)
 
-void qUnregisterGuiVariant()
-{
-    QVariantPrivate::unregisterHandler(QModulesPrivate::Gui);
-    qMetaTypeGuiHelper = 0;
-}
-Q_DESTRUCTOR_FUNCTION(qUnregisterGuiVariant)
-
-
 QT_END_NAMESPACE
index 8184768..f6817ce 100644 (file)
@@ -184,12 +184,4 @@ void qRegisterWidgetsVariant()
 }
 Q_CONSTRUCTOR_FUNCTION(qRegisterWidgetsVariant)
 
-void qUnregisterWidgetsVariant()
-{
-    QVariantPrivate::unregisterHandler(QModulesPrivate::Widgets);
-    qMetaTypeWidgetsHelper = 0;
-}
-Q_DESTRUCTOR_FUNCTION(qUnregisterWidgetsVariant)
-
-
 QT_END_NAMESPACE
index 89c8f77..b6cb6b3 100644 (file)
@@ -58,6 +58,7 @@
 #include <qmatrix4x4.h>
 #include <qpen.h>
 #include <qpolygon.h>
+#include <qpalette.h>
 #include <qtransform.h>
 #include <qvector2d.h>
 #include <qvector3d.h>
@@ -286,6 +287,9 @@ private slots:
     void loadQt5Stream();
     void saveQt5Stream_data();
     void saveQt5Stream();
+
+    void guiVariantAtExit();
+    void widgetsVariantAtExit();
 private:
     void dataStream_data(QDataStream::Version version);
     void loadQVariantFromDataStream(QDataStream::Version version);
@@ -3735,5 +3739,29 @@ void tst_QVariant::debugStreamType()
     QVERIFY(msgHandler.testPassed());
 }
 
+void tst_QVariant::guiVariantAtExit()
+{
+    // crash test, it should not crash at QGuiApplication exit
+    static QVariant cursor = QCursor();
+    static QVariant point = QPoint();
+    static QVariant image = QImage();
+    static QVariant pallete = QPalette();
+    Q_UNUSED(cursor);
+    Q_UNUSED(point);
+    Q_UNUSED(image);
+    Q_UNUSED(pallete);
+    QVERIFY(true);
+}
+
+void tst_QVariant::widgetsVariantAtExit()
+{
+    // crash test, it should not crash at QGuiApplication exit
+    static QVariant icon= QIcon();
+    static QVariant sizePolicy = QSizePolicy();
+    Q_UNUSED(icon);
+    Q_UNUSED(sizePolicy);
+    QVERIFY(true);
+}
+
 QTEST_MAIN(tst_QVariant)
 #include "tst_qvariant.moc"