From bfd2b30faf3da224e5bc5f86d13a57524cd6b2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Fri, 16 Mar 2012 17:28:47 +0100 Subject: Crash fix in ~QVariant 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 --- src/corelib/kernel/qvariant.cpp | 12 ---------- src/corelib/kernel/qvariant_p.h | 1 - src/gui/kernel/qguiapplication.cpp | 3 --- src/gui/kernel/qguivariant.cpp | 8 ------- src/widgets/kernel/qwidgetsvariant.cpp | 8 ------- .../auto/corelib/kernel/qvariant/tst_qvariant.cpp | 28 ++++++++++++++++++++++ 6 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index cbef47566c..19b999a1e2 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -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(name), handler); } -Q_CORE_EXPORT void QVariantPrivate::unregisterHandler(const int /* Modules::Names */ name) -{ - handlerManager.unregisterHandler(static_cast(name)); -} - /*! \class QVariant \brief The QVariant class acts like a union for the most common Qt data types. diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index 75c94ed401..2f5c4f54ee 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -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) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index d72647091d..c6ff5bb230 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -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 diff --git a/src/gui/kernel/qguivariant.cpp b/src/gui/kernel/qguivariant.cpp index 50d3f0b7d1..531afeef2d 100644 --- a/src/gui/kernel/qguivariant.cpp +++ b/src/gui/kernel/qguivariant.cpp @@ -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 diff --git a/src/widgets/kernel/qwidgetsvariant.cpp b/src/widgets/kernel/qwidgetsvariant.cpp index 81847681e4..f6817cec8a 100644 --- a/src/widgets/kernel/qwidgetsvariant.cpp +++ b/src/widgets/kernel/qwidgetsvariant.cpp @@ -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 diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 89c8f77e4a..b6cb6b3632 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -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" -- cgit v1.2.3