aboutsummaryrefslogtreecommitdiffstats
path: root/sources
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-03-03 09:56:40 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-03-17 09:03:23 +0100
commit3a18da91353a71e801658329c55b170c18bcd824 (patch)
treef6b2d91a7c94f5a30b7f28569591882e93153255 /sources
parent3c3802fbc026010a00c235aab9a548b7cafbe2ad (diff)
Qt Datavisualization: Fix crashes in QBar/SurfaceDataProxy add/set/insertRow()
These function take an allocated array. Replace them by functions that take the list by const-ref and pass the allocated copy. Pick-to: 5.15 Fixes: PYSIDE-1438 Change-Id: Id58cdbc4b939713b71724f5d4a67f0448c74f33f Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources')
-rw-r--r--sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml103
-rw-r--r--sources/pyside6/PySide6/glue/qtdatavisualization.cpp32
-rw-r--r--sources/pyside6/tests/QtDataVisualization/datavisualization_test.py16
3 files changed, 105 insertions, 46 deletions
diff --git a/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml b/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml
index e36d7e8de..1fdbc71f4 100644
--- a/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml
+++ b/sources/pyside6/PySide6/QtDataVisualization/typesystem_datavisualization.xml
@@ -118,16 +118,43 @@
<parent index="this" action="add"/>
</modify-argument>
</modify-function>
- <modify-function signature="addRow(QList&lt;QBarDataItem&gt;*)">
- <modify-argument index="1">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
- <modify-function signature="addRow(QList&lt;QBarDataItem&gt;*, const QString&amp;)">
- <modify-argument index="1">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
+
+ <!-- PYSIDE-1438: Replace all add/set/insertRow() taking a 'QList*' by overloads
+ taking 'const QList &' since an allocated list needs to be passed. -->
+ <modify-function signature="addRow(QList&lt;QBarDataItem&gt;*)" remove="all"/>
+ <add-function signature="addRow(const QList&lt;QBarDataItem&gt;&amp;)" return-type="int">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-addrow"/>
+ </add-function>
+ <modify-function signature="addRow(QList&lt;QBarDataItem&gt;*,const QString&amp;)" remove="all"/>
+ <add-function signature="addRow(const QList&lt;QBarDataItem&gt;&amp;,const QString&amp;)"
+ return-type="int">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-addrow-string"/>
+ </add-function>
+
+ <modify-function signature="insertRow(int,QList&lt;QBarDataItem&gt;*)" remove="all"/>
+ <add-function signature="insertRow(int,const QList&lt;QBarDataItem&gt;&amp;)">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-insertrow"/>
+ </add-function>
+ <modify-function signature="insertRow(int,QList&lt;QBarDataItem&gt;*,const QString&amp;)" remove="all"/>
+ <add-function signature="insertRow(int,const QList&lt;QBarDataItem&gt;&amp;, const QString&amp;)">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-insertrow-string"/>
+ </add-function>
+
+ <modify-function signature="setRow(int,QList&lt;QBarDataItem&gt;*)" remove="all"/>
+ <add-function signature="setRow(int,const QList&lt;QBarDataItem&gt;&amp;)">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-setrow"/>
+ </add-function>
+ <modify-function signature="setRow(int,QList&lt;QBarDataItem&gt;*,const QString&amp;)" remove="all"/>
+ <add-function signature="setRow(int,const QList&lt;QBarDataItem&gt;&amp;,const QString&amp;)">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-setrow-string"/>
+ </add-function>
+
<modify-function signature="addRows(const QBarDataArray&amp;)">
<modify-argument index="1">
<parent index="this" action="add"/>
@@ -138,16 +165,6 @@
<parent index="this" action="add"/>
</modify-argument>
</modify-function>
- <modify-function signature="insertRow(int, QList&lt;QBarDataItem&gt;*)">
- <modify-argument index="2">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
- <modify-function signature="insertRow(int, QList&lt;QBarDataItem&gt;*, const QString&amp;)">
- <modify-argument index="2">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
<modify-function signature="insertRows(int, const QBarDataArray&amp;)">
<modify-argument index="2">
<parent index="this" action="add"/>
@@ -158,16 +175,6 @@
<parent index="this" action="add"/>
</modify-argument>
</modify-function>
- <modify-function signature="setRow(int, QList&lt;QBarDataItem&gt;*)">
- <modify-argument index="2">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
- <modify-function signature="setRow(int, QList&lt;QBarDataItem&gt;*, const QString&amp;)">
- <modify-argument index="2">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
<modify-function signature="setRows(int, const QBarDataArray&amp;)">
<modify-argument index="2">
<parent index="this" action="add"/>
@@ -250,21 +257,27 @@
</object-type>
<value-type name="QSurfaceDataItem"/>
<object-type name="QSurfaceDataProxy">
- <modify-function signature="addRow(QList&lt;QSurfaceDataItem&gt;*)">
- <modify-argument index="1">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
- <modify-function signature="insertRow(int, QList&lt;QSurfaceDataItem&gt;*)">
- <modify-argument index="2">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
- <modify-function signature="setRow(int, QList&lt;QSurfaceDataItem&gt;*)">
- <modify-argument index="2">
- <parent index="this" action="add"/>
- </modify-argument>
- </modify-function>
+
+ <!-- PYSIDE-1438: Replace all add/set/insertRow() taking a 'QList*' by overloads
+ taking 'const QList &' since an allocated list needs to be passed. -->
+ <modify-function signature="addRow(QList&lt;QSurfaceDataItem&gt;*)" remove="all"/>
+ <add-function signature="addRow(const QList&lt;QSurfaceDataItem&gt;&amp;)" return-type="int">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-addrow"/>
+ </add-function>
+
+ <modify-function signature="insertRow(int,QList&lt;QSurfaceDataItem&gt;*)" remove="all"/>
+ <add-function signature="insertRow(int,const QList&lt;QSurfaceDataItem&gt;&amp;)">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-insertrow"/>
+ </add-function>
+
+ <modify-function signature="setRow(int,QList&lt;QSurfaceDataItem&gt;*)" remove="all"/>
+ <add-function signature="setRow(int,const QList&lt;QSurfaceDataItem&gt;&amp;)">
+ <inject-code class="target" position="beginning" file="../glue/qtdatavisualization.cpp"
+ snippet="dataproxy-setrow"/>
+ </add-function>
+
<modify-function signature="resetArray(QSurfaceDataArray*)">
<modify-argument index="1">
<parent index="this" action="add"/>
diff --git a/sources/pyside6/PySide6/glue/qtdatavisualization.cpp b/sources/pyside6/PySide6/glue/qtdatavisualization.cpp
index 119d79a40..0a9e5db76 100644
--- a/sources/pyside6/PySide6/glue/qtdatavisualization.cpp
+++ b/sources/pyside6/PySide6/glue/qtdatavisualization.cpp
@@ -40,3 +40,35 @@
// @snippet releaseownership
Shiboken::Object::releaseOwnership(%PYARG_1);
// @snippet releaseownership
+
+// @snippet dataproxy-addrow
+using ListType = decltype(%1);
+%RETURN_TYPE %0 = %CPPSELF.addRow(new ListType(%1));
+%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
+// @snippet dataproxy-addrow
+
+// @snippet dataproxy-addrow-string
+using ListType = decltype(%1);
+%RETURN_TYPE %0 = %CPPSELF.addRow(new ListType(%1), %2);
+%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
+// @snippet dataproxy-addrow-string
+
+// @snippet dataproxy-insertrow
+using ListType = decltype(%2);
+%CPPSELF.insertRow(%1, new ListType(%2));
+// @snippet dataproxy-insertrow
+
+// @snippet dataproxy-insertrow-string
+using ListType = decltype(%2);
+%CPPSELF.insertRow(%1, new ListType(%2), %3);
+// @snippet dataproxy-insertrow-string
+
+// @snippet dataproxy-setrow
+using ListType = decltype(%2);
+%CPPSELF.setRow(%1, new ListType(%2));
+// @snippet dataproxy-setrow
+
+// @snippet dataproxy-setrow-string
+using ListType = decltype(%2);
+%CPPSELF.setRow(%1, new ListType(%2), %3);
+// @snippet dataproxy-setrow-string
diff --git a/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py b/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py
index 3497ae676..ded306ebc 100644
--- a/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py
+++ b/sources/pyside6/tests/QtDataVisualization/datavisualization_test.py
@@ -42,7 +42,8 @@ init_test_paths(False)
from helper.usesqguiapplication import UsesQGuiApplication
from PySide6.QtCore import QTimer
from PySide6.QtDataVisualization import (Q3DBars, QBar3DSeries, QBarDataItem,
- QCategory3DAxis, QValue3DAxis)
+ QBarDataProxy, QCategory3DAxis,
+ QValue3DAxis)
def dataToBarDataRow(data):
@@ -91,5 +92,18 @@ class QtDataVisualizationTestCase(UsesQGuiApplication):
QTimer.singleShot(500, self.app.quit)
self.app.exec_()
+ def testBarDataProxy(self):
+ '''PSYSIDE-1438, crashes in QBarDataProxy.addRow()'''
+ items = [QBarDataItem(v) for v in [1.0, 2.0]]
+ data_proxy = QBarDataProxy()
+ data_proxy.addRow(items)
+ data_proxy.addRow(items, 'bla')
+ data_proxy.insertRow(0, items)
+ data_proxy.insertRow(0, items, 'bla')
+ data_proxy.setRow(0, items)
+ data_proxy.setRow(0, items, 'bla')
+ self.assertTrue(data_proxy.rowCount(), 4)
+
+
if __name__ == '__main__':
unittest.main()