aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-05-11 09:21:37 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2023-05-11 17:37:57 +0200
commitb1d1161a814038adfe8b0a0dac24f101cf1e1db3 (patch)
tree96b8a849f2a806a9f00b4b06f7946c06b62dbf50
parent5b39b316e3c9e40cdc0784538b8d5f290e41d67b (diff)
Numpy support: Fix 64bit support and compiler warning about potentially uninitialized value
The size for long long was incorrect. Fix it and expand the test to check values as well. For really bizarre long types, the variable might be uninitialized, causing shiboken6/libshiboken/sbknumpyview.cpp:82:12: warning: type may be used uninitialized in this function [-Wmaybe-uninitialized] Fix by introducing a helper returning a std::optional. Amends 499832abfdf13eac5aa35f84a62166fb5aa2e034. Task-number: PYSIDE-2313 Pick-to: 6.5 Change-Id: Ie7d22a728a42f644fa84cba811c4e35e7db7ebb5 Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r--sources/pyside6/tests/QtCharts/qcharts_numpy_test.py12
-rw-r--r--sources/shiboken6/libshiboken/sbknumpyview.cpp78
2 files changed, 49 insertions, 41 deletions
diff --git a/sources/pyside6/tests/QtCharts/qcharts_numpy_test.py b/sources/pyside6/tests/QtCharts/qcharts_numpy_test.py
index 044fab34c..8154020c0 100644
--- a/sources/pyside6/tests/QtCharts/qcharts_numpy_test.py
+++ b/sources/pyside6/tests/QtCharts/qcharts_numpy_test.py
@@ -33,10 +33,16 @@ class QChartsNumpyTestCase(UsesQApplication):
data_types = [np.short, np.ushort, np.int32, np.uint32,
np.int64, np.uint64, np.float32, np.float64]
for dt in data_types:
+ print("Testing ", dt)
old_size = line_series.count()
- arr = np.array([2], dtype=dt)
- line_series.appendNp(arr, arr)
- self.assertEqual(line_series.count(), old_size + 1)
+ x_arr = np.array([2], dtype=dt)
+ y_arr = np.array([3], dtype=dt)
+ line_series.appendNp(x_arr, y_arr)
+ size = line_series.count()
+ self.assertEqual(size, old_size + 1)
+ point = line_series.points()[size - 1]
+ self.assertEqual(point.x(), 2)
+ self.assertEqual(point.y(), 3)
if __name__ == '__main__':
diff --git a/sources/shiboken6/libshiboken/sbknumpyview.cpp b/sources/shiboken6/libshiboken/sbknumpyview.cpp
index e83a5bda7..bafbf8038 100644
--- a/sources/shiboken6/libshiboken/sbknumpyview.cpp
+++ b/sources/shiboken6/libshiboken/sbknumpyview.cpp
@@ -6,70 +6,72 @@
#include "helper.h"
#include <iostream>
#include <iomanip>
+#include <optional>
#ifdef HAVE_NUMPY
namespace Shiboken {
namespace Numpy {
-View View::fromPyObject(PyObject *pyIn)
+static std::optional<View::Type> viewTypeFromNumPy(int npt)
{
- if (pyIn == nullptr || PyArray_Check(pyIn) == 0)
- return {};
- auto *ar = reinterpret_cast<PyArrayObject *>(pyIn);
- if ((PyArray_FLAGS(ar) & NPY_ARRAY_C_CONTIGUOUS) == 0)
- return {};
- const int ndim = PyArray_NDIM(ar);
- if (ndim > 2)
- return {};
-
- View::Type type;
- switch (PyArray_TYPE(ar)) {
+ switch (npt) {
case NPY_SHORT:
- type = View::Int16;
- break;
+ return View::Int16;
case NPY_USHORT:
- type = View::Unsigned16;
- break;
+ return View::Unsigned16;
case NPY_INT:
- type = View::Int;
- break;
+ return View::Int;
case NPY_UINT:
- type = View::Unsigned;
- break;
+ return View::Unsigned;
case NPY_LONG:
- if constexpr (sizeof(long) == sizeof(int))
- type = View::Int;
- else if constexpr (sizeof(long) == sizeof(int64_t))
- type = View::Int64;
+ if constexpr (sizeof(long) == sizeof(int))
+ return View::Int;
+ if constexpr (sizeof(long) == sizeof(int64_t))
+ return View::Int64;
break;
case NPY_ULONG:
- if constexpr (sizeof(long) == sizeof(int))
- type = View::Unsigned;
- else if constexpr (sizeof(long) == sizeof(int64_t))
- type = View::Unsigned64;
+ if constexpr (sizeof(long) == sizeof(int))
+ return View::Unsigned;
+ if constexpr (sizeof(long) == sizeof(int64_t))
+ return View::Unsigned64;
break;
case NPY_LONGLONG:
- if constexpr (sizeof(long long) == 64)
- type = View::Int64;
+ if constexpr (sizeof(long long) == 8)
+ return View::Int64;
break;
case NPY_ULONGLONG:
- if constexpr (sizeof(long long) == 64)
- type = View::Unsigned64;
+ if constexpr (sizeof(long long) == 8)
+ return View::Unsigned64;
break;
case NPY_FLOAT:
- type = View::Float;
- break;
+ return View::Float;
case NPY_DOUBLE:
- type = View::Double;
- break;
+ return View::Double;
default:
- return {};
+ break;
}
+ return {};
+}
+
+View View::fromPyObject(PyObject *pyIn)
+{
+ if (pyIn == nullptr || PyArray_Check(pyIn) == 0)
+ return {};
+ auto *ar = reinterpret_cast<PyArrayObject *>(pyIn);
+ if ((PyArray_FLAGS(ar) & NPY_ARRAY_C_CONTIGUOUS) == 0)
+ return {};
+ const int ndim = PyArray_NDIM(ar);
+ if (ndim > 2)
+ return {};
+
+ const auto typeO = viewTypeFromNumPy(PyArray_TYPE(ar));
+ if (!typeO.has_value())
+ return {};
View result;
result.ndim = ndim;
- result.type = type;
+ result.type = typeO.value();
result.data = PyArray_DATA(ar);
result.dimensions[0] = PyArray_DIMS(ar)[0];
result.stride[0] = PyArray_STRIDES(ar)[0];