diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2015-06-01 00:22:35 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2015-06-03 12:02:55 +0000 |
commit | 133e40283155852585b5fc409909a00e920cfcfc (patch) | |
tree | 741cb5b83260c70f7fc37ef1a83dac4d4f37c493 | |
parent | b295afb064d728d8f59d0129979c019761624bca (diff) |
De-duplicate vtables, part I: exported private classes
By making the destructor (usually the first non-inline, non-pure,
virtual function, and therefore the trigger for most compilers to
emit the vtable and type_info structures for the class in that TU)
out-of-line, vtables and, more importantly, type_info structures for
the class are pinned to a single TU. This prevents false negative
dynamic_cast and catch evaluation.
In this first batch, we de-inline destructors of exported private
classes.
Since they are already exported, users of these classes are unaffected
by the change, and since it's private API, we don't need to avoid
adding code to the out-of-line destructor until Qt 6.
Change-Id: I450707877d2cb6a77f79ae1dd355facb98d6c517
Reported-by: Volker Krause <volker.krause@kdab.com>
Task-number: QTBUG-45582
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/itemmodels/qabstractitemmodel.cpp | 5 | ||||
-rw-r--r-- | src/corelib/itemmodels/qabstractitemmodel_p.h | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 10 | ||||
-rw-r--r-- | src/corelib/kernel/qobject_p.h | 4 | ||||
-rw-r--r-- | src/corelib/statemachine/qeventtransition.cpp | 4 | ||||
-rw-r--r-- | src/corelib/statemachine/qeventtransition_p.h | 1 | ||||
-rw-r--r-- | src/gui/opengl/qopenglpaintdevice.cpp | 4 | ||||
-rw-r--r-- | src/gui/opengl/qopenglpaintdevice_p.h | 2 | ||||
-rw-r--r-- | src/gui/painting/qpagedpaintdevice.cpp | 4 | ||||
-rw-r--r-- | src/gui/painting/qpagedpaintdevice_p.h | 4 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine.cpp | 4 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_p.h | 3 | ||||
-rw-r--r-- | src/widgets/effects/qgraphicseffect.cpp | 4 | ||||
-rw-r--r-- | src/widgets/effects/qgraphicseffect_p.h | 1 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsview.cpp | 4 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsview_p.h | 1 |
16 files changed, 51 insertions, 6 deletions
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp index 60ac75133c..2f3cfc1c0a 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.cpp +++ b/src/corelib/itemmodels/qabstractitemmodel.cpp @@ -479,6 +479,11 @@ public: Q_GLOBAL_STATIC(QEmptyItemModel, qEmptyModel) + +QAbstractItemModelPrivate::~QAbstractItemModelPrivate() +{ +} + QAbstractItemModel *QAbstractItemModelPrivate::staticEmptyModel() { return qEmptyModel(); diff --git a/src/corelib/itemmodels/qabstractitemmodel_p.h b/src/corelib/itemmodels/qabstractitemmodel_p.h index 075e6a9018..acf376eff1 100644 --- a/src/corelib/itemmodels/qabstractitemmodel_p.h +++ b/src/corelib/itemmodels/qabstractitemmodel_p.h @@ -71,6 +71,8 @@ class Q_CORE_EXPORT QAbstractItemModelPrivate : public QObjectPrivate public: QAbstractItemModelPrivate() : QObjectPrivate(), supportedDragActions(-1), roleNames(defaultRoleNames()) {} + ~QAbstractItemModelPrivate(); + void removePersistentIndexData(QPersistentModelIndexData *data); void movePersistentIndexes(const QVector<QPersistentModelIndexData *> &indexes, int change, const QModelIndex &parent, Qt::Orientation orientation); void rowsAboutToBeInserted(const QModelIndex &parent, int first, int last); diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index fb4c5cceb9..3ca9c890e8 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -65,6 +65,16 @@ QT_BEGIN_NAMESPACE static int DIRECT_CONNECTION_ONLY = 0; + +QDynamicMetaObjectData::~QDynamicMetaObjectData() +{ +} + +QAbstractDynamicMetaObject::~QAbstractDynamicMetaObject() +{ +} + + struct QSlotObjectBaseDeleter { // for use with QScopedPointer<QSlotObjectBase,...> static void cleanup(QtPrivate::QSlotObjectBase *slot) { if (slot) slot->destroyIfLastRef(); diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 1b64103e40..bd5ee006bf 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -406,7 +406,7 @@ void Q_CORE_EXPORT qDeleteInEventHandler(QObject *o); struct QAbstractDynamicMetaObject; struct Q_CORE_EXPORT QDynamicMetaObjectData { - virtual ~QDynamicMetaObjectData() {} + virtual ~QDynamicMetaObjectData(); virtual void objectDestroyed(QObject *) { delete this; } virtual QAbstractDynamicMetaObject *toDynamicMetaObject(QObject *) = 0; @@ -415,6 +415,8 @@ struct Q_CORE_EXPORT QDynamicMetaObjectData struct Q_CORE_EXPORT QAbstractDynamicMetaObject : public QDynamicMetaObjectData, public QMetaObject { + ~QAbstractDynamicMetaObject(); + virtual QAbstractDynamicMetaObject *toDynamicMetaObject(QObject *) Q_DECL_OVERRIDE { return this; } virtual int createProperty(const char *, const char *) { return -1; } virtual int metaCall(QObject *, QMetaObject::Call c, int _id, void **a) Q_DECL_OVERRIDE diff --git a/src/corelib/statemachine/qeventtransition.cpp b/src/corelib/statemachine/qeventtransition.cpp index 096d667bc3..c10127fa68 100644 --- a/src/corelib/statemachine/qeventtransition.cpp +++ b/src/corelib/statemachine/qeventtransition.cpp @@ -102,6 +102,10 @@ QEventTransitionPrivate::QEventTransitionPrivate() registered = false; } +QEventTransitionPrivate::~QEventTransitionPrivate() +{ +} + QEventTransitionPrivate *QEventTransitionPrivate::get(QEventTransition *q) { return q->d_func(); diff --git a/src/corelib/statemachine/qeventtransition_p.h b/src/corelib/statemachine/qeventtransition_p.h index 64ab945187..9e3ef111f9 100644 --- a/src/corelib/statemachine/qeventtransition_p.h +++ b/src/corelib/statemachine/qeventtransition_p.h @@ -55,6 +55,7 @@ class Q_CORE_EXPORT QEventTransitionPrivate : public QAbstractTransitionPrivate Q_DECLARE_PUBLIC(QEventTransition) public: QEventTransitionPrivate(); + ~QEventTransitionPrivate(); static QEventTransitionPrivate *get(QEventTransition *q); diff --git a/src/gui/opengl/qopenglpaintdevice.cpp b/src/gui/opengl/qopenglpaintdevice.cpp index c0657feaa0..e509b26a95 100644 --- a/src/gui/opengl/qopenglpaintdevice.cpp +++ b/src/gui/opengl/qopenglpaintdevice.cpp @@ -169,6 +169,10 @@ QOpenGLPaintDevicePrivate::QOpenGLPaintDevicePrivate(const QSize &sz) { } +QOpenGLPaintDevicePrivate::~QOpenGLPaintDevicePrivate() +{ +} + class QOpenGLEngineThreadStorage { public: diff --git a/src/gui/opengl/qopenglpaintdevice_p.h b/src/gui/opengl/qopenglpaintdevice_p.h index 57d93ee80a..54ea09240d 100644 --- a/src/gui/opengl/qopenglpaintdevice_p.h +++ b/src/gui/opengl/qopenglpaintdevice_p.h @@ -56,7 +56,7 @@ class Q_GUI_EXPORT QOpenGLPaintDevicePrivate { public: QOpenGLPaintDevicePrivate(const QSize &size); - virtual ~QOpenGLPaintDevicePrivate() { } + virtual ~QOpenGLPaintDevicePrivate(); static QOpenGLPaintDevicePrivate *get(QOpenGLPaintDevice *dev) { return dev->d_func(); } diff --git a/src/gui/painting/qpagedpaintdevice.cpp b/src/gui/painting/qpagedpaintdevice.cpp index 3adc5e9411..547cedf51f 100644 --- a/src/gui/painting/qpagedpaintdevice.cpp +++ b/src/gui/painting/qpagedpaintdevice.cpp @@ -36,6 +36,10 @@ QT_BEGIN_NAMESPACE +QPagedPaintDevicePrivate::~QPagedPaintDevicePrivate() +{ +} + /*! \class QPagedPaintDevice \inmodule QtGui diff --git a/src/gui/painting/qpagedpaintdevice_p.h b/src/gui/painting/qpagedpaintdevice_p.h index 62f69747db..30b1c0a1e6 100644 --- a/src/gui/painting/qpagedpaintdevice_p.h +++ b/src/gui/painting/qpagedpaintdevice_p.h @@ -61,9 +61,7 @@ public: { } - virtual ~QPagedPaintDevicePrivate() - { - } + virtual ~QPagedPaintDevicePrivate(); // ### Qt6 Remove these and make public class methods virtual virtual bool setPageLayout(const QPageLayout &newPageLayout) diff --git a/src/gui/painting/qpaintengine.cpp b/src/gui/painting/qpaintengine.cpp index 6271c8f9e6..bf1f31a85b 100644 --- a/src/gui/painting/qpaintengine.cpp +++ b/src/gui/painting/qpaintengine.cpp @@ -968,6 +968,10 @@ QRect QPaintEngine::systemRect() const return d_func()->systemRect; } +QPaintEnginePrivate::~QPaintEnginePrivate() +{ +} + void QPaintEnginePrivate::drawBoxTextItem(const QPointF &p, const QTextItemInt &ti) { if (!ti.glyphs.numGlyphs) diff --git a/src/gui/painting/qpaintengine_p.h b/src/gui/painting/qpaintengine_p.h index c58662ede4..918c98997b 100644 --- a/src/gui/painting/qpaintengine_p.h +++ b/src/gui/painting/qpaintengine_p.h @@ -60,7 +60,8 @@ class Q_GUI_EXPORT QPaintEnginePrivate public: QPaintEnginePrivate() : pdev(0), q_ptr(0), currentClipDevice(0), hasSystemTransform(0), hasSystemViewport(0) {} - virtual ~QPaintEnginePrivate() { } + virtual ~QPaintEnginePrivate(); + QPaintDevice *pdev; QPaintEngine *q_ptr; QRegion systemClip; diff --git a/src/widgets/effects/qgraphicseffect.cpp b/src/widgets/effects/qgraphicseffect.cpp index f53804e494..5a97be3d96 100644 --- a/src/widgets/effects/qgraphicseffect.cpp +++ b/src/widgets/effects/qgraphicseffect.cpp @@ -111,6 +111,10 @@ #ifndef QT_NO_GRAPHICSEFFECT QT_BEGIN_NAMESPACE +QGraphicsEffectPrivate::~QGraphicsEffectPrivate() +{ +} + /*! \internal \class QGraphicsEffectSource diff --git a/src/widgets/effects/qgraphicseffect_p.h b/src/widgets/effects/qgraphicseffect_p.h index 6e990cc52e..35264c0d30 100644 --- a/src/widgets/effects/qgraphicseffect_p.h +++ b/src/widgets/effects/qgraphicseffect_p.h @@ -142,6 +142,7 @@ class Q_WIDGETS_EXPORT QGraphicsEffectPrivate : public QObjectPrivate Q_DECLARE_PUBLIC(QGraphicsEffect) public: QGraphicsEffectPrivate() : source(0), isEnabled(1) {} + ~QGraphicsEffectPrivate(); inline void setGraphicsEffectSource(QGraphicsEffectSource *newSource) { diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp index c270c4be88..decb455988 100644 --- a/src/widgets/graphicsview/qgraphicsview.cpp +++ b/src/widgets/graphicsview/qgraphicsview.cpp @@ -362,6 +362,10 @@ QGraphicsViewPrivate::QGraphicsViewPrivate() styleOptions.reserve(QGRAPHICSVIEW_PREALLOC_STYLE_OPTIONS); } +QGraphicsViewPrivate::~QGraphicsViewPrivate() +{ +} + /*! \internal */ diff --git a/src/widgets/graphicsview/qgraphicsview_p.h b/src/widgets/graphicsview/qgraphicsview_p.h index fec8336695..dcbffb1c39 100644 --- a/src/widgets/graphicsview/qgraphicsview_p.h +++ b/src/widgets/graphicsview/qgraphicsview_p.h @@ -63,6 +63,7 @@ class Q_WIDGETS_EXPORT QGraphicsViewPrivate : public QAbstractScrollAreaPrivate Q_DECLARE_PUBLIC(QGraphicsView) public: QGraphicsViewPrivate(); + ~QGraphicsViewPrivate(); void recalculateContentSize(); void centerView(QGraphicsView::ViewportAnchor anchor); |