De-inline some destructors in QtWidgets
authorMarc Mutz <marc.mutz@kdab.com>
Mon, 22 Oct 2012 06:30:32 +0000 (08:30 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 6 Nov 2012 11:40:55 +0000 (12:40 +0100)
Destructors should be out-of-line so that the compiler doesn't generate
one per translation unit.

Apart from creating more work for the compiler, it can also lead to
duplicated vtables if the dtor is the first virtual function
(reimplementation), and all other virtuals are inline, too.
Duplicate vtables then break RTTI.

In addition, having virtual dtors de-inlined allows us to add code
to them in a BC way.

As a final argument, this change may lead to less code app-side, since
a sequence of cross-DLL calls (to member variable dtors) is replaced
by a single cross-DLL call to the new out-of-line dtor.

Change-Id: Ifb8c4aa992c75d61ba9ac8de5ab41d1e96b0a0b1
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
30 files changed:
src/widgets/dialogs/qwizard.cpp
src/widgets/dialogs/qwizard.h
src/widgets/graphicsview/qgraphicsitem.cpp
src/widgets/graphicsview/qgraphicsitem.h
src/widgets/kernel/qgesture.cpp
src/widgets/kernel/qgesture.h
src/widgets/kernel/qlayoutitem.cpp
src/widgets/kernel/qlayoutitem.h
src/widgets/styles/qstyleoption.cpp
src/widgets/styles/qstyleoption.h
src/widgets/styles/qwindowscestyle.cpp
src/widgets/styles/qwindowscestyle.h
src/widgets/styles/qwindowsmobilestyle.cpp
src/widgets/styles/qwindowsmobilestyle.h
src/widgets/styles/qwindowsvistastyle.cpp
src/widgets/styles/qwindowsvistastyle.h
src/widgets/widgets/qcheckbox.cpp
src/widgets/widgets/qcheckbox.h
src/widgets/widgets/qcommandlinkbutton.cpp
src/widgets/widgets/qcommandlinkbutton.h
src/widgets/widgets/qdatetimeedit.cpp
src/widgets/widgets/qdatetimeedit.h
src/widgets/widgets/qprogressbar.cpp
src/widgets/widgets/qprogressbar.h
src/widgets/widgets/qradiobutton.cpp
src/widgets/widgets/qradiobutton.h
src/widgets/widgets/qspinbox.cpp
src/widgets/widgets/qspinbox.h
src/widgets/widgets/qsplitter.cpp
src/widgets/widgets/qsplitter.h

index 7f1cb09..44518ec 100644 (file)
@@ -3384,6 +3384,13 @@ QWizardPage::QWizardPage(QWidget *parent)
 }
 
 /*!
+    Destructor.
+*/
+QWizardPage::~QWizardPage()
+{
+}
+
+/*!
     \property QWizardPage::title
     \brief the title of the page
 
index 2fa428f..9101162 100644 (file)
@@ -218,6 +218,7 @@ class Q_WIDGETS_EXPORT QWizardPage : public QWidget
 
 public:
     explicit QWizardPage(QWidget *parent = 0);
+    ~QWizardPage();
 
     void setTitle(const QString &title);
     QString title() const;
index c432902..dd5fb29 100644 (file)
@@ -7576,6 +7576,13 @@ QGraphicsObject::QGraphicsObject(QGraphicsItemPrivate &dd, QGraphicsItem *parent
 }
 
 /*!
+  Destructor.
+*/
+QGraphicsObject::~QGraphicsObject()
+{
+}
+
+/*!
   \reimp
 */
 bool QGraphicsObject::event(QEvent *ev)
index cf9c6cf..0cb936b 100644 (file)
@@ -563,6 +563,7 @@ class Q_WIDGETS_EXPORT QGraphicsObject : public QObject, public QGraphicsItem
     Q_INTERFACES(QGraphicsItem)
 public:
     explicit QGraphicsObject(QGraphicsItem *parent = 0);
+    ~QGraphicsObject();
 
 #ifdef Q_NO_USING_KEYWORD
     const QObjectList &children() const { return QObject::children(); }
index 28e3213..1f12d1a 100644 (file)
@@ -295,6 +295,12 @@ QPanGesture::QPanGesture(QObject *parent)
     d_func()->gestureType = Qt::PanGesture;
 }
 
+/*!
+    Destructor.
+*/
+QPanGesture::~QPanGesture()
+{
+}
 
 QPointF QPanGesture::lastOffset() const
 {
@@ -486,6 +492,13 @@ QPinchGesture::QPinchGesture(QObject *parent)
     d_func()->gestureType = Qt::PinchGesture;
 }
 
+/*!
+    Destructor.
+*/
+QPinchGesture::~QPinchGesture()
+{
+}
+
 QPinchGesture::ChangeFlags QPinchGesture::totalChangeFlags() const
 {
     return d_func()->totalChangeFlags;
@@ -673,6 +686,13 @@ QSwipeGesture::QSwipeGesture(QObject *parent)
     d_func()->gestureType = Qt::SwipeGesture;
 }
 
+/*!
+    Destructor.
+*/
+QSwipeGesture::~QSwipeGesture()
+{
+}
+
 QSwipeGesture::SwipeDirection QSwipeGesture::horizontalDirection() const
 {
     Q_D(const QSwipeGesture);
@@ -732,6 +752,13 @@ QTapGesture::QTapGesture(QObject *parent)
     d_func()->gestureType = Qt::TapGesture;
 }
 
+/*!
+    Destructor.
+*/
+QTapGesture::~QTapGesture()
+{
+}
+
 QPointF QTapGesture::position() const
 {
     return d_func()->position;
@@ -769,6 +796,13 @@ QTapAndHoldGesture::QTapAndHoldGesture(QObject *parent)
     d_func()->gestureType = Qt::TapAndHoldGesture;
 }
 
+/*!
+    Destructor.
+*/
+QTapAndHoldGesture::~QTapAndHoldGesture()
+{
+}
+
 QPointF QTapAndHoldGesture::position() const
 {
     return d_func()->position;
index b8a7193..0f09f20 100644 (file)
@@ -118,6 +118,7 @@ class Q_WIDGETS_EXPORT QPanGesture : public QGesture
 
 public:
     explicit QPanGesture(QObject *parent = 0);
+    ~QPanGesture();
 
     QPointF lastOffset() const;
     QPointF offset() const;
@@ -164,6 +165,7 @@ public:
 
 public:
     explicit QPinchGesture(QObject *parent = 0);
+    ~QPinchGesture();
 
     ChangeFlags totalChangeFlags() const;
     void setTotalChangeFlags(ChangeFlags value);
@@ -219,6 +221,7 @@ public:
     enum SwipeDirection { NoDirection, Left, Right, Up, Down };
 
     explicit QSwipeGesture(QObject *parent = 0);
+    ~QSwipeGesture();
 
     SwipeDirection horizontalDirection() const;
     SwipeDirection verticalDirection() const;
@@ -239,6 +242,7 @@ class Q_WIDGETS_EXPORT QTapGesture : public QGesture
 
 public:
     explicit QTapGesture(QObject *parent = 0);
+    ~QTapGesture();
 
     QPointF position() const;
     void setPosition(const QPointF &pos);
@@ -256,6 +260,7 @@ class Q_WIDGETS_EXPORT QTapAndHoldGesture : public QGesture
 
 public:
     explicit QTapAndHoldGesture(QObject *parent = 0);
+    ~QTapAndHoldGesture();
 
     QPointF position() const;
     void setPosition(const QPointF &pos);
index 5ef3c17..7de3f47 100644 (file)
@@ -263,6 +263,11 @@ void QLayoutItem::setAlignment(Qt::Alignment alignment)
 */
 
 /*!
+    Destructor.
+*/
+QSpacerItem::~QSpacerItem() {}
+
+/*!
     Changes this spacer item to have preferred width \a w, preferred
     height \a h, horizontal size policy \a hPolicy and vertical size
     policy \a vPolicy.
@@ -291,6 +296,11 @@ void QSpacerItem::changeSize(int w, int h, QSizePolicy::Policy hPolicy,
 */
 
 /*!
+    Destructor.
+*/
+QWidgetItem::~QWidgetItem() {}
+
+/*!
     Destroys the QLayoutItem.
 */
 QLayoutItem::~QLayoutItem()
index a2f60b1..093e7fe 100644 (file)
@@ -99,6 +99,8 @@ public:
                  QSizePolicy::Policy hData = QSizePolicy::Minimum,
                  QSizePolicy::Policy vData = QSizePolicy::Minimum)
         : width(w), height(h), sizeP(hData, vData) { }
+    ~QSpacerItem();
+
     void changeSize(int w, int h,
                      QSizePolicy::Policy hData = QSizePolicy::Minimum,
                      QSizePolicy::Policy vData = QSizePolicy::Minimum);
@@ -124,6 +126,8 @@ class Q_WIDGETS_EXPORT QWidgetItem : public QLayoutItem
 
 public:
     explicit QWidgetItem(QWidget *w) : wid(w) { }
+    ~QWidgetItem();
+
     QSize sizeHint() const;
     QSize minimumSize() const;
     QSize maximumSize() const;
index 53c1cf4..3bc0c05 100644 (file)
@@ -3889,6 +3889,13 @@ QStyleHintReturnMask::QStyleHintReturnMask() : QStyleHintReturn(Version, Type)
 }
 
 /*!
+    Destructor.
+*/
+QStyleHintReturnMask::~QStyleHintReturnMask()
+{
+}
+
+/*!
     \enum QStyleHintReturnMask::StyleOptionType
 
     This enum is used to hold information about the type of the style option, and
@@ -3942,6 +3949,13 @@ QStyleHintReturnVariant::QStyleHintReturnVariant() : QStyleHintReturn(Version, T
 }
 
 /*!
+    Destructor.
+*/
+QStyleHintReturnVariant::~QStyleHintReturnVariant()
+{
+}
+
+/*!
     \enum QStyleHintReturnVariant::StyleOptionType
 
     This enum is used to hold information about the type of the style option, and
index d88582a..2625bf7 100644 (file)
@@ -709,6 +709,7 @@ public:
     enum StyleOptionVersion { Version = 1 };
 
     QStyleHintReturnMask();
+    ~QStyleHintReturnMask();
 
     QRegion region;
 };
@@ -719,6 +720,7 @@ public:
     enum StyleOptionVersion { Version = 1 };
 
     QStyleHintReturnVariant();
+    ~QStyleHintReturnVariant();
 
     QVariant variant;
 };
index 28b8e3d..8accf18 100644 (file)
@@ -80,6 +80,10 @@ QWindowsCEStyle::QWindowsCEStyle() : QWindowsStyle() {
     qApp->setEffectEnabled(Qt::UI_AnimateMenu, false);
 }
 
+QWindowsCEStyle::~QWindowsCEStyle()
+{
+}
+
 void QWindowsCEStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                                     QPainter *painter, const QWidget *widget) const {
 
index 37471b0..606cbaf 100644 (file)
@@ -56,6 +56,7 @@ class Q_WIDGETS_EXPORT QWindowsCEStyle : public QWindowsStyle
    Q_OBJECT
 public:
     QWindowsCEStyle();
+    ~QWindowsCEStyle();
 
     void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                        QPainter *painter, const QWidget *widget = 0) const;
index 3242e6a..8ac9888 100644 (file)
@@ -4515,6 +4515,10 @@ QWindowsMobileStyle::QWindowsMobileStyle() : QWindowsStyle(*new QWindowsMobileSt
     qApp->setEffectEnabled(Qt::UI_AnimateMenu, false);
 }
 
+QWindowsMobileStyle::~QWindowsMobileStyle()
+{
+}
+
 QWindowsMobileStylePrivate::QWindowsMobileStylePrivate() :QWindowsStylePrivate() {
 
 #ifdef Q_OS_WINCE
index 607d201..7bb7d5c 100644 (file)
@@ -58,6 +58,7 @@ class Q_WIDGETS_EXPORT QWindowsMobileStyle : public QWindowsStyle
     Q_OBJECT
 public:
     QWindowsMobileStyle();
+    ~QWindowsMobileStyle();
 
     void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                        QPainter *painter, const QWidget *widget = 0) const;
index 022fb93..093a9f7 100644 (file)
@@ -203,6 +203,13 @@ QWindowsVistaStyle::QWindowsVistaStyle()
 {
 }
 
+/*!
+  Destructor.
+*/
+QWindowsVistaStyle::~QWindowsVistaStyle()
+{
+}
+
 //convert Qt state flags to uxtheme button states
 static int buttonStateId(int flags, int partId)
 {
index 0b17881..72950aa 100644 (file)
@@ -57,6 +57,7 @@ class Q_WIDGETS_EXPORT QWindowsVistaStyle : public QWindowsXPStyle
     Q_OBJECT
 public:
     QWindowsVistaStyle();
+    ~QWindowsVistaStyle();
     
     void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
                        QPainter *painter, const QWidget *widget = 0) const;
index 29ac80c..bf6593d 100644 (file)
@@ -216,6 +216,13 @@ QCheckBox::QCheckBox(const QString &text, QWidget *parent)
     setText(text);
 }
 
+/*!
+    Destructor.
+*/
+QCheckBox::~QCheckBox()
+{
+}
+
 void QCheckBox::setTristate(bool y)
 {
     Q_D(QCheckBox);
index c7f33b9..468c871 100644 (file)
@@ -61,7 +61,7 @@ class Q_WIDGETS_EXPORT QCheckBox : public QAbstractButton
 public:
     explicit QCheckBox(QWidget *parent=0);
     explicit QCheckBox(const QString &text, QWidget *parent=0);
-
+    ~QCheckBox();
 
     QSize sizeHint() const;
     QSize minimumSizeHint() const;
index 5207241..11c4b41 100644 (file)
@@ -302,6 +302,13 @@ QCommandLinkButton::QCommandLinkButton(const QString &text, const QString &descr
     d->init();
 }
 
+/*!
+    Destructor.
+*/
+QCommandLinkButton::~QCommandLinkButton()
+{
+}
+
 /*! \reimp */
 bool QCommandLinkButton::event(QEvent *e)
 {
index 50707d8..ec8fd33 100644 (file)
@@ -62,6 +62,7 @@ public:
     explicit QCommandLinkButton(QWidget *parent=0);
     explicit QCommandLinkButton(const QString &text, QWidget *parent=0);
     explicit QCommandLinkButton(const QString &text, const QString &description, QWidget *parent=0);
+    ~QCommandLinkButton();
 
     QString description() const;
     void setDescription(const QString &description);
index 8a23530..0895c96 100644 (file)
@@ -219,6 +219,13 @@ QDateTimeEdit::QDateTimeEdit(const QVariant &var, QVariant::Type parserType, QWi
 }
 
 /*!
+    Destructor.
+*/
+QDateTimeEdit::~QDateTimeEdit()
+{
+}
+
+/*!
   \property QDateTimeEdit::dateTime
   \brief the QDateTime that is set in the QDateTimeEdit
 
@@ -1562,6 +1569,13 @@ QTimeEdit::QTimeEdit(const QTime &time, QWidget *parent)
 }
 
 /*!
+  Destructor.
+*/
+QTimeEdit::~QTimeEdit()
+{
+}
+
+/*!
   \property QTimeEdit::time
   \internal
   \sa QDateTimeEdit::time
@@ -1631,6 +1645,13 @@ QDateEdit::QDateEdit(const QDate &date, QWidget *parent)
 }
 
 /*!
+  Destructor.
+*/
+QDateEdit::~QDateEdit()
+{
+}
+
+/*!
   \property QDateEdit::date
   \internal
   \sa QDateTimeEdit::date
index 77e038c..7435013 100644 (file)
@@ -100,6 +100,7 @@ public:
     explicit QDateTimeEdit(const QDateTime &dt, QWidget *parent = 0);
     explicit QDateTimeEdit(const QDate &d, QWidget *parent = 0);
     explicit QDateTimeEdit(const QTime &t, QWidget *parent = 0);
+    ~QDateTimeEdit();
 
     QDateTime dateTime() const;
     QDate date() const;
@@ -209,6 +210,7 @@ class Q_WIDGETS_EXPORT QTimeEdit : public QDateTimeEdit
 public:
     explicit QTimeEdit(QWidget *parent = 0);
     explicit QTimeEdit(const QTime &time, QWidget *parent = 0);
+    ~QTimeEdit();
 
 Q_SIGNALS:
     void userTimeChanged(const QTime &time);
@@ -221,6 +223,7 @@ class Q_WIDGETS_EXPORT QDateEdit : public QDateTimeEdit
 public:
     explicit QDateEdit(QWidget *parent = 0);
     explicit QDateEdit(const QDate &date, QWidget *parent = 0);
+    ~QDateEdit();
 
 Q_SIGNALS:
     void userDateChanged(const QDate &date);
index b7726e7..2bd8930 100644 (file)
@@ -244,6 +244,13 @@ QProgressBar::QProgressBar(QWidget *parent)
 }
 
 /*!
+    Destructor.
+*/
+QProgressBar::~QProgressBar()
+{
+}
+
+/*!
     Reset the progress bar. The progress bar "rewinds" and shows no
     progress.
 */
index 30a4863..a830df7 100644 (file)
@@ -73,6 +73,7 @@ public:
     enum Direction { TopToBottom, BottomToTop };
 
     explicit QProgressBar(QWidget *parent = 0);
+    ~QProgressBar();
 
     int minimum() const;
     int maximum() const;
index 78d53ad..d4abd33 100644 (file)
@@ -144,6 +144,13 @@ QRadioButton::QRadioButton(QWidget *parent)
 }
 
 /*!
+    Destructor.
+*/
+QRadioButton::~QRadioButton()
+{
+}
+
+/*!
     Constructs a radio button with the given \a parent and a \a text string.
 
     The \a parent argument is passed on to the QAbstractButton constructor.
index eeb0298..dec49dd 100644 (file)
@@ -59,6 +59,7 @@ class Q_WIDGETS_EXPORT QRadioButton : public QAbstractButton
 public:
     explicit QRadioButton(QWidget *parent=0);
     explicit QRadioButton(const QString &text, QWidget *parent=0);
+    ~QRadioButton();
 
     QSize sizeHint() const;
     QSize minimumSizeHint() const;
index 6a11c6d..cb09e8b 100644 (file)
@@ -209,6 +209,10 @@ QSpinBox::QSpinBox(QWidget *parent)
     d->init();
 }
 
+/*!
+    Destructor.
+*/
+QSpinBox::~QSpinBox() {}
 
 /*!
     \property QSpinBox::value
@@ -580,6 +584,11 @@ QDoubleSpinBox::QDoubleSpinBox(QWidget *parent)
 }
 
 /*!
+    Destructor.
+*/
+QDoubleSpinBox::~QDoubleSpinBox() {}
+
+/*!
     \property QDoubleSpinBox::value
     \brief the value of the spin box
 
index b947525..889b283 100644 (file)
@@ -66,6 +66,7 @@ class Q_WIDGETS_EXPORT QSpinBox : public QAbstractSpinBox
 
 public:
     explicit QSpinBox(QWidget *parent = 0);
+    ~QSpinBox();
 
     int value() const;
 
@@ -124,6 +125,7 @@ class Q_WIDGETS_EXPORT QDoubleSpinBox : public QAbstractSpinBox
     Q_PROPERTY(double value READ value WRITE setValue NOTIFY valueChanged USER true)
 public:
     explicit QDoubleSpinBox(QWidget *parent = 0);
+    ~QDoubleSpinBox();
 
     double value() const;
 
index 18724ca..70c493c 100644 (file)
@@ -124,6 +124,13 @@ QSplitterHandle::QSplitterHandle(Qt::Orientation orientation, QSplitter *parent)
 }
 
 /*!
+    Destructor.
+*/
+QSplitterHandle::~QSplitterHandle()
+{
+}
+
+/*!
     Sets the orientation of the splitter handle to \a orientation.
     This is usually propagated from the QSplitter.
 
index 147fcff..2bcdc54 100644 (file)
@@ -141,6 +141,7 @@ class Q_WIDGETS_EXPORT QSplitterHandle : public QWidget
     Q_OBJECT
 public:
     explicit QSplitterHandle(Qt::Orientation o, QSplitter *parent);
+    ~QSplitterHandle();
 
     void setOrientation(Qt::Orientation o);
     Qt::Orientation orientation() const;